Commit f1e902af7fd88138c76abcf1a17d04efb8d3293a

Authored by 648540858
1 parent f1fed36c

支持级联移动位置订阅通知转发

src/main/java/com/genersoft/iot/vmp/gb28181/bean/SubscribeHolder.java
@@ -103,6 +103,16 @@ public class SubscribeHolder { @@ -103,6 +103,16 @@ public class SubscribeHolder {
103 return platforms; 103 return platforms;
104 } 104 }
105 105
  106 + public List<String> getAllMobilePositionSubscribePlatform() {
  107 + List<String> platforms = new ArrayList<>();
  108 + if(!mobilePositionMap.isEmpty()) {
  109 + for (String key : mobilePositionMap.keySet()) {
  110 + platforms.add(mobilePositionMap.get(key).getId());
  111 + }
  112 + }
  113 + return platforms;
  114 + }
  115 +
106 public void removeAllSubscribe(String platformId) { 116 public void removeAllSubscribe(String platformId) {
107 removeMobilePositionSubscribe(platformId); 117 removeMobilePositionSubscribe(platformId);
108 removeCatalogSubscribe(platformId); 118 removeCatalogSubscribe(platformId);
src/main/java/com/genersoft/iot/vmp/gb28181/event/EventPublisher.java
@@ -4,6 +4,7 @@ import com.genersoft.iot.vmp.gb28181.bean.*; @@ -4,6 +4,7 @@ import com.genersoft.iot.vmp.gb28181.bean.*;
4 import com.genersoft.iot.vmp.gb28181.event.device.RequestTimeoutEvent; 4 import com.genersoft.iot.vmp.gb28181.event.device.RequestTimeoutEvent;
5 import com.genersoft.iot.vmp.gb28181.event.record.RecordEndEvent; 5 import com.genersoft.iot.vmp.gb28181.event.record.RecordEndEvent;
6 import com.genersoft.iot.vmp.gb28181.event.subscribe.catalog.CatalogEvent; 6 import com.genersoft.iot.vmp.gb28181.event.subscribe.catalog.CatalogEvent;
  7 +import com.genersoft.iot.vmp.gb28181.event.subscribe.mobilePosition.MobilePositionEvent;
7 import com.genersoft.iot.vmp.media.zlm.event.ZLMOfflineEvent; 8 import com.genersoft.iot.vmp.media.zlm.event.ZLMOfflineEvent;
8 import com.genersoft.iot.vmp.media.zlm.event.ZLMOnlineEvent; 9 import com.genersoft.iot.vmp.media.zlm.event.ZLMOnlineEvent;
9 import org.springframework.beans.factory.annotation.Autowired; 10 import org.springframework.beans.factory.annotation.Autowired;
@@ -94,6 +95,13 @@ public class EventPublisher { @@ -94,6 +95,13 @@ public class EventPublisher {
94 } 95 }
95 96
96 97
  98 + public void mobilePositionEventPublish(MobilePosition mobilePosition) {
  99 + MobilePositionEvent event = new MobilePositionEvent(this);
  100 + event.setMobilePosition(mobilePosition);
  101 + applicationEventPublisher.publishEvent(event);
  102 + }
  103 +
  104 +
97 public void catalogEventPublishForStream(String platformId, List<GbStream> gbStreams, String type) { 105 public void catalogEventPublishForStream(String platformId, List<GbStream> gbStreams, String type) {
98 CatalogEvent outEvent = new CatalogEvent(this); 106 CatalogEvent outEvent = new CatalogEvent(this);
99 outEvent.setGbStreams(gbStreams); 107 outEvent.setGbStreams(gbStreams);
src/main/java/com/genersoft/iot/vmp/gb28181/event/subscribe/mobilePosition/MobilePositionEvent.java 0 → 100755
  1 +package com.genersoft.iot.vmp.gb28181.event.subscribe.mobilePosition;
  2 +
  3 +import com.genersoft.iot.vmp.gb28181.bean.MobilePosition;
  4 +import org.springframework.context.ApplicationEvent;
  5 +
  6 +public class MobilePositionEvent extends ApplicationEvent {
  7 + public MobilePositionEvent(Object source) {
  8 + super(source);
  9 + }
  10 +
  11 + private MobilePosition mobilePosition;
  12 +
  13 + public MobilePosition getMobilePosition() {
  14 + return mobilePosition;
  15 + }
  16 +
  17 + public void setMobilePosition(MobilePosition mobilePosition) {
  18 + this.mobilePosition = mobilePosition;
  19 + }
  20 +}
src/main/java/com/genersoft/iot/vmp/gb28181/event/subscribe/mobilePosition/MobilePositionEventLister.java 0 → 100755
  1 +package com.genersoft.iot.vmp.gb28181.event.subscribe.mobilePosition;
  2 +
  3 +import com.genersoft.iot.vmp.gb28181.bean.ParentPlatform;
  4 +import com.genersoft.iot.vmp.gb28181.bean.SubscribeHolder;
  5 +import com.genersoft.iot.vmp.gb28181.bean.SubscribeInfo;
  6 +import com.genersoft.iot.vmp.gb28181.transmit.cmd.impl.SIPCommanderFroPlatform;
  7 +import com.genersoft.iot.vmp.service.bean.GPSMsgInfo;
  8 +import com.genersoft.iot.vmp.storager.IVideoManagerStorage;
  9 +import org.slf4j.Logger;
  10 +import org.slf4j.LoggerFactory;
  11 +import org.springframework.beans.factory.annotation.Autowired;
  12 +import org.springframework.context.ApplicationListener;
  13 +import org.springframework.stereotype.Component;
  14 +
  15 +import javax.sip.InvalidArgumentException;
  16 +import javax.sip.SipException;
  17 +import java.text.ParseException;
  18 +import java.util.List;
  19 +
  20 +/**
  21 + * 移动位置通知消息转发
  22 + */
  23 +@Component
  24 +public class MobilePositionEventLister implements ApplicationListener<MobilePositionEvent> {
  25 +
  26 + private final static Logger logger = LoggerFactory.getLogger(MobilePositionEventLister.class);
  27 +
  28 + @Autowired
  29 + private IVideoManagerStorage storager;
  30 +
  31 + @Autowired
  32 + private SIPCommanderFroPlatform sipCommanderFroPlatform;
  33 +
  34 + @Autowired
  35 + private SubscribeHolder subscribeHolder;
  36 +
  37 + @Override
  38 + public void onApplicationEvent(MobilePositionEvent event) {
  39 + // 获取所用订阅
  40 + List<String> platforms = subscribeHolder.getAllMobilePositionSubscribePlatform();
  41 + if (platforms.isEmpty()) {
  42 + return;
  43 + }
  44 + List<ParentPlatform> parentPlatformsForGB = storager.queryPlatFormListForGBWithGBId(event.getMobilePosition().getChannelId(), platforms);
  45 +
  46 + for (ParentPlatform platform : parentPlatformsForGB) {
  47 + logger.info("[向上级发送MobilePosition] 通道:{},平台:{}, 位置: {}:{}", event.getMobilePosition().getChannelId(),
  48 + platform.getServerGBId(), event.getMobilePosition().getLongitude(), event.getMobilePosition().getLatitude());
  49 + SubscribeInfo subscribe = subscribeHolder.getMobilePositionSubscribe(platform.getServerGBId());
  50 + try {
  51 + sipCommanderFroPlatform.sendNotifyMobilePosition(platform, GPSMsgInfo.getInstance(event.getMobilePosition()),
  52 + subscribe);
  53 + } catch (InvalidArgumentException | ParseException | NoSuchFieldException | SipException |
  54 + IllegalAccessException e) {
  55 + logger.error("[命令发送失败] 国标级联 Catalog通知: {}", e.getMessage());
  56 + }
  57 + }
  58 +
  59 + }
  60 +}
  61 +
0 \ No newline at end of file 62 \ No newline at end of file
src/main/java/com/genersoft/iot/vmp/gb28181/transmit/event/request/impl/NotifyRequestProcessor.java
1 package com.genersoft.iot.vmp.gb28181.transmit.event.request.impl; 1 package com.genersoft.iot.vmp.gb28181.transmit.event.request.impl;
2 2
3 -import com.alibaba.fastjson2.JSONObject;  
4 -import com.genersoft.iot.vmp.conf.CivilCodeFileConf;  
5 import com.genersoft.iot.vmp.conf.SipConfig; 3 import com.genersoft.iot.vmp.conf.SipConfig;
6 import com.genersoft.iot.vmp.conf.UserSetting; 4 import com.genersoft.iot.vmp.conf.UserSetting;
7 import com.genersoft.iot.vmp.gb28181.bean.*; 5 import com.genersoft.iot.vmp.gb28181.bean.*;
@@ -78,9 +76,6 @@ public class NotifyRequestProcessor extends SIPRequestProcessorParent implements @@ -78,9 +76,6 @@ public class NotifyRequestProcessor extends SIPRequestProcessorParent implements
78 @Autowired 76 @Autowired
79 private NotifyRequestForCatalogProcessor notifyRequestForCatalogProcessor; 77 private NotifyRequestForCatalogProcessor notifyRequestForCatalogProcessor;
80 78
81 - @Autowired  
82 - private CivilCodeFileConf civilCodeFileConf;  
83 -  
84 private ConcurrentLinkedQueue<HandlerCatchData> taskQueue = new ConcurrentLinkedQueue<>(); 79 private ConcurrentLinkedQueue<HandlerCatchData> taskQueue = new ConcurrentLinkedQueue<>();
85 80
86 @Qualifier("taskExecutor") 81 @Qualifier("taskExecutor")
@@ -98,7 +93,6 @@ public class NotifyRequestProcessor extends SIPRequestProcessorParent implements @@ -98,7 +93,6 @@ public class NotifyRequestProcessor extends SIPRequestProcessorParent implements
98 @Override 93 @Override
99 public void process(RequestEvent evt) { 94 public void process(RequestEvent evt) {
100 try { 95 try {
101 -  
102 if (taskQueue.size() >= userSetting.getMaxNotifyCountQueue()) { 96 if (taskQueue.size() >= userSetting.getMaxNotifyCountQueue()) {
103 responseAck((SIPRequest) evt.getRequest(), Response.BUSY_HERE, null, null); 97 responseAck((SIPRequest) evt.getRequest(), Response.BUSY_HERE, null, null);
104 logger.error("[notify] 待处理消息队列已满 {},返回486 BUSY_HERE,消息不做处理", userSetting.getMaxNotifyCountQueue()); 98 logger.error("[notify] 待处理消息队列已满 {},返回486 BUSY_HERE,消息不做处理", userSetting.getMaxNotifyCountQueue());
@@ -234,25 +228,8 @@ public class NotifyRequestProcessor extends SIPRequestProcessorParent implements @@ -234,25 +228,8 @@ public class NotifyRequestProcessor extends SIPRequestProcessorParent implements
234 mobilePosition.setLongitudeGcj02(deviceChannel.getLongitudeGcj02()); 228 mobilePosition.setLongitudeGcj02(deviceChannel.getLongitudeGcj02());
235 mobilePosition.setLatitudeGcj02(deviceChannel.getLatitudeGcj02()); 229 mobilePosition.setLatitudeGcj02(deviceChannel.getLatitudeGcj02());
236 230
237 - if (userSetting.getSavePositionHistory()) {  
238 - storager.insertMobilePosition(mobilePosition);  
239 - } 231 + deviceChannelService.updateChannelGPS(device, deviceChannel, mobilePosition);
240 232
241 - storager.updateChannelPosition(deviceChannel);  
242 - // 向关联了该通道并且开启移动位置订阅的上级平台发送移动位置订阅消息  
243 -  
244 -  
245 - // 发送redis消息。 通知位置信息的变化  
246 - JSONObject jsonObject = new JSONObject();  
247 - jsonObject.put("time", DateUtil.yyyy_MM_dd_HH_mm_ssToISO8601(mobilePosition.getTime()));  
248 - jsonObject.put("serial", deviceId);  
249 - jsonObject.put("code", channelId);  
250 - jsonObject.put("longitude", mobilePosition.getLongitude());  
251 - jsonObject.put("latitude", mobilePosition.getLatitude());  
252 - jsonObject.put("altitude", mobilePosition.getAltitude());  
253 - jsonObject.put("direction", mobilePosition.getDirection());  
254 - jsonObject.put("speed", mobilePosition.getSpeed());  
255 - redisCatchStorage.sendMobilePositionMsg(jsonObject);  
256 } catch (DocumentException e) { 233 } catch (DocumentException e) {
257 logger.error("未处理的异常 ", e); 234 logger.error("未处理的异常 ", e);
258 } 235 }
@@ -340,25 +317,8 @@ public class NotifyRequestProcessor extends SIPRequestProcessorParent implements @@ -340,25 +317,8 @@ public class NotifyRequestProcessor extends SIPRequestProcessorParent implements
340 mobilePosition.setLongitudeGcj02(deviceChannel.getLongitudeGcj02()); 317 mobilePosition.setLongitudeGcj02(deviceChannel.getLongitudeGcj02());
341 mobilePosition.setLatitudeGcj02(deviceChannel.getLatitudeGcj02()); 318 mobilePosition.setLatitudeGcj02(deviceChannel.getLatitudeGcj02());
342 319
343 - if (userSetting.getSavePositionHistory()) {  
344 - storager.insertMobilePosition(mobilePosition);  
345 - }  
346 -  
347 - storager.updateChannelPosition(deviceChannel);  
348 - // 发送redis消息。 通知位置信息的变化  
349 - JSONObject jsonObject = new JSONObject();  
350 - jsonObject.put("time", DateUtil.yyyy_MM_dd_HH_mm_ssToISO8601(mobilePosition.getTime()));  
351 - jsonObject.put("serial", deviceChannel.getDeviceId());  
352 - jsonObject.put("code", deviceChannel.getChannelId());  
353 - jsonObject.put("longitude", mobilePosition.getLongitude());  
354 - jsonObject.put("latitude", mobilePosition.getLatitude());  
355 - jsonObject.put("altitude", mobilePosition.getAltitude());  
356 - jsonObject.put("direction", mobilePosition.getDirection());  
357 - jsonObject.put("speed", mobilePosition.getSpeed());  
358 - redisCatchStorage.sendMobilePositionMsg(jsonObject);  
359 - 320 + deviceChannelService.updateChannelGPS(device, deviceChannel, mobilePosition);
360 } 321 }
361 - // TODO: 需要实现存储报警信息、报警分类  
362 322
363 // 回复200 OK 323 // 回复200 OK
364 if (redisCatchStorage.deviceIsOnline(deviceId)) { 324 if (redisCatchStorage.deviceIsOnline(deviceId)) {
src/main/java/com/genersoft/iot/vmp/gb28181/transmit/event/request/impl/message/notify/cmd/AlarmNotifyMessageHandler.java
@@ -75,6 +75,9 @@ public class AlarmNotifyMessageHandler extends SIPRequestProcessorParent impleme @@ -75,6 +75,9 @@ public class AlarmNotifyMessageHandler extends SIPRequestProcessorParent impleme
75 @Autowired 75 @Autowired
76 private ThreadPoolTaskExecutor taskExecutor; 76 private ThreadPoolTaskExecutor taskExecutor;
77 77
  78 + @Autowired
  79 + private EventPublisher eventPublisher;
  80 +
78 81
79 @Override 82 @Override
80 public void afterPropertiesSet() throws Exception { 83 public void afterPropertiesSet() throws Exception {
@@ -158,22 +161,7 @@ public class AlarmNotifyMessageHandler extends SIPRequestProcessorParent impleme @@ -158,22 +161,7 @@ public class AlarmNotifyMessageHandler extends SIPRequestProcessorParent impleme
158 mobilePosition.setLongitudeGcj02(deviceChannel.getLongitudeGcj02()); 161 mobilePosition.setLongitudeGcj02(deviceChannel.getLongitudeGcj02());
159 mobilePosition.setLatitudeGcj02(deviceChannel.getLatitudeGcj02()); 162 mobilePosition.setLatitudeGcj02(deviceChannel.getLatitudeGcj02());
160 163
161 - if (userSetting.getSavePositionHistory()) {  
162 - storager.insertMobilePosition(mobilePosition);  
163 - }  
164 - storager.updateChannelPosition(deviceChannel);  
165 -  
166 - // 发送redis消息。 通知位置信息的变化  
167 - JSONObject jsonObject = new JSONObject();  
168 - jsonObject.put("time", DateUtil.yyyy_MM_dd_HH_mm_ssToISO8601(mobilePosition.getTime()));  
169 - jsonObject.put("serial", deviceChannel.getDeviceId());  
170 - jsonObject.put("code", deviceChannel.getChannelId());  
171 - jsonObject.put("longitude", mobilePosition.getLongitude());  
172 - jsonObject.put("latitude", mobilePosition.getLatitude());  
173 - jsonObject.put("altitude", mobilePosition.getAltitude());  
174 - jsonObject.put("direction", mobilePosition.getDirection());  
175 - jsonObject.put("speed", mobilePosition.getSpeed());  
176 - redisCatchStorage.sendMobilePositionMsg(jsonObject); 164 + deviceChannelService.updateChannelGPS(device, deviceChannel, mobilePosition);
177 } 165 }
178 } 166 }
179 if (!ObjectUtils.isEmpty(deviceAlarm.getDeviceId())) { 167 if (!ObjectUtils.isEmpty(deviceAlarm.getDeviceId())) {
src/main/java/com/genersoft/iot/vmp/gb28181/transmit/event/request/impl/message/notify/cmd/MobilePositionNotifyMessageHandler.java
1 package com.genersoft.iot.vmp.gb28181.transmit.event.request.impl.message.notify.cmd; 1 package com.genersoft.iot.vmp.gb28181.transmit.event.request.impl.message.notify.cmd;
2 2
3 -import com.alibaba.fastjson2.JSONObject;  
4 import com.genersoft.iot.vmp.conf.UserSetting; 3 import com.genersoft.iot.vmp.conf.UserSetting;
5 import com.genersoft.iot.vmp.gb28181.bean.*; 4 import com.genersoft.iot.vmp.gb28181.bean.*;
  5 +import com.genersoft.iot.vmp.gb28181.event.EventPublisher;
6 import com.genersoft.iot.vmp.gb28181.transmit.event.request.SIPRequestProcessorParent; 6 import com.genersoft.iot.vmp.gb28181.transmit.event.request.SIPRequestProcessorParent;
7 import com.genersoft.iot.vmp.gb28181.transmit.event.request.impl.message.IMessageHandler; 7 import com.genersoft.iot.vmp.gb28181.transmit.event.request.impl.message.IMessageHandler;
8 import com.genersoft.iot.vmp.gb28181.transmit.event.request.impl.message.notify.NotifyMessageHandler; 8 import com.genersoft.iot.vmp.gb28181.transmit.event.request.impl.message.notify.NotifyMessageHandler;
@@ -57,6 +57,9 @@ public class MobilePositionNotifyMessageHandler extends SIPRequestProcessorParen @@ -57,6 +57,9 @@ public class MobilePositionNotifyMessageHandler extends SIPRequestProcessorParen
57 @Autowired 57 @Autowired
58 private IDeviceChannelService deviceChannelService; 58 private IDeviceChannelService deviceChannelService;
59 59
  60 + @Autowired
  61 + private EventPublisher eventPublisher;
  62 +
60 private ConcurrentLinkedQueue<SipMsgInfo> taskQueue = new ConcurrentLinkedQueue<>(); 63 private ConcurrentLinkedQueue<SipMsgInfo> taskQueue = new ConcurrentLinkedQueue<>();
61 64
62 @Qualifier("taskExecutor") 65 @Qualifier("taskExecutor")
@@ -137,22 +140,7 @@ public class MobilePositionNotifyMessageHandler extends SIPRequestProcessorParen @@ -137,22 +140,7 @@ public class MobilePositionNotifyMessageHandler extends SIPRequestProcessorParen
137 mobilePosition.setLongitudeGcj02(deviceChannel.getLongitudeGcj02()); 140 mobilePosition.setLongitudeGcj02(deviceChannel.getLongitudeGcj02());
138 mobilePosition.setLatitudeGcj02(deviceChannel.getLatitudeGcj02()); 141 mobilePosition.setLatitudeGcj02(deviceChannel.getLatitudeGcj02());
139 142
140 - if (userSetting.getSavePositionHistory()) {  
141 - storager.insertMobilePosition(mobilePosition);  
142 - }  
143 - storager.updateChannelPosition(deviceChannel);  
144 -  
145 - // 发送redis消息。 通知位置信息的变化  
146 - JSONObject jsonObject = new JSONObject();  
147 - jsonObject.put("time", DateUtil.yyyy_MM_dd_HH_mm_ssToISO8601(mobilePosition.getTime()));  
148 - jsonObject.put("serial", deviceChannel.getDeviceId());  
149 - jsonObject.put("code", deviceChannel.getChannelId());  
150 - jsonObject.put("longitude", mobilePosition.getLongitude());  
151 - jsonObject.put("latitude", mobilePosition.getLatitude());  
152 - jsonObject.put("altitude", mobilePosition.getAltitude());  
153 - jsonObject.put("direction", mobilePosition.getDirection());  
154 - jsonObject.put("speed", mobilePosition.getSpeed());  
155 - redisCatchStorage.sendMobilePositionMsg(jsonObject); 143 + deviceChannelService.updateChannelGPS(device, deviceChannel, mobilePosition);
156 144
157 } catch (DocumentException e) { 145 } catch (DocumentException e) {
158 logger.error("未处理的异常 ", e); 146 logger.error("未处理的异常 ", e);
src/main/java/com/genersoft/iot/vmp/gb28181/transmit/event/request/impl/message/response/cmd/MobilePositionResponseMessageHandler.java
1 package com.genersoft.iot.vmp.gb28181.transmit.event.request.impl.message.response.cmd; 1 package com.genersoft.iot.vmp.gb28181.transmit.event.request.impl.message.response.cmd;
2 2
3 -import com.alibaba.fastjson2.JSONObject;  
4 import com.genersoft.iot.vmp.conf.UserSetting; 3 import com.genersoft.iot.vmp.conf.UserSetting;
5 import com.genersoft.iot.vmp.gb28181.bean.Device; 4 import com.genersoft.iot.vmp.gb28181.bean.Device;
6 import com.genersoft.iot.vmp.gb28181.bean.DeviceChannel; 5 import com.genersoft.iot.vmp.gb28181.bean.DeviceChannel;
@@ -131,11 +130,7 @@ public class MobilePositionResponseMessageHandler extends SIPRequestProcessorPar @@ -131,11 +130,7 @@ public class MobilePositionResponseMessageHandler extends SIPRequestProcessorPar
131 mobilePosition.setLongitudeGcj02(deviceChannel.getLongitudeGcj02()); 130 mobilePosition.setLongitudeGcj02(deviceChannel.getLongitudeGcj02());
132 mobilePosition.setLatitudeGcj02(deviceChannel.getLatitudeGcj02()); 131 mobilePosition.setLatitudeGcj02(deviceChannel.getLatitudeGcj02());
133 132
134 - if (userSetting.getSavePositionHistory()) {  
135 - storager.insertMobilePosition(mobilePosition);  
136 - }  
137 -  
138 - storager.updateChannelPosition(deviceChannel); 133 + deviceChannelService.updateChannelGPS(device, deviceChannel, mobilePosition);
139 134
140 String key = DeferredResultHolder.CALLBACK_CMD_MOBILE_POSITION + device.getDeviceId(); 135 String key = DeferredResultHolder.CALLBACK_CMD_MOBILE_POSITION + device.getDeviceId();
141 RequestMessage msg = new RequestMessage(); 136 RequestMessage msg = new RequestMessage();
@@ -143,17 +138,6 @@ public class MobilePositionResponseMessageHandler extends SIPRequestProcessorPar @@ -143,17 +138,6 @@ public class MobilePositionResponseMessageHandler extends SIPRequestProcessorPar
143 msg.setData(mobilePosition); 138 msg.setData(mobilePosition);
144 resultHolder.invokeAllResult(msg); 139 resultHolder.invokeAllResult(msg);
145 140
146 - // 发送redis消息。 通知位置信息的变化  
147 - JSONObject jsonObject = new JSONObject();  
148 - jsonObject.put("time", DateUtil.yyyy_MM_dd_HH_mm_ssToISO8601(mobilePosition.getTime()));  
149 - jsonObject.put("serial", deviceChannel.getDeviceId());  
150 - jsonObject.put("code", deviceChannel.getChannelId());  
151 - jsonObject.put("longitude", mobilePosition.getLongitude());  
152 - jsonObject.put("latitude", mobilePosition.getLatitude());  
153 - jsonObject.put("altitude", mobilePosition.getAltitude());  
154 - jsonObject.put("direction", mobilePosition.getDirection());  
155 - jsonObject.put("speed", mobilePosition.getSpeed());  
156 - redisCatchStorage.sendMobilePositionMsg(jsonObject);  
157 //回复 200 OK 141 //回复 200 OK
158 try { 142 try {
159 responseAck(request, Response.OK); 143 responseAck(request, Response.OK);
src/main/java/com/genersoft/iot/vmp/service/IDeviceChannelService.java
@@ -2,6 +2,7 @@ package com.genersoft.iot.vmp.service; @@ -2,6 +2,7 @@ package com.genersoft.iot.vmp.service;
2 2
3 import com.genersoft.iot.vmp.gb28181.bean.Device; 3 import com.genersoft.iot.vmp.gb28181.bean.Device;
4 import com.genersoft.iot.vmp.gb28181.bean.DeviceChannel; 4 import com.genersoft.iot.vmp.gb28181.bean.DeviceChannel;
  5 +import com.genersoft.iot.vmp.gb28181.bean.MobilePosition;
5 import com.genersoft.iot.vmp.vmanager.bean.ResourceBaseInfo; 6 import com.genersoft.iot.vmp.vmanager.bean.ResourceBaseInfo;
6 import com.genersoft.iot.vmp.vmanager.gb28181.platform.bean.ChannelReduce; 7 import com.genersoft.iot.vmp.vmanager.gb28181.platform.bean.ChannelReduce;
7 8
@@ -92,4 +93,9 @@ public interface IDeviceChannelService { @@ -92,4 +93,9 @@ public interface IDeviceChannelService {
92 * 修改通道的码流类型 93 * 修改通道的码流类型
93 */ 94 */
94 void updateChannelStreamIdentification(DeviceChannel channel); 95 void updateChannelStreamIdentification(DeviceChannel channel);
  96 +
  97 + List<DeviceChannel> queryChaneListByDeviceId(String deviceId);
  98 +
  99 + void updateChannelGPS(Device device, DeviceChannel deviceChannel, MobilePosition mobilePosition);
  100 +
95 } 101 }
src/main/java/com/genersoft/iot/vmp/service/bean/GPSMsgInfo.java
1 package com.genersoft.iot.vmp.service.bean; 1 package com.genersoft.iot.vmp.service.bean;
2 2
  3 +import com.genersoft.iot.vmp.gb28181.bean.MobilePosition;
  4 +import com.genersoft.iot.vmp.utils.DateUtil;
  5 +
3 public class GPSMsgInfo { 6 public class GPSMsgInfo {
4 7
5 /** 8 /**
@@ -39,6 +42,18 @@ public class GPSMsgInfo { @@ -39,6 +42,18 @@ public class GPSMsgInfo {
39 42
40 private boolean stored; 43 private boolean stored;
41 44
  45 + public static GPSMsgInfo getInstance(MobilePosition mobilePosition) {
  46 + GPSMsgInfo gpsMsgInfo = new GPSMsgInfo();
  47 + gpsMsgInfo.setId(mobilePosition.getChannelId());
  48 + gpsMsgInfo.setAltitude(mobilePosition.getAltitude() + "");
  49 + gpsMsgInfo.setLng(mobilePosition.getLongitude());
  50 + gpsMsgInfo.setLat(mobilePosition.getLatitude());
  51 + gpsMsgInfo.setSpeed(mobilePosition.getSpeed());
  52 + gpsMsgInfo.setDirection(mobilePosition.getDirection() + "");
  53 + gpsMsgInfo.setTime(DateUtil.yyyy_MM_dd_HH_mm_ssToISO8601(mobilePosition.getTime()));
  54 + return gpsMsgInfo;
  55 + }
  56 +
42 57
43 public String getId() { 58 public String getId() {
44 return id; 59 return id;
src/main/java/com/genersoft/iot/vmp/service/impl/DeviceChannelServiceImpl.java
1 package com.genersoft.iot.vmp.service.impl; 1 package com.genersoft.iot.vmp.service.impl;
2 2
  3 +import com.alibaba.fastjson2.JSONObject;
3 import com.baomidou.dynamic.datasource.annotation.DS; 4 import com.baomidou.dynamic.datasource.annotation.DS;
4 import com.genersoft.iot.vmp.common.InviteInfo; 5 import com.genersoft.iot.vmp.common.InviteInfo;
5 import com.genersoft.iot.vmp.common.InviteSessionType; 6 import com.genersoft.iot.vmp.common.InviteSessionType;
  7 +import com.genersoft.iot.vmp.conf.UserSetting;
6 import com.genersoft.iot.vmp.gb28181.bean.Device; 8 import com.genersoft.iot.vmp.gb28181.bean.Device;
7 import com.genersoft.iot.vmp.gb28181.bean.DeviceChannel; 9 import com.genersoft.iot.vmp.gb28181.bean.DeviceChannel;
  10 +import com.genersoft.iot.vmp.gb28181.bean.MobilePosition;
  11 +import com.genersoft.iot.vmp.gb28181.event.EventPublisher;
8 import com.genersoft.iot.vmp.gb28181.utils.Coordtransform; 12 import com.genersoft.iot.vmp.gb28181.utils.Coordtransform;
9 import com.genersoft.iot.vmp.service.IDeviceChannelService; 13 import com.genersoft.iot.vmp.service.IDeviceChannelService;
10 import com.genersoft.iot.vmp.service.IInviteStreamService; 14 import com.genersoft.iot.vmp.service.IInviteStreamService;
11 import com.genersoft.iot.vmp.storager.IRedisCatchStorage; 15 import com.genersoft.iot.vmp.storager.IRedisCatchStorage;
12 import com.genersoft.iot.vmp.storager.dao.DeviceChannelMapper; 16 import com.genersoft.iot.vmp.storager.dao.DeviceChannelMapper;
13 import com.genersoft.iot.vmp.storager.dao.DeviceMapper; 17 import com.genersoft.iot.vmp.storager.dao.DeviceMapper;
  18 +import com.genersoft.iot.vmp.storager.dao.DeviceMobilePositionMapper;
14 import com.genersoft.iot.vmp.utils.DateUtil; 19 import com.genersoft.iot.vmp.utils.DateUtil;
15 import com.genersoft.iot.vmp.vmanager.bean.ResourceBaseInfo; 20 import com.genersoft.iot.vmp.vmanager.bean.ResourceBaseInfo;
16 import com.genersoft.iot.vmp.vmanager.gb28181.platform.bean.ChannelReduce; 21 import com.genersoft.iot.vmp.vmanager.gb28181.platform.bean.ChannelReduce;
@@ -35,7 +40,7 @@ public class DeviceChannelServiceImpl implements IDeviceChannelService { @@ -35,7 +40,7 @@ public class DeviceChannelServiceImpl implements IDeviceChannelService {
35 private final static Logger logger = LoggerFactory.getLogger(DeviceChannelServiceImpl.class); 40 private final static Logger logger = LoggerFactory.getLogger(DeviceChannelServiceImpl.class);
36 41
37 @Autowired 42 @Autowired
38 - private IRedisCatchStorage redisCatchStorage; 43 + private EventPublisher eventPublisher;
39 44
40 @Autowired 45 @Autowired
41 private IInviteStreamService inviteStreamService; 46 private IInviteStreamService inviteStreamService;
@@ -46,6 +51,15 @@ public class DeviceChannelServiceImpl implements IDeviceChannelService { @@ -46,6 +51,15 @@ public class DeviceChannelServiceImpl implements IDeviceChannelService {
46 @Autowired 51 @Autowired
47 private DeviceMapper deviceMapper; 52 private DeviceMapper deviceMapper;
48 53
  54 + @Autowired
  55 + private DeviceMobilePositionMapper deviceMobilePositionMapper;
  56 +
  57 + @Autowired
  58 + private UserSetting userSetting;
  59 +
  60 + @Autowired
  61 + private IRedisCatchStorage redisCatchStorage;
  62 +
49 @Override 63 @Override
50 public DeviceChannel updateGps(DeviceChannel deviceChannel, Device device) { 64 public DeviceChannel updateGps(DeviceChannel deviceChannel, Device device) {
51 if (deviceChannel.getLongitude()*deviceChannel.getLatitude() > 0) { 65 if (deviceChannel.getLongitude()*deviceChannel.getLatitude() > 0) {
@@ -84,7 +98,6 @@ public class DeviceChannelServiceImpl implements IDeviceChannelService { @@ -84,7 +98,6 @@ public class DeviceChannelServiceImpl implements IDeviceChannelService {
84 public void updateChannel(String deviceId, DeviceChannel channel) { 98 public void updateChannel(String deviceId, DeviceChannel channel) {
85 String channelId = channel.getChannelId(); 99 String channelId = channel.getChannelId();
86 channel.setDeviceId(deviceId); 100 channel.setDeviceId(deviceId);
87 -// StreamInfo streamInfo = redisCatchStorage.queryPlayByDevice(deviceId, channelId);  
88 InviteInfo inviteInfo = inviteStreamService.getInviteInfoByDeviceAndChannel(InviteSessionType.PLAY, deviceId, channelId); 101 InviteInfo inviteInfo = inviteStreamService.getInviteInfoByDeviceAndChannel(InviteSessionType.PLAY, deviceId, channelId);
89 if (inviteInfo != null && inviteInfo.getStreamInfo() != null) { 102 if (inviteInfo != null && inviteInfo.getStreamInfo() != null) {
90 channel.setStreamId(inviteInfo.getStreamInfo().getStream()); 103 channel.setStreamId(inviteInfo.getStreamInfo().getStream());
@@ -280,4 +293,64 @@ public class DeviceChannelServiceImpl implements IDeviceChannelService { @@ -280,4 +293,64 @@ public class DeviceChannelServiceImpl implements IDeviceChannelService {
280 } 293 }
281 channelMapper.updateChannelStreamIdentification(channel); 294 channelMapper.updateChannelStreamIdentification(channel);
282 } 295 }
  296 +
  297 + @Override
  298 + public List<DeviceChannel> queryChaneListByDeviceId(String deviceId) {
  299 + return channelMapper.queryAllChannels(deviceId);
  300 + }
  301 +
  302 + @Override
  303 + public void updateChannelGPS(Device device, DeviceChannel deviceChannel, MobilePosition mobilePosition) {
  304 + if (userSetting.getSavePositionHistory()) {
  305 + deviceMobilePositionMapper.insertNewPosition(mobilePosition);
  306 + }
  307 +
  308 + if (deviceChannel.getChannelId().equals(deviceChannel.getDeviceId())) {
  309 + deviceChannel.setChannelId(null);
  310 + }
  311 + if (deviceChannel.getGpsTime() == null) {
  312 + deviceChannel.setGpsTime(DateUtil.getNow());
  313 + }
  314 +
  315 + int updated = channelMapper.updatePosition(deviceChannel);
  316 + if (updated == 0) {
  317 + return;
  318 + }
  319 +
  320 + List<DeviceChannel> deviceChannels = new ArrayList<>();
  321 + if (deviceChannel.getChannelId() == null) {
  322 + // 有的设备这里上报的deviceId与通道Id是一样,这种情况更新设备下的全部通道
  323 + List<DeviceChannel> deviceChannelsInDb = queryChaneListByDeviceId(device.getDeviceId());
  324 + deviceChannels.addAll(deviceChannelsInDb);
  325 + }else {
  326 + deviceChannels.add(deviceChannel);
  327 + }
  328 + if (deviceChannels.isEmpty()) {
  329 + return;
  330 + }
  331 + if (deviceChannels.size() > 100) {
  332 + logger.warn("[更新通道位置信息后发送通知] 设备可能是平台,上报的位置信息未标明通道编号," +
  333 + "导致所有通道被更新位置, deviceId:{}", device.getDeviceId());
  334 + }
  335 + for (DeviceChannel channel : deviceChannels) {
  336 + // 向关联了该通道并且开启移动位置订阅的上级平台发送移动位置订阅消息
  337 + mobilePosition.setChannelId(channel.getChannelId());
  338 + try {
  339 + eventPublisher.mobilePositionEventPublish(mobilePosition);
  340 + }catch (Exception e) {
  341 + logger.error("[向上级转发移动位置失败] ", e);
  342 + }
  343 + // 发送redis消息。 通知位置信息的变化
  344 + JSONObject jsonObject = new JSONObject();
  345 + jsonObject.put("time", DateUtil.yyyy_MM_dd_HH_mm_ssToISO8601(mobilePosition.getTime()));
  346 + jsonObject.put("serial", mobilePosition.getDeviceId());
  347 + jsonObject.put("code", mobilePosition.getChannelId());
  348 + jsonObject.put("longitude", mobilePosition.getLongitude());
  349 + jsonObject.put("latitude", mobilePosition.getLatitude());
  350 + jsonObject.put("altitude", mobilePosition.getAltitude());
  351 + jsonObject.put("direction", mobilePosition.getDirection());
  352 + jsonObject.put("speed", mobilePosition.getSpeed());
  353 + redisCatchStorage.sendMobilePositionMsg(jsonObject);
  354 + }
  355 + }
283 } 356 }
src/main/java/com/genersoft/iot/vmp/storager/dao/DeviceChannelMapper.java
@@ -395,7 +395,7 @@ public interface DeviceChannelMapper { @@ -395,7 +395,7 @@ public interface DeviceChannelMapper {
395 "WHERE device_id=#{deviceId} " + 395 "WHERE device_id=#{deviceId} " +
396 " <if test='channelId != null' > AND channel_id=#{channelId}</if>" + 396 " <if test='channelId != null' > AND channel_id=#{channelId}</if>" +
397 " </script>"}) 397 " </script>"})
398 - void updatePosition(DeviceChannel deviceChannel); 398 + int updatePosition(DeviceChannel deviceChannel);
399 399
400 @Select("SELECT * FROM wvp_device_channel WHERE length(trim(stream_id)) > 0") 400 @Select("SELECT * FROM wvp_device_channel WHERE length(trim(stream_id)) > 0")
401 List<DeviceChannel> getAllChannelInPlay(); 401 List<DeviceChannel> getAllChannelInPlay();