648540858
3 years ago
40 changed files with 2200 additions and 204 deletions
@ -0,0 +1,178 @@ |
|||||
|
package com.genersoft.iot.vmp.gb28181.transmit.event.request; |
||||
|
|
||||
|
import gov.nist.javax.sip.SipProviderImpl; |
||||
|
import gov.nist.javax.sip.SipStackImpl; |
||||
|
import gov.nist.javax.sip.message.SIPRequest; |
||||
|
import gov.nist.javax.sip.stack.SIPServerTransaction; |
||||
|
import org.dom4j.Document; |
||||
|
import org.dom4j.DocumentException; |
||||
|
import org.dom4j.Element; |
||||
|
import org.dom4j.io.SAXReader; |
||||
|
import org.slf4j.Logger; |
||||
|
import org.slf4j.LoggerFactory; |
||||
|
import org.springframework.beans.factory.annotation.Autowired; |
||||
|
import org.springframework.beans.factory.annotation.Qualifier; |
||||
|
|
||||
|
import javax.sip.*; |
||||
|
import javax.sip.address.Address; |
||||
|
import javax.sip.address.AddressFactory; |
||||
|
import javax.sip.address.SipURI; |
||||
|
import javax.sip.header.ContentTypeHeader; |
||||
|
import javax.sip.header.HeaderFactory; |
||||
|
import javax.sip.header.ViaHeader; |
||||
|
import javax.sip.message.MessageFactory; |
||||
|
import javax.sip.message.Request; |
||||
|
import javax.sip.message.Response; |
||||
|
import java.io.ByteArrayInputStream; |
||||
|
import java.text.ParseException; |
||||
|
|
||||
|
/** |
||||
|
* @description:处理接收IPCamera发来的SIP协议请求消息 |
||||
|
* @author: songww |
||||
|
* @date: 2020年5月3日 下午4:42:22 |
||||
|
*/ |
||||
|
public abstract class SIPRequestProcessorParent { |
||||
|
|
||||
|
private final static Logger logger = LoggerFactory.getLogger(SIPRequestProcessorParent.class); |
||||
|
|
||||
|
@Autowired |
||||
|
@Qualifier(value="tcpSipProvider") |
||||
|
private SipProviderImpl tcpSipProvider; |
||||
|
|
||||
|
@Autowired |
||||
|
@Qualifier(value="udpSipProvider") |
||||
|
private SipProviderImpl udpSipProvider; |
||||
|
|
||||
|
/** |
||||
|
* 根据 RequestEvent 获取 ServerTransaction |
||||
|
* @param evt |
||||
|
* @return |
||||
|
*/ |
||||
|
public ServerTransaction getServerTransaction(RequestEvent evt) { |
||||
|
Request request = evt.getRequest(); |
||||
|
ServerTransaction serverTransaction = evt.getServerTransaction(); |
||||
|
// 判断TCP还是UDP
|
||||
|
boolean isTcp = false; |
||||
|
ViaHeader reqViaHeader = (ViaHeader) request.getHeader(ViaHeader.NAME); |
||||
|
String transport = reqViaHeader.getTransport(); |
||||
|
if (transport.equals("TCP")) { |
||||
|
isTcp = true; |
||||
|
} |
||||
|
|
||||
|
if (serverTransaction == null) { |
||||
|
try { |
||||
|
if (isTcp) { |
||||
|
SipStackImpl stack = (SipStackImpl)tcpSipProvider.getSipStack(); |
||||
|
serverTransaction = (SIPServerTransaction) stack.findTransaction((SIPRequest)request, true); |
||||
|
if (serverTransaction == null) { |
||||
|
serverTransaction = tcpSipProvider.getNewServerTransaction(request); |
||||
|
} |
||||
|
} else { |
||||
|
SipStackImpl stack = (SipStackImpl)udpSipProvider.getSipStack(); |
||||
|
serverTransaction = (SIPServerTransaction) stack.findTransaction((SIPRequest)request, true); |
||||
|
if (serverTransaction == null) { |
||||
|
serverTransaction = udpSipProvider.getNewServerTransaction(request); |
||||
|
} |
||||
|
} |
||||
|
} catch (TransactionAlreadyExistsException e) { |
||||
|
logger.error(e.getMessage()); |
||||
|
} catch (TransactionUnavailableException e) { |
||||
|
logger.error(e.getMessage()); |
||||
|
} |
||||
|
} |
||||
|
return serverTransaction; |
||||
|
} |
||||
|
|
||||
|
public AddressFactory getAddressFactory() { |
||||
|
try { |
||||
|
return SipFactory.getInstance().createAddressFactory(); |
||||
|
} catch (PeerUnavailableException e) { |
||||
|
e.printStackTrace(); |
||||
|
} |
||||
|
return null; |
||||
|
} |
||||
|
|
||||
|
public HeaderFactory getHeaderFactory() { |
||||
|
try { |
||||
|
return SipFactory.getInstance().createHeaderFactory(); |
||||
|
} catch (PeerUnavailableException e) { |
||||
|
e.printStackTrace(); |
||||
|
} |
||||
|
return null; |
||||
|
} |
||||
|
|
||||
|
public MessageFactory getMessageFactory() { |
||||
|
try { |
||||
|
return SipFactory.getInstance().createMessageFactory(); |
||||
|
} catch (PeerUnavailableException e) { |
||||
|
e.printStackTrace(); |
||||
|
} |
||||
|
return null; |
||||
|
} |
||||
|
|
||||
|
/*** |
||||
|
* 回复状态码 |
||||
|
* 100 trying |
||||
|
* 200 OK |
||||
|
* 400 |
||||
|
* 404 |
||||
|
* @param evt |
||||
|
* @throws SipException |
||||
|
* @throws InvalidArgumentException |
||||
|
* @throws ParseException |
||||
|
*/ |
||||
|
public void responseAck(RequestEvent evt, int statusCode) throws SipException, InvalidArgumentException, ParseException { |
||||
|
Response response = getMessageFactory().createResponse(statusCode, evt.getRequest()); |
||||
|
ServerTransaction serverTransaction = getServerTransaction(evt); |
||||
|
serverTransaction.sendResponse(response); |
||||
|
if (statusCode >= 200) { |
||||
|
if (serverTransaction.getDialog() != null) serverTransaction.getDialog().delete(); |
||||
|
} |
||||
|
} |
||||
|
|
||||
|
public void responseAck(RequestEvent evt, int statusCode, String msg) throws SipException, InvalidArgumentException, ParseException { |
||||
|
Response response = getMessageFactory().createResponse(statusCode, evt.getRequest()); |
||||
|
response.setReasonPhrase(msg); |
||||
|
ServerTransaction serverTransaction = getServerTransaction(evt); |
||||
|
serverTransaction.sendResponse(response); |
||||
|
if (statusCode >= 200) { |
||||
|
if (serverTransaction.getDialog() != null) serverTransaction.getDialog().delete(); |
||||
|
} |
||||
|
} |
||||
|
|
||||
|
/** |
||||
|
* 回复带sdp的200 |
||||
|
* @param evt |
||||
|
* @param sdp |
||||
|
* @throws SipException |
||||
|
* @throws InvalidArgumentException |
||||
|
* @throws ParseException |
||||
|
*/ |
||||
|
public void responseAck(RequestEvent evt, String sdp) throws SipException, InvalidArgumentException, ParseException { |
||||
|
Response response = getMessageFactory().createResponse(Response.OK, evt.getRequest()); |
||||
|
SipFactory sipFactory = SipFactory.getInstance(); |
||||
|
ContentTypeHeader contentTypeHeader = sipFactory.createHeaderFactory().createContentTypeHeader("APPLICATION", "SDP"); |
||||
|
response.setContent(sdp, contentTypeHeader); |
||||
|
|
||||
|
SipURI sipURI = (SipURI)evt.getRequest().getRequestURI(); |
||||
|
|
||||
|
Address concatAddress = sipFactory.createAddressFactory().createAddress( |
||||
|
sipFactory.createAddressFactory().createSipURI(sipURI.getUser(), sipURI.getHost()+":"+sipURI.getPort() |
||||
|
)); |
||||
|
response.addHeader(sipFactory.createHeaderFactory().createContactHeader(concatAddress)); |
||||
|
getServerTransaction(evt).sendResponse(response); |
||||
|
} |
||||
|
|
||||
|
public Element getRootElement(RequestEvent evt) throws DocumentException { |
||||
|
return getRootElement(evt, "gb2312"); |
||||
|
} |
||||
|
public Element getRootElement(RequestEvent evt, String charset) throws DocumentException { |
||||
|
if (charset == null) charset = "gb2312"; |
||||
|
Request request = evt.getRequest(); |
||||
|
SAXReader reader = new SAXReader(); |
||||
|
reader.setEncoding(charset); |
||||
|
Document xml = reader.read(new ByteArrayInputStream(request.getRawContent())); |
||||
|
return xml.getRootElement(); |
||||
|
} |
||||
|
|
||||
|
} |
@ -0,0 +1,23 @@ |
|||||
|
package com.genersoft.iot.vmp.gb28181.transmit.event.request.impl.message; |
||||
|
|
||||
|
import com.genersoft.iot.vmp.gb28181.bean.Device; |
||||
|
import com.genersoft.iot.vmp.gb28181.bean.ParentPlatform; |
||||
|
import org.dom4j.Element; |
||||
|
|
||||
|
import javax.sip.RequestEvent; |
||||
|
|
||||
|
public interface IMessageHandler { |
||||
|
/** |
||||
|
* 处理来自设备的信息 |
||||
|
* @param evt |
||||
|
* @param device |
||||
|
*/ |
||||
|
void handForDevice(RequestEvent evt, Device device, Element element); |
||||
|
|
||||
|
/** |
||||
|
* 处理来自平台的信息 |
||||
|
* @param evt |
||||
|
* @param parentPlatform |
||||
|
*/ |
||||
|
void handForPlatform(RequestEvent evt, ParentPlatform parentPlatform, Element element); |
||||
|
} |
@ -0,0 +1,43 @@ |
|||||
|
package com.genersoft.iot.vmp.gb28181.transmit.event.request.impl.message; |
||||
|
|
||||
|
import com.genersoft.iot.vmp.gb28181.bean.Device; |
||||
|
import com.genersoft.iot.vmp.gb28181.bean.ParentPlatform; |
||||
|
import com.genersoft.iot.vmp.gb28181.transmit.event.request.SIPRequestProcessorParent; |
||||
|
import org.dom4j.Element; |
||||
|
import org.springframework.beans.factory.annotation.Autowired; |
||||
|
|
||||
|
import javax.sip.RequestEvent; |
||||
|
import java.util.Map; |
||||
|
import java.util.concurrent.ConcurrentHashMap; |
||||
|
|
||||
|
import static com.genersoft.iot.vmp.gb28181.utils.XmlUtil.getText; |
||||
|
|
||||
|
public abstract class MessageHandlerAbstract extends SIPRequestProcessorParent implements IMessageHandler{ |
||||
|
|
||||
|
public static Map<String, IMessageHandler> messageHandlerMap = new ConcurrentHashMap<>(); |
||||
|
|
||||
|
@Autowired |
||||
|
public MessageRequestProcessor messageRequestProcessor; |
||||
|
|
||||
|
public void addHandler(String cmdType, IMessageHandler messageHandler) { |
||||
|
messageHandlerMap.put(cmdType, messageHandler); |
||||
|
} |
||||
|
|
||||
|
@Override |
||||
|
public void handForDevice(RequestEvent evt, Device device, Element element) { |
||||
|
String cmd = getText(element, "CmdType"); |
||||
|
IMessageHandler messageHandler = messageHandlerMap.get(cmd); |
||||
|
if (messageHandler != null) { |
||||
|
messageHandler.handForDevice(evt, device, element); |
||||
|
} |
||||
|
} |
||||
|
|
||||
|
@Override |
||||
|
public void handForPlatform(RequestEvent evt, ParentPlatform parentPlatform, Element element) { |
||||
|
String cmd = getText(element, "CmdType"); |
||||
|
IMessageHandler messageHandler = messageHandlerMap.get(cmd); |
||||
|
if (messageHandler != null) { |
||||
|
messageHandler.handForPlatform(evt, parentPlatform, element); |
||||
|
} |
||||
|
} |
||||
|
} |
@ -0,0 +1,91 @@ |
|||||
|
package com.genersoft.iot.vmp.gb28181.transmit.event.request.impl.message; |
||||
|
|
||||
|
import com.genersoft.iot.vmp.gb28181.bean.Device; |
||||
|
import com.genersoft.iot.vmp.gb28181.bean.ParentPlatform; |
||||
|
import com.genersoft.iot.vmp.gb28181.transmit.SIPProcessorObserver; |
||||
|
import com.genersoft.iot.vmp.gb28181.transmit.event.request.ISIPRequestProcessor; |
||||
|
import com.genersoft.iot.vmp.gb28181.transmit.event.request.SIPRequestProcessorParent; |
||||
|
import com.genersoft.iot.vmp.gb28181.utils.SipUtils; |
||||
|
import com.genersoft.iot.vmp.storager.IVideoManagerStorager; |
||||
|
import org.dom4j.DocumentException; |
||||
|
import org.dom4j.Element; |
||||
|
import org.slf4j.Logger; |
||||
|
import org.slf4j.LoggerFactory; |
||||
|
import org.springframework.beans.factory.InitializingBean; |
||||
|
import org.springframework.beans.factory.annotation.Autowired; |
||||
|
import org.springframework.stereotype.Component; |
||||
|
|
||||
|
import javax.sip.InvalidArgumentException; |
||||
|
import javax.sip.RequestEvent; |
||||
|
import javax.sip.SipException; |
||||
|
import javax.sip.message.Response; |
||||
|
import java.text.ParseException; |
||||
|
import java.util.Map; |
||||
|
import java.util.concurrent.ConcurrentHashMap; |
||||
|
|
||||
|
@Component |
||||
|
public class MessageRequestProcessor extends SIPRequestProcessorParent implements InitializingBean, ISIPRequestProcessor { |
||||
|
|
||||
|
private final static Logger logger = LoggerFactory.getLogger(MessageRequestProcessor.class); |
||||
|
|
||||
|
private final String method = "MESSAGE"; |
||||
|
|
||||
|
private static Map<String, IMessageHandler> messageHandlerMap = new ConcurrentHashMap<>(); |
||||
|
|
||||
|
@Autowired |
||||
|
private SIPProcessorObserver sipProcessorObserver; |
||||
|
|
||||
|
@Autowired |
||||
|
private IVideoManagerStorager storage; |
||||
|
|
||||
|
@Override |
||||
|
public void afterPropertiesSet() throws Exception { |
||||
|
// 添加消息处理的订阅
|
||||
|
sipProcessorObserver.addRequestProcessor(method, this); |
||||
|
} |
||||
|
|
||||
|
public void addHandler(String name, IMessageHandler handler) { |
||||
|
messageHandlerMap.put(name, handler); |
||||
|
} |
||||
|
|
||||
|
@Override |
||||
|
public void process(RequestEvent evt) { |
||||
|
logger.debug("接收到消息:" + evt.getRequest()); |
||||
|
String deviceId = SipUtils.getUserIdFromFromHeader(evt.getRequest()); |
||||
|
// 查询设备是否存在
|
||||
|
Device device = storage.queryVideoDevice(deviceId); |
||||
|
// 查询上级平台是否存在
|
||||
|
ParentPlatform parentPlatform = storage.queryParentPlatByServerGBId(deviceId); |
||||
|
try { |
||||
|
if (device == null && parentPlatform == null) { |
||||
|
// 不存在则回复404
|
||||
|
responseAck(evt, Response.NOT_FOUND, "device id not found"); |
||||
|
}else { |
||||
|
Element rootElement = getRootElement(evt); |
||||
|
String name = rootElement.getName(); |
||||
|
IMessageHandler messageHandler = messageHandlerMap.get(name); |
||||
|
if (messageHandler != null) { |
||||
|
if (device != null) { |
||||
|
messageHandler.handForDevice(evt, device, rootElement); |
||||
|
}else { // 由于上面已经判断都为null则直接返回,所以这里device和parentPlatform必有一个不为null
|
||||
|
messageHandler.handForPlatform(evt, parentPlatform, rootElement); |
||||
|
} |
||||
|
}else { |
||||
|
// 不支持的message
|
||||
|
// 不存在则回复415
|
||||
|
responseAck(evt, Response.UNSUPPORTED_MEDIA_TYPE, "Unsupported message type, must Control/Notify/Query/Response"); |
||||
|
} |
||||
|
} |
||||
|
} catch (SipException e) { |
||||
|
logger.warn("SIP 回复错误", e); |
||||
|
} catch (InvalidArgumentException e) { |
||||
|
logger.warn("参数无效", e); |
||||
|
} catch (ParseException e) { |
||||
|
logger.warn("SIP回复时解析异常", e); |
||||
|
} catch (DocumentException e) { |
||||
|
logger.warn("解析XML消息内容异常", e); |
||||
|
} |
||||
|
} |
||||
|
|
||||
|
|
||||
|
} |
@ -0,0 +1,21 @@ |
|||||
|
package com.genersoft.iot.vmp.gb28181.transmit.event.request.impl.message.control; |
||||
|
|
||||
|
import com.genersoft.iot.vmp.gb28181.transmit.event.request.impl.message.MessageHandlerAbstract; |
||||
|
import com.genersoft.iot.vmp.gb28181.transmit.event.request.impl.message.MessageRequestProcessor; |
||||
|
import org.springframework.beans.factory.InitializingBean; |
||||
|
import org.springframework.beans.factory.annotation.Autowired; |
||||
|
import org.springframework.stereotype.Component; |
||||
|
|
||||
|
@Component |
||||
|
public class ControlMessageHandler extends MessageHandlerAbstract implements InitializingBean { |
||||
|
|
||||
|
private final String messageType = "Control"; |
||||
|
|
||||
|
@Autowired |
||||
|
private MessageRequestProcessor messageRequestProcessor; |
||||
|
|
||||
|
@Override |
||||
|
public void afterPropertiesSet() throws Exception { |
||||
|
messageRequestProcessor.addHandler(messageType, this); |
||||
|
} |
||||
|
} |
@ -0,0 +1,16 @@ |
|||||
|
package com.genersoft.iot.vmp.gb28181.transmit.event.request.impl.message.notify; |
||||
|
|
||||
|
import com.genersoft.iot.vmp.gb28181.transmit.event.request.impl.message.MessageHandlerAbstract; |
||||
|
import org.springframework.beans.factory.InitializingBean; |
||||
|
import org.springframework.stereotype.Component; |
||||
|
|
||||
|
@Component |
||||
|
public class NotifyMessageHandler extends MessageHandlerAbstract implements InitializingBean { |
||||
|
|
||||
|
private final String messageType = "Notify"; |
||||
|
|
||||
|
@Override |
||||
|
public void afterPropertiesSet() throws Exception { |
||||
|
messageRequestProcessor.addHandler(messageType, this); |
||||
|
} |
||||
|
} |
@ -0,0 +1,112 @@ |
|||||
|
package com.genersoft.iot.vmp.gb28181.transmit.event.request.impl.message.notify.cmd; |
||||
|
|
||||
|
import com.genersoft.iot.vmp.conf.UserSetup; |
||||
|
import com.genersoft.iot.vmp.gb28181.bean.*; |
||||
|
import com.genersoft.iot.vmp.gb28181.event.DeviceOffLineDetector; |
||||
|
import com.genersoft.iot.vmp.gb28181.event.EventPublisher; |
||||
|
import com.genersoft.iot.vmp.gb28181.transmit.event.request.SIPRequestProcessorParent; |
||||
|
import com.genersoft.iot.vmp.gb28181.transmit.event.request.impl.message.IMessageHandler; |
||||
|
import com.genersoft.iot.vmp.gb28181.transmit.event.request.impl.message.notify.NotifyMessageHandler; |
||||
|
import com.genersoft.iot.vmp.gb28181.utils.NumericUtil; |
||||
|
import com.genersoft.iot.vmp.service.IDeviceAlarmService; |
||||
|
import com.genersoft.iot.vmp.storager.IVideoManagerStorager; |
||||
|
import com.genersoft.iot.vmp.utils.GpsUtil; |
||||
|
import org.dom4j.Element; |
||||
|
import org.slf4j.Logger; |
||||
|
import org.slf4j.LoggerFactory; |
||||
|
import org.springframework.beans.factory.InitializingBean; |
||||
|
import org.springframework.beans.factory.annotation.Autowired; |
||||
|
import org.springframework.util.StringUtils; |
||||
|
|
||||
|
import javax.sip.RequestEvent; |
||||
|
|
||||
|
import static com.genersoft.iot.vmp.gb28181.utils.XmlUtil.getText; |
||||
|
|
||||
|
public class AlarmMessageHandler extends SIPRequestProcessorParent implements InitializingBean, IMessageHandler { |
||||
|
|
||||
|
private Logger logger = LoggerFactory.getLogger(AlarmMessageHandler.class); |
||||
|
private final String cmdType = "Alarm"; |
||||
|
|
||||
|
@Autowired |
||||
|
private NotifyMessageHandler notifyMessageHandler; |
||||
|
|
||||
|
@Autowired |
||||
|
private EventPublisher publisher; |
||||
|
|
||||
|
@Autowired |
||||
|
private UserSetup userSetup; |
||||
|
|
||||
|
@Autowired |
||||
|
private IVideoManagerStorager storager; |
||||
|
|
||||
|
@Autowired |
||||
|
private IDeviceAlarmService deviceAlarmService; |
||||
|
|
||||
|
@Autowired |
||||
|
private DeviceOffLineDetector offLineDetector; |
||||
|
|
||||
|
@Override |
||||
|
public void afterPropertiesSet() throws Exception { |
||||
|
notifyMessageHandler.addHandler(cmdType, this); |
||||
|
} |
||||
|
|
||||
|
@Override |
||||
|
public void handForDevice(RequestEvent evt, Device device, Element rootElement) { |
||||
|
Element deviceIdElement = rootElement.element("DeviceID"); |
||||
|
String channelId = deviceIdElement.getText().toString(); |
||||
|
DeviceAlarm deviceAlarm = new DeviceAlarm(); |
||||
|
deviceAlarm.setDeviceId(device.getDeviceId()); |
||||
|
deviceAlarm.setChannelId(channelId); |
||||
|
deviceAlarm.setAlarmPriority(getText(rootElement, "AlarmPriority")); |
||||
|
deviceAlarm.setAlarmMethod(getText(rootElement, "AlarmMethod")); |
||||
|
deviceAlarm.setAlarmTime(getText(rootElement, "AlarmTime")); |
||||
|
if (getText(rootElement, "AlarmDescription") == null) { |
||||
|
deviceAlarm.setAlarmDescription(""); |
||||
|
} else { |
||||
|
deviceAlarm.setAlarmDescription(getText(rootElement, "AlarmDescription")); |
||||
|
} |
||||
|
if (NumericUtil.isDouble(getText(rootElement, "Longitude"))) { |
||||
|
deviceAlarm.setLongitude(Double.parseDouble(getText(rootElement, "Longitude"))); |
||||
|
} else { |
||||
|
deviceAlarm.setLongitude(0.00); |
||||
|
} |
||||
|
if (NumericUtil.isDouble(getText(rootElement, "Latitude"))) { |
||||
|
deviceAlarm.setLatitude(Double.parseDouble(getText(rootElement, "Latitude"))); |
||||
|
} else { |
||||
|
deviceAlarm.setLatitude(0.00); |
||||
|
} |
||||
|
|
||||
|
if (!StringUtils.isEmpty(deviceAlarm.getAlarmMethod())) { |
||||
|
if ( deviceAlarm.getAlarmMethod().equals("4")) { |
||||
|
MobilePosition mobilePosition = new MobilePosition(); |
||||
|
mobilePosition.setDeviceId(deviceAlarm.getDeviceId()); |
||||
|
mobilePosition.setTime(deviceAlarm.getAlarmTime()); |
||||
|
mobilePosition.setLongitude(deviceAlarm.getLongitude()); |
||||
|
mobilePosition.setLatitude(deviceAlarm.getLatitude()); |
||||
|
mobilePosition.setReportSource("GPS Alarm"); |
||||
|
BaiduPoint bp = new BaiduPoint(); |
||||
|
bp = GpsUtil.Wgs84ToBd09(String.valueOf(mobilePosition.getLongitude()), String.valueOf(mobilePosition.getLatitude())); |
||||
|
logger.info("百度坐标:" + bp.getBdLng() + ", " + bp.getBdLat()); |
||||
|
mobilePosition.setGeodeticSystem("BD-09"); |
||||
|
mobilePosition.setCnLng(bp.getBdLng()); |
||||
|
mobilePosition.setCnLat(bp.getBdLat()); |
||||
|
if (!userSetup.getSavePositionHistory()) { |
||||
|
storager.clearMobilePositionsByDeviceId(device.getDeviceId()); |
||||
|
} |
||||
|
storager.insertMobilePosition(mobilePosition); |
||||
|
} |
||||
|
} |
||||
|
logger.debug("存储报警信息、报警分类"); |
||||
|
// 存储报警信息、报警分类
|
||||
|
deviceAlarmService.add(deviceAlarm); |
||||
|
|
||||
|
if (offLineDetector.isOnline(device.getDeviceId())) { |
||||
|
publisher.deviceAlarmEventPublish(deviceAlarm); |
||||
|
} |
||||
|
} |
||||
|
|
||||
|
@Override |
||||
|
public void handForPlatform(RequestEvent evt, ParentPlatform parentPlatform, Element element) { |
||||
|
|
||||
|
} |
||||
|
} |
@ -0,0 +1,61 @@ |
|||||
|
package com.genersoft.iot.vmp.gb28181.transmit.event.request.impl.message.notify.cmd; |
||||
|
|
||||
|
import com.genersoft.iot.vmp.common.VideoManagerConstants; |
||||
|
import com.genersoft.iot.vmp.gb28181.bean.Device; |
||||
|
import com.genersoft.iot.vmp.gb28181.bean.ParentPlatform; |
||||
|
import com.genersoft.iot.vmp.gb28181.event.EventPublisher; |
||||
|
import com.genersoft.iot.vmp.gb28181.transmit.event.request.SIPRequestProcessorParent; |
||||
|
import com.genersoft.iot.vmp.gb28181.transmit.event.request.impl.message.IMessageHandler; |
||||
|
import com.genersoft.iot.vmp.gb28181.transmit.event.request.impl.message.notify.NotifyMessageHandler; |
||||
|
import org.dom4j.Element; |
||||
|
import org.slf4j.Logger; |
||||
|
import org.slf4j.LoggerFactory; |
||||
|
import org.springframework.beans.factory.InitializingBean; |
||||
|
import org.springframework.beans.factory.annotation.Autowired; |
||||
|
|
||||
|
import javax.sip.InvalidArgumentException; |
||||
|
import javax.sip.RequestEvent; |
||||
|
import javax.sip.SipException; |
||||
|
import javax.sip.message.Response; |
||||
|
import java.text.ParseException; |
||||
|
|
||||
|
public class KeepaliveMessageHandler extends SIPRequestProcessorParent implements InitializingBean, IMessageHandler { |
||||
|
|
||||
|
private Logger logger = LoggerFactory.getLogger(KeepaliveMessageHandler.class); |
||||
|
private final String cmdType = "Keepalive"; |
||||
|
|
||||
|
@Autowired |
||||
|
private NotifyMessageHandler notifyMessageHandler; |
||||
|
|
||||
|
@Autowired |
||||
|
private EventPublisher publisher; |
||||
|
|
||||
|
@Override |
||||
|
public void afterPropertiesSet() throws Exception { |
||||
|
notifyMessageHandler.addHandler(cmdType, this); |
||||
|
} |
||||
|
|
||||
|
@Override |
||||
|
public void handForDevice(RequestEvent evt, Device device, Element element) { |
||||
|
// 检查设备是否存在并在线, 不在线则设置为在线
|
||||
|
try { |
||||
|
if (device != null ) { |
||||
|
// 回复200 OK
|
||||
|
responseAck(evt, Response.OK); |
||||
|
publisher.onlineEventPublish(device, VideoManagerConstants.EVENT_ONLINE_KEEPLIVE); |
||||
|
} |
||||
|
} catch (SipException e) { |
||||
|
e.printStackTrace(); |
||||
|
} catch (InvalidArgumentException e) { |
||||
|
e.printStackTrace(); |
||||
|
} catch (ParseException e) { |
||||
|
e.printStackTrace(); |
||||
|
} |
||||
|
} |
||||
|
|
||||
|
@Override |
||||
|
public void handForPlatform(RequestEvent evt, ParentPlatform parentPlatform, Element element) { |
||||
|
// 不会收到上级平台的心跳信息
|
||||
|
|
||||
|
} |
||||
|
} |
@ -0,0 +1,73 @@ |
|||||
|
package com.genersoft.iot.vmp.gb28181.transmit.event.request.impl.message.notify.cmd; |
||||
|
|
||||
|
import com.genersoft.iot.vmp.common.StreamInfo; |
||||
|
import com.genersoft.iot.vmp.gb28181.bean.Device; |
||||
|
import com.genersoft.iot.vmp.gb28181.bean.ParentPlatform; |
||||
|
import com.genersoft.iot.vmp.gb28181.transmit.cmd.impl.SIPCommander; |
||||
|
import com.genersoft.iot.vmp.gb28181.transmit.event.request.SIPRequestProcessorParent; |
||||
|
import com.genersoft.iot.vmp.gb28181.transmit.event.request.impl.message.IMessageHandler; |
||||
|
import com.genersoft.iot.vmp.gb28181.transmit.event.request.impl.message.notify.NotifyMessageHandler; |
||||
|
import com.genersoft.iot.vmp.storager.IRedisCatchStorage; |
||||
|
import org.dom4j.Element; |
||||
|
import org.slf4j.Logger; |
||||
|
import org.slf4j.LoggerFactory; |
||||
|
import org.springframework.beans.factory.InitializingBean; |
||||
|
import org.springframework.beans.factory.annotation.Autowired; |
||||
|
|
||||
|
import javax.sip.InvalidArgumentException; |
||||
|
import javax.sip.RequestEvent; |
||||
|
import javax.sip.SipException; |
||||
|
import javax.sip.message.Response; |
||||
|
|
||||
|
import java.text.ParseException; |
||||
|
|
||||
|
import static com.genersoft.iot.vmp.gb28181.utils.XmlUtil.getText; |
||||
|
|
||||
|
public class MediaStatusMessageHandler extends SIPRequestProcessorParent implements InitializingBean, IMessageHandler { |
||||
|
|
||||
|
private Logger logger = LoggerFactory.getLogger(MediaStatusMessageHandler.class); |
||||
|
private final String cmdType = "MediaStatus"; |
||||
|
|
||||
|
@Autowired |
||||
|
private NotifyMessageHandler notifyMessageHandler; |
||||
|
|
||||
|
@Autowired |
||||
|
private SIPCommander cmder; |
||||
|
|
||||
|
@Autowired |
||||
|
private IRedisCatchStorage redisCatchStorage; |
||||
|
|
||||
|
@Override |
||||
|
public void afterPropertiesSet() throws Exception { |
||||
|
notifyMessageHandler.addHandler(cmdType, this); |
||||
|
} |
||||
|
|
||||
|
@Override |
||||
|
public void handForDevice(RequestEvent evt, Device device, Element rootElement) { |
||||
|
|
||||
|
// 回复200 OK
|
||||
|
try { |
||||
|
responseAck(evt, Response.OK); |
||||
|
} catch (SipException e) { |
||||
|
e.printStackTrace(); |
||||
|
} catch (InvalidArgumentException e) { |
||||
|
e.printStackTrace(); |
||||
|
} catch (ParseException e) { |
||||
|
e.printStackTrace(); |
||||
|
} |
||||
|
String NotifyType =getText(rootElement, "NotifyType"); |
||||
|
if (NotifyType.equals("121")){ |
||||
|
logger.info("媒体播放完毕,通知关流"); |
||||
|
StreamInfo streamInfo = redisCatchStorage.queryPlaybackByDevice(device.getDeviceId(), "*"); |
||||
|
if (streamInfo != null) { |
||||
|
redisCatchStorage.stopPlayback(streamInfo); |
||||
|
cmder.streamByeCmd(streamInfo.getDeviceID(), streamInfo.getChannelId()); |
||||
|
} |
||||
|
} |
||||
|
} |
||||
|
|
||||
|
@Override |
||||
|
public void handForPlatform(RequestEvent evt, ParentPlatform parentPlatform, Element element) { |
||||
|
|
||||
|
} |
||||
|
} |
@ -0,0 +1,101 @@ |
|||||
|
package com.genersoft.iot.vmp.gb28181.transmit.event.request.impl.message.notify.cmd; |
||||
|
|
||||
|
import com.genersoft.iot.vmp.conf.UserSetup; |
||||
|
import com.genersoft.iot.vmp.gb28181.bean.BaiduPoint; |
||||
|
import com.genersoft.iot.vmp.gb28181.bean.Device; |
||||
|
import com.genersoft.iot.vmp.gb28181.bean.MobilePosition; |
||||
|
import com.genersoft.iot.vmp.gb28181.bean.ParentPlatform; |
||||
|
import com.genersoft.iot.vmp.gb28181.transmit.event.request.SIPRequestProcessorParent; |
||||
|
import com.genersoft.iot.vmp.gb28181.transmit.event.request.impl.message.IMessageHandler; |
||||
|
import com.genersoft.iot.vmp.gb28181.transmit.event.request.impl.message.notify.NotifyMessageHandler; |
||||
|
import com.genersoft.iot.vmp.gb28181.utils.NumericUtil; |
||||
|
import com.genersoft.iot.vmp.storager.IVideoManagerStorager; |
||||
|
import com.genersoft.iot.vmp.utils.GpsUtil; |
||||
|
import org.dom4j.DocumentException; |
||||
|
import org.dom4j.Element; |
||||
|
import org.slf4j.Logger; |
||||
|
import org.slf4j.LoggerFactory; |
||||
|
import org.springframework.beans.factory.InitializingBean; |
||||
|
import org.springframework.beans.factory.annotation.Autowired; |
||||
|
import org.springframework.util.StringUtils; |
||||
|
|
||||
|
import javax.sip.InvalidArgumentException; |
||||
|
import javax.sip.RequestEvent; |
||||
|
import javax.sip.SipException; |
||||
|
import javax.sip.message.Response; |
||||
|
import java.text.ParseException; |
||||
|
|
||||
|
import static com.genersoft.iot.vmp.gb28181.utils.XmlUtil.getText; |
||||
|
|
||||
|
public class MobilePositionMessageHandler extends SIPRequestProcessorParent implements InitializingBean, IMessageHandler { |
||||
|
|
||||
|
private Logger logger = LoggerFactory.getLogger(MobilePositionMessageHandler.class); |
||||
|
private final String cmdType = "MobilePosition"; |
||||
|
|
||||
|
@Autowired |
||||
|
private NotifyMessageHandler notifyMessageHandler; |
||||
|
|
||||
|
@Autowired |
||||
|
private UserSetup userSetup; |
||||
|
|
||||
|
@Autowired |
||||
|
private IVideoManagerStorager storager; |
||||
|
|
||||
|
@Override |
||||
|
public void afterPropertiesSet() throws Exception { |
||||
|
notifyMessageHandler.addHandler(cmdType, this); |
||||
|
} |
||||
|
|
||||
|
@Override |
||||
|
public void handForDevice(RequestEvent evt, Device device, Element rootElement) { |
||||
|
|
||||
|
try { |
||||
|
rootElement = getRootElement(evt, device.getCharset()); |
||||
|
|
||||
|
MobilePosition mobilePosition = new MobilePosition(); |
||||
|
if (!StringUtils.isEmpty(device.getName())) { |
||||
|
mobilePosition.setDeviceName(device.getName()); |
||||
|
} |
||||
|
mobilePosition.setDeviceId(device.getDeviceId()); |
||||
|
mobilePosition.setChannelId(getText(rootElement, "DeviceID")); |
||||
|
mobilePosition.setTime(getText(rootElement, "Time")); |
||||
|
mobilePosition.setLongitude(Double.parseDouble(getText(rootElement, "Longitude"))); |
||||
|
mobilePosition.setLatitude(Double.parseDouble(getText(rootElement, "Latitude"))); |
||||
|
if (NumericUtil.isDouble(getText(rootElement, "Speed"))) { |
||||
|
mobilePosition.setSpeed(Double.parseDouble(getText(rootElement, "Speed"))); |
||||
|
} else { |
||||
|
mobilePosition.setSpeed(0.0); |
||||
|
} |
||||
|
if (NumericUtil.isDouble(getText(rootElement, "Direction"))) { |
||||
|
mobilePosition.setDirection(Double.parseDouble(getText(rootElement, "Direction"))); |
||||
|
} else { |
||||
|
mobilePosition.setDirection(0.0); |
||||
|
} |
||||
|
if (NumericUtil.isDouble(getText(rootElement, "Altitude"))) { |
||||
|
mobilePosition.setAltitude(Double.parseDouble(getText(rootElement, "Altitude"))); |
||||
|
} else { |
||||
|
mobilePosition.setAltitude(0.0); |
||||
|
} |
||||
|
mobilePosition.setReportSource("Mobile Position"); |
||||
|
BaiduPoint bp = new BaiduPoint(); |
||||
|
bp = GpsUtil.Wgs84ToBd09(String.valueOf(mobilePosition.getLongitude()), String.valueOf(mobilePosition.getLatitude())); |
||||
|
logger.info("百度坐标:" + bp.getBdLng() + ", " + bp.getBdLat()); |
||||
|
mobilePosition.setGeodeticSystem("BD-09"); |
||||
|
mobilePosition.setCnLng(bp.getBdLng()); |
||||
|
mobilePosition.setCnLat(bp.getBdLat()); |
||||
|
if (!userSetup.getSavePositionHistory()) { |
||||
|
storager.clearMobilePositionsByDeviceId(device.getDeviceId()); |
||||
|
} |
||||
|
storager.insertMobilePosition(mobilePosition); |
||||
|
//回复 200 OK
|
||||
|
responseAck(evt, Response.OK); |
||||
|
} catch (DocumentException | SipException | InvalidArgumentException | ParseException e) { |
||||
|
e.printStackTrace(); |
||||
|
} |
||||
|
} |
||||
|
|
||||
|
@Override |
||||
|
public void handForPlatform(RequestEvent evt, ParentPlatform parentPlatform, Element element) { |
||||
|
|
||||
|
} |
||||
|
} |
@ -0,0 +1,21 @@ |
|||||
|
package com.genersoft.iot.vmp.gb28181.transmit.event.request.impl.message.query; |
||||
|
|
||||
|
import com.genersoft.iot.vmp.gb28181.transmit.event.request.impl.message.MessageHandlerAbstract; |
||||
|
import com.genersoft.iot.vmp.gb28181.transmit.event.request.impl.message.MessageRequestProcessor; |
||||
|
import org.springframework.beans.factory.InitializingBean; |
||||
|
import org.springframework.beans.factory.annotation.Autowired; |
||||
|
import org.springframework.stereotype.Component; |
||||
|
|
||||
|
@Component |
||||
|
public class QueryMessageHandler extends MessageHandlerAbstract implements InitializingBean { |
||||
|
|
||||
|
private final String messageType = "Query"; |
||||
|
|
||||
|
@Autowired |
||||
|
private MessageRequestProcessor messageRequestProcessor; |
||||
|
|
||||
|
@Override |
||||
|
public void afterPropertiesSet() throws Exception { |
||||
|
messageRequestProcessor.addHandler(messageType, this); |
||||
|
} |
||||
|
} |
@ -0,0 +1,118 @@ |
|||||
|
package com.genersoft.iot.vmp.gb28181.transmit.event.request.impl.message.query.cmd; |
||||
|
|
||||
|
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.GbStream; |
||||
|
import com.genersoft.iot.vmp.gb28181.bean.ParentPlatform; |
||||
|
import com.genersoft.iot.vmp.gb28181.event.EventPublisher; |
||||
|
import com.genersoft.iot.vmp.gb28181.transmit.callback.DeferredResultHolder; |
||||
|
import com.genersoft.iot.vmp.gb28181.transmit.cmd.impl.SIPCommanderFroPlatform; |
||||
|
import com.genersoft.iot.vmp.gb28181.transmit.event.request.SIPRequestProcessorParent; |
||||
|
import com.genersoft.iot.vmp.gb28181.transmit.event.request.impl.message.IMessageHandler; |
||||
|
import com.genersoft.iot.vmp.gb28181.transmit.event.request.impl.message.query.QueryMessageHandler; |
||||
|
import com.genersoft.iot.vmp.storager.IVideoManagerStorager; |
||||
|
import com.genersoft.iot.vmp.vmanager.gb28181.platform.bean.ChannelReduce; |
||||
|
import org.dom4j.Element; |
||||
|
import org.slf4j.Logger; |
||||
|
import org.slf4j.LoggerFactory; |
||||
|
import org.springframework.beans.factory.InitializingBean; |
||||
|
import org.springframework.beans.factory.annotation.Autowired; |
||||
|
|
||||
|
import javax.sip.InvalidArgumentException; |
||||
|
import javax.sip.RequestEvent; |
||||
|
import javax.sip.SipException; |
||||
|
import javax.sip.header.FromHeader; |
||||
|
import javax.sip.message.Response; |
||||
|
import java.text.ParseException; |
||||
|
import java.util.List; |
||||
|
|
||||
|
public class CatalogMessageHandler extends SIPRequestProcessorParent implements InitializingBean, IMessageHandler { |
||||
|
|
||||
|
private Logger logger = LoggerFactory.getLogger(CatalogMessageHandler.class); |
||||
|
private final String cmdType = "Catalog"; |
||||
|
|
||||
|
@Autowired |
||||
|
private QueryMessageHandler queryMessageHandler; |
||||
|
|
||||
|
@Autowired |
||||
|
private IVideoManagerStorager storager; |
||||
|
|
||||
|
@Autowired |
||||
|
private SIPCommanderFroPlatform cmderFroPlatform; |
||||
|
|
||||
|
@Autowired |
||||
|
private SipConfig config; |
||||
|
|
||||
|
@Autowired |
||||
|
private EventPublisher publisher; |
||||
|
|
||||
|
@Override |
||||
|
public void afterPropertiesSet() throws Exception { |
||||
|
queryMessageHandler.addHandler(cmdType, this); |
||||
|
} |
||||
|
|
||||
|
@Override |
||||
|
public void handForDevice(RequestEvent evt, Device device, Element element) { |
||||
|
|
||||
|
} |
||||
|
|
||||
|
@Override |
||||
|
public void handForPlatform(RequestEvent evt, ParentPlatform parentPlatform, Element rootElement) { |
||||
|
|
||||
|
String key = DeferredResultHolder.CALLBACK_CMD_CATALOG + parentPlatform.getServerGBId(); |
||||
|
FromHeader fromHeader = (FromHeader) evt.getRequest().getHeader(FromHeader.NAME); |
||||
|
try { |
||||
|
// 回复200 OK
|
||||
|
responseAck(evt, Response.OK); |
||||
|
Element snElement = rootElement.element("SN"); |
||||
|
String sn = snElement.getText(); |
||||
|
// 准备回复通道信息
|
||||
|
List<ChannelReduce> channelReduces = storager.queryChannelListInParentPlatform(parentPlatform.getServerGBId()); |
||||
|
// 查询关联的直播通道
|
||||
|
List<GbStream> gbStreams = storager.queryGbStreamListInPlatform(parentPlatform.getServerGBId()); |
||||
|
int size = channelReduces.size() + gbStreams.size(); |
||||
|
// 回复级联的通道
|
||||
|
if (channelReduces.size() > 0) { |
||||
|
for (ChannelReduce channelReduce : channelReduces) { |
||||
|
DeviceChannel deviceChannel = storager.queryChannel(channelReduce.getDeviceId(), channelReduce.getChannelId()); |
||||
|
cmderFroPlatform.catalogQuery(deviceChannel, parentPlatform, sn, fromHeader.getTag(), size); |
||||
|
} |
||||
|
} |
||||
|
// 回复直播的通道
|
||||
|
if (gbStreams.size() > 0) { |
||||
|
for (GbStream gbStream : gbStreams) { |
||||
|
DeviceChannel deviceChannel = new DeviceChannel(); |
||||
|
deviceChannel.setChannelId(gbStream.getGbId()); |
||||
|
deviceChannel.setName(gbStream.getName()); |
||||
|
deviceChannel.setLongitude(gbStream.getLongitude()); |
||||
|
deviceChannel.setLatitude(gbStream.getLatitude()); |
||||
|
deviceChannel.setDeviceId(parentPlatform.getDeviceGBId()); |
||||
|
deviceChannel.setManufacture("wvp-pro"); |
||||
|
deviceChannel.setStatus(gbStream.isStatus()?1:0); |
||||
|
// deviceChannel.setParentId(parentPlatform.getDeviceGBId());
|
||||
|
deviceChannel.setRegisterWay(1); |
||||
|
deviceChannel.setCivilCode(config.getDomain()); |
||||
|
deviceChannel.setModel("live"); |
||||
|
deviceChannel.setOwner("wvp-pro"); |
||||
|
deviceChannel.setParental(0); |
||||
|
deviceChannel.setSecrecy("0"); |
||||
|
deviceChannel.setSecrecy("0"); |
||||
|
|
||||
|
cmderFroPlatform.catalogQuery(deviceChannel, parentPlatform, sn, fromHeader.getTag(), size); |
||||
|
} |
||||
|
} |
||||
|
if (size == 0) { |
||||
|
// 回复无通道
|
||||
|
cmderFroPlatform.catalogQuery(null, parentPlatform, sn, fromHeader.getTag(), size); |
||||
|
} |
||||
|
} catch (SipException e) { |
||||
|
e.printStackTrace(); |
||||
|
} catch (InvalidArgumentException e) { |
||||
|
e.printStackTrace(); |
||||
|
} catch (ParseException e) { |
||||
|
e.printStackTrace(); |
||||
|
} |
||||
|
|
||||
|
} |
||||
|
} |
@ -0,0 +1,109 @@ |
|||||
|
package com.genersoft.iot.vmp.gb28181.transmit.event.request.impl.message.query.cmd; |
||||
|
|
||||
|
import com.genersoft.iot.vmp.VManageBootstrap; |
||||
|
import com.genersoft.iot.vmp.gb28181.bean.Device; |
||||
|
import com.genersoft.iot.vmp.gb28181.bean.ParentPlatform; |
||||
|
import com.genersoft.iot.vmp.gb28181.transmit.cmd.impl.SIPCommander; |
||||
|
import com.genersoft.iot.vmp.gb28181.transmit.cmd.impl.SIPCommanderFroPlatform; |
||||
|
import com.genersoft.iot.vmp.gb28181.transmit.event.request.SIPRequestProcessorParent; |
||||
|
import com.genersoft.iot.vmp.gb28181.transmit.event.request.impl.message.IMessageHandler; |
||||
|
import com.genersoft.iot.vmp.gb28181.transmit.event.request.impl.message.query.QueryMessageHandler; |
||||
|
import com.genersoft.iot.vmp.storager.IVideoManagerStorager; |
||||
|
import com.genersoft.iot.vmp.utils.SpringBeanFactory; |
||||
|
import gov.nist.javax.sip.SipStackImpl; |
||||
|
import org.dom4j.Element; |
||||
|
import org.slf4j.Logger; |
||||
|
import org.slf4j.LoggerFactory; |
||||
|
import org.springframework.beans.factory.InitializingBean; |
||||
|
import org.springframework.beans.factory.annotation.Autowired; |
||||
|
import org.springframework.util.StringUtils; |
||||
|
|
||||
|
import javax.sip.ListeningPoint; |
||||
|
import javax.sip.ObjectInUseException; |
||||
|
import javax.sip.RequestEvent; |
||||
|
import javax.sip.SipProvider; |
||||
|
import javax.sip.address.SipURI; |
||||
|
import javax.sip.header.HeaderAddress; |
||||
|
import javax.sip.header.ToHeader; |
||||
|
import java.util.Iterator; |
||||
|
|
||||
|
import static com.genersoft.iot.vmp.gb28181.utils.XmlUtil.getText; |
||||
|
|
||||
|
public class DeviceControlMessageHandler extends SIPRequestProcessorParent implements InitializingBean, IMessageHandler { |
||||
|
|
||||
|
private Logger logger = LoggerFactory.getLogger(DeviceControlMessageHandler.class); |
||||
|
private final String cmdType = "DeviceControl"; |
||||
|
|
||||
|
@Autowired |
||||
|
private QueryMessageHandler queryMessageHandler; |
||||
|
|
||||
|
@Autowired |
||||
|
private IVideoManagerStorager storager; |
||||
|
|
||||
|
@Autowired |
||||
|
private SIPCommander cmder; |
||||
|
|
||||
|
@Autowired |
||||
|
private SIPCommanderFroPlatform cmderFroPlatform; |
||||
|
|
||||
|
@Override |
||||
|
public void afterPropertiesSet() throws Exception { |
||||
|
queryMessageHandler.addHandler(cmdType, this); |
||||
|
} |
||||
|
|
||||
|
@Override |
||||
|
public void handForDevice(RequestEvent evt, Device device, Element element) { |
||||
|
|
||||
|
} |
||||
|
|
||||
|
@Override |
||||
|
public void handForPlatform(RequestEvent evt, ParentPlatform parentPlatform, Element rootElement) { |
||||
|
|
||||
|
// 此处是上级发出的DeviceControl指令
|
||||
|
String targetGBId = ((SipURI) ((HeaderAddress) evt.getRequest().getHeader(ToHeader.NAME)).getAddress().getURI()).getUser(); |
||||
|
String channelId = getText(rootElement, "DeviceID"); |
||||
|
// 远程启动功能
|
||||
|
if (!StringUtils.isEmpty(getText(rootElement, "TeleBoot"))) { |
||||
|
if (parentPlatform.getServerGBId().equals(targetGBId)) { |
||||
|
// 远程启动本平台:需要在重新启动程序后先对SipStack解绑
|
||||
|
logger.info("执行远程启动本平台命令"); |
||||
|
cmderFroPlatform.unregister(parentPlatform, null, null); |
||||
|
|
||||
|
Thread restartThread = new Thread(new Runnable() { |
||||
|
@Override |
||||
|
public void run() { |
||||
|
try { |
||||
|
Thread.sleep(3000); |
||||
|
SipProvider up = (SipProvider) SpringBeanFactory.getBean("udpSipProvider"); |
||||
|
SipStackImpl stack = (SipStackImpl)up.getSipStack(); |
||||
|
stack.stop(); |
||||
|
Iterator listener = stack.getListeningPoints(); |
||||
|
while (listener.hasNext()) { |
||||
|
stack.deleteListeningPoint((ListeningPoint) listener.next()); |
||||
|
} |
||||
|
Iterator providers = stack.getSipProviders(); |
||||
|
while (providers.hasNext()) { |
||||
|
stack.deleteSipProvider((SipProvider) providers.next()); |
||||
|
} |
||||
|
VManageBootstrap.restart(); |
||||
|
} catch (InterruptedException ignored) { |
||||
|
} catch (ObjectInUseException e) { |
||||
|
e.printStackTrace(); |
||||
|
} |
||||
|
} |
||||
|
}); |
||||
|
|
||||
|
restartThread.setDaemon(false); |
||||
|
restartThread.start(); |
||||
|
} else { |
||||
|
// 远程启动指定设备
|
||||
|
} |
||||
|
} |
||||
|
// 云台/前端控制命令
|
||||
|
if (!StringUtils.isEmpty(getText(rootElement,"PTZCmd")) && !parentPlatform.getServerGBId().equals(targetGBId)) { |
||||
|
String cmdString = getText(rootElement,"PTZCmd"); |
||||
|
Device deviceForPlatform = storager.queryVideoDeviceByPlatformIdAndChannelId(parentPlatform.getServerGBId(), channelId); |
||||
|
cmder.fronEndCmd(deviceForPlatform, channelId, cmdString); |
||||
|
} |
||||
|
} |
||||
|
} |
@ -0,0 +1,60 @@ |
|||||
|
package com.genersoft.iot.vmp.gb28181.transmit.event.request.impl.message.query.cmd; |
||||
|
|
||||
|
import com.genersoft.iot.vmp.gb28181.bean.Device; |
||||
|
import com.genersoft.iot.vmp.gb28181.bean.ParentPlatform; |
||||
|
import com.genersoft.iot.vmp.gb28181.transmit.cmd.impl.SIPCommanderFroPlatform; |
||||
|
import com.genersoft.iot.vmp.gb28181.transmit.event.request.SIPRequestProcessorParent; |
||||
|
import com.genersoft.iot.vmp.gb28181.transmit.event.request.impl.message.IMessageHandler; |
||||
|
import com.genersoft.iot.vmp.gb28181.transmit.event.request.impl.message.query.QueryMessageHandler; |
||||
|
import org.dom4j.Element; |
||||
|
import org.slf4j.Logger; |
||||
|
import org.slf4j.LoggerFactory; |
||||
|
import org.springframework.beans.factory.InitializingBean; |
||||
|
import org.springframework.beans.factory.annotation.Autowired; |
||||
|
|
||||
|
import javax.sip.InvalidArgumentException; |
||||
|
import javax.sip.RequestEvent; |
||||
|
import javax.sip.SipException; |
||||
|
import javax.sip.header.FromHeader; |
||||
|
import javax.sip.message.Response; |
||||
|
import java.text.ParseException; |
||||
|
|
||||
|
public class DeviceInfoMessageHandler extends SIPRequestProcessorParent implements InitializingBean, IMessageHandler { |
||||
|
|
||||
|
private Logger logger = LoggerFactory.getLogger(DeviceInfoMessageHandler.class); |
||||
|
private final String cmdType = "DeviceInfo"; |
||||
|
|
||||
|
@Autowired |
||||
|
private QueryMessageHandler queryMessageHandler; |
||||
|
|
||||
|
@Autowired |
||||
|
private SIPCommanderFroPlatform cmderFroPlatform; |
||||
|
|
||||
|
@Override |
||||
|
public void afterPropertiesSet() throws Exception { |
||||
|
queryMessageHandler.addHandler(cmdType, this); |
||||
|
} |
||||
|
|
||||
|
@Override |
||||
|
public void handForDevice(RequestEvent evt, Device device, Element rootElement) { |
||||
|
|
||||
|
} |
||||
|
|
||||
|
@Override |
||||
|
public void handForPlatform(RequestEvent evt, ParentPlatform parentPlatform, Element rootElement) { |
||||
|
logger.info("接收到DeviceInfo查询消息"); |
||||
|
FromHeader fromHeader = (FromHeader) evt.getRequest().getHeader(FromHeader.NAME); |
||||
|
try { |
||||
|
// 回复200 OK
|
||||
|
responseAck(evt, Response.OK); |
||||
|
} catch (SipException e) { |
||||
|
e.printStackTrace(); |
||||
|
} catch (InvalidArgumentException e) { |
||||
|
e.printStackTrace(); |
||||
|
} catch (ParseException e) { |
||||
|
e.printStackTrace(); |
||||
|
} |
||||
|
String sn = rootElement.element("SN").getText(); |
||||
|
cmderFroPlatform.deviceInfoResponse(parentPlatform, sn, fromHeader.getTag()); |
||||
|
} |
||||
|
} |
@ -0,0 +1,73 @@ |
|||||
|
package com.genersoft.iot.vmp.gb28181.transmit.event.request.impl.message.query.cmd; |
||||
|
|
||||
|
import com.genersoft.iot.vmp.conf.SipConfig; |
||||
|
import com.genersoft.iot.vmp.gb28181.bean.Device; |
||||
|
import com.genersoft.iot.vmp.gb28181.bean.ParentPlatform; |
||||
|
import com.genersoft.iot.vmp.gb28181.event.EventPublisher; |
||||
|
import com.genersoft.iot.vmp.gb28181.transmit.cmd.impl.SIPCommanderFroPlatform; |
||||
|
import com.genersoft.iot.vmp.gb28181.transmit.event.request.SIPRequestProcessorParent; |
||||
|
import com.genersoft.iot.vmp.gb28181.transmit.event.request.impl.message.IMessageHandler; |
||||
|
import com.genersoft.iot.vmp.gb28181.transmit.event.request.impl.message.query.QueryMessageHandler; |
||||
|
import com.genersoft.iot.vmp.storager.IVideoManagerStorager; |
||||
|
import org.dom4j.Element; |
||||
|
import org.slf4j.Logger; |
||||
|
import org.slf4j.LoggerFactory; |
||||
|
import org.springframework.beans.factory.InitializingBean; |
||||
|
import org.springframework.beans.factory.annotation.Autowired; |
||||
|
|
||||
|
import javax.sip.InvalidArgumentException; |
||||
|
import javax.sip.RequestEvent; |
||||
|
import javax.sip.SipException; |
||||
|
import javax.sip.header.FromHeader; |
||||
|
import javax.sip.message.Response; |
||||
|
import java.text.ParseException; |
||||
|
|
||||
|
public class DeviceStatusMessageHandler extends SIPRequestProcessorParent implements InitializingBean, IMessageHandler { |
||||
|
|
||||
|
private Logger logger = LoggerFactory.getLogger(DeviceStatusMessageHandler.class); |
||||
|
private final String cmdType = "DeviceStatus"; |
||||
|
|
||||
|
@Autowired |
||||
|
private QueryMessageHandler queryMessageHandler; |
||||
|
|
||||
|
@Autowired |
||||
|
private IVideoManagerStorager storager; |
||||
|
|
||||
|
@Autowired |
||||
|
private SIPCommanderFroPlatform cmderFroPlatform; |
||||
|
|
||||
|
@Autowired |
||||
|
private SipConfig config; |
||||
|
|
||||
|
@Autowired |
||||
|
private EventPublisher publisher; |
||||
|
|
||||
|
@Override |
||||
|
public void afterPropertiesSet() throws Exception { |
||||
|
queryMessageHandler.addHandler(cmdType, this); |
||||
|
} |
||||
|
|
||||
|
@Override |
||||
|
public void handForDevice(RequestEvent evt, Device device, Element element) { |
||||
|
|
||||
|
} |
||||
|
|
||||
|
@Override |
||||
|
public void handForPlatform(RequestEvent evt, ParentPlatform parentPlatform, Element rootElement) { |
||||
|
|
||||
|
logger.info("接收到DeviceStatus查询消息"); |
||||
|
FromHeader fromHeader = (FromHeader) evt.getRequest().getHeader(FromHeader.NAME); |
||||
|
// 回复200 OK
|
||||
|
try { |
||||
|
responseAck(evt, Response.OK); |
||||
|
} catch (SipException e) { |
||||
|
e.printStackTrace(); |
||||
|
} catch (InvalidArgumentException e) { |
||||
|
e.printStackTrace(); |
||||
|
} catch (ParseException e) { |
||||
|
e.printStackTrace(); |
||||
|
} |
||||
|
String sn = rootElement.element("SN").getText(); |
||||
|
cmderFroPlatform.deviceStatusResponse(parentPlatform, sn, fromHeader.getTag()); |
||||
|
} |
||||
|
} |
@ -0,0 +1,21 @@ |
|||||
|
package com.genersoft.iot.vmp.gb28181.transmit.event.request.impl.message.response; |
||||
|
|
||||
|
import com.genersoft.iot.vmp.gb28181.transmit.event.request.impl.message.MessageHandlerAbstract; |
||||
|
import com.genersoft.iot.vmp.gb28181.transmit.event.request.impl.message.MessageRequestProcessor; |
||||
|
import org.springframework.beans.factory.InitializingBean; |
||||
|
import org.springframework.beans.factory.annotation.Autowired; |
||||
|
import org.springframework.stereotype.Component; |
||||
|
|
||||
|
@Component |
||||
|
public class ResponseMessageHandler extends MessageHandlerAbstract implements InitializingBean { |
||||
|
|
||||
|
private final String messageType = "Response"; |
||||
|
|
||||
|
@Autowired |
||||
|
private MessageRequestProcessor messageRequestProcessor; |
||||
|
|
||||
|
@Override |
||||
|
public void afterPropertiesSet() throws Exception { |
||||
|
messageRequestProcessor.addHandler(messageType, this); |
||||
|
} |
||||
|
} |
@ -0,0 +1,58 @@ |
|||||
|
package com.genersoft.iot.vmp.gb28181.transmit.event.request.impl.message.response.cmd; |
||||
|
|
||||
|
import com.alibaba.fastjson.JSONObject; |
||||
|
import com.genersoft.iot.vmp.gb28181.bean.Device; |
||||
|
import com.genersoft.iot.vmp.gb28181.bean.ParentPlatform; |
||||
|
import com.genersoft.iot.vmp.gb28181.transmit.callback.DeferredResultHolder; |
||||
|
import com.genersoft.iot.vmp.gb28181.transmit.callback.RequestMessage; |
||||
|
import com.genersoft.iot.vmp.gb28181.transmit.event.request.SIPRequestProcessorParent; |
||||
|
import com.genersoft.iot.vmp.gb28181.transmit.event.request.impl.message.IMessageHandler; |
||||
|
import com.genersoft.iot.vmp.gb28181.transmit.event.request.impl.message.response.ResponseMessageHandler; |
||||
|
import com.genersoft.iot.vmp.gb28181.utils.XmlUtil; |
||||
|
import org.dom4j.Element; |
||||
|
import org.slf4j.Logger; |
||||
|
import org.slf4j.LoggerFactory; |
||||
|
import org.springframework.beans.factory.InitializingBean; |
||||
|
import org.springframework.beans.factory.annotation.Autowired; |
||||
|
import org.springframework.stereotype.Component; |
||||
|
|
||||
|
import javax.sip.RequestEvent; |
||||
|
|
||||
|
@Component |
||||
|
public class AlarmMessageHandler extends SIPRequestProcessorParent implements InitializingBean, IMessageHandler { |
||||
|
|
||||
|
private Logger logger = LoggerFactory.getLogger(AlarmMessageHandler.class); |
||||
|
private final String cmdType = "Alarm"; |
||||
|
|
||||
|
@Autowired |
||||
|
private ResponseMessageHandler responseMessageHandler; |
||||
|
|
||||
|
@Autowired |
||||
|
private DeferredResultHolder deferredResultHolder; |
||||
|
|
||||
|
@Override |
||||
|
public void afterPropertiesSet() throws Exception { |
||||
|
responseMessageHandler.addHandler(cmdType, this); |
||||
|
} |
||||
|
|
||||
|
@Override |
||||
|
public void handForDevice(RequestEvent evt, Device device, Element rootElement) { |
||||
|
Element deviceIdElement = rootElement.element("DeviceID"); |
||||
|
String channelId = deviceIdElement.getText().toString(); |
||||
|
String key = DeferredResultHolder.CALLBACK_CMD_ALARM + device.getDeviceId() + channelId; |
||||
|
JSONObject json = new JSONObject(); |
||||
|
XmlUtil.node2Json(rootElement, json); |
||||
|
if (logger.isDebugEnabled()) { |
||||
|
logger.debug(json.toJSONString()); |
||||
|
} |
||||
|
RequestMessage msg = new RequestMessage(); |
||||
|
msg.setKey(key); |
||||
|
msg.setData(json); |
||||
|
deferredResultHolder.invokeAllResult(msg); |
||||
|
} |
||||
|
|
||||
|
@Override |
||||
|
public void handForPlatform(RequestEvent evt, ParentPlatform parentPlatform, Element element) { |
||||
|
|
||||
|
} |
||||
|
} |
@ -0,0 +1,72 @@ |
|||||
|
package com.genersoft.iot.vmp.gb28181.transmit.event.request.impl.message.response.cmd; |
||||
|
|
||||
|
import com.alibaba.fastjson.JSONObject; |
||||
|
import com.genersoft.iot.vmp.gb28181.bean.Device; |
||||
|
import com.genersoft.iot.vmp.gb28181.bean.ParentPlatform; |
||||
|
import com.genersoft.iot.vmp.gb28181.transmit.callback.DeferredResultHolder; |
||||
|
import com.genersoft.iot.vmp.gb28181.transmit.callback.RequestMessage; |
||||
|
import com.genersoft.iot.vmp.gb28181.transmit.event.request.SIPRequestProcessorParent; |
||||
|
import com.genersoft.iot.vmp.gb28181.transmit.event.request.impl.message.IMessageHandler; |
||||
|
import com.genersoft.iot.vmp.gb28181.transmit.event.request.impl.message.response.ResponseMessageHandler; |
||||
|
import com.genersoft.iot.vmp.gb28181.utils.XmlUtil; |
||||
|
import org.dom4j.Element; |
||||
|
import org.slf4j.Logger; |
||||
|
import org.slf4j.LoggerFactory; |
||||
|
import org.springframework.beans.factory.InitializingBean; |
||||
|
import org.springframework.beans.factory.annotation.Autowired; |
||||
|
import org.springframework.stereotype.Component; |
||||
|
|
||||
|
import javax.sip.InvalidArgumentException; |
||||
|
import javax.sip.RequestEvent; |
||||
|
import javax.sip.SipException; |
||||
|
import javax.sip.message.Response; |
||||
|
import java.text.ParseException; |
||||
|
|
||||
|
import static com.genersoft.iot.vmp.gb28181.utils.XmlUtil.getText; |
||||
|
|
||||
|
@Component |
||||
|
public class BroadcastMessageHandler extends SIPRequestProcessorParent implements InitializingBean, IMessageHandler { |
||||
|
|
||||
|
private Logger logger = LoggerFactory.getLogger(BroadcastMessageHandler.class); |
||||
|
private final String cmdType = "Broadcast"; |
||||
|
|
||||
|
@Autowired |
||||
|
private ResponseMessageHandler responseMessageHandler; |
||||
|
|
||||
|
@Autowired |
||||
|
private DeferredResultHolder deferredResultHolder; |
||||
|
|
||||
|
@Override |
||||
|
public void afterPropertiesSet() throws Exception { |
||||
|
responseMessageHandler.addHandler(cmdType, this); |
||||
|
} |
||||
|
|
||||
|
@Override |
||||
|
public void handForDevice(RequestEvent evt, Device device, Element rootElement) { |
||||
|
try { |
||||
|
String channelId = getText(rootElement, "DeviceID"); |
||||
|
String key = DeferredResultHolder.CALLBACK_CMD_BROADCAST + device.getDeviceId() + channelId; |
||||
|
// 回复200 OK
|
||||
|
responseAck(evt, Response.OK); |
||||
|
// 此处是对本平台发出Broadcast指令的应答
|
||||
|
JSONObject json = new JSONObject(); |
||||
|
XmlUtil.node2Json(rootElement, json); |
||||
|
if (logger.isDebugEnabled()) { |
||||
|
logger.debug(json.toJSONString()); |
||||
|
} |
||||
|
RequestMessage msg = new RequestMessage(); |
||||
|
msg.setKey(key); |
||||
|
msg.setData(json); |
||||
|
deferredResultHolder.invokeAllResult(msg); |
||||
|
|
||||
|
|
||||
|
} catch (ParseException | SipException | InvalidArgumentException e) { |
||||
|
e.printStackTrace(); |
||||
|
} |
||||
|
} |
||||
|
|
||||
|
@Override |
||||
|
public void handForPlatform(RequestEvent evt, ParentPlatform parentPlatform, Element element) { |
||||
|
|
||||
|
} |
||||
|
} |
@ -0,0 +1,182 @@ |
|||||
|
package com.genersoft.iot.vmp.gb28181.transmit.event.request.impl.message.response.cmd; |
||||
|
|
||||
|
import com.genersoft.iot.vmp.common.VideoManagerConstants; |
||||
|
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.event.DeviceOffLineDetector; |
||||
|
import com.genersoft.iot.vmp.gb28181.event.EventPublisher; |
||||
|
import com.genersoft.iot.vmp.gb28181.transmit.callback.DeferredResultHolder; |
||||
|
import com.genersoft.iot.vmp.gb28181.transmit.callback.RequestMessage; |
||||
|
import com.genersoft.iot.vmp.gb28181.transmit.event.request.SIPRequestProcessorParent; |
||||
|
import com.genersoft.iot.vmp.gb28181.transmit.event.request.impl.message.IMessageHandler; |
||||
|
import com.genersoft.iot.vmp.gb28181.transmit.event.request.impl.message.response.ResponseMessageHandler; |
||||
|
import com.genersoft.iot.vmp.gb28181.utils.NumericUtil; |
||||
|
import com.genersoft.iot.vmp.storager.IVideoManagerStorager; |
||||
|
import org.dom4j.DocumentException; |
||||
|
import org.dom4j.Element; |
||||
|
import org.slf4j.Logger; |
||||
|
import org.slf4j.LoggerFactory; |
||||
|
import org.springframework.beans.factory.InitializingBean; |
||||
|
import org.springframework.beans.factory.annotation.Autowired; |
||||
|
import org.springframework.stereotype.Component; |
||||
|
|
||||
|
import javax.sip.InvalidArgumentException; |
||||
|
import javax.sip.RequestEvent; |
||||
|
import javax.sip.SipException; |
||||
|
import javax.sip.message.Response; |
||||
|
import java.text.ParseException; |
||||
|
import java.util.Iterator; |
||||
|
|
||||
|
import static com.genersoft.iot.vmp.gb28181.utils.XmlUtil.getText; |
||||
|
|
||||
|
@Component |
||||
|
public class CatalogMessageHandler extends SIPRequestProcessorParent implements InitializingBean, IMessageHandler { |
||||
|
|
||||
|
private Logger logger = LoggerFactory.getLogger(CatalogMessageHandler.class); |
||||
|
private final String cmdType = "Catalog"; |
||||
|
|
||||
|
@Autowired |
||||
|
private ResponseMessageHandler responseMessageHandler; |
||||
|
|
||||
|
@Autowired |
||||
|
private IVideoManagerStorager storager; |
||||
|
|
||||
|
@Autowired |
||||
|
private DeferredResultHolder deferredResultHolder; |
||||
|
|
||||
|
@Autowired |
||||
|
private DeviceOffLineDetector offLineDetector; |
||||
|
|
||||
|
@Autowired |
||||
|
private SipConfig config; |
||||
|
|
||||
|
@Autowired |
||||
|
private EventPublisher publisher; |
||||
|
|
||||
|
@Override |
||||
|
public void afterPropertiesSet() throws Exception { |
||||
|
responseMessageHandler.addHandler(cmdType, this); |
||||
|
} |
||||
|
|
||||
|
@Override |
||||
|
public void handForDevice(RequestEvent evt, Device device, Element element) { |
||||
|
String key = DeferredResultHolder.CALLBACK_CMD_CATALOG + device.getDeviceId(); |
||||
|
Element rootElement = null; |
||||
|
try { |
||||
|
rootElement = getRootElement(evt, device.getCharset()); |
||||
|
Element deviceListElement = rootElement.element("DeviceList"); |
||||
|
Iterator<Element> deviceListIterator = deviceListElement.elementIterator(); |
||||
|
if (deviceListIterator != null) { |
||||
|
|
||||
|
// 遍历DeviceList
|
||||
|
while (deviceListIterator.hasNext()) { |
||||
|
Element itemDevice = deviceListIterator.next(); |
||||
|
Element channelDeviceElement = itemDevice.element("DeviceID"); |
||||
|
if (channelDeviceElement == null) { |
||||
|
continue; |
||||
|
} |
||||
|
String channelDeviceId = channelDeviceElement.getText(); |
||||
|
Element channdelNameElement = itemDevice.element("Name"); |
||||
|
String channelName = channdelNameElement != null ? channdelNameElement.getTextTrim().toString() : ""; |
||||
|
Element statusElement = itemDevice.element("Status"); |
||||
|
String status = statusElement != null ? statusElement.getText().toString() : "ON"; |
||||
|
DeviceChannel deviceChannel = new DeviceChannel(); |
||||
|
deviceChannel.setName(channelName); |
||||
|
deviceChannel.setChannelId(channelDeviceId); |
||||
|
// ONLINE OFFLINE HIKVISION DS-7716N-E4 NVR的兼容性处理
|
||||
|
if (status.equals("ON") || status.equals("On") || status.equals("ONLINE")) { |
||||
|
deviceChannel.setStatus(1); |
||||
|
} |
||||
|
if (status.equals("OFF") || status.equals("Off") || status.equals("OFFLINE")) { |
||||
|
deviceChannel.setStatus(0); |
||||
|
} |
||||
|
|
||||
|
deviceChannel.setManufacture(getText(itemDevice, "Manufacturer")); |
||||
|
deviceChannel.setModel(getText(itemDevice, "Model")); |
||||
|
deviceChannel.setOwner(getText(itemDevice, "Owner")); |
||||
|
deviceChannel.setCivilCode(getText(itemDevice, "CivilCode")); |
||||
|
deviceChannel.setBlock(getText(itemDevice, "Block")); |
||||
|
deviceChannel.setAddress(getText(itemDevice, "Address")); |
||||
|
if (getText(itemDevice, "Parental") == null || getText(itemDevice, "Parental") == "") { |
||||
|
deviceChannel.setParental(0); |
||||
|
} else { |
||||
|
deviceChannel.setParental(Integer.parseInt(getText(itemDevice, "Parental"))); |
||||
|
} |
||||
|
deviceChannel.setParentId(getText(itemDevice, "ParentID")); |
||||
|
if (getText(itemDevice, "SafetyWay") == null || getText(itemDevice, "SafetyWay") == "") { |
||||
|
deviceChannel.setSafetyWay(0); |
||||
|
} else { |
||||
|
deviceChannel.setSafetyWay(Integer.parseInt(getText(itemDevice, "SafetyWay"))); |
||||
|
} |
||||
|
if (getText(itemDevice, "RegisterWay") == null || getText(itemDevice, "RegisterWay") == "") { |
||||
|
deviceChannel.setRegisterWay(1); |
||||
|
} else { |
||||
|
deviceChannel.setRegisterWay(Integer.parseInt(getText(itemDevice, "RegisterWay"))); |
||||
|
} |
||||
|
deviceChannel.setCertNum(getText(itemDevice, "CertNum")); |
||||
|
if (getText(itemDevice, "Certifiable") == null || getText(itemDevice, "Certifiable") == "") { |
||||
|
deviceChannel.setCertifiable(0); |
||||
|
} else { |
||||
|
deviceChannel.setCertifiable(Integer.parseInt(getText(itemDevice, "Certifiable"))); |
||||
|
} |
||||
|
if (getText(itemDevice, "ErrCode") == null || getText(itemDevice, "ErrCode") == "") { |
||||
|
deviceChannel.setErrCode(0); |
||||
|
} else { |
||||
|
deviceChannel.setErrCode(Integer.parseInt(getText(itemDevice, "ErrCode"))); |
||||
|
} |
||||
|
deviceChannel.setEndTime(getText(itemDevice, "EndTime")); |
||||
|
deviceChannel.setSecrecy(getText(itemDevice, "Secrecy")); |
||||
|
deviceChannel.setIpAddress(getText(itemDevice, "IPAddress")); |
||||
|
if (getText(itemDevice, "Port") == null || getText(itemDevice, "Port") == "") { |
||||
|
deviceChannel.setPort(0); |
||||
|
} else { |
||||
|
deviceChannel.setPort(Integer.parseInt(getText(itemDevice, "Port"))); |
||||
|
} |
||||
|
deviceChannel.setPassword(getText(itemDevice, "Password")); |
||||
|
if (NumericUtil.isDouble(getText(itemDevice, "Longitude"))) { |
||||
|
deviceChannel.setLongitude(Double.parseDouble(getText(itemDevice, "Longitude"))); |
||||
|
} else { |
||||
|
deviceChannel.setLongitude(0.00); |
||||
|
} |
||||
|
if (NumericUtil.isDouble(getText(itemDevice, "Latitude"))) { |
||||
|
deviceChannel.setLatitude(Double.parseDouble(getText(itemDevice, "Latitude"))); |
||||
|
} else { |
||||
|
deviceChannel.setLatitude(0.00); |
||||
|
} |
||||
|
if (getText(itemDevice, "PTZType") == null || getText(itemDevice, "PTZType") == "") { |
||||
|
deviceChannel.setPTZType(0); |
||||
|
} else { |
||||
|
deviceChannel.setPTZType(Integer.parseInt(getText(itemDevice, "PTZType"))); |
||||
|
} |
||||
|
deviceChannel.setHasAudio(true); // 默认含有音频,播放时再检查是否有音频及是否AAC
|
||||
|
storager.updateChannel(device.getDeviceId(), deviceChannel); |
||||
|
} |
||||
|
|
||||
|
RequestMessage msg = new RequestMessage(); |
||||
|
msg.setKey(key); |
||||
|
msg.setData(device); |
||||
|
deferredResultHolder.invokeAllResult(msg); |
||||
|
// 回复200 OK
|
||||
|
responseAck(evt, Response.OK); |
||||
|
if (offLineDetector.isOnline(device.getDeviceId())) { |
||||
|
publisher.onlineEventPublish(device, VideoManagerConstants.EVENT_ONLINE_MESSAGE); |
||||
|
} |
||||
|
} |
||||
|
} catch (DocumentException e) { |
||||
|
e.printStackTrace(); |
||||
|
} catch (InvalidArgumentException e) { |
||||
|
e.printStackTrace(); |
||||
|
} catch (ParseException e) { |
||||
|
e.printStackTrace(); |
||||
|
} catch (SipException e) { |
||||
|
e.printStackTrace(); |
||||
|
} |
||||
|
} |
||||
|
|
||||
|
@Override |
||||
|
public void handForPlatform(RequestEvent evt, ParentPlatform parentPlatform, Element rootElement) { |
||||
|
|
||||
|
} |
||||
|
} |
@ -0,0 +1,81 @@ |
|||||
|
package com.genersoft.iot.vmp.gb28181.transmit.event.request.impl.message.response.cmd; |
||||
|
|
||||
|
import com.alibaba.fastjson.JSONObject; |
||||
|
import com.genersoft.iot.vmp.gb28181.bean.Device; |
||||
|
import com.genersoft.iot.vmp.gb28181.bean.ParentPlatform; |
||||
|
import com.genersoft.iot.vmp.gb28181.event.EventPublisher; |
||||
|
import com.genersoft.iot.vmp.gb28181.transmit.callback.DeferredResultHolder; |
||||
|
import com.genersoft.iot.vmp.gb28181.transmit.callback.RequestMessage; |
||||
|
import com.genersoft.iot.vmp.gb28181.transmit.event.request.SIPRequestProcessorParent; |
||||
|
import com.genersoft.iot.vmp.gb28181.transmit.event.request.impl.message.IMessageHandler; |
||||
|
import com.genersoft.iot.vmp.gb28181.transmit.event.request.impl.message.response.ResponseMessageHandler; |
||||
|
import com.genersoft.iot.vmp.gb28181.utils.XmlUtil; |
||||
|
import org.dom4j.Element; |
||||
|
import org.slf4j.Logger; |
||||
|
import org.slf4j.LoggerFactory; |
||||
|
import org.springframework.beans.factory.InitializingBean; |
||||
|
import org.springframework.beans.factory.annotation.Autowired; |
||||
|
import org.springframework.stereotype.Component; |
||||
|
|
||||
|
import javax.sip.InvalidArgumentException; |
||||
|
import javax.sip.RequestEvent; |
||||
|
import javax.sip.SipException; |
||||
|
import javax.sip.message.Response; |
||||
|
import java.text.ParseException; |
||||
|
|
||||
|
import static com.genersoft.iot.vmp.gb28181.utils.XmlUtil.getText; |
||||
|
|
||||
|
@Component |
||||
|
public class ConfigDownloadMessageHandler extends SIPRequestProcessorParent implements InitializingBean, IMessageHandler { |
||||
|
|
||||
|
private Logger logger = LoggerFactory.getLogger(ConfigDownloadMessageHandler.class); |
||||
|
private final String cmdType = "ConfigDownload"; |
||||
|
|
||||
|
@Autowired |
||||
|
private ResponseMessageHandler responseMessageHandler; |
||||
|
|
||||
|
@Autowired |
||||
|
private EventPublisher publisher; |
||||
|
|
||||
|
@Autowired |
||||
|
private DeferredResultHolder deferredResultHolder; |
||||
|
|
||||
|
@Override |
||||
|
public void afterPropertiesSet() throws Exception { |
||||
|
responseMessageHandler.addHandler(cmdType, this); |
||||
|
} |
||||
|
|
||||
|
|
||||
|
@Override |
||||
|
public void handForDevice(RequestEvent evt, Device device, Element element) { |
||||
|
String channelId = getText(element, "DeviceID"); |
||||
|
String key = DeferredResultHolder.CALLBACK_CMD_CONFIGDOWNLOAD + device.getDeviceId() + channelId; |
||||
|
try { |
||||
|
// 回复200 OK
|
||||
|
responseAck(evt, Response.OK); |
||||
|
// 此处是对本平台发出DeviceControl指令的应答
|
||||
|
JSONObject json = new JSONObject(); |
||||
|
XmlUtil.node2Json(element, json); |
||||
|
if (logger.isDebugEnabled()) { |
||||
|
logger.debug(json.toJSONString()); |
||||
|
} |
||||
|
RequestMessage msg = new RequestMessage(); |
||||
|
msg.setKey(key); |
||||
|
msg.setData(json); |
||||
|
deferredResultHolder.invokeAllResult(msg); |
||||
|
} catch (SipException e) { |
||||
|
e.printStackTrace(); |
||||
|
} catch (InvalidArgumentException e) { |
||||
|
e.printStackTrace(); |
||||
|
} catch (ParseException e) { |
||||
|
e.printStackTrace(); |
||||
|
} |
||||
|
|
||||
|
} |
||||
|
|
||||
|
@Override |
||||
|
public void handForPlatform(RequestEvent evt, ParentPlatform parentPlatform, Element element) { |
||||
|
// 不会收到上级平台的心跳信息
|
||||
|
|
||||
|
} |
||||
|
} |
@ -0,0 +1,58 @@ |
|||||
|
package com.genersoft.iot.vmp.gb28181.transmit.event.request.impl.message.response.cmd; |
||||
|
|
||||
|
import com.alibaba.fastjson.JSONObject; |
||||
|
import com.genersoft.iot.vmp.gb28181.bean.Device; |
||||
|
import com.genersoft.iot.vmp.gb28181.bean.ParentPlatform; |
||||
|
import com.genersoft.iot.vmp.gb28181.transmit.callback.DeferredResultHolder; |
||||
|
import com.genersoft.iot.vmp.gb28181.transmit.callback.RequestMessage; |
||||
|
import com.genersoft.iot.vmp.gb28181.transmit.event.request.SIPRequestProcessorParent; |
||||
|
import com.genersoft.iot.vmp.gb28181.transmit.event.request.impl.message.IMessageHandler; |
||||
|
import com.genersoft.iot.vmp.gb28181.transmit.event.request.impl.message.response.ResponseMessageHandler; |
||||
|
import com.genersoft.iot.vmp.gb28181.utils.XmlUtil; |
||||
|
import org.dom4j.Element; |
||||
|
import org.slf4j.Logger; |
||||
|
import org.slf4j.LoggerFactory; |
||||
|
import org.springframework.beans.factory.InitializingBean; |
||||
|
import org.springframework.beans.factory.annotation.Autowired; |
||||
|
import org.springframework.stereotype.Component; |
||||
|
|
||||
|
import javax.sip.RequestEvent; |
||||
|
|
||||
|
import static com.genersoft.iot.vmp.gb28181.utils.XmlUtil.getText; |
||||
|
|
||||
|
@Component |
||||
|
public class DeviceConfigMessageHandler extends SIPRequestProcessorParent implements InitializingBean, IMessageHandler { |
||||
|
|
||||
|
private Logger logger = LoggerFactory.getLogger(DeviceConfigMessageHandler.class); |
||||
|
private final String cmdType = "DeviceConfig"; |
||||
|
|
||||
|
@Autowired |
||||
|
private ResponseMessageHandler responseMessageHandler; |
||||
|
|
||||
|
@Autowired |
||||
|
private DeferredResultHolder deferredResultHolder; |
||||
|
|
||||
|
@Override |
||||
|
public void afterPropertiesSet() throws Exception { |
||||
|
responseMessageHandler.addHandler(cmdType, this); |
||||
|
} |
||||
|
|
||||
|
@Override |
||||
|
public void handForDevice(RequestEvent evt, Device device, Element element) { |
||||
|
JSONObject json = new JSONObject(); |
||||
|
XmlUtil.node2Json(element, json); |
||||
|
String channelId = getText(element, "DeviceID"); |
||||
|
if (logger.isDebugEnabled()) { |
||||
|
logger.debug(json.toJSONString()); |
||||
|
} |
||||
|
String key = DeferredResultHolder.CALLBACK_CMD_DEVICECONFIG + device.getDeviceId() + channelId; |
||||
|
RequestMessage msg = new RequestMessage(); |
||||
|
msg.setKey(key); |
||||
|
msg.setData(json); |
||||
|
deferredResultHolder.invokeAllResult(msg); |
||||
|
} |
||||
|
|
||||
|
@Override |
||||
|
public void handForPlatform(RequestEvent evt, ParentPlatform parentPlatform, Element rootElement) { |
||||
|
} |
||||
|
} |
@ -0,0 +1,59 @@ |
|||||
|
package com.genersoft.iot.vmp.gb28181.transmit.event.request.impl.message.response.cmd; |
||||
|
|
||||
|
import com.alibaba.fastjson.JSONObject; |
||||
|
import com.genersoft.iot.vmp.gb28181.bean.Device; |
||||
|
import com.genersoft.iot.vmp.gb28181.bean.ParentPlatform; |
||||
|
import com.genersoft.iot.vmp.gb28181.transmit.callback.DeferredResultHolder; |
||||
|
import com.genersoft.iot.vmp.gb28181.transmit.callback.RequestMessage; |
||||
|
import com.genersoft.iot.vmp.gb28181.transmit.event.request.SIPRequestProcessorParent; |
||||
|
import com.genersoft.iot.vmp.gb28181.transmit.event.request.impl.message.IMessageHandler; |
||||
|
import com.genersoft.iot.vmp.gb28181.transmit.event.request.impl.message.response.ResponseMessageHandler; |
||||
|
import com.genersoft.iot.vmp.gb28181.utils.XmlUtil; |
||||
|
import org.dom4j.Element; |
||||
|
import org.slf4j.Logger; |
||||
|
import org.slf4j.LoggerFactory; |
||||
|
import org.springframework.beans.factory.InitializingBean; |
||||
|
import org.springframework.beans.factory.annotation.Autowired; |
||||
|
import org.springframework.stereotype.Component; |
||||
|
|
||||
|
import javax.sip.RequestEvent; |
||||
|
|
||||
|
import static com.genersoft.iot.vmp.gb28181.utils.XmlUtil.getText; |
||||
|
|
||||
|
@Component |
||||
|
public class DeviceControlMessageHandler extends SIPRequestProcessorParent implements InitializingBean, IMessageHandler { |
||||
|
|
||||
|
private Logger logger = LoggerFactory.getLogger(DeviceControlMessageHandler.class); |
||||
|
private final String cmdType = "DeviceControl"; |
||||
|
|
||||
|
@Autowired |
||||
|
private ResponseMessageHandler responseMessageHandler; |
||||
|
|
||||
|
@Autowired |
||||
|
private DeferredResultHolder deferredResultHolder; |
||||
|
|
||||
|
@Override |
||||
|
public void afterPropertiesSet() throws Exception { |
||||
|
responseMessageHandler.addHandler(cmdType, this); |
||||
|
} |
||||
|
|
||||
|
@Override |
||||
|
public void handForDevice(RequestEvent evt, Device device, Element element) { |
||||
|
// 此处是对本平台发出DeviceControl指令的应答
|
||||
|
JSONObject json = new JSONObject(); |
||||
|
String channelId = getText(element, "DeviceID"); |
||||
|
XmlUtil.node2Json(element, json); |
||||
|
if (logger.isDebugEnabled()) { |
||||
|
logger.debug(json.toJSONString()); |
||||
|
} |
||||
|
RequestMessage msg = new RequestMessage(); |
||||
|
String key = DeferredResultHolder.CALLBACK_CMD_DEVICECONTROL + device.getDeviceId() + channelId; |
||||
|
msg.setKey(key); |
||||
|
msg.setData(json); |
||||
|
deferredResultHolder.invokeAllResult(msg); |
||||
|
} |
||||
|
|
||||
|
@Override |
||||
|
public void handForPlatform(RequestEvent evt, ParentPlatform parentPlatform, Element rootElement) { |
||||
|
} |
||||
|
} |
@ -0,0 +1,103 @@ |
|||||
|
package com.genersoft.iot.vmp.gb28181.transmit.event.request.impl.message.response.cmd; |
||||
|
|
||||
|
import com.genersoft.iot.vmp.common.VideoManagerConstants; |
||||
|
import com.genersoft.iot.vmp.conf.SipConfig; |
||||
|
import com.genersoft.iot.vmp.gb28181.bean.Device; |
||||
|
import com.genersoft.iot.vmp.gb28181.bean.ParentPlatform; |
||||
|
import com.genersoft.iot.vmp.gb28181.event.DeviceOffLineDetector; |
||||
|
import com.genersoft.iot.vmp.gb28181.event.EventPublisher; |
||||
|
import com.genersoft.iot.vmp.gb28181.transmit.callback.DeferredResultHolder; |
||||
|
import com.genersoft.iot.vmp.gb28181.transmit.callback.RequestMessage; |
||||
|
import com.genersoft.iot.vmp.gb28181.transmit.event.request.SIPRequestProcessorParent; |
||||
|
import com.genersoft.iot.vmp.gb28181.transmit.event.request.impl.message.IMessageHandler; |
||||
|
import com.genersoft.iot.vmp.gb28181.transmit.event.request.impl.message.response.ResponseMessageHandler; |
||||
|
import com.genersoft.iot.vmp.storager.IVideoManagerStorager; |
||||
|
import org.dom4j.DocumentException; |
||||
|
import org.dom4j.Element; |
||||
|
import org.slf4j.Logger; |
||||
|
import org.slf4j.LoggerFactory; |
||||
|
import org.springframework.beans.factory.InitializingBean; |
||||
|
import org.springframework.beans.factory.annotation.Autowired; |
||||
|
import org.springframework.stereotype.Component; |
||||
|
import org.springframework.util.StringUtils; |
||||
|
|
||||
|
import javax.sip.InvalidArgumentException; |
||||
|
import javax.sip.RequestEvent; |
||||
|
import javax.sip.SipException; |
||||
|
import javax.sip.message.Response; |
||||
|
import java.text.ParseException; |
||||
|
|
||||
|
import static com.genersoft.iot.vmp.gb28181.utils.XmlUtil.getText; |
||||
|
|
||||
|
@Component |
||||
|
public class DeviceInfoMessageHandler extends SIPRequestProcessorParent implements InitializingBean, IMessageHandler { |
||||
|
|
||||
|
private Logger logger = LoggerFactory.getLogger(DeviceInfoMessageHandler.class); |
||||
|
private final String cmdType = "DeviceInfo"; |
||||
|
|
||||
|
@Autowired |
||||
|
private ResponseMessageHandler responseMessageHandler; |
||||
|
|
||||
|
@Autowired |
||||
|
private IVideoManagerStorager storager; |
||||
|
|
||||
|
@Autowired |
||||
|
private DeferredResultHolder deferredResultHolder; |
||||
|
|
||||
|
@Autowired |
||||
|
private DeviceOffLineDetector offLineDetector; |
||||
|
|
||||
|
@Autowired |
||||
|
private SipConfig config; |
||||
|
|
||||
|
@Autowired |
||||
|
private EventPublisher publisher; |
||||
|
|
||||
|
@Override |
||||
|
public void afterPropertiesSet() throws Exception { |
||||
|
responseMessageHandler.addHandler(cmdType, this); |
||||
|
} |
||||
|
|
||||
|
@Override |
||||
|
public void handForDevice(RequestEvent evt, Device device, Element rootElement) { |
||||
|
logger.debug("接收到DeviceInfo应答消息"); |
||||
|
try { |
||||
|
rootElement = getRootElement(evt, device.getCharset()); |
||||
|
Element deviceIdElement = rootElement.element("DeviceID"); |
||||
|
String channelId = deviceIdElement.getTextTrim(); |
||||
|
String key = DeferredResultHolder.CALLBACK_CMD_DEVICEINFO + device.getDeviceId() + channelId; |
||||
|
device.setName(getText(rootElement, "DeviceName")); |
||||
|
|
||||
|
device.setManufacturer(getText(rootElement, "Manufacturer")); |
||||
|
device.setModel(getText(rootElement, "Model")); |
||||
|
device.setFirmware(getText(rootElement, "Firmware")); |
||||
|
if (StringUtils.isEmpty(device.getStreamMode())) { |
||||
|
device.setStreamMode("UDP"); |
||||
|
} |
||||
|
storager.updateDevice(device); |
||||
|
|
||||
|
RequestMessage msg = new RequestMessage(); |
||||
|
msg.setKey(key); |
||||
|
msg.setData(device); |
||||
|
deferredResultHolder.invokeAllResult(msg); |
||||
|
// 回复200 OK
|
||||
|
responseAck(evt, Response.OK); |
||||
|
if (offLineDetector.isOnline(device.getDeviceId())) { |
||||
|
publisher.onlineEventPublish(device, VideoManagerConstants.EVENT_ONLINE_MESSAGE); |
||||
|
} |
||||
|
} catch (DocumentException e) { |
||||
|
e.printStackTrace(); |
||||
|
} catch (InvalidArgumentException e) { |
||||
|
e.printStackTrace(); |
||||
|
} catch (ParseException e) { |
||||
|
e.printStackTrace(); |
||||
|
} catch (SipException e) { |
||||
|
e.printStackTrace(); |
||||
|
} |
||||
|
} |
||||
|
|
||||
|
@Override |
||||
|
public void handForPlatform(RequestEvent evt, ParentPlatform parentPlatform, Element rootElement) { |
||||
|
|
||||
|
} |
||||
|
} |
@ -0,0 +1,89 @@ |
|||||
|
package com.genersoft.iot.vmp.gb28181.transmit.event.request.impl.message.response.cmd; |
||||
|
|
||||
|
import com.alibaba.fastjson.JSONObject; |
||||
|
import com.genersoft.iot.vmp.common.VideoManagerConstants; |
||||
|
import com.genersoft.iot.vmp.gb28181.bean.Device; |
||||
|
import com.genersoft.iot.vmp.gb28181.bean.ParentPlatform; |
||||
|
import com.genersoft.iot.vmp.gb28181.event.DeviceOffLineDetector; |
||||
|
import com.genersoft.iot.vmp.gb28181.event.EventPublisher; |
||||
|
import com.genersoft.iot.vmp.gb28181.transmit.callback.DeferredResultHolder; |
||||
|
import com.genersoft.iot.vmp.gb28181.transmit.callback.RequestMessage; |
||||
|
import com.genersoft.iot.vmp.gb28181.transmit.event.request.SIPRequestProcessorParent; |
||||
|
import com.genersoft.iot.vmp.gb28181.transmit.event.request.impl.message.IMessageHandler; |
||||
|
import com.genersoft.iot.vmp.gb28181.transmit.event.request.impl.message.response.ResponseMessageHandler; |
||||
|
import com.genersoft.iot.vmp.gb28181.utils.XmlUtil; |
||||
|
import org.dom4j.Element; |
||||
|
import org.slf4j.Logger; |
||||
|
import org.slf4j.LoggerFactory; |
||||
|
import org.springframework.beans.factory.InitializingBean; |
||||
|
import org.springframework.beans.factory.annotation.Autowired; |
||||
|
import org.springframework.stereotype.Component; |
||||
|
|
||||
|
import javax.sip.InvalidArgumentException; |
||||
|
import javax.sip.RequestEvent; |
||||
|
import javax.sip.SipException; |
||||
|
import javax.sip.message.Response; |
||||
|
import java.text.ParseException; |
||||
|
|
||||
|
@Component |
||||
|
public class DeviceStatusMessageHandler extends SIPRequestProcessorParent implements InitializingBean, IMessageHandler { |
||||
|
|
||||
|
private Logger logger = LoggerFactory.getLogger(DeviceStatusMessageHandler.class); |
||||
|
private final String cmdType = "DeviceStatus"; |
||||
|
|
||||
|
@Autowired |
||||
|
private ResponseMessageHandler responseMessageHandler; |
||||
|
|
||||
|
@Autowired |
||||
|
private DeviceOffLineDetector offLineDetector; |
||||
|
|
||||
|
@Autowired |
||||
|
private DeferredResultHolder deferredResultHolder; |
||||
|
|
||||
|
@Autowired |
||||
|
private EventPublisher publisher; |
||||
|
|
||||
|
@Override |
||||
|
public void afterPropertiesSet() throws Exception { |
||||
|
responseMessageHandler.addHandler(cmdType, this); |
||||
|
} |
||||
|
|
||||
|
@Override |
||||
|
public void handForDevice(RequestEvent evt, Device device, Element element) { |
||||
|
logger.info("接收到DeviceStatus应答消息"); |
||||
|
// 检查设备是否存在, 不存在则不回复
|
||||
|
// 回复200 OK
|
||||
|
try { |
||||
|
responseAck(evt, Response.OK); |
||||
|
} catch (SipException e) { |
||||
|
e.printStackTrace(); |
||||
|
} catch (InvalidArgumentException e) { |
||||
|
e.printStackTrace(); |
||||
|
} catch (ParseException e) { |
||||
|
e.printStackTrace(); |
||||
|
} |
||||
|
Element deviceIdElement = element.element("DeviceID"); |
||||
|
String channelId = deviceIdElement.getText(); |
||||
|
JSONObject json = new JSONObject(); |
||||
|
XmlUtil.node2Json(element, json); |
||||
|
if (logger.isDebugEnabled()) { |
||||
|
logger.debug(json.toJSONString()); |
||||
|
} |
||||
|
RequestMessage msg = new RequestMessage(); |
||||
|
msg.setKey(DeferredResultHolder.CALLBACK_CMD_DEVICESTATUS + device.getDeviceId() + channelId); |
||||
|
msg.setData(json); |
||||
|
deferredResultHolder.invokeAllResult(msg); |
||||
|
|
||||
|
if (offLineDetector.isOnline(device.getDeviceId())) { |
||||
|
publisher.onlineEventPublish(device, VideoManagerConstants.EVENT_ONLINE_MESSAGE); |
||||
|
} else { |
||||
|
|
||||
|
} |
||||
|
} |
||||
|
|
||||
|
@Override |
||||
|
public void handForPlatform(RequestEvent evt, ParentPlatform parentPlatform, Element rootElement) { |
||||
|
|
||||
|
|
||||
|
} |
||||
|
} |
@ -0,0 +1,103 @@ |
|||||
|
package com.genersoft.iot.vmp.gb28181.transmit.event.request.impl.message.response.cmd; |
||||
|
|
||||
|
import com.genersoft.iot.vmp.conf.UserSetup; |
||||
|
import com.genersoft.iot.vmp.gb28181.bean.BaiduPoint; |
||||
|
import com.genersoft.iot.vmp.gb28181.bean.Device; |
||||
|
import com.genersoft.iot.vmp.gb28181.bean.MobilePosition; |
||||
|
import com.genersoft.iot.vmp.gb28181.bean.ParentPlatform; |
||||
|
import com.genersoft.iot.vmp.gb28181.transmit.event.request.SIPRequestProcessorParent; |
||||
|
import com.genersoft.iot.vmp.gb28181.transmit.event.request.impl.message.IMessageHandler; |
||||
|
import com.genersoft.iot.vmp.gb28181.transmit.event.request.impl.message.response.ResponseMessageHandler; |
||||
|
import com.genersoft.iot.vmp.gb28181.utils.NumericUtil; |
||||
|
import com.genersoft.iot.vmp.storager.IVideoManagerStorager; |
||||
|
import com.genersoft.iot.vmp.utils.GpsUtil; |
||||
|
import org.dom4j.DocumentException; |
||||
|
import org.dom4j.Element; |
||||
|
import org.slf4j.Logger; |
||||
|
import org.slf4j.LoggerFactory; |
||||
|
import org.springframework.beans.factory.InitializingBean; |
||||
|
import org.springframework.beans.factory.annotation.Autowired; |
||||
|
import org.springframework.stereotype.Component; |
||||
|
import org.springframework.util.StringUtils; |
||||
|
|
||||
|
import javax.sip.InvalidArgumentException; |
||||
|
import javax.sip.RequestEvent; |
||||
|
import javax.sip.SipException; |
||||
|
import javax.sip.message.Response; |
||||
|
import java.text.ParseException; |
||||
|
|
||||
|
import static com.genersoft.iot.vmp.gb28181.utils.XmlUtil.getText; |
||||
|
|
||||
|
@Component |
||||
|
public class MobilePositionMessageHandler extends SIPRequestProcessorParent implements InitializingBean, IMessageHandler { |
||||
|
|
||||
|
private Logger logger = LoggerFactory.getLogger(MobilePositionMessageHandler.class); |
||||
|
private final String cmdType = "MobilePosition"; |
||||
|
|
||||
|
@Autowired |
||||
|
private ResponseMessageHandler responseMessageHandler; |
||||
|
|
||||
|
@Autowired |
||||
|
private UserSetup userSetup; |
||||
|
|
||||
|
@Autowired |
||||
|
private IVideoManagerStorager storager; |
||||
|
|
||||
|
@Override |
||||
|
public void afterPropertiesSet() throws Exception { |
||||
|
responseMessageHandler.addHandler(cmdType, this); |
||||
|
} |
||||
|
|
||||
|
@Override |
||||
|
public void handForDevice(RequestEvent evt, Device device, Element rootElement) { |
||||
|
|
||||
|
try { |
||||
|
rootElement = getRootElement(evt, device.getCharset()); |
||||
|
|
||||
|
MobilePosition mobilePosition = new MobilePosition(); |
||||
|
if (!StringUtils.isEmpty(device.getName())) { |
||||
|
mobilePosition.setDeviceName(device.getName()); |
||||
|
} |
||||
|
mobilePosition.setDeviceId(device.getDeviceId()); |
||||
|
mobilePosition.setChannelId(getText(rootElement, "DeviceID")); |
||||
|
mobilePosition.setTime(getText(rootElement, "Time")); |
||||
|
mobilePosition.setLongitude(Double.parseDouble(getText(rootElement, "Longitude"))); |
||||
|
mobilePosition.setLatitude(Double.parseDouble(getText(rootElement, "Latitude"))); |
||||
|
if (NumericUtil.isDouble(getText(rootElement, "Speed"))) { |
||||
|
mobilePosition.setSpeed(Double.parseDouble(getText(rootElement, "Speed"))); |
||||
|
} else { |
||||
|
mobilePosition.setSpeed(0.0); |
||||
|
} |
||||
|
if (NumericUtil.isDouble(getText(rootElement, "Direction"))) { |
||||
|
mobilePosition.setDirection(Double.parseDouble(getText(rootElement, "Direction"))); |
||||
|
} else { |
||||
|
mobilePosition.setDirection(0.0); |
||||
|
} |
||||
|
if (NumericUtil.isDouble(getText(rootElement, "Altitude"))) { |
||||
|
mobilePosition.setAltitude(Double.parseDouble(getText(rootElement, "Altitude"))); |
||||
|
} else { |
||||
|
mobilePosition.setAltitude(0.0); |
||||
|
} |
||||
|
mobilePosition.setReportSource("Mobile Position"); |
||||
|
BaiduPoint bp = new BaiduPoint(); |
||||
|
bp = GpsUtil.Wgs84ToBd09(String.valueOf(mobilePosition.getLongitude()), String.valueOf(mobilePosition.getLatitude())); |
||||
|
logger.info("百度坐标:" + bp.getBdLng() + ", " + bp.getBdLat()); |
||||
|
mobilePosition.setGeodeticSystem("BD-09"); |
||||
|
mobilePosition.setCnLng(bp.getBdLng()); |
||||
|
mobilePosition.setCnLat(bp.getBdLat()); |
||||
|
if (!userSetup.getSavePositionHistory()) { |
||||
|
storager.clearMobilePositionsByDeviceId(device.getDeviceId()); |
||||
|
} |
||||
|
storager.insertMobilePosition(mobilePosition); |
||||
|
//回复 200 OK
|
||||
|
responseAck(evt, Response.OK); |
||||
|
} catch (DocumentException | SipException | InvalidArgumentException | ParseException e) { |
||||
|
e.printStackTrace(); |
||||
|
} |
||||
|
} |
||||
|
|
||||
|
@Override |
||||
|
public void handForPlatform(RequestEvent evt, ParentPlatform parentPlatform, Element element) { |
||||
|
|
||||
|
} |
||||
|
} |
@ -0,0 +1,153 @@ |
|||||
|
package com.genersoft.iot.vmp.gb28181.transmit.event.request.impl.message.response.cmd; |
||||
|
|
||||
|
import com.genersoft.iot.vmp.gb28181.bean.Device; |
||||
|
import com.genersoft.iot.vmp.gb28181.bean.ParentPlatform; |
||||
|
import com.genersoft.iot.vmp.gb28181.bean.RecordInfo; |
||||
|
import com.genersoft.iot.vmp.gb28181.bean.RecordItem; |
||||
|
import com.genersoft.iot.vmp.gb28181.transmit.callback.CheckForAllRecordsThread; |
||||
|
import com.genersoft.iot.vmp.gb28181.transmit.callback.DeferredResultHolder; |
||||
|
import com.genersoft.iot.vmp.gb28181.transmit.callback.RequestMessage; |
||||
|
import com.genersoft.iot.vmp.gb28181.transmit.event.request.SIPRequestProcessorParent; |
||||
|
import com.genersoft.iot.vmp.gb28181.transmit.event.request.impl.message.IMessageHandler; |
||||
|
import com.genersoft.iot.vmp.gb28181.transmit.event.request.impl.message.response.ResponseMessageHandler; |
||||
|
import com.genersoft.iot.vmp.gb28181.utils.DateUtil; |
||||
|
import com.genersoft.iot.vmp.utils.redis.RedisUtil; |
||||
|
import org.dom4j.DocumentException; |
||||
|
import org.dom4j.Element; |
||||
|
import org.slf4j.Logger; |
||||
|
import org.slf4j.LoggerFactory; |
||||
|
import org.springframework.beans.factory.InitializingBean; |
||||
|
import org.springframework.beans.factory.annotation.Autowired; |
||||
|
import org.springframework.stereotype.Component; |
||||
|
|
||||
|
import javax.sip.InvalidArgumentException; |
||||
|
import javax.sip.RequestEvent; |
||||
|
import javax.sip.SipException; |
||||
|
import javax.sip.message.Response; |
||||
|
import java.text.ParseException; |
||||
|
import java.util.ArrayList; |
||||
|
import java.util.Iterator; |
||||
|
import java.util.List; |
||||
|
import java.util.UUID; |
||||
|
|
||||
|
import static com.genersoft.iot.vmp.gb28181.utils.XmlUtil.getText; |
||||
|
|
||||
|
@Component |
||||
|
public class RecordInfoMessageHandler extends SIPRequestProcessorParent implements InitializingBean, IMessageHandler { |
||||
|
|
||||
|
private Logger logger = LoggerFactory.getLogger(RecordInfoMessageHandler.class); |
||||
|
public static volatile List<String> threadNameList = new ArrayList(); |
||||
|
private final String cmdType = "RecordInfo"; |
||||
|
private final static String CACHE_RECORDINFO_KEY = "CACHE_RECORDINFO_"; |
||||
|
|
||||
|
@Autowired |
||||
|
private ResponseMessageHandler responseMessageHandler; |
||||
|
|
||||
|
@Autowired |
||||
|
private RedisUtil redis; |
||||
|
|
||||
|
@Autowired |
||||
|
private DeferredResultHolder deferredResultHolder; |
||||
|
|
||||
|
@Override |
||||
|
public void afterPropertiesSet() throws Exception { |
||||
|
responseMessageHandler.addHandler(cmdType, this); |
||||
|
} |
||||
|
|
||||
|
@Override |
||||
|
public void handForDevice(RequestEvent evt, Device device, Element rootElement) { |
||||
|
|
||||
|
// 回复200 OK
|
||||
|
try { |
||||
|
responseAck(evt, Response.OK); |
||||
|
|
||||
|
rootElement = getRootElement(evt, device.getCharset()); |
||||
|
String uuid = UUID.randomUUID().toString().replace("-", ""); |
||||
|
RecordInfo recordInfo = new RecordInfo(); |
||||
|
Element deviceIdElement = rootElement.element("DeviceID"); |
||||
|
String channelId = deviceIdElement.getText(); |
||||
|
String key = DeferredResultHolder.CALLBACK_CMD_RECORDINFO + device.getDeviceId() + channelId; |
||||
|
recordInfo.setDeviceId(device.getDeviceId()); |
||||
|
recordInfo.setChannelId(channelId); |
||||
|
recordInfo.setName(getText(rootElement, "Name")); |
||||
|
if (getText(rootElement, "SumNum") == null || getText(rootElement, "SumNum") == "") { |
||||
|
recordInfo.setSumNum(0); |
||||
|
} else { |
||||
|
recordInfo.setSumNum(Integer.parseInt(getText(rootElement, "SumNum"))); |
||||
|
} |
||||
|
String sn = getText(rootElement, "SN"); |
||||
|
Element recordListElement = rootElement.element("RecordList"); |
||||
|
if (recordListElement == null || recordInfo.getSumNum() == 0) { |
||||
|
logger.info("无录像数据"); |
||||
|
RequestMessage msg = new RequestMessage(); |
||||
|
msg.setKey(key); |
||||
|
msg.setData(recordInfo); |
||||
|
deferredResultHolder.invokeAllResult(msg); |
||||
|
} else { |
||||
|
Iterator<Element> recordListIterator = recordListElement.elementIterator(); |
||||
|
List<RecordItem> recordList = new ArrayList<RecordItem>(); |
||||
|
if (recordListIterator != null) { |
||||
|
RecordItem record = new RecordItem(); |
||||
|
logger.info("处理录像列表数据..."); |
||||
|
// 遍历DeviceList
|
||||
|
while (recordListIterator.hasNext()) { |
||||
|
Element itemRecord = recordListIterator.next(); |
||||
|
Element recordElement = itemRecord.element("DeviceID"); |
||||
|
if (recordElement == null) { |
||||
|
logger.info("记录为空,下一个..."); |
||||
|
continue; |
||||
|
} |
||||
|
record = new RecordItem(); |
||||
|
record.setDeviceId(getText(itemRecord, "DeviceID")); |
||||
|
record.setName(getText(itemRecord, "Name")); |
||||
|
record.setFilePath(getText(itemRecord, "FilePath")); |
||||
|
record.setAddress(getText(itemRecord, "Address")); |
||||
|
record.setStartTime( |
||||
|
DateUtil.ISO8601Toyyyy_MM_dd_HH_mm_ss(getText(itemRecord, "StartTime"))); |
||||
|
record.setEndTime( |
||||
|
DateUtil.ISO8601Toyyyy_MM_dd_HH_mm_ss(getText(itemRecord, "EndTime"))); |
||||
|
record.setSecrecy(itemRecord.element("Secrecy") == null ? 0 |
||||
|
: Integer.parseInt(getText(itemRecord, "Secrecy"))); |
||||
|
record.setType(getText(itemRecord, "Type")); |
||||
|
record.setRecorderId(getText(itemRecord, "RecorderID")); |
||||
|
recordList.add(record); |
||||
|
} |
||||
|
recordInfo.setRecordList(recordList); |
||||
|
} |
||||
|
|
||||
|
// 改用单独线程统计已获取录像文件数量,避免多包并行分别统计不完整的问题
|
||||
|
String cacheKey = CACHE_RECORDINFO_KEY + device.getDeviceId() + sn; |
||||
|
redis.set(cacheKey + "_" + uuid, recordList, 90); |
||||
|
if (!threadNameList.contains(cacheKey)) { |
||||
|
threadNameList.add(cacheKey); |
||||
|
CheckForAllRecordsThread chk = new CheckForAllRecordsThread(cacheKey, recordInfo); |
||||
|
chk.setName(cacheKey); |
||||
|
chk.setDeferredResultHolder(deferredResultHolder); |
||||
|
chk.setRedis(redis); |
||||
|
chk.setLogger(logger); |
||||
|
chk.start(); |
||||
|
if (logger.isDebugEnabled()) { |
||||
|
logger.debug("Start Thread " + cacheKey + "."); |
||||
|
} |
||||
|
} else { |
||||
|
if (logger.isDebugEnabled()) { |
||||
|
logger.debug("Thread " + cacheKey + " already started."); |
||||
|
} |
||||
|
} |
||||
|
} |
||||
|
} catch (SipException e) { |
||||
|
e.printStackTrace(); |
||||
|
} catch (InvalidArgumentException e) { |
||||
|
e.printStackTrace(); |
||||
|
} catch (ParseException e) { |
||||
|
e.printStackTrace(); |
||||
|
} catch (DocumentException e) { |
||||
|
e.printStackTrace(); |
||||
|
} |
||||
|
} |
||||
|
|
||||
|
@Override |
||||
|
public void handForPlatform(RequestEvent evt, ParentPlatform parentPlatform, Element element) { |
||||
|
|
||||
|
} |
||||
|
} |
Loading…
Reference in new issue