Commit 6c4da7bebe8040f1d8dea551863eae7bbd4c65a6

Authored by panlinlin
1 parent ccc188c1

完成向上级联->通道推送

修复选择通道是查询的bug
README.md
... ... @@ -41,7 +41,7 @@ https://gitee.com/18010473990/wvp-GB28181.git
41 41 - [X] 注册
42 42 - [X] 心跳保活
43 43 - [X] 通道选择
44   - - [ ] 通道推送
  44 + - [X] 通道推送
45 45 - [ ] 点播
46 46 - [ ] 云台控制
47 47 - [ ] 添加RTSP视频
... ...
src/main/java/com/genersoft/iot/vmp/gb28181/bean/ParentPlatform.java
... ... @@ -94,6 +94,11 @@ public class ParentPlatform {
94 94 */
95 95 private boolean status;
96 96  
  97 + /**
  98 + * 在线状态
  99 + */
  100 + private int channelCount;
  101 +
97 102  
98 103 public boolean isEnable() {
99 104 return enable;
... ... @@ -238,4 +243,12 @@ public class ParentPlatform {
238 243 public void setStatus(boolean status) {
239 244 this.status = status;
240 245 }
  246 +
  247 + public int getChannelCount() {
  248 + return channelCount;
  249 + }
  250 +
  251 + public void setChannelCount(int channelCount) {
  252 + this.channelCount = channelCount;
  253 + }
241 254 }
... ...
src/main/java/com/genersoft/iot/vmp/gb28181/transmit/SIPProcessorFactory.java
... ... @@ -9,6 +9,7 @@ import javax.sip.header.Header;
9 9 import javax.sip.message.Request;
10 10 import javax.sip.message.Response;
11 11  
  12 +import com.genersoft.iot.vmp.gb28181.transmit.cmd.impl.SIPCommanderFroPlatform;
12 13 import com.genersoft.iot.vmp.storager.IRedisCatchStorage;
13 14 import com.alibaba.fastjson.JSON;
14 15 import com.genersoft.iot.vmp.gb28181.transmit.response.impl.*;
... ... @@ -72,6 +73,9 @@ public class SIPProcessorFactory {
72 73  
73 74 @Autowired
74 75 private SIPCommander cmder;
  76 +
  77 + @Autowired
  78 + private SIPCommanderFroPlatform cmderFroPlatform;
75 79  
76 80 @Autowired
77 81 private RedisUtil redis;
... ... @@ -153,6 +157,7 @@ public class SIPProcessorFactory {
153 157 processor.setDeferredResultHolder(deferredResultHolder);
154 158 processor.setOffLineDetector(offLineDetector);
155 159 processor.setCmder(cmder);
  160 + processor.setCmderFroPlatform(cmderFroPlatform);
156 161 processor.setStorager(storager);
157 162 processor.setRedisCatchStorage(redisCatchStorage);
158 163 return processor;
... ...
src/main/java/com/genersoft/iot/vmp/gb28181/transmit/cmd/ISIPCommanderForPlatform.java
1 1 package com.genersoft.iot.vmp.gb28181.transmit.cmd;
2 2  
  3 +import com.genersoft.iot.vmp.gb28181.bean.DeviceChannel;
3 4 import com.genersoft.iot.vmp.gb28181.bean.ParentPlatform;
4 5 import com.genersoft.iot.vmp.gb28181.event.SipSubscribe;
5 6  
6 7 import javax.sip.header.WWWAuthenticateHeader;
  8 +import java.nio.channels.Channel;
  9 +import java.util.List;
7 10  
8 11 public interface ISIPCommanderForPlatform {
9 12  
... ... @@ -29,4 +32,16 @@ public interface ISIPCommanderForPlatform {
29 32 * @return callId(作为接受回复的判定)
30 33 */
31 34 String keepalive(ParentPlatform parentPlatform);
  35 +
  36 +
  37 + /**
  38 + * 向上级回复通道信息
  39 + * @param channel 通道信息
  40 + * @param parentPlatform 平台信息
  41 + * @param sn
  42 + * @param fromTag
  43 + * @param size
  44 + * @return
  45 + */
  46 + boolean catalogQuery(DeviceChannel channel, ParentPlatform parentPlatform, String sn, String fromTag, int size);
32 47 }
... ...
src/main/java/com/genersoft/iot/vmp/gb28181/transmit/cmd/SIPRequestHeaderPlarformProvider.java
... ... @@ -4,22 +4,22 @@ import com.genersoft.iot.vmp.conf.SipConfig;
4 4 import com.genersoft.iot.vmp.gb28181.bean.Device;
5 5 import com.genersoft.iot.vmp.gb28181.bean.Host;
6 6 import com.genersoft.iot.vmp.gb28181.bean.ParentPlatform;
  7 +import com.genersoft.iot.vmp.gb28181.event.SipSubscribe;
7 8 import org.springframework.beans.factory.annotation.Autowired;
8 9 import org.springframework.beans.factory.annotation.Qualifier;
9 10 import org.springframework.stereotype.Component;
10 11 import org.springframework.util.DigestUtils;
11 12  
12   -import javax.sip.InvalidArgumentException;
13   -import javax.sip.PeerUnavailableException;
14   -import javax.sip.SipFactory;
15   -import javax.sip.SipProvider;
  13 +import javax.sip.*;
16 14 import javax.sip.address.Address;
17 15 import javax.sip.address.SipURI;
18 16 import javax.sip.header.*;
19 17 import javax.sip.message.Request;
20 18 import javax.validation.constraints.NotNull;
  19 +import java.nio.channels.Channel;
21 20 import java.text.ParseException;
22 21 import java.util.ArrayList;
  22 +import java.util.List;
23 23 import java.util.UUID;
24 24  
25 25 /**
... ... @@ -193,4 +193,38 @@ public class SIPRequestHeaderPlarformProvider {
193 193 return registerRequest;
194 194 }
195 195  
  196 +
  197 + public Request createMessageRequest(ParentPlatform parentPlatform, String content, String fromTag) throws PeerUnavailableException, ParseException, InvalidArgumentException {
  198 + Request request = null;
  199 + // sipuri
  200 + SipURI requestURI = sipFactory.createAddressFactory().createSipURI(parentPlatform.getServerGBId(), parentPlatform.getServerIP()+ ":" + parentPlatform.getServerPort());
  201 + // via
  202 + ArrayList<ViaHeader> viaHeaders = new ArrayList<ViaHeader>();
  203 + ViaHeader viaHeader = sipFactory.createHeaderFactory().createViaHeader(parentPlatform.getDeviceIp(), Integer.parseInt(parentPlatform.getDevicePort()),
  204 + parentPlatform.getTransport(), null);
  205 + viaHeader.setRPort();
  206 + viaHeaders.add(viaHeader);
  207 + // from
  208 + SipURI fromSipURI = sipFactory.createAddressFactory().createSipURI(parentPlatform.getServerGBId(),
  209 + parentPlatform.getDeviceIp() + ":" + parentPlatform.getDevicePort());
  210 + Address fromAddress = sipFactory.createAddressFactory().createAddress(fromSipURI);
  211 + FromHeader fromHeader = sipFactory.createHeaderFactory().createFromHeader(fromAddress, fromTag);
  212 + // to
  213 + SipURI toSipURI = sipFactory.createAddressFactory().createSipURI(parentPlatform.getDeviceGBId(), parentPlatform.getServerGBDomain());
  214 + Address toAddress = sipFactory.createAddressFactory().createAddress(toSipURI);
  215 + ToHeader toHeader = sipFactory.createHeaderFactory().createToHeader(toAddress, null);
  216 + // callid
  217 + CallIdHeader callIdHeader = parentPlatform.getTransport().equals("TCP") ? tcpSipProvider.getNewCallId()
  218 + : udpSipProvider.getNewCallId();
  219 + // Forwards
  220 + MaxForwardsHeader maxForwards = sipFactory.createHeaderFactory().createMaxForwardsHeader(70);
  221 + // ceq
  222 + CSeqHeader cSeqHeader = sipFactory.createHeaderFactory().createCSeqHeader(1L, Request.MESSAGE);
  223 +
  224 + request = sipFactory.createMessageFactory().createRequest(requestURI, Request.MESSAGE, callIdHeader, cSeqHeader, fromHeader,
  225 + toHeader, viaHeaders, maxForwards);
  226 + ContentTypeHeader contentTypeHeader = sipFactory.createHeaderFactory().createContentTypeHeader("APPLICATION", "MANSCDP+xml");
  227 + request.setContent(content, contentTypeHeader);
  228 + return request;
  229 + }
196 230 }
... ...
src/main/java/com/genersoft/iot/vmp/gb28181/transmit/cmd/impl/SIPCommanderFroPlatform.java
... ... @@ -2,6 +2,7 @@ package com.genersoft.iot.vmp.gb28181.transmit.cmd.impl;
2 2  
3 3 import com.genersoft.iot.vmp.conf.SipConfig;
4 4 import com.genersoft.iot.vmp.gb28181.bean.Device;
  5 +import com.genersoft.iot.vmp.gb28181.bean.DeviceChannel;
5 6 import com.genersoft.iot.vmp.gb28181.bean.ParentPlatform;
6 7 import com.genersoft.iot.vmp.gb28181.bean.ParentPlatformCatch;
7 8 import com.genersoft.iot.vmp.gb28181.event.SipSubscribe;
... ... @@ -21,7 +22,9 @@ import javax.sip.*;
21 22 import javax.sip.header.CallIdHeader;
22 23 import javax.sip.header.WWWAuthenticateHeader;
23 24 import javax.sip.message.Request;
  25 +import java.nio.channels.Channel;
24 26 import java.text.ParseException;
  27 +import java.util.List;
25 28 import java.util.UUID;
26 29  
27 30 @Component
... ... @@ -156,4 +159,54 @@ public class SIPCommanderFroPlatform implements ISIPCommanderForPlatform {
156 159 }
157 160  
158 161 }
  162 +
  163 + /**
  164 + * 向上级回复通道信息
  165 + * @param channel 通道信息
  166 + * @param parentPlatform 平台信息
  167 + * @return
  168 + */
  169 + @Override
  170 + public boolean catalogQuery(DeviceChannel channel, ParentPlatform parentPlatform, String sn, String fromTag, int size) {
  171 +
  172 + if (channel == null || parentPlatform ==null) {
  173 + return false;
  174 + }
  175 + try {
  176 + StringBuffer catalogXml = new StringBuffer(600);
  177 + catalogXml.append("<?xml version=\"1.0\" encoding=\"GB2312\"?>\r\n");
  178 + catalogXml.append("<Response>\r\n");
  179 + catalogXml.append("<CmdType>Catalog</CmdType>\r\n");
  180 + catalogXml.append("<SN>" +sn + "</SN>\r\n");
  181 + catalogXml.append("<DeviceID>" + parentPlatform.getDeviceGBId() + "</DeviceID>\r\n");
  182 + catalogXml.append("<SumNum>" + size + "</SumNum>\r\n");
  183 + catalogXml.append("<DeviceList Num=\"1\">\r\n");
  184 + catalogXml.append("<Item>\r\n");
  185 +
  186 + catalogXml.append("<DeviceID>" + channel.getChannelId() + "</DeviceID>\r\n");
  187 + catalogXml.append("<Name>" + channel.getName() + "</Name>\r\n");
  188 + catalogXml.append("<Manufacturer>" + channel.getManufacture() + "</Manufacturer>\r\n");
  189 + catalogXml.append("<Model>" + channel.getModel() + "</Model>\r\n");
  190 + catalogXml.append("<Owner>" + channel.getOwner() + "</Owner>\r\n");
  191 + catalogXml.append("<CivilCode>" + channel.getCivilCode() + "</CivilCode>\r\n");
  192 + catalogXml.append("<Address>" + channel.getAddress() + "</Address>\r\n");
  193 + catalogXml.append("<Parental>" + channel.getParental() + "</Parental>\r\n");// TODO 当前不能添加分组, 所以暂时没有父节点
  194 + catalogXml.append("<ParentID>" + channel.getParentId() + "</ParentID>\r\n"); // TODO 当前不能添加分组, 所以暂时没有父节点
  195 + catalogXml.append("<Secrecy>" + channel.getSecrecy() + "</Secrecy>\r\n");
  196 + catalogXml.append("<RegisterWay>" + channel.getRegisterWay() + "</RegisterWay>\r\n");
  197 + catalogXml.append("<Status>" + (channel.getStatus() == 0?"OFF":"ON") + "</Status>\r\n");
  198 + catalogXml.append("<Info></Info>\r\n");
  199 +
  200 + catalogXml.append("</Item>\r\n");
  201 + catalogXml.append("</DeviceList>\r\n");
  202 + catalogXml.append("</Response>\r\n");
  203 + Request request = headerProviderPlarformProvider.createMessageRequest(parentPlatform, catalogXml.toString(), fromTag);
  204 + transmitRequest(parentPlatform, request);
  205 +
  206 + } catch (SipException | ParseException | InvalidArgumentException e) {
  207 + e.printStackTrace();
  208 + return false;
  209 + }
  210 + return true;
  211 + }
159 212 }
... ...
src/main/java/com/genersoft/iot/vmp/gb28181/transmit/request/impl/MessageRequestProcessor.java
... ... @@ -7,10 +7,14 @@ import java.util.*;
7 7 import javax.sip.InvalidArgumentException;
8 8 import javax.sip.RequestEvent;
9 9 import javax.sip.SipException;
  10 +import javax.sip.header.FromHeader;
10 11 import javax.sip.message.Request;
11 12 import javax.sip.message.Response;
12 13  
  14 +import com.genersoft.iot.vmp.gb28181.bean.*;
  15 +import com.genersoft.iot.vmp.gb28181.transmit.cmd.impl.SIPCommanderFroPlatform;
13 16 import com.genersoft.iot.vmp.storager.IRedisCatchStorage;
  17 +import com.genersoft.iot.vmp.vmanager.platform.bean.ChannelReduce;
14 18 import org.dom4j.Document;
15 19 import org.dom4j.DocumentException;
16 20 import org.dom4j.Element;
... ... @@ -20,10 +24,6 @@ import org.slf4j.LoggerFactory;
20 24 import org.springframework.beans.factory.annotation.Autowired;
21 25  
22 26 import com.genersoft.iot.vmp.common.VideoManagerConstants;
23   -import com.genersoft.iot.vmp.gb28181.bean.Device;
24   -import com.genersoft.iot.vmp.gb28181.bean.DeviceChannel;
25   -import com.genersoft.iot.vmp.gb28181.bean.RecordInfo;
26   -import com.genersoft.iot.vmp.gb28181.bean.RecordItem;
27 27 import com.genersoft.iot.vmp.gb28181.event.DeviceOffLineDetector;
28 28 import com.genersoft.iot.vmp.gb28181.event.EventPublisher;
29 29 import com.genersoft.iot.vmp.gb28181.transmit.callback.DeferredResultHolder;
... ... @@ -47,6 +47,8 @@ public class MessageRequestProcessor extends SIPRequestAbstractProcessor {
47 47  
48 48 private SIPCommander cmder;
49 49  
  50 + private SIPCommanderFroPlatform cmderFroPlatform;
  51 +
50 52 private IVideoManagerStorager storager;
51 53  
52 54 private IRedisCatchStorage redisCatchStorage;
... ... @@ -163,110 +165,135 @@ public class MessageRequestProcessor extends SIPRequestAbstractProcessor {
163 165 Element deviceIdElement = rootElement.element("DeviceID");
164 166 String deviceId = deviceIdElement.getText();
165 167 Element deviceListElement = rootElement.element("DeviceList");
166   - if (deviceListElement == null) {
167   - return;
168   - }
169   - Iterator<Element> deviceListIterator = deviceListElement.elementIterator();
170   - if (deviceListIterator != null) {
171   - Device device = storager.queryVideoDevice(deviceId);
172   - if (device == null) {
  168 + if (deviceListElement == null) { // 存在DeviceList则为响应 catalog, 不存在DeviceList则为查询请求
  169 + // TODO 后续将代码拆分
  170 + ParentPlatform parentPlatform = storager.queryParentPlatById(deviceId);
  171 + if (parentPlatform == null) {
  172 + response404Ack(evt);
173 173 return;
174   - }
175   - // 遍历DeviceList
176   - while (deviceListIterator.hasNext()) {
177   - Element itemDevice = deviceListIterator.next();
178   - Element channelDeviceElement = itemDevice.element("DeviceID");
179   - if (channelDeviceElement == null) {
180   - continue;
181   - }
182   - String channelDeviceId = channelDeviceElement.getText();
183   - Element channdelNameElement = itemDevice.element("Name");
184   - String channelName = channdelNameElement != null ? channdelNameElement.getTextTrim().toString() : "";
185   - Element statusElement = itemDevice.element("Status");
186   - String status = statusElement != null ? statusElement.getText().toString() : "ON";
187   - DeviceChannel deviceChannel = new DeviceChannel();
188   - deviceChannel.setName(channelName);
189   - deviceChannel.setChannelId(channelDeviceId);
190   - // ONLINE OFFLINE HIKVISION DS-7716N-E4 NVR的兼容性处理
191   - if (status.equals("ON") || status.equals("On") || status.equals("ONLINE")) {
192   - deviceChannel.setStatus(1);
193   - }
194   - if (status.equals("OFF") || status.equals("Off") || status.equals("OFFLINE")) {
195   - deviceChannel.setStatus(0);
  174 + }else {
  175 + // 回复200 OK
  176 + responseAck(evt);
  177 +
  178 + Element snElement = rootElement.element("SN");
  179 + String sn = snElement.getText();
  180 + FromHeader fromHeader = (FromHeader)evt.getRequest().getHeader(FromHeader.NAME);
  181 + // 准备回复通道信息
  182 + List<ChannelReduce> channelReduces = storager.queryChannelListInParentPlatform(parentPlatform.getDeviceGBId());
  183 + if (channelReduces.size() >0 ) {
  184 + for (ChannelReduce channelReduce : channelReduces) {
  185 + DeviceChannel deviceChannel = storager.queryChannel(channelReduce.getDeviceId(), channelReduce.getChannelId());
  186 + cmderFroPlatform.catalogQuery(deviceChannel, parentPlatform, sn, fromHeader.getTag(), channelReduces.size());
  187 + }
196 188 }
197 189  
198   - deviceChannel.setManufacture(XmlUtil.getText(itemDevice, "Manufacturer"));
199   - deviceChannel.setModel(XmlUtil.getText(itemDevice, "Model"));
200   - deviceChannel.setOwner(XmlUtil.getText(itemDevice, "Owner"));
201   - deviceChannel.setCivilCode(XmlUtil.getText(itemDevice, "CivilCode"));
202   - deviceChannel.setBlock(XmlUtil.getText(itemDevice, "Block"));
203   - deviceChannel.setAddress(XmlUtil.getText(itemDevice, "Address"));
204   - if (XmlUtil.getText(itemDevice, "Parental") == null || XmlUtil.getText(itemDevice, "Parental") == "") {
205   - deviceChannel.setParental(0);
206   - } else {
207   - deviceChannel.setParental(Integer.parseInt(XmlUtil.getText(itemDevice, "Parental")));
208   - }
209   - deviceChannel.setParentId(XmlUtil.getText(itemDevice, "ParentID"));
210   - if (XmlUtil.getText(itemDevice, "SafetyWay") == null || XmlUtil.getText(itemDevice, "SafetyWay")== "") {
211   - deviceChannel.setSafetyWay(0);
212   - } else {
213   - deviceChannel.setSafetyWay(Integer.parseInt(XmlUtil.getText(itemDevice, "SafetyWay")));
214   - }
215   - if (XmlUtil.getText(itemDevice, "RegisterWay") == null || XmlUtil.getText(itemDevice, "RegisterWay") =="") {
216   - deviceChannel.setRegisterWay(1);
217   - } else {
218   - deviceChannel.setRegisterWay(Integer.parseInt(XmlUtil.getText(itemDevice, "RegisterWay")));
219   - }
220   - deviceChannel.setCertNum(XmlUtil.getText(itemDevice, "CertNum"));
221   - if (XmlUtil.getText(itemDevice, "Certifiable") == null || XmlUtil.getText(itemDevice, "Certifiable") == "") {
222   - deviceChannel.setCertifiable(0);
223   - } else {
224   - deviceChannel.setCertifiable(Integer.parseInt(XmlUtil.getText(itemDevice, "Certifiable")));
225   - }
226   - if (XmlUtil.getText(itemDevice, "ErrCode") == null || XmlUtil.getText(itemDevice, "ErrCode") == "") {
227   - deviceChannel.setErrCode(0);
228   - } else {
229   - deviceChannel.setErrCode(Integer.parseInt(XmlUtil.getText(itemDevice, "ErrCode")));
230   - }
231   - deviceChannel.setEndTime(XmlUtil.getText(itemDevice, "EndTime"));
232   - deviceChannel.setSecrecy(XmlUtil.getText(itemDevice, "Secrecy"));
233   - deviceChannel.setIpAddress(XmlUtil.getText(itemDevice, "IPAddress"));
234   - if (XmlUtil.getText(itemDevice, "Port") == null || XmlUtil.getText(itemDevice, "Port") =="") {
235   - deviceChannel.setPort(0);
236   - } else {
237   - deviceChannel.setPort(Integer.parseInt(XmlUtil.getText(itemDevice, "Port")));
238   - }
239   - deviceChannel.setPassword(XmlUtil.getText(itemDevice, "Password"));
240   - if (XmlUtil.getText(itemDevice, "Longitude") == null || XmlUtil.getText(itemDevice, "Longitude") == "") {
241   - deviceChannel.setLongitude(0.00);
242   - } else {
243   - deviceChannel.setLongitude(Double.parseDouble(XmlUtil.getText(itemDevice, "Longitude")));
244   - }
245   - if (XmlUtil.getText(itemDevice, "Latitude") == null || XmlUtil.getText(itemDevice, "Latitude") =="") {
246   - deviceChannel.setLatitude(0.00);
247   - } else {
248   - deviceChannel.setLatitude(Double.parseDouble(XmlUtil.getText(itemDevice, "Latitude")));
  190 + }
  191 +
  192 +
  193 + }else {
  194 + Iterator<Element> deviceListIterator = deviceListElement.elementIterator();
  195 + if (deviceListIterator != null) {
  196 + Device device = storager.queryVideoDevice(deviceId);
  197 + if (device == null) {
  198 + return;
249 199 }
250   - if (XmlUtil.getText(itemDevice, "PTZType") == null || XmlUtil.getText(itemDevice, "PTZType") == "") {
251   - deviceChannel.setPTZType(0);
252   - } else {
253   - deviceChannel.setPTZType(Integer.parseInt(XmlUtil.getText(itemDevice, "PTZType")));
  200 + // 遍历DeviceList
  201 + while (deviceListIterator.hasNext()) {
  202 + Element itemDevice = deviceListIterator.next();
  203 + Element channelDeviceElement = itemDevice.element("DeviceID");
  204 + if (channelDeviceElement == null) {
  205 + continue;
  206 + }
  207 + String channelDeviceId = channelDeviceElement.getText();
  208 + Element channdelNameElement = itemDevice.element("Name");
  209 + String channelName = channdelNameElement != null ? channdelNameElement.getTextTrim().toString() : "";
  210 + Element statusElement = itemDevice.element("Status");
  211 + String status = statusElement != null ? statusElement.getText().toString() : "ON";
  212 + DeviceChannel deviceChannel = new DeviceChannel();
  213 + deviceChannel.setName(channelName);
  214 + deviceChannel.setChannelId(channelDeviceId);
  215 + // ONLINE OFFLINE HIKVISION DS-7716N-E4 NVR的兼容性处理
  216 + if (status.equals("ON") || status.equals("On") || status.equals("ONLINE")) {
  217 + deviceChannel.setStatus(1);
  218 + }
  219 + if (status.equals("OFF") || status.equals("Off") || status.equals("OFFLINE")) {
  220 + deviceChannel.setStatus(0);
  221 + }
  222 +
  223 + deviceChannel.setManufacture(XmlUtil.getText(itemDevice, "Manufacturer"));
  224 + deviceChannel.setModel(XmlUtil.getText(itemDevice, "Model"));
  225 + deviceChannel.setOwner(XmlUtil.getText(itemDevice, "Owner"));
  226 + deviceChannel.setCivilCode(XmlUtil.getText(itemDevice, "CivilCode"));
  227 + deviceChannel.setBlock(XmlUtil.getText(itemDevice, "Block"));
  228 + deviceChannel.setAddress(XmlUtil.getText(itemDevice, "Address"));
  229 + if (XmlUtil.getText(itemDevice, "Parental") == null || XmlUtil.getText(itemDevice, "Parental") == "") {
  230 + deviceChannel.setParental(0);
  231 + } else {
  232 + deviceChannel.setParental(Integer.parseInt(XmlUtil.getText(itemDevice, "Parental")));
  233 + }
  234 + deviceChannel.setParentId(XmlUtil.getText(itemDevice, "ParentID"));
  235 + if (XmlUtil.getText(itemDevice, "SafetyWay") == null || XmlUtil.getText(itemDevice, "SafetyWay")== "") {
  236 + deviceChannel.setSafetyWay(0);
  237 + } else {
  238 + deviceChannel.setSafetyWay(Integer.parseInt(XmlUtil.getText(itemDevice, "SafetyWay")));
  239 + }
  240 + if (XmlUtil.getText(itemDevice, "RegisterWay") == null || XmlUtil.getText(itemDevice, "RegisterWay") =="") {
  241 + deviceChannel.setRegisterWay(1);
  242 + } else {
  243 + deviceChannel.setRegisterWay(Integer.parseInt(XmlUtil.getText(itemDevice, "RegisterWay")));
  244 + }
  245 + deviceChannel.setCertNum(XmlUtil.getText(itemDevice, "CertNum"));
  246 + if (XmlUtil.getText(itemDevice, "Certifiable") == null || XmlUtil.getText(itemDevice, "Certifiable") == "") {
  247 + deviceChannel.setCertifiable(0);
  248 + } else {
  249 + deviceChannel.setCertifiable(Integer.parseInt(XmlUtil.getText(itemDevice, "Certifiable")));
  250 + }
  251 + if (XmlUtil.getText(itemDevice, "ErrCode") == null || XmlUtil.getText(itemDevice, "ErrCode") == "") {
  252 + deviceChannel.setErrCode(0);
  253 + } else {
  254 + deviceChannel.setErrCode(Integer.parseInt(XmlUtil.getText(itemDevice, "ErrCode")));
  255 + }
  256 + deviceChannel.setEndTime(XmlUtil.getText(itemDevice, "EndTime"));
  257 + deviceChannel.setSecrecy(XmlUtil.getText(itemDevice, "Secrecy"));
  258 + deviceChannel.setIpAddress(XmlUtil.getText(itemDevice, "IPAddress"));
  259 + if (XmlUtil.getText(itemDevice, "Port") == null || XmlUtil.getText(itemDevice, "Port") =="") {
  260 + deviceChannel.setPort(0);
  261 + } else {
  262 + deviceChannel.setPort(Integer.parseInt(XmlUtil.getText(itemDevice, "Port")));
  263 + }
  264 + deviceChannel.setPassword(XmlUtil.getText(itemDevice, "Password"));
  265 + if (XmlUtil.getText(itemDevice, "Longitude") == null || XmlUtil.getText(itemDevice, "Longitude") == "") {
  266 + deviceChannel.setLongitude(0.00);
  267 + } else {
  268 + deviceChannel.setLongitude(Double.parseDouble(XmlUtil.getText(itemDevice, "Longitude")));
  269 + }
  270 + if (XmlUtil.getText(itemDevice, "Latitude") == null || XmlUtil.getText(itemDevice, "Latitude") =="") {
  271 + deviceChannel.setLatitude(0.00);
  272 + } else {
  273 + deviceChannel.setLatitude(Double.parseDouble(XmlUtil.getText(itemDevice, "Latitude")));
  274 + }
  275 + if (XmlUtil.getText(itemDevice, "PTZType") == null || XmlUtil.getText(itemDevice, "PTZType") == "") {
  276 + deviceChannel.setPTZType(0);
  277 + } else {
  278 + deviceChannel.setPTZType(Integer.parseInt(XmlUtil.getText(itemDevice, "PTZType")));
  279 + }
  280 + deviceChannel.setHasAudio(true); // 默认含有音频,播放时再检查是否有音频及是否AAC
  281 + storager.updateChannel(device.getDeviceId(), deviceChannel);
254 282 }
255   - deviceChannel.setHasAudio(true); // 默认含有音频,播放时再检查是否有音频及是否AAC
256   - storager.updateChannel(device.getDeviceId(), deviceChannel);
257   - }
258 283  
259   - RequestMessage msg = new RequestMessage();
260   - msg.setDeviceId(deviceId);
261   - msg.setType(DeferredResultHolder.CALLBACK_CMD_CATALOG);
262   - msg.setData(device);
263   - deferredResultHolder.invokeResult(msg);
264   - // 回复200 OK
265   - responseAck(evt);
266   - if (offLineDetector.isOnline(deviceId)) {
267   - publisher.onlineEventPublish(deviceId, VideoManagerConstants.EVENT_ONLINE_KEEPLIVE);
  284 + RequestMessage msg = new RequestMessage();
  285 + msg.setDeviceId(deviceId);
  286 + msg.setType(DeferredResultHolder.CALLBACK_CMD_CATALOG);
  287 + msg.setData(device);
  288 + deferredResultHolder.invokeResult(msg);
  289 + // 回复200 OK
  290 + responseAck(evt);
  291 + if (offLineDetector.isOnline(deviceId)) {
  292 + publisher.onlineEventPublish(deviceId, VideoManagerConstants.EVENT_ONLINE_KEEPLIVE);
  293 + }
268 294 }
269 295 }
  296 +
270 297 } catch (DocumentException | SipException | InvalidArgumentException | ParseException e) {
271 298 e.printStackTrace();
272 299 }
... ... @@ -469,6 +496,18 @@ public class MessageRequestProcessor extends SIPRequestAbstractProcessor {
469 496 getServerTransaction(evt).sendResponse(response);
470 497 }
471 498  
  499 + /***
  500 + * 回复200 OK
  501 + * @param evt
  502 + * @throws SipException
  503 + * @throws InvalidArgumentException
  504 + * @throws ParseException
  505 + */
  506 + private void response404Ack(RequestEvent evt) throws SipException, InvalidArgumentException, ParseException {
  507 + Response response = getMessageFactory().createResponse(Response.NOT_FOUND, evt.getRequest());
  508 + getServerTransaction(evt).sendResponse(response);
  509 + }
  510 +
472 511 private Element getRootElement(RequestEvent evt) throws DocumentException {
473 512 Request request = evt.getRequest();
474 513 SAXReader reader = new SAXReader();
... ... @@ -508,4 +547,12 @@ public class MessageRequestProcessor extends SIPRequestAbstractProcessor {
508 547 public void setRedisCatchStorage(IRedisCatchStorage redisCatchStorage) {
509 548 this.redisCatchStorage = redisCatchStorage;
510 549 }
  550 +
  551 + public SIPCommanderFroPlatform getCmderFroPlatform() {
  552 + return cmderFroPlatform;
  553 + }
  554 +
  555 + public void setCmderFroPlatform(SIPCommanderFroPlatform cmderFroPlatform) {
  556 + this.cmderFroPlatform = cmderFroPlatform;
  557 + }
511 558 }
... ...
src/main/java/com/genersoft/iot/vmp/storager/IVideoManagerStorager.java
... ... @@ -210,6 +210,11 @@ public interface IVideoManagerStorager {
210 210 */
211 211 PageInfo<ChannelReduce> queryAllChannelList(int page, int count, String query, Boolean online, Boolean channelType, String platformId, Boolean inPlatform);
212 212  
  213 + /**
  214 + * 查询设备的通道信息
  215 + */
  216 + List<ChannelReduce> queryChannelListInParentPlatform(String platformId);
  217 +
213 218  
214 219 /**
215 220 * 更新上级平台的通道信息
... ...
src/main/java/com/genersoft/iot/vmp/storager/dao/DeviceChannelMapper.java
... ... @@ -83,19 +83,19 @@ public interface DeviceChannelMapper {
83 83 "SELECT * FROM ( "+
84 84 " SELECT dc.channelId, dc.deviceId, dc.name, de.manufacturer, de.hostAddress, " +
85 85 "(SELECT count(0) FROM device_channel WHERE parentId=dc.channelId) as subCount, " +
86   - "pc.platformId " +
  86 + "(SELECT pc.platformId FROM platform_gb_channel pc WHERE pc.deviceId=dc.deviceId AND pc.channelId = dc.channelId ) as platformId " +
87 87 "FROM device_channel dc " +
88 88 "LEFT JOIN device de ON dc.deviceId = de.deviceId " +
89   - "LEFT JOIN platform_gb_channel pc on pc.deviceId = dc.deviceId AND pc.channelId = dc.channelId " +
90 89 " WHERE 1=1 " +
91 90 " <if test=\"query != null\"> AND (dc.channelId LIKE '%${query}%' OR dc.name LIKE '%${query}%' OR dc.name LIKE '%${query}%')</if> " +
92 91 " <if test=\"online == true\" > AND dc.status=1</if> " +
93 92 " <if test=\"online == false\" > AND dc.status=0</if> " +
94   - " <if test=\"platformId != null and inPlatform == true\"> AND pc.platformId=#{platformId} </if> " +
95 93 ") dcr" +
96 94 " WHERE 1=1 " +
97 95 " <if test=\"hasSubChannel!= null and hasSubChannel == true\" > AND subCount >0</if> " +
98 96 " <if test=\"hasSubChannel!= null and hasSubChannel == false\" > AND subCount=0</if> " +
  97 + " <if test=\"platformId != null and inPlatform == true \" > AND platformId='${platformId}'</if> " +
  98 + " <if test=\"platformId != null and inPlatform == false \" > AND (platformId != '${platformId}' OR platformId is NULL ) </if> " +
99 99 " </script>"})
100 100  
101 101 List<ChannelReduce> queryChannelListInAll(String query, Boolean online, Boolean hasSubChannel, String platformId, Boolean inPlatform);
... ...
src/main/java/com/genersoft/iot/vmp/storager/dao/ParentPlatformMapper.java
... ... @@ -45,7 +45,7 @@ public interface ParentPlatformMapper {
45 45 @Delete("DELETE FROM parent_platform WHERE deviceGBId=#{deviceGBId}")
46 46 int delParentPlatform(ParentPlatform parentPlatform);
47 47  
48   - @Select("SELECT * FROM parent_platform")
  48 + @Select("SELECT *,( SELECT count(0) FROM platform_gb_channel pc WHERE pc.platformId = pp.deviceGBId) as channelCount FROM parent_platform pp ")
49 49 List<ParentPlatform> getParentPlatformList();
50 50  
51 51 @Select("SELECT * FROM parent_platform WHERE enable=#{enable}")
... ...
src/main/java/com/genersoft/iot/vmp/storager/dao/PatformChannelMapper.java
... ... @@ -30,8 +30,13 @@ public interface PatformChannelMapper {
30 30  
31 31  
32 32 @Delete("<script> "+
33   - "DELETE FROM platform_gb_channel WHERE deviceAndChannelId in" +
  33 + "DELETE FROM platform_gb_channel WHERE platformId='${platformId}' AND deviceAndChannelId in" +
34 34 "<foreach collection='channelReducesToDel' item='item' open='(' separator=',' close=')' > '${item.deviceId}_${item.channelId}'</foreach>" +
35 35 "</script>")
36 36 int delChannelForGB(String platformId, List<ChannelReduce> channelReducesToDel);
  37 +
  38 + @Delete("<script> "+
  39 + "DELETE FROM platform_gb_channel WHERE platformId='${platformId}'" +
  40 + "</script>")
  41 + int cleanChannelForGB(String platformId);
37 42 }
... ...
src/main/java/com/genersoft/iot/vmp/storager/impl/VideoManagerStoragerImpl.java
... ... @@ -249,9 +249,12 @@ public class VideoManagerStoragerImpl implements IVideoManagerStorager {
249 249 return result > 0;
250 250 }
251 251  
  252 + @Transactional
252 253 @Override
253 254 public boolean deleteParentPlatform(ParentPlatform parentPlatform) {
254 255 int result = platformMapper.delParentPlatform(parentPlatform);
  256 + // 删除关联的通道
  257 + patformChannelMapper.cleanChannelForGB(parentPlatform.getDeviceGBId());
255 258 return result > 0;
256 259 }
257 260  
... ... @@ -286,6 +289,11 @@ public class VideoManagerStoragerImpl implements IVideoManagerStorager {
286 289 return new PageInfo<>(all);
287 290 }
288 291  
  292 + @Override
  293 + public List<ChannelReduce> queryChannelListInParentPlatform(String platformId) {
  294 +
  295 + return deviceChannelMapper.queryChannelListInAll(null, null, null, platformId, true);
  296 + }
289 297  
290 298 @Override
291 299 public int updateChannelForGB(String platformId, List<ChannelReduce> channelReduces) {
... ...
web_src/src/components/gb28181/chooseChannel.vue
1 1 <template>
2 2 <div id="chooseChannel" v-loading="isLoging">
3 3  
4   - <el-dialog title="选择通道" top="2rem" width="70%" :close-on-click-modal="false" :visible.sync="showDialog" :destroy-on-close="true" @close="close()">
  4 + <el-dialog title="选择通道" v-if="showDialog" top="2rem" width="70%" :close-on-click-modal="false" :visible.sync="showDialog" :destroy-on-close="true" @close="close()">
5 5 <el-tabs v-model="tabActiveName" >
6 6 <el-tab-pane label="国标通道" name="gbChannel">
7 7 <el-container>
... ...
web_src/src/components/gb28181/chooseChannelForGb.vue
... ... @@ -41,7 +41,7 @@
41 41 <el-table-column prop="manufacturer" label="厂家" align="center">
42 42 </el-table-column>
43 43 </el-table>
44   - <el-pagination style="float: right;margin-top: 1rem;" @size-change="handleSizeChange" @current-change="currentChange" :current-page="currentPage" :page-size="count" :page-sizes="[15, 20, 30, 50]" layout="total, sizes, prev, pager, next" :total="total">
  44 + <el-pagination style="float: right;margin-top: 1rem;" @size-change="handleSizeChange" @current-change="currentChange" :current-page="currentPage" :page-size="count" :page-sizes="[10, 20, 30, 50]" layout="total, sizes, prev, pager, next" :total="total">
45 45 </el-pagination>
46 46 </div>
47 47 </template>
... ...