Commit 3955e6ed53d450f8faf488d4b74ba0c0c83c5aaa

Authored by 648540858
1 parent c2e2e245

异步通道刷新,优化ui效果

Showing 20 changed files with 492 additions and 171 deletions
src/main/java/com/genersoft/iot/vmp/common/VideoManagerConstants.java
@@ -22,6 +22,9 @@ public class VideoManagerConstants { @@ -22,6 +22,9 @@ public class VideoManagerConstants {
22 22
23 public static final String DEVICE_PREFIX = "VMP_DEVICE_"; 23 public static final String DEVICE_PREFIX = "VMP_DEVICE_";
24 24
  25 + // 设备同步完成
  26 + public static final String DEVICE_SYNC_PREFIX = "VMP_DEVICE_SYNC_";
  27 +
25 public static final String CACHEKEY_PREFIX = "VMP_CHANNEL_"; 28 public static final String CACHEKEY_PREFIX = "VMP_CHANNEL_";
26 29
27 public static final String KEEPLIVEKEY_PREFIX = "VMP_KEEPALIVE_"; 30 public static final String KEEPLIVEKEY_PREFIX = "VMP_KEEPALIVE_";
@@ -69,6 +72,7 @@ public class VideoManagerConstants { @@ -69,6 +72,7 @@ public class VideoManagerConstants {
69 72
70 public static final String SYSTEM_INFO_NET_PREFIX = "VMP_SYSTEM_INFO_NET_"; 73 public static final String SYSTEM_INFO_NET_PREFIX = "VMP_SYSTEM_INFO_NET_";
71 74
  75 +
72 //************************** redis 消息********************************* 76 //************************** redis 消息*********************************
73 77
74 // 流变化的通知 78 // 流变化的通知
src/main/java/com/genersoft/iot/vmp/gb28181/bean/CatalogData.java
@@ -8,6 +8,12 @@ public class CatalogData { @@ -8,6 +8,12 @@ public class CatalogData {
8 private List<DeviceChannel> channelList; 8 private List<DeviceChannel> channelList;
9 private Date lastTime; 9 private Date lastTime;
10 private Device device; 10 private Device device;
  11 + private String errorMsg;
  12 +
  13 + public enum CatalogDataStatus{
  14 + ready, runIng, end
  15 + }
  16 + private CatalogDataStatus status;
11 17
12 public int getTotal() { 18 public int getTotal() {
13 return total; 19 return total;
@@ -40,4 +46,20 @@ public class CatalogData { @@ -40,4 +46,20 @@ public class CatalogData {
40 public void setDevice(Device device) { 46 public void setDevice(Device device) {
41 this.device = device; 47 this.device = device;
42 } 48 }
  49 +
  50 + public String getErrorMsg() {
  51 + return errorMsg;
  52 + }
  53 +
  54 + public void setErrorMsg(String errorMsg) {
  55 + this.errorMsg = errorMsg;
  56 + }
  57 +
  58 + public CatalogDataStatus getStatus() {
  59 + return status;
  60 + }
  61 +
  62 + public void setStatus(CatalogDataStatus status) {
  63 + this.status = status;
  64 + }
43 } 65 }
src/main/java/com/genersoft/iot/vmp/gb28181/bean/SyncStatus.java 0 → 100644
  1 +package com.genersoft.iot.vmp.gb28181.bean;
  2 +
  3 +/**
  4 + * 摄像机同步状态
  5 + */
  6 +public class SyncStatus {
  7 + private int total;
  8 + private int current;
  9 + private String errorMsg;
  10 +
  11 + public int getTotal() {
  12 + return total;
  13 + }
  14 +
  15 + public void setTotal(int total) {
  16 + this.total = total;
  17 + }
  18 +
  19 + public int getCurrent() {
  20 + return current;
  21 + }
  22 +
  23 + public void setCurrent(int current) {
  24 + this.current = current;
  25 + }
  26 +
  27 + public String getErrorMsg() {
  28 + return errorMsg;
  29 + }
  30 +
  31 + public void setErrorMsg(String errorMsg) {
  32 + this.errorMsg = errorMsg;
  33 + }
  34 +}
src/main/java/com/genersoft/iot/vmp/gb28181/event/online/OnlineEventListener.java
@@ -97,8 +97,6 @@ public class OnlineEventListener implements ApplicationListener&lt;OnlineEvent&gt; { @@ -97,8 +97,6 @@ public class OnlineEventListener implements ApplicationListener&lt;OnlineEvent&gt; {
97 } 97 }
98 // 处理上线监听 98 // 处理上线监听
99 storager.updateDevice(device); 99 storager.updateDevice(device);
100 - List<DeviceChannel> deviceChannelList = storager.queryOnlineChannelsByDeviceId(device.getDeviceId());  
101 - eventPublisher.catalogEventPublish(null, deviceChannelList, CatalogEvent.ON);  
102 // 上线添加订阅 100 // 上线添加订阅
103 if (device.getSubscribeCycleForCatalog() > 0) { 101 if (device.getSubscribeCycleForCatalog() > 0) {
104 deviceService.addCatalogSubscribe(device); 102 deviceService.addCatalogSubscribe(device);
src/main/java/com/genersoft/iot/vmp/gb28181/session/CatalogDataCatch.java
@@ -3,6 +3,7 @@ package com.genersoft.iot.vmp.gb28181.session; @@ -3,6 +3,7 @@ package com.genersoft.iot.vmp.gb28181.session;
3 import com.genersoft.iot.vmp.gb28181.bean.CatalogData; 3 import com.genersoft.iot.vmp.gb28181.bean.CatalogData;
4 import com.genersoft.iot.vmp.gb28181.bean.Device; 4 import com.genersoft.iot.vmp.gb28181.bean.Device;
5 import com.genersoft.iot.vmp.gb28181.bean.DeviceChannel; 5 import com.genersoft.iot.vmp.gb28181.bean.DeviceChannel;
  6 +import com.genersoft.iot.vmp.gb28181.bean.SyncStatus;
6 import com.genersoft.iot.vmp.gb28181.transmit.callback.DeferredResultHolder; 7 import com.genersoft.iot.vmp.gb28181.transmit.callback.DeferredResultHolder;
7 import com.genersoft.iot.vmp.gb28181.transmit.callback.RequestMessage; 8 import com.genersoft.iot.vmp.gb28181.transmit.callback.RequestMessage;
8 import com.genersoft.iot.vmp.storager.IVideoManagerStorage; 9 import com.genersoft.iot.vmp.storager.IVideoManagerStorage;
@@ -25,6 +26,17 @@ public class CatalogDataCatch { @@ -25,6 +26,17 @@ public class CatalogDataCatch {
25 @Autowired 26 @Autowired
26 private IVideoManagerStorage storager; 27 private IVideoManagerStorage storager;
27 28
  29 + public void addReady(String key) {
  30 + CatalogData catalogData = data.get(key);
  31 + if (catalogData == null || catalogData.getStatus().equals(CatalogData.CatalogDataStatus.end)) {
  32 + catalogData = new CatalogData();
  33 + catalogData.setChannelList(new ArrayList<>());
  34 + catalogData.setStatus(CatalogData.CatalogDataStatus.ready);
  35 + catalogData.setLastTime(new Date(System.currentTimeMillis()));
  36 + data.put(key, catalogData);
  37 + }
  38 + }
  39 +
28 public void put(String key, int total, Device device, List<DeviceChannel> deviceChannelList) { 40 public void put(String key, int total, Device device, List<DeviceChannel> deviceChannelList) {
29 CatalogData catalogData = data.get(key); 41 CatalogData catalogData = data.get(key);
30 if (catalogData == null) { 42 if (catalogData == null) {
@@ -32,10 +44,16 @@ public class CatalogDataCatch { @@ -32,10 +44,16 @@ public class CatalogDataCatch {
32 catalogData.setTotal(total); 44 catalogData.setTotal(total);
33 catalogData.setDevice(device); 45 catalogData.setDevice(device);
34 catalogData.setChannelList(new ArrayList<>()); 46 catalogData.setChannelList(new ArrayList<>());
  47 + catalogData.setStatus(CatalogData.CatalogDataStatus.runIng);
  48 + catalogData.setLastTime(new Date(System.currentTimeMillis()));
35 data.put(key, catalogData); 49 data.put(key, catalogData);
  50 + }else {
  51 + catalogData.setTotal(total);
  52 + catalogData.setDevice(device);
  53 + catalogData.setStatus(CatalogData.CatalogDataStatus.runIng);
  54 + catalogData.getChannelList().addAll(deviceChannelList);
  55 + catalogData.setLastTime(new Date(System.currentTimeMillis()));
36 } 56 }
37 - catalogData.getChannelList().addAll(deviceChannelList);  
38 - catalogData.setLastTime(new Date(System.currentTimeMillis()));  
39 } 57 }
40 58
41 public List<DeviceChannel> get(String key) { 59 public List<DeviceChannel> get(String key) {
@@ -50,6 +68,16 @@ public class CatalogDataCatch { @@ -50,6 +68,16 @@ public class CatalogDataCatch {
50 return catalogData.getTotal(); 68 return catalogData.getTotal();
51 } 69 }
52 70
  71 + public SyncStatus getSyncStatus(String key) {
  72 + CatalogData catalogData = data.get(key);
  73 + if (catalogData == null) return null;
  74 + SyncStatus syncStatus = new SyncStatus();
  75 + syncStatus.setCurrent(catalogData.getChannelList().size());
  76 + syncStatus.setTotal(catalogData.getTotal());
  77 + syncStatus.setErrorMsg(catalogData.getErrorMsg());
  78 + return syncStatus;
  79 + }
  80 +
53 public void del(String key) { 81 public void del(String key) {
54 data.remove(key); 82 data.remove(key);
55 } 83 }
@@ -57,24 +85,32 @@ public class CatalogDataCatch { @@ -57,24 +85,32 @@ public class CatalogDataCatch {
57 @Scheduled(fixedRate = 5 * 1000) //每5秒执行一次, 发现数据5秒未更新则移除数据并认为数据接收超时 85 @Scheduled(fixedRate = 5 * 1000) //每5秒执行一次, 发现数据5秒未更新则移除数据并认为数据接收超时
58 private void timerTask(){ 86 private void timerTask(){
59 Set<String> keys = data.keySet(); 87 Set<String> keys = data.keySet();
60 - Calendar calendar = Calendar.getInstance();  
61 - calendar.setTime(new Date());  
62 - calendar.set(Calendar.SECOND, calendar.get(Calendar.SECOND) - 5); 88 + Calendar calendarBefore5S = Calendar.getInstance();
  89 + calendarBefore5S.setTime(new Date());
  90 + calendarBefore5S.set(Calendar.SECOND, calendarBefore5S.get(Calendar.SECOND) - 5);
  91 +
  92 + Calendar calendarBefore30S = Calendar.getInstance();
  93 + calendarBefore30S.setTime(new Date());
  94 + calendarBefore30S.set(Calendar.SECOND, calendarBefore30S.get(Calendar.SECOND) - 30);
63 for (String key : keys) { 95 for (String key : keys) {
64 CatalogData catalogData = data.get(key); 96 CatalogData catalogData = data.get(key);
65 - if (catalogData.getLastTime().before(calendar.getTime())) {  
66 - 97 + if (catalogData.getLastTime().before(calendarBefore5S.getTime())) { // 超过五秒收不到消息任务超时, 只更新这一部分数据
67 storager.resetChannels(catalogData.getDevice().getDeviceId(), catalogData.getChannelList()); 98 storager.resetChannels(catalogData.getDevice().getDeviceId(), catalogData.getChannelList());
68 - RequestMessage msg = new RequestMessage();  
69 - msg.setKey(key);  
70 - WVPResult<Object> result = new WVPResult<>();  
71 - result.setCode(0);  
72 - result.setMsg("更新成功,共" + catalogData.getTotal() + "条,已更新" + catalogData.getChannelList().size() + "条");  
73 - result.setData(catalogData.getDevice());  
74 - msg.setData(result);  
75 - deferredResultHolder.invokeAllResult(msg); 99 + String errorMsg = "更新成功,共" + catalogData.getTotal() + "条,已更新" + catalogData.getChannelList().size() + "条";
  100 + catalogData.setStatus(CatalogData.CatalogDataStatus.end);
  101 + catalogData.setErrorMsg(errorMsg);
  102 + }
  103 + if (catalogData.getLastTime().before(calendarBefore30S.getTime())) { // 超过三十秒,如果标记为end则删除
76 data.remove(key); 104 data.remove(key);
77 } 105 }
78 } 106 }
79 } 107 }
  108 +
  109 +
  110 + public void setChannelSyncEnd(String key, String errorMsg) {
  111 + CatalogData catalogData = data.get(key);
  112 + if (catalogData == null)return;
  113 + catalogData.setStatus(CatalogData.CatalogDataStatus.end);
  114 + catalogData.setErrorMsg(errorMsg);
  115 + }
80 } 116 }
src/main/java/com/genersoft/iot/vmp/gb28181/transmit/cmd/ISIPCommanderForPlatform.java
@@ -46,6 +46,7 @@ public interface ISIPCommanderForPlatform { @@ -46,6 +46,7 @@ public interface ISIPCommanderForPlatform {
46 * @return 46 * @return
47 */ 47 */
48 boolean catalogQuery(DeviceChannel channel, ParentPlatform parentPlatform, String sn, String fromTag, int size); 48 boolean catalogQuery(DeviceChannel channel, ParentPlatform parentPlatform, String sn, String fromTag, int size);
  49 + boolean catalogQuery(List<DeviceChannel> channels, ParentPlatform parentPlatform, String sn, String fromTag);
49 50
50 /** 51 /**
51 * 向上级回复DeviceInfo查询信息 52 * 向上级回复DeviceInfo查询信息
src/main/java/com/genersoft/iot/vmp/gb28181/transmit/cmd/impl/SIPCommander.java
@@ -235,7 +235,7 @@ public class SIPCommander implements ISIPCommander { @@ -235,7 +235,7 @@ public class SIPCommander implements ISIPCommander {
235 String cmdStr= cmdString(leftRight, upDown, inOut, moveSpeed, zoomSpeed); 235 String cmdStr= cmdString(leftRight, upDown, inOut, moveSpeed, zoomSpeed);
236 StringBuffer ptzXml = new StringBuffer(200); 236 StringBuffer ptzXml = new StringBuffer(200);
237 String charset = device.getCharset(); 237 String charset = device.getCharset();
238 - ptzXml.append("<?xml version=\"1.0\" encoding=\"" + charset + "\" ?>\r\n"); 238 + ptzXml.append("<?xml version=\"1.0\" encoding=\"" + charset + "\"?>\r\n");
239 ptzXml.append("<Control>\r\n"); 239 ptzXml.append("<Control>\r\n");
240 ptzXml.append("<CmdType>DeviceControl</CmdType>\r\n"); 240 ptzXml.append("<CmdType>DeviceControl</CmdType>\r\n");
241 ptzXml.append("<SN>" + (int)((Math.random()*9+1)*100000) + "</SN>\r\n"); 241 ptzXml.append("<SN>" + (int)((Math.random()*9+1)*100000) + "</SN>\r\n");
@@ -278,7 +278,7 @@ public class SIPCommander implements ISIPCommander { @@ -278,7 +278,7 @@ public class SIPCommander implements ISIPCommander {
278 logger.debug("控制字符串:" + cmdStr); 278 logger.debug("控制字符串:" + cmdStr);
279 StringBuffer ptzXml = new StringBuffer(200); 279 StringBuffer ptzXml = new StringBuffer(200);
280 String charset = device.getCharset(); 280 String charset = device.getCharset();
281 - ptzXml.append("<?xml version=\"1.0\" encoding=\"" + charset + "\" ?>\r\n"); 281 + ptzXml.append("<?xml version=\"1.0\" encoding=\"" + charset + "\"?>\r\n");
282 ptzXml.append("<Control>\r\n"); 282 ptzXml.append("<Control>\r\n");
283 ptzXml.append("<CmdType>DeviceControl</CmdType>\r\n"); 283 ptzXml.append("<CmdType>DeviceControl</CmdType>\r\n");
284 ptzXml.append("<SN>" + (int)((Math.random()*9+1)*100000) + "</SN>\r\n"); 284 ptzXml.append("<SN>" + (int)((Math.random()*9+1)*100000) + "</SN>\r\n");
@@ -314,7 +314,7 @@ public class SIPCommander implements ISIPCommander { @@ -314,7 +314,7 @@ public class SIPCommander implements ISIPCommander {
314 try { 314 try {
315 StringBuffer ptzXml = new StringBuffer(200); 315 StringBuffer ptzXml = new StringBuffer(200);
316 String charset = device.getCharset(); 316 String charset = device.getCharset();
317 - ptzXml.append("<?xml version=\"1.0\" encoding=\"" + charset + "\" ?>\r\n"); 317 + ptzXml.append("<?xml version=\"1.0\" encoding=\"" + charset + "\"?>\r\n");
318 ptzXml.append("<Control>\r\n"); 318 ptzXml.append("<Control>\r\n");
319 ptzXml.append("<CmdType>DeviceControl</CmdType>\r\n"); 319 ptzXml.append("<CmdType>DeviceControl</CmdType>\r\n");
320 ptzXml.append("<SN>" + (int)((Math.random()*9+1)*100000) + "</SN>\r\n"); 320 ptzXml.append("<SN>" + (int)((Math.random()*9+1)*100000) + "</SN>\r\n");
@@ -778,7 +778,7 @@ public class SIPCommander implements ISIPCommander { @@ -778,7 +778,7 @@ public class SIPCommander implements ISIPCommander {
778 try { 778 try {
779 StringBuffer broadcastXml = new StringBuffer(200); 779 StringBuffer broadcastXml = new StringBuffer(200);
780 String charset = device.getCharset(); 780 String charset = device.getCharset();
781 - broadcastXml.append("<?xml version=\"1.0\" encoding=\"" + charset + "\" ?>\r\n"); 781 + broadcastXml.append("<?xml version=\"1.0\" encoding=\"" + charset + "\"?>\r\n");
782 broadcastXml.append("<Notify>\r\n"); 782 broadcastXml.append("<Notify>\r\n");
783 broadcastXml.append("<CmdType>Broadcast</CmdType>\r\n"); 783 broadcastXml.append("<CmdType>Broadcast</CmdType>\r\n");
784 broadcastXml.append("<SN>" + (int)((Math.random()*9+1)*100000) + "</SN>\r\n"); 784 broadcastXml.append("<SN>" + (int)((Math.random()*9+1)*100000) + "</SN>\r\n");
@@ -804,7 +804,7 @@ public class SIPCommander implements ISIPCommander { @@ -804,7 +804,7 @@ public class SIPCommander implements ISIPCommander {
804 try { 804 try {
805 StringBuffer broadcastXml = new StringBuffer(200); 805 StringBuffer broadcastXml = new StringBuffer(200);
806 String charset = device.getCharset(); 806 String charset = device.getCharset();
807 - broadcastXml.append("<?xml version=\"1.0\" encoding=\"" + charset + "\" ?>\r\n"); 807 + broadcastXml.append("<?xml version=\"1.0\" encoding=\"" + charset + "\"?>\r\n");
808 broadcastXml.append("<Notify>\r\n"); 808 broadcastXml.append("<Notify>\r\n");
809 broadcastXml.append("<CmdType>Broadcast</CmdType>\r\n"); 809 broadcastXml.append("<CmdType>Broadcast</CmdType>\r\n");
810 broadcastXml.append("<SN>" + (int)((Math.random()*9+1)*100000) + "</SN>\r\n"); 810 broadcastXml.append("<SN>" + (int)((Math.random()*9+1)*100000) + "</SN>\r\n");
@@ -837,7 +837,7 @@ public class SIPCommander implements ISIPCommander { @@ -837,7 +837,7 @@ public class SIPCommander implements ISIPCommander {
837 try { 837 try {
838 StringBuffer cmdXml = new StringBuffer(200); 838 StringBuffer cmdXml = new StringBuffer(200);
839 String charset = device.getCharset(); 839 String charset = device.getCharset();
840 - cmdXml.append("<?xml version=\"1.0\" encoding=\"" + charset + "\" ?>\r\n"); 840 + cmdXml.append("<?xml version=\"1.0\" encoding=\"" + charset + "\"?>\r\n");
841 cmdXml.append("<Control>\r\n"); 841 cmdXml.append("<Control>\r\n");
842 cmdXml.append("<CmdType>DeviceControl</CmdType>\r\n"); 842 cmdXml.append("<CmdType>DeviceControl</CmdType>\r\n");
843 cmdXml.append("<SN>" + (int)((Math.random()*9+1)*100000) + "</SN>\r\n"); 843 cmdXml.append("<SN>" + (int)((Math.random()*9+1)*100000) + "</SN>\r\n");
@@ -873,7 +873,7 @@ public class SIPCommander implements ISIPCommander { @@ -873,7 +873,7 @@ public class SIPCommander implements ISIPCommander {
873 try { 873 try {
874 StringBuffer cmdXml = new StringBuffer(200); 874 StringBuffer cmdXml = new StringBuffer(200);
875 String charset = device.getCharset(); 875 String charset = device.getCharset();
876 - cmdXml.append("<?xml version=\"1.0\" encoding=\"" + charset + "\" ?>\r\n"); 876 + cmdXml.append("<?xml version=\"1.0\" encoding=\"" + charset + "\"?>\r\n");
877 cmdXml.append("<Control>\r\n"); 877 cmdXml.append("<Control>\r\n");
878 cmdXml.append("<CmdType>DeviceControl</CmdType>\r\n"); 878 cmdXml.append("<CmdType>DeviceControl</CmdType>\r\n");
879 cmdXml.append("<SN>" + (int)((Math.random()*9+1)*100000) + "</SN>\r\n"); 879 cmdXml.append("<SN>" + (int)((Math.random()*9+1)*100000) + "</SN>\r\n");
@@ -906,7 +906,7 @@ public class SIPCommander implements ISIPCommander { @@ -906,7 +906,7 @@ public class SIPCommander implements ISIPCommander {
906 try { 906 try {
907 StringBuffer cmdXml = new StringBuffer(200); 907 StringBuffer cmdXml = new StringBuffer(200);
908 String charset = device.getCharset(); 908 String charset = device.getCharset();
909 - cmdXml.append("<?xml version=\"1.0\" encoding=\"" + charset + "\" ?>\r\n"); 909 + cmdXml.append("<?xml version=\"1.0\" encoding=\"" + charset + "\"?>\r\n");
910 cmdXml.append("<Control>\r\n"); 910 cmdXml.append("<Control>\r\n");
911 cmdXml.append("<CmdType>DeviceControl</CmdType>\r\n"); 911 cmdXml.append("<CmdType>DeviceControl</CmdType>\r\n");
912 cmdXml.append("<SN>" + (int)((Math.random()*9+1)*100000) + "</SN>\r\n"); 912 cmdXml.append("<SN>" + (int)((Math.random()*9+1)*100000) + "</SN>\r\n");
@@ -938,7 +938,7 @@ public class SIPCommander implements ISIPCommander { @@ -938,7 +938,7 @@ public class SIPCommander implements ISIPCommander {
938 try { 938 try {
939 StringBuffer cmdXml = new StringBuffer(200); 939 StringBuffer cmdXml = new StringBuffer(200);
940 String charset = device.getCharset(); 940 String charset = device.getCharset();
941 - cmdXml.append("<?xml version=\"1.0\" encoding=\"" + charset + "\" ?>\r\n"); 941 + cmdXml.append("<?xml version=\"1.0\" encoding=\"" + charset + "\"?>\r\n");
942 cmdXml.append("<Control>\r\n"); 942 cmdXml.append("<Control>\r\n");
943 cmdXml.append("<CmdType>DeviceControl</CmdType>\r\n"); 943 cmdXml.append("<CmdType>DeviceControl</CmdType>\r\n");
944 cmdXml.append("<SN>" + (int)((Math.random()*9+1)*100000) + "</SN>\r\n"); 944 cmdXml.append("<SN>" + (int)((Math.random()*9+1)*100000) + "</SN>\r\n");
@@ -983,7 +983,7 @@ public class SIPCommander implements ISIPCommander { @@ -983,7 +983,7 @@ public class SIPCommander implements ISIPCommander {
983 try { 983 try {
984 StringBuffer cmdXml = new StringBuffer(200); 984 StringBuffer cmdXml = new StringBuffer(200);
985 String charset = device.getCharset(); 985 String charset = device.getCharset();
986 - cmdXml.append("<?xml version=\"1.0\" encoding=\"" + charset + "\" ?>\r\n"); 986 + cmdXml.append("<?xml version=\"1.0\" encoding=\"" + charset + "\"?>\r\n");
987 cmdXml.append("<Control>\r\n"); 987 cmdXml.append("<Control>\r\n");
988 cmdXml.append("<CmdType>DeviceControl</CmdType>\r\n"); 988 cmdXml.append("<CmdType>DeviceControl</CmdType>\r\n");
989 cmdXml.append("<SN>" + (int)((Math.random()*9+1)*100000) + "</SN>\r\n"); 989 cmdXml.append("<SN>" + (int)((Math.random()*9+1)*100000) + "</SN>\r\n");
@@ -1022,7 +1022,7 @@ public class SIPCommander implements ISIPCommander { @@ -1022,7 +1022,7 @@ public class SIPCommander implements ISIPCommander {
1022 try { 1022 try {
1023 StringBuffer cmdXml = new StringBuffer(200); 1023 StringBuffer cmdXml = new StringBuffer(200);
1024 String charset = device.getCharset(); 1024 String charset = device.getCharset();
1025 - cmdXml.append("<?xml version=\"1.0\" encoding=\"" + charset + "\" ?>\r\n"); 1025 + cmdXml.append("<?xml version=\"1.0\" encoding=\"" + charset + "\"?>\r\n");
1026 cmdXml.append("<Control>\r\n"); 1026 cmdXml.append("<Control>\r\n");
1027 cmdXml.append("<CmdType>DeviceControl</CmdType>\r\n"); 1027 cmdXml.append("<CmdType>DeviceControl</CmdType>\r\n");
1028 cmdXml.append("<SN>" + (int)((Math.random()*9+1)*100000) + "</SN>\r\n"); 1028 cmdXml.append("<SN>" + (int)((Math.random()*9+1)*100000) + "</SN>\r\n");
@@ -1091,7 +1091,7 @@ public class SIPCommander implements ISIPCommander { @@ -1091,7 +1091,7 @@ public class SIPCommander implements ISIPCommander {
1091 try { 1091 try {
1092 StringBuffer cmdXml = new StringBuffer(200); 1092 StringBuffer cmdXml = new StringBuffer(200);
1093 String charset = device.getCharset(); 1093 String charset = device.getCharset();
1094 - cmdXml.append("<?xml version=\"1.0\" encoding=\"" + charset + "\" ?>\r\n"); 1094 + cmdXml.append("<?xml version=\"1.0\" encoding=\"" + charset + "\"?>\r\n");
1095 cmdXml.append("<Control>\r\n"); 1095 cmdXml.append("<Control>\r\n");
1096 cmdXml.append("<CmdType>DeviceConfig</CmdType>\r\n"); 1096 cmdXml.append("<CmdType>DeviceConfig</CmdType>\r\n");
1097 cmdXml.append("<SN>" + (int)((Math.random()*9+1)*100000) + "</SN>\r\n"); 1097 cmdXml.append("<SN>" + (int)((Math.random()*9+1)*100000) + "</SN>\r\n");
@@ -1146,7 +1146,7 @@ public class SIPCommander implements ISIPCommander { @@ -1146,7 +1146,7 @@ public class SIPCommander implements ISIPCommander {
1146 try { 1146 try {
1147 String charset = device.getCharset(); 1147 String charset = device.getCharset();
1148 StringBuffer catalogXml = new StringBuffer(200); 1148 StringBuffer catalogXml = new StringBuffer(200);
1149 - catalogXml.append("<?xml version=\"1.0\" encoding=\"" + charset + "\" ?>\r\n"); 1149 + catalogXml.append("<?xml version=\"1.0\" encoding=\"" + charset + "\"?>\r\n");
1150 catalogXml.append("<Query>\r\n"); 1150 catalogXml.append("<Query>\r\n");
1151 catalogXml.append("<CmdType>DeviceStatus</CmdType>\r\n"); 1151 catalogXml.append("<CmdType>DeviceStatus</CmdType>\r\n");
1152 catalogXml.append("<SN>" + (int)((Math.random()*9+1)*100000) + "</SN>\r\n"); 1152 catalogXml.append("<SN>" + (int)((Math.random()*9+1)*100000) + "</SN>\r\n");
@@ -1179,7 +1179,7 @@ public class SIPCommander implements ISIPCommander { @@ -1179,7 +1179,7 @@ public class SIPCommander implements ISIPCommander {
1179 try { 1179 try {
1180 StringBuffer catalogXml = new StringBuffer(200); 1180 StringBuffer catalogXml = new StringBuffer(200);
1181 String charset = device.getCharset(); 1181 String charset = device.getCharset();
1182 - catalogXml.append("<?xml version=\"1.0\" encoding=\"" + charset + "\" ?>\r\n"); 1182 + catalogXml.append("<?xml version=\"1.0\" encoding=\"" + charset + "\"?>\r\n");
1183 catalogXml.append("<Query>\r\n"); 1183 catalogXml.append("<Query>\r\n");
1184 catalogXml.append("<CmdType>DeviceInfo</CmdType>\r\n"); 1184 catalogXml.append("<CmdType>DeviceInfo</CmdType>\r\n");
1185 catalogXml.append("<SN>" + (int)((Math.random()*9+1)*100000) + "</SN>\r\n"); 1185 catalogXml.append("<SN>" + (int)((Math.random()*9+1)*100000) + "</SN>\r\n");
@@ -1212,7 +1212,7 @@ public class SIPCommander implements ISIPCommander { @@ -1212,7 +1212,7 @@ public class SIPCommander implements ISIPCommander {
1212 try { 1212 try {
1213 StringBuffer catalogXml = new StringBuffer(200); 1213 StringBuffer catalogXml = new StringBuffer(200);
1214 String charset = device.getCharset(); 1214 String charset = device.getCharset();
1215 - catalogXml.append("<?xml version=\"1.0\" encoding=\"" + charset + "\" ?>\r\n"); 1215 + catalogXml.append("<?xml version=\"1.0\" encoding=\"" + charset + "\"?>\r\n");
1216 catalogXml.append("<Query>\r\n"); 1216 catalogXml.append("<Query>\r\n");
1217 catalogXml.append("<CmdType>Catalog</CmdType>\r\n"); 1217 catalogXml.append("<CmdType>Catalog</CmdType>\r\n");
1218 catalogXml.append("<SN>" + (int)((Math.random()*9+1)*100000) + "</SN>\r\n"); 1218 catalogXml.append("<SN>" + (int)((Math.random()*9+1)*100000) + "</SN>\r\n");
@@ -1252,7 +1252,7 @@ public class SIPCommander implements ISIPCommander { @@ -1252,7 +1252,7 @@ public class SIPCommander implements ISIPCommander {
1252 try { 1252 try {
1253 StringBuffer recordInfoXml = new StringBuffer(200); 1253 StringBuffer recordInfoXml = new StringBuffer(200);
1254 String charset = device.getCharset(); 1254 String charset = device.getCharset();
1255 - recordInfoXml.append("<?xml version=\"1.0\" encoding=\"" + charset + "\" ?>\r\n"); 1255 + recordInfoXml.append("<?xml version=\"1.0\" encoding=\"" + charset + "\"?>\r\n");
1256 recordInfoXml.append("<Query>\r\n"); 1256 recordInfoXml.append("<Query>\r\n");
1257 recordInfoXml.append("<CmdType>RecordInfo</CmdType>\r\n"); 1257 recordInfoXml.append("<CmdType>RecordInfo</CmdType>\r\n");
1258 recordInfoXml.append("<SN>" + sn + "</SN>\r\n"); 1258 recordInfoXml.append("<SN>" + sn + "</SN>\r\n");
@@ -1306,7 +1306,7 @@ public class SIPCommander implements ISIPCommander { @@ -1306,7 +1306,7 @@ public class SIPCommander implements ISIPCommander {
1306 try { 1306 try {
1307 StringBuffer cmdXml = new StringBuffer(200); 1307 StringBuffer cmdXml = new StringBuffer(200);
1308 String charset = device.getCharset(); 1308 String charset = device.getCharset();
1309 - cmdXml.append("<?xml version=\"1.0\" encoding=\"" + charset + "\" ?>\r\n"); 1309 + cmdXml.append("<?xml version=\"1.0\" encoding=\"" + charset + "\"?>\r\n");
1310 cmdXml.append("<Query>\r\n"); 1310 cmdXml.append("<Query>\r\n");
1311 cmdXml.append("<CmdType>Alarm</CmdType>\r\n"); 1311 cmdXml.append("<CmdType>Alarm</CmdType>\r\n");
1312 cmdXml.append("<SN>" + (int)((Math.random()*9+1)*100000) + "</SN>\r\n"); 1312 cmdXml.append("<SN>" + (int)((Math.random()*9+1)*100000) + "</SN>\r\n");
@@ -1357,7 +1357,7 @@ public class SIPCommander implements ISIPCommander { @@ -1357,7 +1357,7 @@ public class SIPCommander implements ISIPCommander {
1357 try { 1357 try {
1358 StringBuffer cmdXml = new StringBuffer(200); 1358 StringBuffer cmdXml = new StringBuffer(200);
1359 String charset = device.getCharset(); 1359 String charset = device.getCharset();
1360 - cmdXml.append("<?xml version=\"1.0\" encoding=\"" + charset + "\" ?>\r\n"); 1360 + cmdXml.append("<?xml version=\"1.0\" encoding=\"" + charset + "\"?>\r\n");
1361 cmdXml.append("<Query>\r\n"); 1361 cmdXml.append("<Query>\r\n");
1362 cmdXml.append("<CmdType>ConfigDownload</CmdType>\r\n"); 1362 cmdXml.append("<CmdType>ConfigDownload</CmdType>\r\n");
1363 cmdXml.append("<SN>" + (int)((Math.random()*9+1)*100000) + "</SN>\r\n"); 1363 cmdXml.append("<SN>" + (int)((Math.random()*9+1)*100000) + "</SN>\r\n");
@@ -1393,7 +1393,7 @@ public class SIPCommander implements ISIPCommander { @@ -1393,7 +1393,7 @@ public class SIPCommander implements ISIPCommander {
1393 try { 1393 try {
1394 StringBuffer cmdXml = new StringBuffer(200); 1394 StringBuffer cmdXml = new StringBuffer(200);
1395 String charset = device.getCharset(); 1395 String charset = device.getCharset();
1396 - cmdXml.append("<?xml version=\"1.0\" encoding=\"" + charset + "\" ?>\r\n"); 1396 + cmdXml.append("<?xml version=\"1.0\" encoding=\"" + charset + "\"?>\r\n");
1397 cmdXml.append("<Query>\r\n"); 1397 cmdXml.append("<Query>\r\n");
1398 cmdXml.append("<CmdType>PresetQuery</CmdType>\r\n"); 1398 cmdXml.append("<CmdType>PresetQuery</CmdType>\r\n");
1399 cmdXml.append("<SN>" + (int)((Math.random()*9+1)*100000) + "</SN>\r\n"); 1399 cmdXml.append("<SN>" + (int)((Math.random()*9+1)*100000) + "</SN>\r\n");
@@ -1428,7 +1428,7 @@ public class SIPCommander implements ISIPCommander { @@ -1428,7 +1428,7 @@ public class SIPCommander implements ISIPCommander {
1428 try { 1428 try {
1429 StringBuffer mobilePostitionXml = new StringBuffer(200); 1429 StringBuffer mobilePostitionXml = new StringBuffer(200);
1430 String charset = device.getCharset(); 1430 String charset = device.getCharset();
1431 - mobilePostitionXml.append("<?xml version=\"1.0\" encoding=\"" + charset + "\" ?>\r\n"); 1431 + mobilePostitionXml.append("<?xml version=\"1.0\" encoding=\"" + charset + "\"?>\r\n");
1432 mobilePostitionXml.append("<Query>\r\n"); 1432 mobilePostitionXml.append("<Query>\r\n");
1433 mobilePostitionXml.append("<CmdType>MobilePosition</CmdType>\r\n"); 1433 mobilePostitionXml.append("<CmdType>MobilePosition</CmdType>\r\n");
1434 mobilePostitionXml.append("<SN>" + (int)((Math.random()*9+1)*100000) + "</SN>\r\n"); 1434 mobilePostitionXml.append("<SN>" + (int)((Math.random()*9+1)*100000) + "</SN>\r\n");
@@ -1462,7 +1462,7 @@ public class SIPCommander implements ISIPCommander { @@ -1462,7 +1462,7 @@ public class SIPCommander implements ISIPCommander {
1462 try { 1462 try {
1463 StringBuffer subscribePostitionXml = new StringBuffer(200); 1463 StringBuffer subscribePostitionXml = new StringBuffer(200);
1464 String charset = device.getCharset(); 1464 String charset = device.getCharset();
1465 - subscribePostitionXml.append("<?xml version=\"1.0\" encoding=\"" + charset + "\" ?>\r\n"); 1465 + subscribePostitionXml.append("<?xml version=\"1.0\" encoding=\"" + charset + "\"?>\r\n");
1466 subscribePostitionXml.append("<Query>\r\n"); 1466 subscribePostitionXml.append("<Query>\r\n");
1467 subscribePostitionXml.append("<CmdType>MobilePosition</CmdType>\r\n"); 1467 subscribePostitionXml.append("<CmdType>MobilePosition</CmdType>\r\n");
1468 subscribePostitionXml.append("<SN>" + (int)((Math.random()*9+1)*100000) + "</SN>\r\n"); 1468 subscribePostitionXml.append("<SN>" + (int)((Math.random()*9+1)*100000) + "</SN>\r\n");
@@ -1513,7 +1513,7 @@ public class SIPCommander implements ISIPCommander { @@ -1513,7 +1513,7 @@ public class SIPCommander implements ISIPCommander {
1513 try { 1513 try {
1514 StringBuffer cmdXml = new StringBuffer(200); 1514 StringBuffer cmdXml = new StringBuffer(200);
1515 String charset = device.getCharset(); 1515 String charset = device.getCharset();
1516 - cmdXml.append("<?xml version=\"1.0\" encoding=\"" + charset + "\" ?>\r\n"); 1516 + cmdXml.append("<?xml version=\"1.0\" encoding=\"" + charset + "\"?>\r\n");
1517 cmdXml.append("<Query>\r\n"); 1517 cmdXml.append("<Query>\r\n");
1518 cmdXml.append("<CmdType>Alarm</CmdType>\r\n"); 1518 cmdXml.append("<CmdType>Alarm</CmdType>\r\n");
1519 cmdXml.append("<SN>" + (int)((Math.random()*9+1)*100000) + "</SN>\r\n"); 1519 cmdXml.append("<SN>" + (int)((Math.random()*9+1)*100000) + "</SN>\r\n");
@@ -1559,7 +1559,7 @@ public class SIPCommander implements ISIPCommander { @@ -1559,7 +1559,7 @@ public class SIPCommander implements ISIPCommander {
1559 try { 1559 try {
1560 StringBuffer cmdXml = new StringBuffer(200); 1560 StringBuffer cmdXml = new StringBuffer(200);
1561 String charset = device.getCharset(); 1561 String charset = device.getCharset();
1562 - cmdXml.append("<?xml version=\"1.0\" encoding=\"" + charset + "\" ?>\r\n"); 1562 + cmdXml.append("<?xml version=\"1.0\" encoding=\"" + charset + "\"?>\r\n");
1563 cmdXml.append("<Query>\r\n"); 1563 cmdXml.append("<Query>\r\n");
1564 cmdXml.append("<CmdType>Catalog</CmdType>\r\n"); 1564 cmdXml.append("<CmdType>Catalog</CmdType>\r\n");
1565 cmdXml.append("<SN>" + (int)((Math.random()*9+1)*100000) + "</SN>\r\n"); 1565 cmdXml.append("<SN>" + (int)((Math.random()*9+1)*100000) + "</SN>\r\n");
@@ -1590,7 +1590,7 @@ public class SIPCommander implements ISIPCommander { @@ -1590,7 +1590,7 @@ public class SIPCommander implements ISIPCommander {
1590 try { 1590 try {
1591 StringBuffer dragXml = new StringBuffer(200); 1591 StringBuffer dragXml = new StringBuffer(200);
1592 String charset = device.getCharset(); 1592 String charset = device.getCharset();
1593 - dragXml.append("<?xml version=\"1.0\" encoding=\"" + charset + "\" ?>\r\n"); 1593 + dragXml.append("<?xml version=\"1.0\" encoding=\"" + charset + "\"?>\r\n");
1594 dragXml.append("<Control>\r\n"); 1594 dragXml.append("<Control>\r\n");
1595 dragXml.append("<CmdType>DeviceControl</CmdType>\r\n"); 1595 dragXml.append("<CmdType>DeviceControl</CmdType>\r\n");
1596 dragXml.append("<SN>" + (int) ((Math.random() * 9 + 1) * 100000) + "</SN>\r\n"); 1596 dragXml.append("<SN>" + (int) ((Math.random() * 9 + 1) * 100000) + "</SN>\r\n");
src/main/java/com/genersoft/iot/vmp/gb28181/transmit/cmd/impl/SIPCommanderFroPlatform.java
@@ -147,7 +147,7 @@ public class SIPCommanderFroPlatform implements ISIPCommanderForPlatform { @@ -147,7 +147,7 @@ public class SIPCommanderFroPlatform implements ISIPCommanderForPlatform {
147 try { 147 try {
148 String characterSet = parentPlatform.getCharacterSet(); 148 String characterSet = parentPlatform.getCharacterSet();
149 StringBuffer keepaliveXml = new StringBuffer(200); 149 StringBuffer keepaliveXml = new StringBuffer(200);
150 - keepaliveXml.append("<?xml version=\"1.0\" encoding=\"" + characterSet + "\" ?>\r\n"); 150 + keepaliveXml.append("<?xml version=\"1.0\" encoding=\"" + characterSet + "\"?>\r\n");
151 keepaliveXml.append("<Notify>\r\n"); 151 keepaliveXml.append("<Notify>\r\n");
152 keepaliveXml.append("<CmdType>Keepalive</CmdType>\r\n"); 152 keepaliveXml.append("<CmdType>Keepalive</CmdType>\r\n");
153 keepaliveXml.append("<SN>" + (int)((Math.random()*9+1)*100000) + "</SN>\r\n"); 153 keepaliveXml.append("<SN>" + (int)((Math.random()*9+1)*100000) + "</SN>\r\n");
@@ -215,44 +215,7 @@ public class SIPCommanderFroPlatform implements ISIPCommanderForPlatform { @@ -215,44 +215,7 @@ public class SIPCommanderFroPlatform implements ISIPCommanderForPlatform {
215 return false; 215 return false;
216 } 216 }
217 try { 217 try {
218 - String characterSet = parentPlatform.getCharacterSet();  
219 - StringBuffer catalogXml = new StringBuffer(600);  
220 - catalogXml.append("<?xml version=\"1.0\" encoding=\"" + characterSet +"\" ?>\r\n");  
221 - catalogXml.append("<Response>\r\n");  
222 - catalogXml.append("<CmdType>Catalog</CmdType>\r\n");  
223 - catalogXml.append("<SN>" +sn + "</SN>\r\n");  
224 - catalogXml.append("<DeviceID>" + parentPlatform.getDeviceGBId() + "</DeviceID>\r\n");  
225 - catalogXml.append("<SumNum>" + size + "</SumNum>\r\n");  
226 - catalogXml.append("<DeviceList Num=\"1\">\r\n");  
227 - catalogXml.append("<Item>\r\n");  
228 - if (channel != null) {  
229 - catalogXml.append("<DeviceID>" + channel.getChannelId() + "</DeviceID>\r\n");  
230 - catalogXml.append("<Name>" + channel.getName() + "</Name>\r\n");  
231 - catalogXml.append("<Manufacturer>" + channel.getManufacture() + "</Manufacturer>\r\n");  
232 - catalogXml.append("<Model>" + channel.getModel() + "</Model>\r\n");  
233 - catalogXml.append("<Owner>" + channel.getOwner() + "</Owner>\r\n");  
234 - catalogXml.append("<CivilCode>" + channel.getCivilCode() + "</CivilCode>\r\n");  
235 - catalogXml.append("<Address>" + channel.getAddress() + "</Address>\r\n");  
236 - catalogXml.append("<Parental>" + channel.getParental() + "</Parental>\r\n");  
237 - if (channel.getParentId() != null) {  
238 - catalogXml.append("<ParentID>" + channel.getParentId() + "</ParentID>\r\n");  
239 - }  
240 - catalogXml.append("<Secrecy>" + channel.getSecrecy() + "</Secrecy>\r\n");  
241 - catalogXml.append("<RegisterWay>" + channel.getRegisterWay() + "</RegisterWay>\r\n");  
242 - catalogXml.append("<Status>" + (channel.getStatus() == 0?"OFF":"ON") + "</Status>\r\n");  
243 - catalogXml.append("<Longitude>" + channel.getLongitude() + "</Longitude>\r\n");  
244 - catalogXml.append("<Latitude>" + channel.getLatitude() + "</Latitude>\r\n");  
245 - catalogXml.append("<IPAddress>" + channel.getIpAddress() + "</IPAddress>\r\n");  
246 - catalogXml.append("<Port>" + channel.getPort() + "</Port>\r\n");  
247 - catalogXml.append("<Info>\r\n");  
248 - catalogXml.append("<PTZType>" + channel.getPTZType() + "</PTZType>\r\n");  
249 - catalogXml.append("</Info>\r\n");  
250 - }  
251 -  
252 -  
253 - catalogXml.append("</Item>\r\n");  
254 - catalogXml.append("</DeviceList>\r\n");  
255 - catalogXml.append("</Response>\r\n"); 218 + String catalogXml = getCatalogXml(channel, sn, parentPlatform, size);
256 219
257 // callid 220 // callid
258 CallIdHeader callIdHeader = parentPlatform.getTransport().equals("TCP") ? tcpSipProvider.getNewCallId() 221 CallIdHeader callIdHeader = parentPlatform.getTransport().equals("TCP") ? tcpSipProvider.getNewCallId()
@@ -268,6 +231,77 @@ public class SIPCommanderFroPlatform implements ISIPCommanderForPlatform { @@ -268,6 +231,77 @@ public class SIPCommanderFroPlatform implements ISIPCommanderForPlatform {
268 return true; 231 return true;
269 } 232 }
270 233
  234 + @Override
  235 + public boolean catalogQuery(List<DeviceChannel> channels, ParentPlatform parentPlatform, String sn, String fromTag) {
  236 + if ( parentPlatform ==null) {
  237 + return false;
  238 + }
  239 + sendCatalogResponse(channels, parentPlatform, sn, fromTag, 0);
  240 + return true;
  241 + }
  242 + private String getCatalogXml(DeviceChannel channel, String sn, ParentPlatform parentPlatform, int size) {
  243 + String characterSet = parentPlatform.getCharacterSet();
  244 + StringBuffer catalogXml = new StringBuffer(600);
  245 + catalogXml.append("<?xml version=\"1.0\" encoding=\"" + characterSet +"\"?>\r\n");
  246 + catalogXml.append("<Response>\r\n");
  247 + catalogXml.append("<CmdType>Catalog</CmdType>\r\n");
  248 + catalogXml.append("<SN>" +sn + "</SN>\r\n");
  249 + catalogXml.append("<DeviceID>" + parentPlatform.getDeviceGBId() + "</DeviceID>\r\n");
  250 + catalogXml.append("<SumNum>" + size + "</SumNum>\r\n");
  251 + catalogXml.append("<DeviceList Num=\"1\">\r\n");
  252 + catalogXml.append("<Item>\r\n");
  253 + if (channel != null) {
  254 + catalogXml.append("<DeviceID>" + channel.getChannelId() + "</DeviceID>\r\n");
  255 + catalogXml.append("<Name>" + channel.getName() + "</Name>\r\n");
  256 + catalogXml.append("<Manufacturer>" + channel.getManufacture() + "</Manufacturer>\r\n");
  257 + catalogXml.append("<Model>" + channel.getModel() + "</Model>\r\n");
  258 + catalogXml.append("<Owner>" + channel.getOwner() + "</Owner>\r\n");
  259 + catalogXml.append("<CivilCode>" + channel.getCivilCode() + "</CivilCode>\r\n");
  260 + catalogXml.append("<Address>" + channel.getAddress() + "</Address>\r\n");
  261 + catalogXml.append("<Parental>" + channel.getParental() + "</Parental>\r\n");
  262 + if (channel.getParentId() != null) {
  263 + catalogXml.append("<ParentID>" + channel.getParentId() + "</ParentID>\r\n");
  264 + }
  265 + catalogXml.append("<Secrecy>" + channel.getSecrecy() + "</Secrecy>\r\n");
  266 + catalogXml.append("<RegisterWay>" + channel.getRegisterWay() + "</RegisterWay>\r\n");
  267 + catalogXml.append("<Status>" + (channel.getStatus() == 0?"OFF":"ON") + "</Status>\r\n");
  268 + catalogXml.append("<Longitude>" + channel.getLongitude() + "</Longitude>\r\n");
  269 + catalogXml.append("<Latitude>" + channel.getLatitude() + "</Latitude>\r\n");
  270 + catalogXml.append("<IPAddress>" + channel.getIpAddress() + "</IPAddress>\r\n");
  271 + catalogXml.append("<Port>" + channel.getPort() + "</Port>\r\n");
  272 + catalogXml.append("<Info>\r\n");
  273 + catalogXml.append("<PTZType>" + channel.getPTZType() + "</PTZType>\r\n");
  274 + catalogXml.append("</Info>\r\n");
  275 + }
  276 +
  277 +
  278 + catalogXml.append("</Item>\r\n");
  279 + catalogXml.append("</DeviceList>\r\n");
  280 + catalogXml.append("</Response>\r\n");
  281 + return catalogXml.toString();
  282 + }
  283 +
  284 + private void sendCatalogResponse(List<DeviceChannel> channels, ParentPlatform parentPlatform, String sn, String fromTag, int index) {
  285 + if (index >= channels.size()) {
  286 + return;
  287 + }
  288 + try {
  289 + DeviceChannel deviceChannel = channels.get(index);
  290 + String catalogXml = getCatalogXml(deviceChannel, sn, parentPlatform, channels.size());
  291 + // callid
  292 + CallIdHeader callIdHeader = parentPlatform.getTransport().equals("TCP") ? tcpSipProvider.getNewCallId()
  293 + : udpSipProvider.getNewCallId();
  294 +
  295 + Request request = headerProviderPlarformProvider.createMessageRequest(parentPlatform, catalogXml, fromTag, callIdHeader);
  296 + transmitRequest(parentPlatform, request, null, eventResult -> {
  297 + int indexNext = index + 1;
  298 + sendCatalogResponse(channels, parentPlatform, sn, fromTag, indexNext);
  299 + });
  300 + } catch (SipException | ParseException | InvalidArgumentException e) {
  301 + e.printStackTrace();
  302 + }
  303 + }
  304 +
271 /** 305 /**
272 * 向上级回复DeviceInfo查询信息 306 * 向上级回复DeviceInfo查询信息
273 * @param parentPlatform 平台信息 307 * @param parentPlatform 平台信息
@@ -283,7 +317,7 @@ public class SIPCommanderFroPlatform implements ISIPCommanderForPlatform { @@ -283,7 +317,7 @@ public class SIPCommanderFroPlatform implements ISIPCommanderForPlatform {
283 try { 317 try {
284 String characterSet = parentPlatform.getCharacterSet(); 318 String characterSet = parentPlatform.getCharacterSet();
285 StringBuffer deviceInfoXml = new StringBuffer(600); 319 StringBuffer deviceInfoXml = new StringBuffer(600);
286 - deviceInfoXml.append("<?xml version=\"1.0\" encoding=\"" + characterSet + "\" ?>\r\n"); 320 + deviceInfoXml.append("<?xml version=\"1.0\" encoding=\"" + characterSet + "\"?>\r\n");
287 deviceInfoXml.append("<Response>\r\n"); 321 deviceInfoXml.append("<Response>\r\n");
288 deviceInfoXml.append("<CmdType>DeviceInfo</CmdType>\r\n"); 322 deviceInfoXml.append("<CmdType>DeviceInfo</CmdType>\r\n");
289 deviceInfoXml.append("<SN>" +sn + "</SN>\r\n"); 323 deviceInfoXml.append("<SN>" +sn + "</SN>\r\n");
@@ -323,7 +357,7 @@ public class SIPCommanderFroPlatform implements ISIPCommanderForPlatform { @@ -323,7 +357,7 @@ public class SIPCommanderFroPlatform implements ISIPCommanderForPlatform {
323 try { 357 try {
324 String characterSet = parentPlatform.getCharacterSet(); 358 String characterSet = parentPlatform.getCharacterSet();
325 StringBuffer deviceStatusXml = new StringBuffer(600); 359 StringBuffer deviceStatusXml = new StringBuffer(600);
326 - deviceStatusXml.append("<?xml version=\"1.0\" encoding=\"" + characterSet + "\" ?>\r\n"); 360 + deviceStatusXml.append("<?xml version=\"1.0\" encoding=\"" + characterSet + "\"?>\r\n");
327 deviceStatusXml.append("<Response>\r\n"); 361 deviceStatusXml.append("<Response>\r\n");
328 deviceStatusXml.append("<CmdType>DeviceStatus</CmdType>\r\n"); 362 deviceStatusXml.append("<CmdType>DeviceStatus</CmdType>\r\n");
329 deviceStatusXml.append("<SN>" +sn + "</SN>\r\n"); 363 deviceStatusXml.append("<SN>" +sn + "</SN>\r\n");
@@ -355,7 +389,7 @@ public class SIPCommanderFroPlatform implements ISIPCommanderForPlatform { @@ -355,7 +389,7 @@ public class SIPCommanderFroPlatform implements ISIPCommanderForPlatform {
355 try { 389 try {
356 String characterSet = parentPlatform.getCharacterSet(); 390 String characterSet = parentPlatform.getCharacterSet();
357 StringBuffer deviceStatusXml = new StringBuffer(600); 391 StringBuffer deviceStatusXml = new StringBuffer(600);
358 - deviceStatusXml.append("<?xml version=\"1.0\" encoding=\"" + characterSet + "\" ?>\r\n"); 392 + deviceStatusXml.append("<?xml version=\"1.0\" encoding=\"" + characterSet + "\"?>\r\n");
359 deviceStatusXml.append("<Notify>\r\n"); 393 deviceStatusXml.append("<Notify>\r\n");
360 deviceStatusXml.append("<CmdType>MobilePosition</CmdType>\r\n"); 394 deviceStatusXml.append("<CmdType>MobilePosition</CmdType>\r\n");
361 deviceStatusXml.append("<SN>" + (int)((Math.random()*9+1)*100000) + "</SN>\r\n"); 395 deviceStatusXml.append("<SN>" + (int)((Math.random()*9+1)*100000) + "</SN>\r\n");
@@ -472,7 +506,7 @@ public class SIPCommanderFroPlatform implements ISIPCommanderForPlatform { @@ -472,7 +506,7 @@ public class SIPCommanderFroPlatform implements ISIPCommanderForPlatform {
472 channel.setParentId(parentPlatform.getDeviceGBId()); 506 channel.setParentId(parentPlatform.getDeviceGBId());
473 } 507 }
474 String characterSet = parentPlatform.getCharacterSet(); 508 String characterSet = parentPlatform.getCharacterSet();
475 - catalogXml.append("<?xml version=\"1.0\" encoding=\"" + characterSet + "\" ?>\r\n"); 509 + catalogXml.append("<?xml version=\"1.0\" encoding=\"" + characterSet + "\"?>\r\n");
476 catalogXml.append("<Notify>\r\n"); 510 catalogXml.append("<Notify>\r\n");
477 catalogXml.append("<CmdType>Catalog</CmdType>\r\n"); 511 catalogXml.append("<CmdType>Catalog</CmdType>\r\n");
478 catalogXml.append("<SN>" + (int) ((Math.random() * 9 + 1) * 100000) + "</SN>\r\n"); 512 catalogXml.append("<SN>" + (int) ((Math.random() * 9 + 1) * 100000) + "</SN>\r\n");
@@ -546,7 +580,7 @@ public class SIPCommanderFroPlatform implements ISIPCommanderForPlatform { @@ -546,7 +580,7 @@ public class SIPCommanderFroPlatform implements ISIPCommanderForPlatform {
546 } 580 }
547 String characterSet = parentPlatform.getCharacterSet(); 581 String characterSet = parentPlatform.getCharacterSet();
548 StringBuffer catalogXml = new StringBuffer(600); 582 StringBuffer catalogXml = new StringBuffer(600);
549 - catalogXml.append("<?xml version=\"1.0\" encoding=\"" + characterSet + "\" ?>\r\n"); 583 + catalogXml.append("<?xml version=\"1.0\" encoding=\"" + characterSet + "\"?>\r\n");
550 catalogXml.append("<Notify>\r\n"); 584 catalogXml.append("<Notify>\r\n");
551 catalogXml.append("<CmdType>Catalog</CmdType>\r\n"); 585 catalogXml.append("<CmdType>Catalog</CmdType>\r\n");
552 catalogXml.append("<SN>" + (int) ((Math.random() * 9 + 1) * 100000) + "</SN>\r\n"); 586 catalogXml.append("<SN>" + (int) ((Math.random() * 9 + 1) * 100000) + "</SN>\r\n");
@@ -569,7 +603,7 @@ public class SIPCommanderFroPlatform implements ISIPCommanderForPlatform { @@ -569,7 +603,7 @@ public class SIPCommanderFroPlatform implements ISIPCommanderForPlatform {
569 try { 603 try {
570 String characterSet = parentPlatform.getCharacterSet(); 604 String characterSet = parentPlatform.getCharacterSet();
571 StringBuffer recordXml = new StringBuffer(600); 605 StringBuffer recordXml = new StringBuffer(600);
572 - recordXml.append("<?xml version=\"1.0\" encoding=\"" + characterSet + "\" ?>\r\n"); 606 + recordXml.append("<?xml version=\"1.0\" encoding=\"" + characterSet + "\"?>\r\n");
573 recordXml.append("<Response>\r\n"); 607 recordXml.append("<Response>\r\n");
574 recordXml.append("<CmdType>RecordInfo</CmdType>\r\n"); 608 recordXml.append("<CmdType>RecordInfo</CmdType>\r\n");
575 recordXml.append("<SN>" +recordInfo.getSn() + "</SN>\r\n"); 609 recordXml.append("<SN>" +recordInfo.getSn() + "</SN>\r\n");
src/main/java/com/genersoft/iot/vmp/gb28181/transmit/event/request/impl/message/MessageRequestProcessor.java
@@ -12,6 +12,7 @@ import com.genersoft.iot.vmp.gb28181.transmit.event.request.SIPRequestProcessorP @@ -12,6 +12,7 @@ import com.genersoft.iot.vmp.gb28181.transmit.event.request.SIPRequestProcessorP
12 import com.genersoft.iot.vmp.gb28181.utils.SipUtils; 12 import com.genersoft.iot.vmp.gb28181.utils.SipUtils;
13 import com.genersoft.iot.vmp.storager.IRedisCatchStorage; 13 import com.genersoft.iot.vmp.storager.IRedisCatchStorage;
14 import com.genersoft.iot.vmp.storager.IVideoManagerStorage; 14 import com.genersoft.iot.vmp.storager.IVideoManagerStorage;
  15 +import gov.nist.javax.sip.message.SIPRequest;
15 import org.dom4j.DocumentException; 16 import org.dom4j.DocumentException;
16 import org.dom4j.Element; 17 import org.dom4j.Element;
17 import org.slf4j.Logger; 18 import org.slf4j.Logger;
@@ -23,6 +24,7 @@ import org.springframework.stereotype.Component; @@ -23,6 +24,7 @@ import org.springframework.stereotype.Component;
23 import javax.sip.InvalidArgumentException; 24 import javax.sip.InvalidArgumentException;
24 import javax.sip.RequestEvent; 25 import javax.sip.RequestEvent;
25 import javax.sip.SipException; 26 import javax.sip.SipException;
  27 +import javax.sip.address.SipURI;
26 import javax.sip.header.CSeqHeader; 28 import javax.sip.header.CSeqHeader;
27 import javax.sip.header.CallIdHeader; 29 import javax.sip.header.CallIdHeader;
28 import javax.sip.message.Response; 30 import javax.sip.message.Response;
@@ -81,6 +83,17 @@ public class MessageRequestProcessor extends SIPRequestProcessorParent implement @@ -81,6 +83,17 @@ public class MessageRequestProcessor extends SIPRequestProcessorParent implement
81 // 查询上级平台是否存在 83 // 查询上级平台是否存在
82 ParentPlatform parentPlatform = storage.queryParentPlatByServerGBId(deviceId); 84 ParentPlatform parentPlatform = storage.queryParentPlatByServerGBId(deviceId);
83 try { 85 try {
  86 + if (device != null && parentPlatform != null) {
  87 + logger.warn("[重复]平台与设备编号重复:{}", deviceId);
  88 + SIPRequest request = (SIPRequest) evt.getRequest();
  89 + String hostAddress = request.getRemoteAddress().getHostAddress();
  90 + int remotePort = request.getRemotePort();
  91 + if (device.getHostAddress().equals(hostAddress + ":" + remotePort)) {
  92 + parentPlatform = null;
  93 + }else {
  94 + device = null;
  95 + }
  96 + }
84 if (device == null && parentPlatform == null) { 97 if (device == null && parentPlatform == null) {
85 // 不存在则回复404 98 // 不存在则回复404
86 responseAck(evt, Response.NOT_FOUND, "device "+ deviceId +" not found"); 99 responseAck(evt, Response.NOT_FOUND, "device "+ deviceId +" not found");
src/main/java/com/genersoft/iot/vmp/gb28181/transmit/event/request/impl/message/notify/cmd/CatalogNotifyMessageHandler.java
@@ -18,6 +18,7 @@ import javax.sip.SipException; @@ -18,6 +18,7 @@ import javax.sip.SipException;
18 import javax.sip.header.FromHeader; 18 import javax.sip.header.FromHeader;
19 import javax.sip.message.Response; 19 import javax.sip.message.Response;
20 import java.text.ParseException; 20 import java.text.ParseException;
  21 +import java.util.ArrayList;
21 import java.util.List; 22 import java.util.List;
22 23
23 @Component 24 @Component
@@ -58,7 +59,8 @@ public class CatalogNotifyMessageHandler extends SIPRequestProcessorParent imple @@ -58,7 +59,8 @@ public class CatalogNotifyMessageHandler extends SIPRequestProcessorParent imple
58 List<DeviceChannelInPlatform> deviceChannels = storage.queryChannelListInParentPlatform(parentPlatform.getServerGBId()); 59 List<DeviceChannelInPlatform> deviceChannels = storage.queryChannelListInParentPlatform(parentPlatform.getServerGBId());
59 // 查询关联的直播通道 60 // 查询关联的直播通道
60 List<GbStream> gbStreams = storage.queryGbStreamListInPlatform(parentPlatform.getServerGBId()); 61 List<GbStream> gbStreams = storage.queryGbStreamListInPlatform(parentPlatform.getServerGBId());
61 - int size = deviceChannels.size() + gbStreams.size(); 62 +
  63 + List<DeviceChannel> allChannels = new ArrayList<>();
62 // 回复目录信息 64 // 回复目录信息
63 List<PlatformCatalog> catalogs = storage.queryCatalogInPlatform(parentPlatform.getServerGBId()); 65 List<PlatformCatalog> catalogs = storage.queryCatalogInPlatform(parentPlatform.getServerGBId());
64 if (catalogs.size() > 0) { 66 if (catalogs.size() > 0) {
@@ -81,9 +83,7 @@ public class CatalogNotifyMessageHandler extends SIPRequestProcessorParent imple @@ -81,9 +83,7 @@ public class CatalogNotifyMessageHandler extends SIPRequestProcessorParent imple
81 deviceChannel.setModel("live"); 83 deviceChannel.setModel("live");
82 deviceChannel.setOwner("wvp-pro"); 84 deviceChannel.setOwner("wvp-pro");
83 deviceChannel.setSecrecy("0"); 85 deviceChannel.setSecrecy("0");
84 - cmderFroPlatform.catalogQuery(deviceChannel, parentPlatform, sn, fromHeader.getTag(), size);  
85 - // 防止发送过快  
86 - Thread.sleep(100); 86 + allChannels.add(deviceChannel);
87 } 87 }
88 } 88 }
89 // 回复级联的通道 89 // 回复级联的通道
@@ -96,9 +96,7 @@ public class CatalogNotifyMessageHandler extends SIPRequestProcessorParent imple @@ -96,9 +96,7 @@ public class CatalogNotifyMessageHandler extends SIPRequestProcessorParent imple
96 deviceChannel.setParental(0); 96 deviceChannel.setParental(0);
97 deviceChannel.setParentId(channel.getCatalogId()); 97 deviceChannel.setParentId(channel.getCatalogId());
98 deviceChannel.setCivilCode(parentPlatform.getDeviceGBId().substring(0, 6)); 98 deviceChannel.setCivilCode(parentPlatform.getDeviceGBId().substring(0, 6));
99 - cmderFroPlatform.catalogQuery(deviceChannel, parentPlatform, sn, fromHeader.getTag(), size);  
100 - // 防止发送过快  
101 - Thread.sleep(100); 99 + allChannels.add(deviceChannel);
102 } 100 }
103 } 101 }
104 // 回复直播的通道 102 // 回复直播的通道
@@ -123,16 +121,16 @@ public class CatalogNotifyMessageHandler extends SIPRequestProcessorParent imple @@ -123,16 +121,16 @@ public class CatalogNotifyMessageHandler extends SIPRequestProcessorParent imple
123 deviceChannel.setOwner("wvp-pro"); 121 deviceChannel.setOwner("wvp-pro");
124 deviceChannel.setParental(0); 122 deviceChannel.setParental(0);
125 deviceChannel.setSecrecy("0"); 123 deviceChannel.setSecrecy("0");
126 - cmderFroPlatform.catalogQuery(deviceChannel, parentPlatform, sn, fromHeader.getTag(), size);  
127 - // 防止发送过快  
128 - Thread.sleep(100); 124 + allChannels.add(deviceChannel);
129 } 125 }
130 } 126 }
131 - if (size == 0) { 127 + if (allChannels.size() > 0) {
  128 + cmderFroPlatform.catalogQuery(allChannels, parentPlatform, sn, fromHeader.getTag());
  129 + }else {
132 // 回复无通道 130 // 回复无通道
133 - cmderFroPlatform.catalogQuery(null, parentPlatform, sn, fromHeader.getTag(), size); 131 + cmderFroPlatform.catalogQuery(null, parentPlatform, sn, fromHeader.getTag(), 0);
134 } 132 }
135 - } catch (SipException | InvalidArgumentException | ParseException | InterruptedException e) { 133 + } catch (SipException | InvalidArgumentException | ParseException e) {
136 e.printStackTrace(); 134 e.printStackTrace();
137 } 135 }
138 136
src/main/java/com/genersoft/iot/vmp/gb28181/transmit/event/request/impl/message/query/cmd/CatalogQueryMessageHandler.java
@@ -22,6 +22,7 @@ import javax.sip.SipException; @@ -22,6 +22,7 @@ import javax.sip.SipException;
22 import javax.sip.header.FromHeader; 22 import javax.sip.header.FromHeader;
23 import javax.sip.message.Response; 23 import javax.sip.message.Response;
24 import java.text.ParseException; 24 import java.text.ParseException;
  25 +import java.util.ArrayList;
25 import java.util.List; 26 import java.util.List;
26 27
27 @Component 28 @Component
@@ -45,6 +46,9 @@ public class CatalogQueryMessageHandler extends SIPRequestProcessorParent implem @@ -45,6 +46,9 @@ public class CatalogQueryMessageHandler extends SIPRequestProcessorParent implem
45 @Autowired 46 @Autowired
46 private EventPublisher publisher; 47 private EventPublisher publisher;
47 48
  49 + @Autowired
  50 + private IVideoManagerStorage storage;
  51 +
48 @Override 52 @Override
49 public void afterPropertiesSet() throws Exception { 53 public void afterPropertiesSet() throws Exception {
50 queryMessageHandler.addHandler(cmdType, this); 54 queryMessageHandler.addHandler(cmdType, this);
@@ -71,10 +75,11 @@ public class CatalogQueryMessageHandler extends SIPRequestProcessorParent implem @@ -71,10 +75,11 @@ public class CatalogQueryMessageHandler extends SIPRequestProcessorParent implem
71 List<GbStream> gbStreams = storager.queryGbStreamListInPlatform(parentPlatform.getServerGBId()); 75 List<GbStream> gbStreams = storager.queryGbStreamListInPlatform(parentPlatform.getServerGBId());
72 // 回复目录信息 76 // 回复目录信息
73 List<PlatformCatalog> catalogs = storager.queryCatalogInPlatform(parentPlatform.getServerGBId()); 77 List<PlatformCatalog> catalogs = storager.queryCatalogInPlatform(parentPlatform.getServerGBId());
74 - int size = catalogs.size() + deviceChannelInPlatforms.size() + gbStreams.size(); 78 +
  79 + List<DeviceChannel> allChannels = new ArrayList<>();
75 if (catalogs.size() > 0) { 80 if (catalogs.size() > 0) {
76 for (PlatformCatalog catalog : catalogs) { 81 for (PlatformCatalog catalog : catalogs) {
77 - if (catalog.getParentId().equals(parentPlatform.getServerGBId())) { 82 + if (catalog.getParentId().equals(catalog.getPlatformId())) {
78 catalog.setParentId(parentPlatform.getDeviceGBId()); 83 catalog.setParentId(parentPlatform.getDeviceGBId());
79 } 84 }
80 DeviceChannel deviceChannel = new DeviceChannel(); 85 DeviceChannel deviceChannel = new DeviceChannel();
@@ -92,9 +97,7 @@ public class CatalogQueryMessageHandler extends SIPRequestProcessorParent implem @@ -92,9 +97,7 @@ public class CatalogQueryMessageHandler extends SIPRequestProcessorParent implem
92 deviceChannel.setModel("live"); 97 deviceChannel.setModel("live");
93 deviceChannel.setOwner("wvp-pro"); 98 deviceChannel.setOwner("wvp-pro");
94 deviceChannel.setSecrecy("0"); 99 deviceChannel.setSecrecy("0");
95 - cmderFroPlatform.catalogQuery(deviceChannel, parentPlatform, sn, fromHeader.getTag(), size);  
96 - // 防止发送过快  
97 - Thread.sleep(100); 100 + allChannels.add(deviceChannel);
98 } 101 }
99 } 102 }
100 // 回复级联的通道 103 // 回复级联的通道
@@ -103,20 +106,18 @@ public class CatalogQueryMessageHandler extends SIPRequestProcessorParent implem @@ -103,20 +106,18 @@ public class CatalogQueryMessageHandler extends SIPRequestProcessorParent implem
103 if (channel.getCatalogId().equals(parentPlatform.getServerGBId())) { 106 if (channel.getCatalogId().equals(parentPlatform.getServerGBId())) {
104 channel.setCatalogId(parentPlatform.getDeviceGBId()); 107 channel.setCatalogId(parentPlatform.getDeviceGBId());
105 } 108 }
106 - DeviceChannel deviceChannel = storager.queryChannel(channel.getDeviceId(), channel.getChannelId()); 109 + DeviceChannel deviceChannel = storage.queryChannel(channel.getDeviceId(), channel.getChannelId());
107 deviceChannel.setParental(0); 110 deviceChannel.setParental(0);
108 deviceChannel.setParentId(channel.getCatalogId()); 111 deviceChannel.setParentId(channel.getCatalogId());
109 deviceChannel.setCivilCode(parentPlatform.getDeviceGBId().substring(0, 6)); 112 deviceChannel.setCivilCode(parentPlatform.getDeviceGBId().substring(0, 6));
110 - cmderFroPlatform.catalogQuery(deviceChannel, parentPlatform, sn, fromHeader.getTag(), size);  
111 - // 防止发送过快  
112 - Thread.sleep(100); 113 + allChannels.add(deviceChannel);
113 } 114 }
114 } 115 }
115 // 回复直播的通道 116 // 回复直播的通道
116 if (gbStreams.size() > 0) { 117 if (gbStreams.size() > 0) {
117 for (GbStream gbStream : gbStreams) { 118 for (GbStream gbStream : gbStreams) {
118 if (gbStream.getCatalogId().equals(parentPlatform.getServerGBId())) { 119 if (gbStream.getCatalogId().equals(parentPlatform.getServerGBId())) {
119 - gbStream.setCatalogId(parentPlatform.getDeviceGBId()); 120 + gbStream.setCatalogId(null);
120 } 121 }
121 DeviceChannel deviceChannel = new DeviceChannel(); 122 DeviceChannel deviceChannel = new DeviceChannel();
122 deviceChannel.setChannelId(gbStream.getGbId()); 123 deviceChannel.setChannelId(gbStream.getGbId());
@@ -134,15 +135,14 @@ public class CatalogQueryMessageHandler extends SIPRequestProcessorParent implem @@ -134,15 +135,14 @@ public class CatalogQueryMessageHandler extends SIPRequestProcessorParent implem
134 deviceChannel.setOwner("wvp-pro"); 135 deviceChannel.setOwner("wvp-pro");
135 deviceChannel.setParental(0); 136 deviceChannel.setParental(0);
136 deviceChannel.setSecrecy("0"); 137 deviceChannel.setSecrecy("0");
137 -  
138 - cmderFroPlatform.catalogQuery(deviceChannel, parentPlatform, sn, fromHeader.getTag(), size);  
139 - // 防止发送过快  
140 - Thread.sleep(100); 138 + allChannels.add(deviceChannel);
141 } 139 }
142 } 140 }
143 - if (size == 0) { 141 + if (allChannels.size() > 0) {
  142 + cmderFroPlatform.catalogQuery(allChannels, parentPlatform, sn, fromHeader.getTag());
  143 + }else {
144 // 回复无通道 144 // 回复无通道
145 - cmderFroPlatform.catalogQuery(null, parentPlatform, sn, fromHeader.getTag(), size); 145 + cmderFroPlatform.catalogQuery(null, parentPlatform, sn, fromHeader.getTag(), 0);
146 } 146 }
147 } catch (SipException e) { 147 } catch (SipException e) {
148 e.printStackTrace(); 148 e.printStackTrace();
@@ -150,8 +150,6 @@ public class CatalogQueryMessageHandler extends SIPRequestProcessorParent implem @@ -150,8 +150,6 @@ public class CatalogQueryMessageHandler extends SIPRequestProcessorParent implem
150 e.printStackTrace(); 150 e.printStackTrace();
151 } catch (ParseException e) { 151 } catch (ParseException e) {
152 e.printStackTrace(); 152 e.printStackTrace();
153 - } catch (InterruptedException e) {  
154 - e.printStackTrace();  
155 } 153 }
156 154
157 } 155 }
src/main/java/com/genersoft/iot/vmp/gb28181/transmit/event/request/impl/message/response/cmd/CatalogResponseMessageHandler.java
@@ -123,7 +123,7 @@ public class CatalogResponseMessageHandler extends SIPRequestProcessorParent imp @@ -123,7 +123,7 @@ public class CatalogResponseMessageHandler extends SIPRequestProcessorParent imp
123 123
124 channelList.add(deviceChannel); 124 channelList.add(deviceChannel);
125 } 125 }
126 - logger.debug("收到来自设备【{}】的通道: {}个,{}/{}", device.getDeviceId(), channelList.size(), catalogDataCatch.get(key) == null ? 0 :catalogDataCatch.get(key).size(), sumNum); 126 + logger.info("收到来自设备【{}】的通道: {}个,{}/{}", device.getDeviceId(), channelList.size(), catalogDataCatch.get(key) == null ? 0 :catalogDataCatch.get(key).size(), sumNum);
127 catalogDataCatch.put(key, sumNum, device, channelList); 127 catalogDataCatch.put(key, sumNum, device, channelList);
128 if (catalogDataCatch.get(key).size() == sumNum) { 128 if (catalogDataCatch.get(key).size() == sumNum) {
129 // 数据已经完整接收 129 // 数据已经完整接收
@@ -230,8 +230,22 @@ public class CatalogResponseMessageHandler extends SIPRequestProcessorParent imp @@ -230,8 +230,22 @@ public class CatalogResponseMessageHandler extends SIPRequestProcessorParent imp
230 } 230 }
231 } 231 }
232 232
233 - public String getChannelSyncProgress(String deviceId) { 233 + public SyncStatus getChannelSyncProgress(String deviceId) {
234 String key = DeferredResultHolder.CALLBACK_CMD_CATALOG + deviceId; 234 String key = DeferredResultHolder.CALLBACK_CMD_CATALOG + deviceId;
235 - return catalogDataCatch.get(key) == null ? "0/0" : catalogDataCatch.get(key).size() + "/" + catalogDataCatch.getTotal(key); 235 + if (catalogDataCatch.get(key) == null) {
  236 + return null;
  237 + }else {
  238 + return catalogDataCatch.getSyncStatus(key);
  239 + }
  240 + }
  241 +
  242 + public void setChannelSyncReady(String deviceId) {
  243 + String key = DeferredResultHolder.CALLBACK_CMD_CATALOG + deviceId;
  244 + catalogDataCatch.addReady(key);
  245 + }
  246 +
  247 + public void setChannelSyncEnd(String deviceId, String errorMsg) {
  248 + String key = DeferredResultHolder.CALLBACK_CMD_CATALOG + deviceId;
  249 + catalogDataCatch.setChannelSyncEnd(key, errorMsg);
236 } 250 }
237 } 251 }
src/main/java/com/genersoft/iot/vmp/service/IDeviceService.java
1 package com.genersoft.iot.vmp.service; 1 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.SyncStatus;
4 5
5 /** 6 /**
6 * 设备相关业务处理 7 * 设备相关业务处理
@@ -34,4 +35,24 @@ public interface IDeviceService { @@ -34,4 +35,24 @@ public interface IDeviceService {
34 * @return 35 * @return
35 */ 36 */
36 boolean removeMobilePositionSubscribe(Device device); 37 boolean removeMobilePositionSubscribe(Device device);
  38 +
  39 + /**
  40 + * 移除移动位置订阅
  41 + * @param deviceId 设备ID
  42 + * @return
  43 + */
  44 + SyncStatus getChannelSyncStatus(String deviceId);
  45 +
  46 + /**
  47 + * 设置通道同步状态
  48 + * @param deviceId 设备ID
  49 + */
  50 + void setChannelSyncReady(String deviceId);
  51 +
  52 + /**
  53 + * 设置同步结束
  54 + * @param deviceId 设备ID
  55 + * @param errorMsg 错误信息
  56 + */
  57 + void setChannelSyncEnd(String deviceId, String errorMsg);
37 } 58 }
src/main/java/com/genersoft/iot/vmp/service/impl/DeviceServiceImpl.java
@@ -3,9 +3,12 @@ package com.genersoft.iot.vmp.service.impl; @@ -3,9 +3,12 @@ package com.genersoft.iot.vmp.service.impl;
3 import com.genersoft.iot.vmp.conf.DynamicTask; 3 import com.genersoft.iot.vmp.conf.DynamicTask;
4 import com.genersoft.iot.vmp.gb28181.bean.Device; 4 import com.genersoft.iot.vmp.gb28181.bean.Device;
5 import com.genersoft.iot.vmp.gb28181.transmit.cmd.ISIPCommander; 5 import com.genersoft.iot.vmp.gb28181.transmit.cmd.ISIPCommander;
  6 +import com.genersoft.iot.vmp.gb28181.transmit.event.request.impl.message.response.cmd.CatalogResponseMessageHandler;
6 import com.genersoft.iot.vmp.service.IDeviceService; 7 import com.genersoft.iot.vmp.service.IDeviceService;
7 import com.genersoft.iot.vmp.gb28181.task.impl.CatalogSubscribeTask; 8 import com.genersoft.iot.vmp.gb28181.task.impl.CatalogSubscribeTask;
8 import com.genersoft.iot.vmp.gb28181.task.impl.MobilePositionSubscribeTask; 9 import com.genersoft.iot.vmp.gb28181.task.impl.MobilePositionSubscribeTask;
  10 +import com.genersoft.iot.vmp.gb28181.bean.SyncStatus;
  11 +import com.genersoft.iot.vmp.storager.IRedisCatchStorage;
9 import org.slf4j.Logger; 12 import org.slf4j.Logger;
10 import org.slf4j.LoggerFactory; 13 import org.slf4j.LoggerFactory;
11 import org.springframework.beans.factory.annotation.Autowired; 14 import org.springframework.beans.factory.annotation.Autowired;
@@ -25,6 +28,12 @@ public class DeviceServiceImpl implements IDeviceService { @@ -25,6 +28,12 @@ public class DeviceServiceImpl implements IDeviceService {
25 @Autowired 28 @Autowired
26 private ISIPCommander sipCommander; 29 private ISIPCommander sipCommander;
27 30
  31 + @Autowired
  32 + private CatalogResponseMessageHandler catalogResponseMessageHandler;
  33 +
  34 + @Autowired
  35 + private IRedisCatchStorage redisCatchStorage;
  36 +
28 @Override 37 @Override
29 public boolean addCatalogSubscribe(Device device) { 38 public boolean addCatalogSubscribe(Device device) {
30 if (device == null || device.getSubscribeCycleForCatalog() < 0) { 39 if (device == null || device.getSubscribeCycleForCatalog() < 0) {
@@ -86,4 +95,19 @@ public class DeviceServiceImpl implements IDeviceService { @@ -86,4 +95,19 @@ public class DeviceServiceImpl implements IDeviceService {
86 dynamicTask.stop(device.getDeviceId() + "mobile_position"); 95 dynamicTask.stop(device.getDeviceId() + "mobile_position");
87 return true; 96 return true;
88 } 97 }
  98 +
  99 + @Override
  100 + public SyncStatus getChannelSyncStatus(String deviceId) {
  101 + return catalogResponseMessageHandler.getChannelSyncProgress(deviceId);
  102 + }
  103 +
  104 + @Override
  105 + public void setChannelSyncReady(String deviceId) {
  106 + catalogResponseMessageHandler.setChannelSyncReady(deviceId);
  107 + }
  108 +
  109 + @Override
  110 + public void setChannelSyncEnd(String deviceId, String errorMsg) {
  111 + catalogResponseMessageHandler.setChannelSyncEnd(deviceId, errorMsg);
  112 + }
89 } 113 }
src/main/java/com/genersoft/iot/vmp/storager/IRedisCatchStorage.java
@@ -216,4 +216,5 @@ public interface IRedisCatchStorage { @@ -216,4 +216,5 @@ public interface IRedisCatchStorage {
216 void sendMobilePositionMsg(JSONObject jsonObject); 216 void sendMobilePositionMsg(JSONObject jsonObject);
217 217
218 void sendStreamPushRequestedMsg(MessageForPushChannel messageForPushChannel); 218 void sendStreamPushRequestedMsg(MessageForPushChannel messageForPushChannel);
  219 +
219 } 220 }
src/main/java/com/genersoft/iot/vmp/storager/impl/RedisCatchStorageImpl.java
@@ -638,4 +638,5 @@ public class RedisCatchStorageImpl implements IRedisCatchStorage { @@ -638,4 +638,5 @@ public class RedisCatchStorageImpl implements IRedisCatchStorage {
638 logger.info("[redis 推流被请求通知] {}: {}-{}", key, msg.getApp(), msg.getStream()); 638 logger.info("[redis 推流被请求通知] {}: {}-{}", key, msg.getApp(), msg.getStream());
639 redis.convertAndSend(key, (JSONObject)JSON.toJSON(msg)); 639 redis.convertAndSend(key, (JSONObject)JSON.toJSON(msg));
640 } 640 }
  641 +
641 } 642 }
src/main/java/com/genersoft/iot/vmp/storager/impl/VideoManagerStorageImpl.java
@@ -445,8 +445,6 @@ public class VideoManagerStorageImpl implements IVideoManagerStorage { @@ -445,8 +445,6 @@ public class VideoManagerStorageImpl implements IVideoManagerStorage {
445 device.setOnline(1); 445 device.setOnline(1);
446 logger.info("更新设备在线: " + deviceId); 446 logger.info("更新设备在线: " + deviceId);
447 redisCatchStorage.updateDevice(device); 447 redisCatchStorage.updateDevice(device);
448 - List<DeviceChannel> deviceChannelList = deviceChannelMapper.queryOnlineChannelsByDeviceId(deviceId);  
449 - eventPublisher.catalogEventPublish(null, deviceChannelList, CatalogEvent.ON);  
450 return deviceMapper.update(device) > 0; 448 return deviceMapper.update(device) > 0;
451 } 449 }
452 450
src/main/java/com/genersoft/iot/vmp/vmanager/gb28181/device/DeviceQuery.java
@@ -4,6 +4,7 @@ import com.alibaba.fastjson.JSONObject; @@ -4,6 +4,7 @@ import com.alibaba.fastjson.JSONObject;
4 import com.genersoft.iot.vmp.conf.DynamicTask; 4 import com.genersoft.iot.vmp.conf.DynamicTask;
5 import com.genersoft.iot.vmp.gb28181.bean.Device; 5 import com.genersoft.iot.vmp.gb28181.bean.Device;
6 import com.genersoft.iot.vmp.gb28181.bean.DeviceChannel; 6 import com.genersoft.iot.vmp.gb28181.bean.DeviceChannel;
  7 +import com.genersoft.iot.vmp.gb28181.bean.SyncStatus;
7 import com.genersoft.iot.vmp.gb28181.event.DeviceOffLineDetector; 8 import com.genersoft.iot.vmp.gb28181.event.DeviceOffLineDetector;
8 import com.genersoft.iot.vmp.gb28181.transmit.callback.DeferredResultHolder; 9 import com.genersoft.iot.vmp.gb28181.transmit.callback.DeferredResultHolder;
9 import com.genersoft.iot.vmp.gb28181.transmit.callback.RequestMessage; 10 import com.genersoft.iot.vmp.gb28181.transmit.callback.RequestMessage;
@@ -18,6 +19,7 @@ import io.swagger.annotations.Api; @@ -18,6 +19,7 @@ import io.swagger.annotations.Api;
18 import io.swagger.annotations.ApiImplicitParam; 19 import io.swagger.annotations.ApiImplicitParam;
19 import io.swagger.annotations.ApiImplicitParams; 20 import io.swagger.annotations.ApiImplicitParams;
20 import io.swagger.annotations.ApiOperation; 21 import io.swagger.annotations.ApiOperation;
  22 +import org.kxml2.wap.wv.WV;
21 import org.slf4j.Logger; 23 import org.slf4j.Logger;
22 import org.slf4j.LoggerFactory; 24 import org.slf4j.LoggerFactory;
23 import org.springframework.beans.factory.annotation.Autowired; 25 import org.springframework.beans.factory.annotation.Autowired;
@@ -149,49 +151,30 @@ public class DeviceQuery { @@ -149,49 +151,30 @@ public class DeviceQuery {
149 @ApiImplicitParam(name="deviceId", value = "设备id", required = true, dataTypeClass = String.class), 151 @ApiImplicitParam(name="deviceId", value = "设备id", required = true, dataTypeClass = String.class),
150 }) 152 })
151 @PostMapping("/devices/{deviceId}/sync") 153 @PostMapping("/devices/{deviceId}/sync")
152 - public DeferredResult<ResponseEntity<Device>> devicesSync(@PathVariable String deviceId){ 154 + public WVPResult<SyncStatus> devicesSync(@PathVariable String deviceId){
153 155
154 if (logger.isDebugEnabled()) { 156 if (logger.isDebugEnabled()) {
155 logger.debug("设备通道信息同步API调用,deviceId:" + deviceId); 157 logger.debug("设备通道信息同步API调用,deviceId:" + deviceId);
156 } 158 }
157 Device device = storager.queryVideoDevice(deviceId); 159 Device device = storager.queryVideoDevice(deviceId);
158 - String key = DeferredResultHolder.CALLBACK_CMD_CATALOG + deviceId;  
159 - String uuid = UUID.randomUUID().toString();  
160 - // 默认超时时间为30分钟  
161 - DeferredResult<ResponseEntity<Device>> result = new DeferredResult<ResponseEntity<Device>>(30*60*1000L);  
162 - result.onTimeout(()->{  
163 - logger.warn("设备[{}]通道信息同步超时", deviceId);  
164 - // 释放rtpserver  
165 - RequestMessage msg = new RequestMessage();  
166 - msg.setKey(key);  
167 - msg.setId(uuid);  
168 - WVPResult<Object> wvpResult = new WVPResult<>();  
169 - wvpResult.setCode(-1);  
170 - wvpResult.setData(device);  
171 - wvpResult.setMsg("更新超时");  
172 - msg.setData(wvpResult);  
173 - resultHolder.invokeAllResult(msg);  
174 -  
175 - });  
176 - // 等待其他相同请求返回时一起返回  
177 - if (resultHolder.exist(key, null)) {  
178 - resultHolder.put(key, uuid, result);  
179 - return result;  
180 - }else {  
181 - cmder.catalogQuery(device, event -> {  
182 - RequestMessage msg = new RequestMessage();  
183 - msg.setKey(key);  
184 - msg.setId(uuid);  
185 - WVPResult<Object> wvpResult = new WVPResult<>();  
186 - wvpResult.setCode(-1);  
187 - wvpResult.setData(device);  
188 - wvpResult.setMsg(String.format("同步通道失败,错误码: %s, %s", event.statusCode, event.msg));  
189 - msg.setData(wvpResult);  
190 - resultHolder.invokeAllResult(msg);  
191 - });  
192 - resultHolder.put(key, uuid, result);  
193 - return result; 160 + SyncStatus syncStatus = deviceService.getChannelSyncStatus(deviceId);
  161 + // 已存在则返回进度
  162 + if (syncStatus != null && syncStatus.getErrorMsg() == null) {
  163 + WVPResult<SyncStatus> wvpResult = new WVPResult<>();
  164 + wvpResult.setCode(0);
  165 + wvpResult.setData(syncStatus);
  166 + return wvpResult;
194 } 167 }
  168 + SyncStatus syncStatusReady = new SyncStatus();
  169 + deviceService.setChannelSyncReady(deviceId);
  170 + cmder.catalogQuery(device, event -> {
  171 + String errorMsg = String.format("同步通道失败,错误码: %s, %s", event.statusCode, event.msg);
  172 + deviceService.setChannelSyncEnd(deviceId, errorMsg);
  173 + });
  174 + WVPResult<SyncStatus> wvpResult = new WVPResult<>();
  175 + wvpResult.setCode(0);
  176 + wvpResult.setMsg("开始同步");
  177 + return wvpResult;
195 } 178 }
196 179
197 /** 180 /**
@@ -468,4 +451,22 @@ public class DeviceQuery { @@ -468,4 +451,22 @@ public class DeviceQuery {
468 public WVPResult<List<DeviceChannelTree>> tree(@PathVariable String deviceId) { 451 public WVPResult<List<DeviceChannelTree>> tree(@PathVariable String deviceId) {
469 return WVPResult.Data(storager.tree(deviceId)); 452 return WVPResult.Data(storager.tree(deviceId));
470 } 453 }
  454 +
  455 + @GetMapping("/{deviceId}/sync_status")
  456 + @ApiOperation(value = "获取通道同步进度", notes = "获取通道同步进度")
  457 + public WVPResult<SyncStatus> getSyncStatus(@PathVariable String deviceId) {
  458 + SyncStatus channelSyncStatus = deviceService.getChannelSyncStatus(deviceId);
  459 + WVPResult<SyncStatus> wvpResult = new WVPResult<>();
  460 + if (channelSyncStatus == null) {
  461 + wvpResult.setCode(-1);
  462 + wvpResult.setMsg("同步尚未开始");
  463 + }else {
  464 + wvpResult.setCode(0);
  465 + wvpResult.setData(channelSyncStatus);
  466 + if (channelSyncStatus.getErrorMsg() != null) {
  467 + wvpResult.setMsg(channelSyncStatus.getErrorMsg());
  468 + }
  469 + }
  470 + return wvpResult;
  471 + }
471 } 472 }
web_src/src/components/DeviceList.vue
@@ -57,7 +57,7 @@ @@ -57,7 +57,7 @@
57 57
58 <el-table-column label="操作" width="450" align="center" fixed="right"> 58 <el-table-column label="操作" width="450" align="center" fixed="right">
59 <template slot-scope="scope"> 59 <template slot-scope="scope">
60 - <el-button size="mini" :loading="syncDevices.includes(scope.row.deviceId)" v-if="scope.row.online!=0" icon="el-icon-refresh" @click="refDevice(scope.row)">刷新</el-button> 60 + <el-button size="mini" v-if="scope.row.online!=0" icon="el-icon-refresh" @click="refDevice(scope.row)" @mouseover="getTooltipContent(scope.row.deviceId)">刷新</el-button>
61 <el-button-group> 61 <el-button-group>
62 <el-button size="mini" icon="el-icon-video-camera-solid" v-bind:disabled="scope.row.online==0" type="primary" @click="showChannelList(scope.row)">通道</el-button> 62 <el-button size="mini" icon="el-icon-video-camera-solid" v-bind:disabled="scope.row.online==0" type="primary" @click="showChannelList(scope.row)">通道</el-button>
63 <el-button size="mini" icon="el-icon-location" v-bind:disabled="scope.row.online==0" type="primary" @click="showDevicePosition(scope.row)">定位</el-button> 63 <el-button size="mini" icon="el-icon-location" v-bind:disabled="scope.row.online==0" type="primary" @click="showDevicePosition(scope.row)">定位</el-button>
@@ -78,6 +78,7 @@ @@ -78,6 +78,7 @@
78 :total="total"> 78 :total="total">
79 </el-pagination> 79 </el-pagination>
80 <deviceEdit ref="deviceEdit" ></deviceEdit> 80 <deviceEdit ref="deviceEdit" ></deviceEdit>
  81 + <syncChannelProgress ref="syncChannelProgress" ></syncChannelProgress>
81 </el-main> 82 </el-main>
82 </el-container> 83 </el-container>
83 </div> 84 </div>
@@ -86,11 +87,13 @@ @@ -86,11 +87,13 @@
86 <script> 87 <script>
87 import uiHeader from './UiHeader.vue' 88 import uiHeader from './UiHeader.vue'
88 import deviceEdit from './dialog/deviceEdit.vue' 89 import deviceEdit from './dialog/deviceEdit.vue'
  90 + import syncChannelProgress from './dialog/SyncChannelProgress.vue'
89 export default { 91 export default {
90 name: 'app', 92 name: 'app',
91 components: { 93 components: {
92 uiHeader, 94 uiHeader,
93 - deviceEdit 95 + deviceEdit,
  96 + syncChannelProgress,
94 }, 97 },
95 data() { 98 data() {
96 return { 99 return {
@@ -105,7 +108,6 @@ @@ -105,7 +108,6 @@
105 count:15, 108 count:15,
106 total:0, 109 total:0,
107 getDeviceListLoading: false, 110 getDeviceListLoading: false,
108 - syncDevices:[]  
109 }; 111 };
110 }, 112 },
111 computed: { 113 computed: {
@@ -198,8 +200,7 @@ @@ -198,8 +200,7 @@
198 //刷新设备信息 200 //刷新设备信息
199 refDevice: function(itemData) { 201 refDevice: function(itemData) {
200 console.log("刷新对应设备:" + itemData.deviceId); 202 console.log("刷新对应设备:" + itemData.deviceId);
201 - var that = this;  
202 - this.syncDevices.push(itemData.deviceId) 203 + let that = this;
203 this.$axios({ 204 this.$axios({
204 method: 'post', 205 method: 'post',
205 url: '/api/device/query/devices/' + itemData.deviceId + '/sync' 206 url: '/api/device/query/devices/' + itemData.deviceId + '/sync'
@@ -212,14 +213,14 @@ @@ -212,14 +213,14 @@
212 type: 'error' 213 type: 'error'
213 }); 214 });
214 }else{ 215 }else{
215 - that.$message({  
216 - showClose: true,  
217 - message: res.data.msg,  
218 - type: 'success'  
219 - }); 216 + // that.$message({
  217 + // showClose: true,
  218 + // message: res.data.msg,
  219 + // type: 'success'
  220 + // });
  221 + this.$refs.syncChannelProgress.openDialog(itemData.deviceId)
220 } 222 }
221 that.initData() 223 that.initData()
222 - this.syncDevices.splice(this.syncDevices.indexOf(itemData.deviceId, 1));  
223 }).catch((e) => { 224 }).catch((e) => {
224 console.error(e) 225 console.error(e)
225 that.$message({ 226 that.$message({
@@ -227,9 +228,29 @@ @@ -227,9 +228,29 @@
227 message: e, 228 message: e,
228 type: 'error' 229 type: 'error'
229 }); 230 });
230 - this.syncDevices.splice(this.syncDevices.indexOf(itemData.deviceId, 1));  
231 }); 231 });
  232 +
232 }, 233 },
  234 +
  235 + getTooltipContent: async function (deviceId){
  236 + let result = "";
  237 + await this.$axios({
  238 + method: 'get',
  239 + async: false,
  240 + url:`/api/device/query/${deviceId}/sync_status/`,
  241 + }).then((res) => {
  242 + if (res.data.code == 0) {
  243 + if (res.data.data.errorMsg !== null) {
  244 + result = res.data.data.errorMsg
  245 + } else if (res.data.msg !== null) {
  246 + result = res.data.msg
  247 + } else {
  248 + result = `同步中...[${res.data.data.current}/${res.data.data.total}]`;
  249 + }
  250 + }
  251 + })
  252 + return result;
  253 + },
233 //通知设备上传媒体流 254 //通知设备上传媒体流
234 sendDevicePush: function(itemData) { 255 sendDevicePush: function(itemData) {
235 // let deviceId = this.currentDevice.deviceId; 256 // let deviceId = this.currentDevice.deviceId;
web_src/src/components/dialog/SyncChannelProgress.vue 0 → 100644
  1 +<template>
  2 + <div id="SyncChannelProgress" v-loading="isLoging">
  3 + <el-dialog
  4 + width="240px"
  5 + top="13%"
  6 + :append-to-body="true"
  7 + :close-on-click-modal="false"
  8 + :visible.sync="showDialog"
  9 + :destroy-on-close="true"
  10 + :show-close="true"
  11 + @close="close()"
  12 + style="text-align: center">
  13 + <el-progress type="circle" :percentage="percentage" :status="syncStatus"></el-progress>
  14 + <div style="text-align: center">
  15 + {{msg}}
  16 + </div>
  17 + </el-dialog>
  18 + </div>
  19 +</template>
  20 +
  21 +<script>
  22 +
  23 +export default {
  24 + name: "SyncChannelProgress",
  25 + computed: {},
  26 + props: ['platformId'],
  27 + created() {},
  28 + data() {
  29 + return {
  30 + syncStatus: null,
  31 + percentage: 0,
  32 + total: 0,
  33 + current: 0,
  34 + showDialog: false,
  35 + isLoging: false,
  36 + syncFlag: false,
  37 + deviceId: null,
  38 + timmer: null,
  39 + msg: "正在同步",
  40 + };
  41 + },
  42 + methods: {
  43 + openDialog: function (deviceId) {
  44 + console.log("deviceId: " + deviceId)
  45 + this.deviceId = deviceId;
  46 + this.showDialog = true;
  47 + this.msg = "";
  48 + this.percentage= 0;
  49 + this.total= 0;
  50 + this.current= 0;
  51 + this.syncFlag= false;
  52 + this.syncStatus = null;
  53 + this.getProgress()
  54 + },
  55 + getProgress(){
  56 + this.$axios({
  57 + method: 'get',
  58 + url:`/api/device/query/${this.deviceId}/sync_status/`,
  59 + }).then((res) => {
  60 + if (res.data.code == 0) {
  61 + if (!this.syncFlag) {
  62 + this.syncFlag = true;
  63 + }
  64 + if (res.data.data == null) {
  65 + this.syncStatus = "success"
  66 + this.percentage = 100;
  67 + this.msg = '同步成功';
  68 + }else if (res.data.data.total == 0){
  69 + this.msg = `等待同步中`;
  70 + this.timmer = setTimeout(this.getProgress, 300)
  71 + }else if (res.data.data.errorMsg !== null ){
  72 + this.msg = res.data.data.errorMsg;
  73 + this.syncStatus = "exception"
  74 + }else {
  75 + this.total = res.data.data.total;
  76 + this.current = res.data.data.current;
  77 + this.percentage = Math.floor(Number(res.data.data.current)/Number(res.data.data.total)* 10000)/100;
  78 + this.msg = `同步中...[${res.data.data.current}/${res.data.data.total}]`;
  79 + this.timmer = setTimeout(this.getProgress, 300)
  80 + }
  81 + }else {
  82 + if (this.syncFlag) {
  83 + this.syncStatus = "success"
  84 + this.percentage = 100;
  85 + this.msg = '同步成功';
  86 + }else {
  87 + this.syncStatus = "error"
  88 + this.msg = res.data.msg;
  89 + }
  90 + }
  91 + }).catch((error) =>{
  92 + console.log(error);
  93 + this.syncStatus = "error"
  94 + this.msg = error.response.data.msg;
  95 + });
  96 + },
  97 + close: function (){
  98 + window.clearTimeout(this.timmer)
  99 + }
  100 + },
  101 +};
  102 +</script>