Commit 32fbfd8d1e77e8745482b6df487f7f0acdd2721b
1 parent
a2bea34a
增加上级平台查询DeviceInfo和DeviceStatus的响应功能
Showing
1 changed file
with
75 additions
and
21 deletions
src/main/java/com/genersoft/iot/vmp/gb28181/transmit/request/impl/MessageRequestProcessor.java
| ... | ... | @@ -5,6 +5,7 @@ import java.text.ParseException; |
| 5 | 5 | import java.util.*; |
| 6 | 6 | |
| 7 | 7 | import javax.sip.header.FromHeader; |
| 8 | +import javax.sip.header.HeaderAddress; | |
| 8 | 9 | import javax.sip.InvalidArgumentException; |
| 9 | 10 | import javax.sip.RequestEvent; |
| 10 | 11 | import javax.sip.SipException; |
| ... | ... | @@ -12,6 +13,7 @@ import javax.sip.message.Request; |
| 12 | 13 | import javax.sip.message.Response; |
| 13 | 14 | |
| 14 | 15 | import com.alibaba.fastjson.JSONObject; |
| 16 | +import com.genersoft.iot.vmp.VManageBootstrap; | |
| 15 | 17 | import com.genersoft.iot.vmp.common.StreamInfo; |
| 16 | 18 | import com.genersoft.iot.vmp.common.VideoManagerConstants; |
| 17 | 19 | import com.genersoft.iot.vmp.conf.UserSetup; |
| ... | ... | @@ -114,10 +116,10 @@ public class MessageRequestProcessor extends SIPRequestAbstractProcessor { |
| 114 | 116 | logger.info("接收到Catalog消息"); |
| 115 | 117 | processMessageCatalogList(evt); |
| 116 | 118 | } else if (MESSAGE_DEVICE_INFO.equals(cmd)) { |
| 117 | - logger.info("接收到DeviceInfo消息"); | |
| 119 | + //DeviceInfo消息处理 | |
| 118 | 120 | processMessageDeviceInfo(evt); |
| 119 | 121 | } else if (MESSAGE_DEVICE_STATUS.equals(cmd)) { |
| 120 | - logger.info("接收到DeviceStatus消息"); | |
| 122 | + // DeviceStatus消息处理 | |
| 121 | 123 | processMessageDeviceStatus(evt); |
| 122 | 124 | } else if (MESSAGE_DEVICE_CONTROL.equals(cmd)) { |
| 123 | 125 | logger.info("接收到DeviceControl消息"); |
| ... | ... | @@ -211,27 +213,48 @@ public class MessageRequestProcessor extends SIPRequestAbstractProcessor { |
| 211 | 213 | private void processMessageDeviceStatus(RequestEvent evt) { |
| 212 | 214 | try { |
| 213 | 215 | Element rootElement = getRootElement(evt); |
| 214 | - String deviceId = XmlUtil.getText(rootElement, "DeviceID"); | |
| 215 | - // 检查设备是否存在, 不存在则不回复 | |
| 216 | - if (storager.exists(deviceId)) { | |
| 217 | - // 回复200 OK | |
| 218 | - responseAck(evt); | |
| 219 | - JSONObject json = new JSONObject(); | |
| 220 | - XmlUtil.node2Json(rootElement, json); | |
| 221 | - if (logger.isDebugEnabled()) { | |
| 222 | - logger.debug(json.toJSONString()); | |
| 223 | - } | |
| 224 | - RequestMessage msg = new RequestMessage(); | |
| 225 | - msg.setDeviceId(deviceId); | |
| 226 | - msg.setType(DeferredResultHolder.CALLBACK_CMD_DEVICESTATUS); | |
| 227 | - msg.setData(json); | |
| 228 | - deferredResultHolder.invokeResult(msg); | |
| 216 | + String name = rootElement.getName(); | |
| 217 | + Element deviceIdElement = rootElement.element("DeviceID"); | |
| 218 | + String deviceId = deviceIdElement.getText(); | |
| 229 | 219 | |
| 230 | - if (offLineDetector.isOnline(deviceId)) { | |
| 231 | - publisher.onlineEventPublish(deviceId, VideoManagerConstants.EVENT_ONLINE_KEEPLIVE); | |
| 220 | + if (name.equalsIgnoreCase("Query")) { // 区分是Response——查询响应,还是Query——查询请求 | |
| 221 | + logger.info("接收到DeviceStatus查询消息"); | |
| 222 | + FromHeader fromHeader = (FromHeader) evt.getRequest().getHeader(FromHeader.NAME); | |
| 223 | + String platformId = ((SipUri) fromHeader.getAddress().getURI()).getUser(); | |
| 224 | + if (platformId == null) { | |
| 225 | + response404Ack(evt); | |
| 226 | + return; | |
| 232 | 227 | } else { |
| 228 | + // 回复200 OK | |
| 229 | + responseAck(evt); | |
| 230 | + String sn = rootElement.element("SN").getText(); | |
| 231 | + ParentPlatform parentPlatform = storager.queryParentPlatById(platformId); | |
| 232 | + cmderFroPlatform.deviceStatusResponse(parentPlatform, sn, fromHeader.getTag()); | |
| 233 | + } | |
| 234 | + } else { | |
| 235 | + logger.info("接收到DeviceStatus应答消息"); | |
| 236 | + // 检查设备是否存在, 不存在则不回复 | |
| 237 | + if (storager.exists(deviceId)) { | |
| 238 | + // 回复200 OK | |
| 239 | + responseAck(evt); | |
| 240 | + JSONObject json = new JSONObject(); | |
| 241 | + XmlUtil.node2Json(rootElement, json); | |
| 242 | + if (logger.isDebugEnabled()) { | |
| 243 | + logger.debug(json.toJSONString()); | |
| 244 | + } | |
| 245 | + RequestMessage msg = new RequestMessage(); | |
| 246 | + msg.setDeviceId(deviceId); | |
| 247 | + msg.setType(DeferredResultHolder.CALLBACK_CMD_DEVICESTATUS); | |
| 248 | + msg.setData(json); | |
| 249 | + deferredResultHolder.invokeResult(msg); | |
| 250 | + | |
| 251 | + if (offLineDetector.isOnline(deviceId)) { | |
| 252 | + publisher.onlineEventPublish(deviceId, VideoManagerConstants.EVENT_ONLINE_KEEPLIVE); | |
| 253 | + } else { | |
| 254 | + } | |
| 233 | 255 | } |
| 234 | 256 | } |
| 257 | + | |
| 235 | 258 | } catch (ParseException | SipException | InvalidArgumentException | DocumentException e) { |
| 236 | 259 | e.printStackTrace(); |
| 237 | 260 | } |
| ... | ... | @@ -263,6 +286,25 @@ public class MessageRequestProcessor extends SIPRequestAbstractProcessor { |
| 263 | 286 | deferredResultHolder.invokeResult(msg); |
| 264 | 287 | } else { |
| 265 | 288 | // 此处是上级发出的DeviceControl指令 |
| 289 | + if (XmlUtil.getText(rootElement, "TeleBoot").equals("Boot") && false) { // 远程启动功能:需要在重新启动程序后先对SipStack解绑 | |
| 290 | + String platformId = ((SipUri) ((HeaderAddress) evt.getRequest().getHeader(FromHeader.NAME)).getAddress().getURI()).getUser(); | |
| 291 | + logger.info("执行远程启动命令"); | |
| 292 | + ParentPlatform parentPlatform = storager.queryParentPlatById(platformId); | |
| 293 | + cmderFroPlatform.unregister(parentPlatform, null, null); | |
| 294 | + | |
| 295 | + Thread restartThread = new Thread(new Runnable() { | |
| 296 | + @Override | |
| 297 | + public void run() { | |
| 298 | + try { | |
| 299 | + Thread.sleep(1000); | |
| 300 | + VManageBootstrap.restart(); | |
| 301 | + } catch (InterruptedException ignored) { | |
| 302 | + } | |
| 303 | + } | |
| 304 | + }); | |
| 305 | + restartThread.setDaemon(false); | |
| 306 | + restartThread.start(); | |
| 307 | + } | |
| 266 | 308 | } |
| 267 | 309 | } catch (ParseException | SipException | InvalidArgumentException | DocumentException e) { |
| 268 | 310 | e.printStackTrace(); |
| ... | ... | @@ -374,9 +416,21 @@ public class MessageRequestProcessor extends SIPRequestAbstractProcessor { |
| 374 | 416 | Element deviceIdElement = rootElement.element("DeviceID"); |
| 375 | 417 | String deviceId = deviceIdElement.getTextTrim().toString(); |
| 376 | 418 | if (requestName.equals("Query")) { |
| 377 | - // 回复200 OK | |
| 378 | - responseAck(evt); | |
| 419 | + logger.info("接收到DeviceInfo查询消息"); | |
| 420 | + FromHeader fromHeader = (FromHeader) evt.getRequest().getHeader(FromHeader.NAME); | |
| 421 | + String platformId = ((SipUri) fromHeader.getAddress().getURI()).getUser(); | |
| 422 | + if (platformId == null) { | |
| 423 | + response404Ack(evt); | |
| 424 | + return; | |
| 425 | + } else { | |
| 426 | + // 回复200 OK | |
| 427 | + responseAck(evt); | |
| 428 | + String sn = rootElement.element("SN").getText(); | |
| 429 | + ParentPlatform parentPlatform = storager.queryParentPlatById(platformId); | |
| 430 | + cmderFroPlatform.deviceInfoResponse(parentPlatform, sn, fromHeader.getTag()); | |
| 431 | + } | |
| 379 | 432 | } else { |
| 433 | + logger.info("接收到DeviceInfo应答消息"); | |
| 380 | 434 | Device device = storager.queryVideoDevice(deviceId); |
| 381 | 435 | if (device == null) { |
| 382 | 436 | return; | ... | ... |