README.md
@@ -60,21 +60,24 @@ 15. 支持订阅与通知方法 - [X] 移动位置订阅 - [X] 移动位置通知处理 - [ ] 报警事件订阅 - [X] 报警事件订阅 - [X] 报警事件通知处理 - [ ] 设备目录订阅 - [X] 设备目录通知处理 16. 移动位置查询和显示,可通过配置文件设置移动位置历史是否存储 # 2.0 支持特性 - [ ] 国标通道向上级联 - [X] 国标通道向上级联 - [X] WEB添加上级平台 - [X] 注册 - [X] 心跳保活 - [X] 通道选择 - [X] 通道推送 - [ ] 点播 - [ ] 云台控制 - [X] 点播 - [X] 云台控制 - [X] 平台状态查询 - [X] 平台信息查询 - [X] 平台远程启动 - [ ] 添加RTSP视频 - [ ] 添加ONVIF探测局域网内的设备 - [ ] 添加RTMP视频 src/main/java/com/genersoft/iot/vmp/gb28181/transmit/cmd/ISIPCommander.java
@@ -78,6 +78,14 @@ boolean frontEndCmd(Device device, String channelId, int cmdCode, int parameter1, int parameter2, int combineCode2); /** * 前端控制指令(用于转发上级指令) * @param device 控制设备 * @param channelId 预览通道 * @param cmdString 前端控制指令串 */ boolean fronEndCmd(Device device, String channelId, String cmdString); /** * 请求预览视频流 * * @param device 视频设备 src/main/java/com/genersoft/iot/vmp/gb28181/transmit/cmd/impl/SIPCommander.java
@@ -282,6 +282,36 @@ } /** * 前端控制指令(用于转发上级指令) * @param device 控制设备 * @param channelId 预览通道 * @param cmdString 前端控制指令串 */ @Override public boolean fronEndCmd(Device device, String channelId, String cmdString) { try { StringBuffer ptzXml = new StringBuffer(200); ptzXml.append("<?xml version=\"1.0\" ?>\r\n"); ptzXml.append("<Control>\r\n"); ptzXml.append("<CmdType>DeviceControl</CmdType>\r\n"); ptzXml.append("<SN>" + (int)((Math.random()*9+1)*100000) + "</SN>\r\n"); ptzXml.append("<DeviceID>" + channelId + "</DeviceID>\r\n"); ptzXml.append("<PTZCmd>" + cmdString + "</PTZCmd>\r\n"); ptzXml.append("<Info>\r\n"); ptzXml.append("</Info>\r\n"); ptzXml.append("</Control>\r\n"); String tm = Long.toString(System.currentTimeMillis()); Request request = headerProvider.createMessageRequest(device, ptzXml.toString(), "z9hG4bK-ViaPtz-" + tm, "FromPtz" + tm, null); transmitRequest(device, request); return true; } catch (SipException | ParseException | InvalidArgumentException e) { e.printStackTrace(); } return false; } /** * 请求预览视频流 * @param device 视频设备 * @param channelId 预览通道 src/main/java/com/genersoft/iot/vmp/gb28181/transmit/request/impl/MessageRequestProcessor.java
@@ -4,8 +4,11 @@ import java.text.ParseException; import java.util.*; import javax.sip.address.SipURI; import javax.sip.header.FromHeader; import javax.sip.header.HeaderAddress; import javax.sip.header.ToHeader; import javax.sip.InvalidArgumentException; import javax.sip.ListeningPoint; import javax.sip.ObjectInUseException; @@ -290,9 +293,13 @@ deferredResultHolder.invokeResult(msg); } else { // 此处是上级发出的DeviceControl指令 if (XmlUtil.getText(rootElement, "TeleBoot").equals("Boot") ) { // 远程启动功能:需要在重新启动程序后先对SipStack解绑 String platformId = ((SipUri) ((HeaderAddress) evt.getRequest().getHeader(FromHeader.NAME)).getAddress().getURI()).getUser(); logger.info("执行远程启动命令"); String platformId = ((SipURI) ((HeaderAddress) evt.getRequest().getHeader(FromHeader.NAME)).getAddress().getURI()).getUser(); String targetGBId = ((SipURI) ((HeaderAddress) evt.getRequest().getHeader(ToHeader.NAME)).getAddress().getURI()).getUser(); // 远程启动功能 if (!XmlUtil.isEmpty(XmlUtil.getText(rootElement, "TeleBoot"))) { if (deviceId.equals(targetGBId)) { // 远程启动功能:需要在重新启动程序后先对SipStack解绑 logger.info("执行远程启动本平台命令"); ParentPlatform parentPlatform = storager.queryParentPlatById(platformId); cmderFroPlatform.unregister(parentPlatform, null, null); @@ -322,6 +329,14 @@ restartThread.setDaemon(false); restartThread.start(); } else { // 远程启动指定设备 } } if (!XmlUtil.isEmpty(XmlUtil.getText(rootElement,"PTZCmd")) && !deviceId.equals(targetGBId)) { String cmdString = XmlUtil.getText(rootElement,"PTZCmd"); Device device = storager.queryVideoDeviceByPlatformIdAndChannelId(platformId, deviceId); cmder.fronEndCmd(device, deviceId, cmdString); } } } catch (ParseException | SipException | InvalidArgumentException | DocumentException e) {