package com.genersoft.iot.vmp.gb28181.transmit.cmd.impl; //import com.genersoft.iot.vmp.conf.SipConfig; //import com.genersoft.iot.vmp.gb28181.bean.Device; 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.event.SipSubscribe; //import com.genersoft.iot.vmp.gb28181.session.VideoStreamSessionManager; import com.genersoft.iot.vmp.gb28181.transmit.cmd.ISIPCommanderForPlatform; import com.genersoft.iot.vmp.gb28181.transmit.cmd.SIPRequestHeaderPlarformProvider; //import com.genersoft.iot.vmp.gb28181.transmit.cmd.SIPRequestHeaderProvider; import com.genersoft.iot.vmp.storager.IRedisCatchStorage; //import com.genersoft.iot.vmp.storager.IVideoManagerStorager; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Qualifier; import org.springframework.beans.factory.annotation.Value; 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.UUID; @Component public class SIPCommanderFroPlatform implements ISIPCommanderForPlatform { // @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; @Autowired @Qualifier(value="tcpSipProvider") private SipProvider tcpSipProvider; @Autowired @Qualifier(value="udpSipProvider") private SipProvider udpSipProvider; @Value("${media.rtp.enable}") private boolean rtpEnable; @Override public boolean register(ParentPlatform parentPlatform) { return register(parentPlatform, null, null, null, null); } @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; if (www == null ) { request = headerProviderPlarformProvider.createRegisterRequest(parentPlatform, 1L, null, null); // 将 callid 写入缓存, 等注册成功可以更新状态 CallIdHeader callIdHeader = (CallIdHeader)request.getHeader(CallIdHeader.NAME); redisCatchStorage.updatePlatformRegisterInfo(callIdHeader.getCallId(), parentPlatform.getServerGBId()); sipSubscribe.addErrorSubscribe(callIdHeader.getCallId(), (event)->{ redisCatchStorage.delPlatformRegisterInfo(callIdHeader.getCallId()); if (errorEvent != null) { errorEvent.response(event); } }); }else { request = headerProviderPlarformProvider.createRegisterRequest(parentPlatform, null, null, callId, www); } 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");//" encoding=\"GB2312\"?>\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"); Request request = headerProviderPlarformProvider.createKeetpaliveMessageRequest( parentPlatform, keepaliveXml.toString(), "z9hG4bK-" + UUID.randomUUID().toString().replace("-", ""), UUID.randomUUID().toString().replace("-", ""), null); transmitRequest(parentPlatform, request); CallIdHeader callIdHeader = (CallIdHeader)request.getHeader(CallIdHeader.NAME); 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 (channel == null || 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"); 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");// TODO 当前不能添加分组, 所以暂时没有父节点 catalogXml.append("" + channel.getParentId() + "\r\n"); // TODO 当前不能添加分组, 所以暂时没有父节点 catalogXml.append("" + channel.getSecrecy() + "\r\n"); catalogXml.append("" + channel.getRegisterWay() + "\r\n"); catalogXml.append("" + (channel.getStatus() == 0?"OFF":"ON") + "\r\n"); catalogXml.append("\r\n"); catalogXml.append("
\r\n"); catalogXml.append("
\r\n"); catalogXml.append("
\r\n"); Request request = headerProviderPlarformProvider.createMessageRequest(parentPlatform, catalogXml.toString(), fromTag); transmitRequest(parentPlatform, request); } catch (SipException | ParseException | InvalidArgumentException e) { e.printStackTrace(); return false; } return true; } }