Browse Source

处理报警和位置上报时使用fromHeader获取deviceId, xml的deviceId作为channelId使用。

pull/183/head
648540858 3 years ago
parent
commit
497e581e5e
  1. 2
      sql/mysql.sql
  2. 13
      src/main/java/com/genersoft/iot/vmp/gb28181/bean/DeviceAlarm.java
  3. 13
      src/main/java/com/genersoft/iot/vmp/gb28181/bean/MobilePosition.java
  4. 55
      src/main/java/com/genersoft/iot/vmp/gb28181/transmit/request/impl/MessageRequestProcessor.java
  5. 4
      src/main/java/com/genersoft/iot/vmp/storager/dao/DeviceAlarmMapper.java
  6. 4
      src/main/java/com/genersoft/iot/vmp/storager/dao/DeviceMobilePositionMapper.java
  7. 23
      src/main/java/com/genersoft/iot/vmp/utils/SipUtils.java
  8. BIN
      src/main/resources/wvp.sqlite

2
sql/mysql.sql

@ -66,6 +66,7 @@ create table device_alarm
id int auto_increment id int auto_increment
primary key, primary key,
deviceId varchar(50) not null, deviceId varchar(50) not null,
channelId varchar(50) not null,
alarmPriority varchar(50) not null, alarmPriority varchar(50) not null,
alarmMethod varchar(50), alarmMethod varchar(50),
alarmTime varchar(50) not null, alarmTime varchar(50) not null,
@ -92,6 +93,7 @@ create table log
create table device_mobile_position create table device_mobile_position
( (
deviceId varchar(50) not null, deviceId varchar(50) not null,
channelId varchar(50) not null,
deviceName varchar(255) null, deviceName varchar(255) null,
time varchar(50) not null, time varchar(50) not null,
longitude double not null, longitude double not null,

13
src/main/java/com/genersoft/iot/vmp/gb28181/bean/DeviceAlarm.java

@ -13,6 +13,11 @@ public class DeviceAlarm {
*/ */
private String deviceId; private String deviceId;
/**
* 通道Id
*/
private String channelId;
/** /**
* 报警级别, 1为一级警情, 2为二级警情, 3为三级警情, 4为四级 警情- * 报警级别, 1为一级警情, 2为二级警情, 3为三级警情, 4为四级 警情-
*/ */
@ -121,4 +126,12 @@ public class DeviceAlarm {
public void setAlarmType(String alarmType) { public void setAlarmType(String alarmType) {
this.alarmType = alarmType; this.alarmType = alarmType;
} }
public String getChannelId() {
return channelId;
}
public void setChannelId(String channelId) {
this.channelId = channelId;
}
} }

13
src/main/java/com/genersoft/iot/vmp/gb28181/bean/MobilePosition.java

@ -12,6 +12,11 @@ public class MobilePosition {
*/ */
private String deviceId; private String deviceId;
/**
* 通道Id
*/
private String channelId;
/** /**
* 设备名称 * 设备名称
*/ */
@ -163,4 +168,12 @@ public class MobilePosition {
public void setCnLat(String cnLat) { public void setCnLat(String cnLat) {
this.cnLat = cnLat; this.cnLat = cnLat;
} }
public String getChannelId() {
return channelId;
}
public void setChannelId(String channelId) {
this.channelId = channelId;
}
} }

55
src/main/java/com/genersoft/iot/vmp/gb28181/transmit/request/impl/MessageRequestProcessor.java

@ -5,9 +5,11 @@ import java.text.ParseException;
import java.util.*; import java.util.*;
import javax.sip.*; import javax.sip.*;
import javax.sip.address.Address;
import javax.sip.address.SipURI; import javax.sip.address.SipURI;
import javax.sip.header.FromHeader; import javax.sip.header.FromHeader;
import javax.sip.header.Header;
import javax.sip.header.HeaderAddress; import javax.sip.header.HeaderAddress;
import javax.sip.header.ToHeader; import javax.sip.header.ToHeader;
import javax.sip.message.Request; import javax.sip.message.Request;
@ -34,6 +36,7 @@ import com.genersoft.iot.vmp.service.IDeviceAlarmService;
import com.genersoft.iot.vmp.storager.IRedisCatchStorage; import com.genersoft.iot.vmp.storager.IRedisCatchStorage;
import com.genersoft.iot.vmp.storager.IVideoManagerStorager; import com.genersoft.iot.vmp.storager.IVideoManagerStorager;
import com.genersoft.iot.vmp.utils.GpsUtil; import com.genersoft.iot.vmp.utils.GpsUtil;
import com.genersoft.iot.vmp.utils.SipUtils;
import com.genersoft.iot.vmp.utils.SpringBeanFactory; import com.genersoft.iot.vmp.utils.SpringBeanFactory;
import com.genersoft.iot.vmp.utils.redis.RedisUtil; import com.genersoft.iot.vmp.utils.redis.RedisUtil;
import com.genersoft.iot.vmp.vmanager.gb28181.platform.bean.ChannelReduce; import com.genersoft.iot.vmp.vmanager.gb28181.platform.bean.ChannelReduce;
@ -166,18 +169,21 @@ public class MessageRequestProcessor extends SIPRequestAbstractProcessor {
*/ */
private void processMessageMobilePosition(RequestEvent evt) { private void processMessageMobilePosition(RequestEvent evt) {
try { try {
Element rootElement = getRootElement(evt); String deviceId = SipUtils.getUserIdFromFromHeader(evt.getRequest());
Device device = storager.queryVideoDevice(deviceId);
if (device == null) {
logger.warn("处理MobilePosition移动位置消息时未找到设备信息");
return;
}
Element rootElement = getRootElement(evt, device.getCharset());
MobilePosition mobilePosition = new MobilePosition(); MobilePosition mobilePosition = new MobilePosition();
Element deviceIdElement = rootElement.element("DeviceID"); Element deviceIdElement = rootElement.element("DeviceID");
String deviceId = deviceIdElement.getTextTrim().toString(); if (!StringUtils.isEmpty(device.getName())) {
Device device = storager.queryVideoDevice(deviceId); mobilePosition.setDeviceName(device.getName());
if (device != null) {
rootElement = getRootElement(evt, device.getCharset());
if (!StringUtils.isEmpty(device.getName())) {
mobilePosition.setDeviceName(device.getName());
}
} }
mobilePosition.setDeviceId(XmlUtil.getText(rootElement, "DeviceID")); mobilePosition.setDeviceId(deviceId);
mobilePosition.setChannelId(XmlUtil.getText(rootElement, "DeviceID"));
mobilePosition.setTime(XmlUtil.getText(rootElement, "Time")); mobilePosition.setTime(XmlUtil.getText(rootElement, "Time"));
mobilePosition.setLongitude(Double.parseDouble(XmlUtil.getText(rootElement, "Longitude"))); mobilePosition.setLongitude(Double.parseDouble(XmlUtil.getText(rootElement, "Longitude")));
mobilePosition.setLatitude(Double.parseDouble(XmlUtil.getText(rootElement, "Latitude"))); mobilePosition.setLatitude(Double.parseDouble(XmlUtil.getText(rootElement, "Latitude")));
@ -691,16 +697,18 @@ public class MessageRequestProcessor extends SIPRequestAbstractProcessor {
*/ */
private void processMessageAlarm(RequestEvent evt) { private void processMessageAlarm(RequestEvent evt) {
try { try {
Element rootElement = getRootElement(evt); String deviceId = SipUtils.getUserIdFromFromHeader(evt.getRequest());
Element deviceIdElement = rootElement.element("DeviceID");
String deviceId = deviceIdElement.getText().toString();
// 回复200 OK
responseAck(evt);
Device device = storager.queryVideoDevice(deviceId); Device device = storager.queryVideoDevice(deviceId);
if (device == null) { if (device == null) {
logger.warn("处理alarm设备报警信息未找到设备信息");
return; return;
} }
Element rootElement = getRootElement(evt, device.getCharset());
Element deviceIdElement = rootElement.element("DeviceID");
String channelId = deviceIdElement.getText().toString();
// 回复200 OK
responseAck(evt);
if (device.getCharset() != null) { if (device.getCharset() != null) {
rootElement = getRootElement(evt, device.getCharset()); rootElement = getRootElement(evt, device.getCharset());
} }
@ -708,6 +716,7 @@ public class MessageRequestProcessor extends SIPRequestAbstractProcessor {
if (rootElement.getName().equals("Notify")) { // 处理报警通知 if (rootElement.getName().equals("Notify")) { // 处理报警通知
DeviceAlarm deviceAlarm = new DeviceAlarm(); DeviceAlarm deviceAlarm = new DeviceAlarm();
deviceAlarm.setDeviceId(deviceId); deviceAlarm.setDeviceId(deviceId);
deviceAlarm.setChannelId(channelId);
deviceAlarm.setAlarmPriority(XmlUtil.getText(rootElement, "AlarmPriority")); deviceAlarm.setAlarmPriority(XmlUtil.getText(rootElement, "AlarmPriority"));
deviceAlarm.setAlarmMethod(XmlUtil.getText(rootElement, "AlarmMethod")); deviceAlarm.setAlarmMethod(XmlUtil.getText(rootElement, "AlarmMethod"));
deviceAlarm.setAlarmTime(XmlUtil.getText(rootElement, "AlarmTime")); deviceAlarm.setAlarmTime(XmlUtil.getText(rootElement, "AlarmTime"));
@ -792,7 +801,9 @@ public class MessageRequestProcessor extends SIPRequestAbstractProcessor {
Response response = getMessageFactory().createResponse(Response.NOT_FOUND, evt.getRequest()); Response response = getMessageFactory().createResponse(Response.NOT_FOUND, evt.getRequest());
ServerTransaction serverTransaction = getServerTransaction(evt); ServerTransaction serverTransaction = getServerTransaction(evt);
serverTransaction.sendResponse(response); serverTransaction.sendResponse(response);
if (serverTransaction.getDialog() != null) serverTransaction.getDialog().delete(); if (serverTransaction.getDialog() != null) {
serverTransaction.getDialog().delete();
}
} }
// if (device != null && device.getOnline() == 1) { // if (device != null && device.getOnline() == 1) {
@ -1006,7 +1017,9 @@ public class MessageRequestProcessor extends SIPRequestAbstractProcessor {
Response response = getMessageFactory().createResponse(Response.OK, evt.getRequest()); Response response = getMessageFactory().createResponse(Response.OK, evt.getRequest());
ServerTransaction serverTransaction = getServerTransaction(evt); ServerTransaction serverTransaction = getServerTransaction(evt);
serverTransaction.sendResponse(response); serverTransaction.sendResponse(response);
if (serverTransaction.getDialog() != null) serverTransaction.getDialog().delete(); if (serverTransaction.getDialog() != null) {
serverTransaction.getDialog().delete();
}
} }
/*** /***
@ -1020,7 +1033,9 @@ public class MessageRequestProcessor extends SIPRequestAbstractProcessor {
Response response = getMessageFactory().createResponse(Response.NOT_FOUND, evt.getRequest()); Response response = getMessageFactory().createResponse(Response.NOT_FOUND, evt.getRequest());
ServerTransaction serverTransaction = getServerTransaction(evt); ServerTransaction serverTransaction = getServerTransaction(evt);
serverTransaction.sendResponse(response); serverTransaction.sendResponse(response);
if (serverTransaction.getDialog() != null) serverTransaction.getDialog().delete(); if (serverTransaction.getDialog() != null) {
serverTransaction.getDialog().delete();
}
} }
private Element getRootElement(RequestEvent evt) throws DocumentException { private Element getRootElement(RequestEvent evt) throws DocumentException {
@ -1029,7 +1044,9 @@ public class MessageRequestProcessor extends SIPRequestAbstractProcessor {
} }
private Element getRootElement(RequestEvent evt, String charset) throws DocumentException { private Element getRootElement(RequestEvent evt, String charset) throws DocumentException {
if (charset == null) charset = "gb2312"; if (charset == null) {
charset = "gb2312";
}
Request request = evt.getRequest(); Request request = evt.getRequest();
SAXReader reader = new SAXReader(); SAXReader reader = new SAXReader();
reader.setEncoding(charset); reader.setEncoding(charset);

4
src/main/java/com/genersoft/iot/vmp/storager/dao/DeviceAlarmMapper.java

@ -15,8 +15,8 @@ import java.util.List;
@Repository @Repository
public interface DeviceAlarmMapper { public interface DeviceAlarmMapper {
@Insert("INSERT INTO device_alarm (deviceId, alarmPriority, alarmMethod, alarmTime, alarmDescription, longitude, latitude, alarmType ) " + @Insert("INSERT INTO device_alarm (deviceId, channelId, alarmPriority, alarmMethod, alarmTime, alarmDescription, longitude, latitude, alarmType ) " +
"VALUES ('${deviceId}', '${alarmPriority}', '${alarmMethod}', '${alarmTime}', '${alarmDescription}', ${longitude}, ${latitude}, '${alarmType}')") "VALUES ('${deviceId}', '${channelId}', '${alarmPriority}', '${alarmMethod}', '${alarmTime}', '${alarmDescription}', ${longitude}, ${latitude}, '${alarmType}')")
int add(DeviceAlarm alarm); int add(DeviceAlarm alarm);

4
src/main/java/com/genersoft/iot/vmp/storager/dao/DeviceMobilePositionMapper.java

@ -10,8 +10,8 @@ import org.apache.ibatis.annotations.*;
//@Repository //@Repository
public interface DeviceMobilePositionMapper { public interface DeviceMobilePositionMapper {
@Insert("INSERT INTO device_mobile_position (deviceId, deviceName, time, longitude, latitude, altitude, speed, direction, reportSource, geodeticSystem, cnLng, cnLat) " + @Insert("INSERT INTO device_mobile_position (deviceId,channelId, deviceName, time, longitude, latitude, altitude, speed, direction, reportSource, geodeticSystem, cnLng, cnLat) " +
"VALUES ('${deviceId}', '${deviceName}', '${time}', ${longitude}, ${latitude}, ${altitude}, ${speed}, ${direction}, '${reportSource}', '${geodeticSystem}', '${cnLng}', '${cnLat}')") "VALUES ('${deviceId}','${channelId}', '${deviceName}', '${time}', ${longitude}, ${latitude}, ${altitude}, ${speed}, ${direction}, '${reportSource}', '${geodeticSystem}', '${cnLng}', '${cnLat}')")
int insertNewPosition(MobilePosition mobilePosition); int insertNewPosition(MobilePosition mobilePosition);
@Select(value = {" <script>" + @Select(value = {" <script>" +

23
src/main/java/com/genersoft/iot/vmp/utils/SipUtils.java

@ -0,0 +1,23 @@
package com.genersoft.iot.vmp.utils;
import gov.nist.javax.sip.address.AddressImpl;
import gov.nist.javax.sip.address.SipUri;
import javax.sip.header.FromHeader;
import javax.sip.message.Request;
/**
* @author panlinlin
* @version 1.0.0
* @Description JAIN SIP的工具类
* @createTime 2021年09月27日 15:12:00
*/
public class SipUtils {
public static String getUserIdFromFromHeader(Request request) {
FromHeader fromHeader = (FromHeader)request.getHeader(FromHeader.NAME);
AddressImpl address = (AddressImpl)fromHeader.getAddress();
SipUri uri = (SipUri) address.getURI();
return uri.getUser();
}
}

BIN
src/main/resources/wvp.sqlite

Binary file not shown.
Loading…
Cancel
Save