1.前提准备
1.1.首先将设备接入SIP网关服务
我这里使用的是开源的wvp-GB28181-pro项目,首先将设备接入到SIP网关服务。
配置信息如下:
1.2.修改设备配置
设备接入后,会自动注册到平台,可以在国标设备栏看到刚刚注册的设备信息。
如上图,是我刚刚接入的国标设备,如果不做特殊处理,设备接入的时候,流传输模式默认是“UDP”,这里需要改为“TCP被动模式”,否则是无法通过公网进行对讲请求。
1.3.公网对讲测试
点击上图中的设备后面的通道,可以进行对此设备进行拉流。
这里会有语音对讲的测试功能,默认使用“Broadcast”模式。然后点击对讲就可以开始对讲测试了。
因为对讲需要依赖ZLMediaKit,如果到此还是无法进行对讲,可能有以下几个方面:
(1)ZLMediaKit版本不对
(2)ZLMediaKit没有开启多端口模式或者其他配置有问题
(3)电脑没有语音输入功能
(4)没有使用SSL安全链接,
(5)设备自身不带对讲或者对讲协议不适配
总之很多地方需要注意,如果有搞不定的伙伴,可以加我微信:lenny930618。
2.实现代码
给国标设备下发指令,通知设备进行语音对讲
/**
* 语音广播
*
* @param device 视频设备
*/
@Override
public void audioBroadcastCmd(Device device, String channelId, SipSubscribe.Event okEvent, SipSubscribe.Event errorEvent) throws InvalidArgumentException, SipException, ParseException {
StringBuffer broadcastXml = new StringBuffer(200);
String charset = device.getCharset();
broadcastXml.append("<?xml version=\"1.0\" encoding=\"" + charset + "\"?>\r\n");
broadcastXml.append("<Notify>\r\n");
broadcastXml.append("<CmdType>Broadcast</CmdType>\r\n");
broadcastXml.append("<SN>" + (int)((Math.random()*9+1)*100000) + "</SN>\r\n");
broadcastXml.append("<SourceID>" + sipConfig.getId() + "</SourceID>\r\n");
broadcastXml.append("<TargetID>" + channelId + "</TargetID>\r\n");
broadcastXml.append("</Notify>\r\n");
Request request = headerProvider.createMessageRequest(device, broadcastXml.toString(), SipUtils.getNewViaTag(), SipUtils.getNewFromTag(), null,sipSender.getNewCallIdHeader(sipLayer.getLocalIp(device.getLocalIp()),device.getTransport()));
sipSender.transmitRequest(sipLayer.getLocalIp(device.getLocalIp()), request, errorEvent, okEvent);
}
设备收到的指令信息如下:
3.系统效果
我这边因为客户并非严格的国标设备,在国标的基础上进行了很多修改,我也是对WVP整个项目进行魔改,最后实现了自己的系统业务呈现。
最终,将定位、轨迹、视频、对讲完整实现。