package com.genersoft.iot.vmp.gb28181.transmit.cmd.impl; import com.genersoft.iot.vmp.gb28181.bean.DeviceChannel; import com.genersoft.iot.vmp.gb28181.bean.ParentPlatform; import com.genersoft.iot.vmp.gb28181.bean.ParentPlatformCatch; import com.genersoft.iot.vmp.gb28181.bean.SubscribeInfo; import com.genersoft.iot.vmp.gb28181.event.SipSubscribe; import com.genersoft.iot.vmp.gb28181.transmit.cmd.ISIPCommanderForPlatform; import com.genersoft.iot.vmp.gb28181.transmit.cmd.SIPRequestHeaderPlarformProvider; import com.genersoft.iot.vmp.service.bean.GPSMsgInfo; import com.genersoft.iot.vmp.storager.IRedisCatchStorage; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Qualifier; import org.springframework.context.annotation.DependsOn; import org.springframework.context.annotation.Lazy; import org.springframework.lang.Nullable; import org.springframework.stereotype.Component; import javax.sip.*; import javax.sip.header.CallIdHeader; import javax.sip.header.WWWAuthenticateHeader; import javax.sip.message.Request; import java.text.ParseException; import java.util.List; import java.util.UUID; @Component @DependsOn("sipLayer") public class SIPCommanderFroPlatform implements ISIPCommanderForPlatform { private final Logger logger = LoggerFactory.getLogger(SIPCommanderFroPlatform.class); // @Autowired // private SipConfig sipConfig; // @Autowired // private SIPRequestHeaderProvider headerProvider; @Autowired private SIPRequestHeaderPlarformProvider headerProviderPlarformProvider; // @Autowired // private VideoStreamSessionManager streamSession; // @Autowired // private IVideoManagerStorager storager; @Autowired private IRedisCatchStorage redisCatchStorage; @Autowired private SipSubscribe sipSubscribe; @Lazy @Autowired @Qualifier(value="tcpSipProvider") private SipProvider tcpSipProvider; @Lazy @Autowired @Qualifier(value="udpSipProvider") private SipProvider udpSipProvider; @Override public boolean register(ParentPlatform parentPlatform, SipSubscribe.Event errorEvent , SipSubscribe.Event okEvent) { return register(parentPlatform, null, null, errorEvent, okEvent); } @Override public boolean unregister(ParentPlatform parentPlatform, SipSubscribe.Event errorEvent , SipSubscribe.Event okEvent) { parentPlatform.setExpires("0"); ParentPlatformCatch parentPlatformCatch = redisCatchStorage.queryPlatformCatchInfo(parentPlatform.getServerGBId()); if (parentPlatformCatch != null) { parentPlatformCatch.setParentPlatform(parentPlatform); redisCatchStorage.updatePlatformCatchInfo(parentPlatformCatch); } return register(parentPlatform, null, null, errorEvent, okEvent); } @Override public boolean register(ParentPlatform parentPlatform, @Nullable String callId, @Nullable WWWAuthenticateHeader www, SipSubscribe.Event errorEvent , SipSubscribe.Event okEvent) { try { Request request = null; String tm = Long.toString(System.currentTimeMillis()); if (www == null ) { // //callid CallIdHeader callIdHeader = null; if(parentPlatform.getTransport().equals("TCP")) { callIdHeader = tcpSipProvider.getNewCallId(); } if(parentPlatform.getTransport().equals("UDP")) { callIdHeader = udpSipProvider.getNewCallId(); } request = headerProviderPlarformProvider.createRegisterRequest(parentPlatform, redisCatchStorage.getCSEQ(Request.REGISTER), "FromRegister" + tm, null, callIdHeader); // 将 callid 写入缓存, 等注册成功可以更新状态 String callIdFromHeader = callIdHeader.getCallId(); redisCatchStorage.updatePlatformRegisterInfo(callIdFromHeader, parentPlatform.getServerGBId()); sipSubscribe.addErrorSubscribe(callIdHeader.getCallId(), (event)->{ if (event != null) { logger.info("向上级平台 [ {} ] 注册发生错误: {} ", parentPlatform.getServerGBId(), event.msg); } redisCatchStorage.delPlatformRegisterInfo(callIdFromHeader); if (errorEvent != null ) { errorEvent.response(event); } }); }else { CallIdHeader callIdHeader = parentPlatform.getTransport().equals("TCP") ? tcpSipProvider.getNewCallId() : udpSipProvider.getNewCallId(); request = headerProviderPlarformProvider.createRegisterRequest(parentPlatform, "FromRegister" + tm, null, callId, www, callIdHeader); } transmitRequest(parentPlatform, request, null, okEvent); return true; } catch (ParseException e) { e.printStackTrace(); } catch (InvalidArgumentException e) { e.printStackTrace(); } catch (PeerUnavailableException e) { e.printStackTrace(); } catch (SipException e) { e.printStackTrace(); } return false; } @Override public String keepalive(ParentPlatform parentPlatform) { String callId = null; try { StringBuffer keepaliveXml = new StringBuffer(200); keepaliveXml.append("\r\n"); keepaliveXml.append("\r\n"); keepaliveXml.append("Keepalive\r\n"); keepaliveXml.append("" + (int)((Math.random()*9+1)*100000) + "\r\n"); keepaliveXml.append("" + parentPlatform.getDeviceGBId() + "\r\n"); keepaliveXml.append("OK\r\n"); keepaliveXml.append("\r\n"); CallIdHeader callIdHeader = parentPlatform.getTransport().equals("TCP") ? tcpSipProvider.getNewCallId() : udpSipProvider.getNewCallId(); Request request = headerProviderPlarformProvider.createKeetpaliveMessageRequest( parentPlatform, keepaliveXml.toString(), "z9hG4bK-" + UUID.randomUUID().toString().replace("-", ""), UUID.randomUUID().toString().replace("-", ""), null, callIdHeader); transmitRequest(parentPlatform, request); callId = callIdHeader.getCallId(); } catch (ParseException | InvalidArgumentException | SipException e) { e.printStackTrace(); } return callId; } private void transmitRequest(ParentPlatform parentPlatform, Request request) throws SipException { transmitRequest(parentPlatform, request, null, null); } private void transmitRequest(ParentPlatform parentPlatform, Request request, SipSubscribe.Event errorEvent) throws SipException { transmitRequest(parentPlatform, request, errorEvent, null); } private void transmitRequest(ParentPlatform parentPlatform, Request request, SipSubscribe.Event errorEvent , SipSubscribe.Event okEvent) throws SipException { if("TCP".equals(parentPlatform.getTransport())) { tcpSipProvider.sendRequest(request); } else if("UDP".equals(parentPlatform.getTransport())) { udpSipProvider.sendRequest(request); } CallIdHeader callIdHeader = (CallIdHeader)request.getHeader(CallIdHeader.NAME); // 添加错误订阅 if (errorEvent != null) { sipSubscribe.addErrorSubscribe(callIdHeader.getCallId(), errorEvent); } // 添加订阅 if (okEvent != null) { sipSubscribe.addOkSubscribe(callIdHeader.getCallId(), okEvent); } } /** * 向上级回复通道信息 * @param channel 通道信息 * @param parentPlatform 平台信息 * @return */ @Override public boolean catalogQuery(DeviceChannel channel, ParentPlatform parentPlatform, String sn, String fromTag, int size) { if ( parentPlatform ==null) { return false; } try { StringBuffer catalogXml = new StringBuffer(600); catalogXml.append("\r\n"); catalogXml.append("\r\n"); catalogXml.append("Catalog\r\n"); catalogXml.append("" +sn + "\r\n"); catalogXml.append("" + parentPlatform.getDeviceGBId() + "\r\n"); catalogXml.append("" + size + "\r\n"); catalogXml.append("\r\n"); catalogXml.append("\r\n"); if (channel != null) { catalogXml.append("" + channel.getChannelId() + "\r\n"); catalogXml.append("" + channel.getName() + "\r\n"); catalogXml.append("" + channel.getManufacture() + "\r\n"); catalogXml.append("" + channel.getModel() + "\r\n"); catalogXml.append("" + channel.getOwner() + "\r\n"); catalogXml.append("" + channel.getCivilCode() + "\r\n"); catalogXml.append("
" + channel.getAddress() + "
\r\n"); catalogXml.append("" + channel.getParental() + "\r\n"); catalogXml.append("" + channel.getParentId() + "\r\n"); catalogXml.append("" + channel.getSecrecy() + "\r\n"); catalogXml.append("" + channel.getRegisterWay() + "\r\n"); catalogXml.append("" + (channel.getStatus() == 0?"OFF":"ON") + "\r\n"); catalogXml.append("" + channel.getLongitude() + "\r\n"); catalogXml.append("" + channel.getLatitude() + "\r\n"); catalogXml.append("" + channel.getIpAddress() + "\r\n"); catalogXml.append("" + channel.getPort() + "\r\n"); catalogXml.append("\r\n"); catalogXml.append("" + channel.getPTZType() + "\r\n"); catalogXml.append("\r\n"); } catalogXml.append("
\r\n"); catalogXml.append("
\r\n"); catalogXml.append("
\r\n"); // callid CallIdHeader callIdHeader = parentPlatform.getTransport().equals("TCP") ? tcpSipProvider.getNewCallId() : udpSipProvider.getNewCallId(); Request request = headerProviderPlarformProvider.createMessageRequest(parentPlatform, catalogXml.toString(), fromTag, callIdHeader); transmitRequest(parentPlatform, request); } catch (SipException | ParseException | InvalidArgumentException e) { e.printStackTrace(); return false; } return true; } /** * 向上级回复DeviceInfo查询信息 * @param parentPlatform 平台信息 * @param sn * @param fromTag * @return */ @Override public boolean deviceInfoResponse(ParentPlatform parentPlatform, String sn, String fromTag) { if (parentPlatform == null) { return false; } try { StringBuffer deviceInfoXml = new StringBuffer(600); deviceInfoXml.append("\r\n"); deviceInfoXml.append("\r\n"); deviceInfoXml.append("DeviceInfo\r\n"); deviceInfoXml.append("" +sn + "\r\n"); deviceInfoXml.append("" + parentPlatform.getDeviceGBId() + "\r\n"); deviceInfoXml.append("" + parentPlatform.getName() + "\r\n"); deviceInfoXml.append("wvp\r\n"); deviceInfoXml.append("wvp-28181-2.0\r\n"); deviceInfoXml.append("2.0.202107\r\n"); deviceInfoXml.append("OK\r\n"); deviceInfoXml.append("\r\n"); CallIdHeader callIdHeader = parentPlatform.getTransport().equals("TCP") ? tcpSipProvider.getNewCallId() : udpSipProvider.getNewCallId(); Request request = headerProviderPlarformProvider.createMessageRequest(parentPlatform, deviceInfoXml.toString(), fromTag, callIdHeader); transmitRequest(parentPlatform, request); } catch (SipException | ParseException | InvalidArgumentException e) { e.printStackTrace(); return false; } return true; } /** * 向上级回复DeviceStatus查询信息 * @param parentPlatform 平台信息 * @param sn * @param fromTag * @return */ @Override public boolean deviceStatusResponse(ParentPlatform parentPlatform, String sn, String fromTag) { if (parentPlatform == null) { return false; } try { StringBuffer deviceStatusXml = new StringBuffer(600); deviceStatusXml.append("\r\n"); deviceStatusXml.append("\r\n"); deviceStatusXml.append("DeviceStatus\r\n"); deviceStatusXml.append("" +sn + "\r\n"); deviceStatusXml.append("" + parentPlatform.getDeviceGBId() + "\r\n"); deviceStatusXml.append("OK\r\n"); deviceStatusXml.append("ONLINE\r\n"); deviceStatusXml.append("OK\r\n"); deviceStatusXml.append("\r\n"); CallIdHeader callIdHeader = parentPlatform.getTransport().equals("TCP") ? tcpSipProvider.getNewCallId() : udpSipProvider.getNewCallId(); Request request = headerProviderPlarformProvider.createMessageRequest(parentPlatform, deviceStatusXml.toString(), fromTag, callIdHeader); transmitRequest(parentPlatform, request); } catch (SipException | ParseException | InvalidArgumentException e) { e.printStackTrace(); return false; } return true; } @Override public boolean sendNotifyMobilePosition(ParentPlatform parentPlatform, GPSMsgInfo gpsMsgInfo, SubscribeInfo subscribeInfo) { if (parentPlatform == null) { return false; } try { StringBuffer deviceStatusXml = new StringBuffer(600); deviceStatusXml.append("\r\n"); deviceStatusXml.append("\r\n"); deviceStatusXml.append("MobilePosition\r\n"); deviceStatusXml.append("" + (int)((Math.random()*9+1)*100000) + "\r\n"); deviceStatusXml.append("" + gpsMsgInfo.getId() + "\r\n"); deviceStatusXml.append("\r\n"); deviceStatusXml.append("" + gpsMsgInfo.getLng() + "\r\n"); deviceStatusXml.append("" + gpsMsgInfo.getLat() + "\r\n"); deviceStatusXml.append("" + gpsMsgInfo.getSpeed() + "\r\n"); deviceStatusXml.append("" + gpsMsgInfo.getDirection() + "\r\n"); deviceStatusXml.append("" + gpsMsgInfo.getAltitude() + "\r\n"); deviceStatusXml.append("\r\n"); CallIdHeader callIdHeader = parentPlatform.getTransport().equals("TCP") ? tcpSipProvider.getNewCallId() : udpSipProvider.getNewCallId(); callIdHeader.setCallId(subscribeInfo.getCallId()); String tm = Long.toString(System.currentTimeMillis()); Request request = headerProviderPlarformProvider.createNotifyRequest(parentPlatform, deviceStatusXml.toString(), subscribeInfo.getToTag(), subscribeInfo.getFromTag(), callIdHeader); transmitRequest(parentPlatform, request); } catch (SipException | ParseException | InvalidArgumentException e) { e.printStackTrace(); return false; } return true; } @Override public boolean sendNotifyForCatalogAddOrUpdate(String type, ParentPlatform parentPlatform, List deviceChannels, SubscribeInfo subscribeInfo) { if (parentPlatform == null || deviceChannels == null || deviceChannels.size() == 0 || subscribeInfo == null) { return false; } for (DeviceChannel channel : deviceChannels) { try { StringBuffer catalogXml = new StringBuffer(600); catalogXml.append("\r\n"); catalogXml.append("\r\n"); catalogXml.append("Catalog\r\n"); catalogXml.append("" + (int) ((Math.random() * 9 + 1) * 100000) + "\r\n"); catalogXml.append("" + deviceChannels.size() + "\r\n"); catalogXml.append("\r\n"); catalogXml.append("\r\n"); catalogXml.append("" + channel.getChannelId() + "\r\n"); catalogXml.append("" + type + "\r\n"); catalogXml.append("" + channel.getName() + "\r\n"); catalogXml.append("" + channel.getManufacture() + "\r\n"); catalogXml.append("" + channel.getModel() + "\r\n"); catalogXml.append("" + channel.getOwner() + "\r\n"); catalogXml.append("" + channel.getCivilCode() + "\r\n"); catalogXml.append("
" + channel.getAddress() + "
\r\n"); catalogXml.append("" + channel.getParental() + "\r\n"); catalogXml.append("" + channel.getParentId() + "\r\n"); catalogXml.append("" + channel.getSecrecy() + "\r\n"); catalogXml.append("" + channel.getRegisterWay() + "\r\n"); catalogXml.append("" + (channel.getStatus() == 0 ? "OFF" : "ON") + "\r\n"); catalogXml.append("" + channel.getLongitude() + "\r\n"); catalogXml.append("" + channel.getLatitude() + "\r\n"); catalogXml.append("" + channel.getIpAddress() + "\r\n"); catalogXml.append("" + channel.getPort() + "\r\n"); catalogXml.append("\r\n"); catalogXml.append("" + channel.getPTZType() + "\r\n"); catalogXml.append("\r\n"); catalogXml.append("
\r\n"); catalogXml.append("
\r\n"); catalogXml.append("
\r\n"); CallIdHeader callIdHeader = parentPlatform.getTransport().equals("TCP") ? tcpSipProvider.getNewCallId() : udpSipProvider.getNewCallId(); callIdHeader.setCallId(subscribeInfo.getCallId()); String tm = Long.toString(System.currentTimeMillis()); Request request = headerProviderPlarformProvider.createNotifyRequest(parentPlatform, catalogXml.toString(), subscribeInfo.getToTag(), subscribeInfo.getFromTag(), callIdHeader); transmitRequest(parentPlatform, request); Thread.sleep(10); } catch (SipException | ParseException | InvalidArgumentException e) { e.printStackTrace(); return false; } catch (InterruptedException e) { e.printStackTrace(); } } return true; } @Override public boolean sendNotifyForCatalogOther(String type, ParentPlatform parentPlatform, List deviceChannels, SubscribeInfo subscribeInfo) { if (parentPlatform == null || deviceChannels == null || deviceChannels.size() == 0 || subscribeInfo == null) { return false; } for (DeviceChannel channel : deviceChannels) { try { StringBuffer catalogXml = new StringBuffer(600); catalogXml.append("\r\n"); catalogXml.append("\r\n"); catalogXml.append("Catalog\r\n"); catalogXml.append("" + (int) ((Math.random() * 9 + 1) * 100000) + "\r\n"); catalogXml.append("" + deviceChannels.size() + "\r\n"); catalogXml.append("\r\n"); catalogXml.append("\r\n"); catalogXml.append("" + channel.getChannelId() + "\r\n"); catalogXml.append("" + type + "\r\n"); catalogXml.append("\r\n"); catalogXml.append("\r\n"); catalogXml.append("\r\n"); CallIdHeader callIdHeader = parentPlatform.getTransport().equals("TCP") ? tcpSipProvider.getNewCallId() : udpSipProvider.getNewCallId(); callIdHeader.setCallId(subscribeInfo.getCallId()); String tm = Long.toString(System.currentTimeMillis()); Request request = headerProviderPlarformProvider.createNotifyRequest(parentPlatform, catalogXml.toString(), subscribeInfo.getToTag(), subscribeInfo.getFromTag(), callIdHeader); transmitRequest(parentPlatform, request); Thread.sleep(200); } catch (SipException | ParseException | InvalidArgumentException e) { e.printStackTrace(); return false; } catch (InterruptedException e) { e.printStackTrace(); } } return true; } }