diff --git a/.gitignore b/.gitignore index 2b17a4b09..c6a38c6b1 100644 --- a/.gitignore +++ b/.gitignore @@ -31,3 +31,5 @@ certificates /.vs /docker/volumes /docker/wvp/config/jwk.json +/打包/ +/snap/ diff --git a/src/main/java/com/genersoft/iot/vmp/conf/SipConfig.java b/src/main/java/com/genersoft/iot/vmp/conf/SipConfig.java index 5822d64c5..94be102cc 100644 --- a/src/main/java/com/genersoft/iot/vmp/conf/SipConfig.java +++ b/src/main/java/com/genersoft/iot/vmp/conf/SipConfig.java @@ -32,7 +32,5 @@ public class SipConfig { Integer registerTimeInterval = 120; - private boolean alarm = false; - private long timeout = 1000; } diff --git a/src/main/java/com/genersoft/iot/vmp/gb28181/bean/DeviceAlarm.java b/src/main/java/com/genersoft/iot/vmp/gb28181/bean/DeviceAlarm.java index 22d3dd2ae..6c273b70c 100644 --- a/src/main/java/com/genersoft/iot/vmp/gb28181/bean/DeviceAlarm.java +++ b/src/main/java/com/genersoft/iot/vmp/gb28181/bean/DeviceAlarm.java @@ -1,5 +1,6 @@ package com.genersoft.iot.vmp.gb28181.bean; +import com.genersoft.iot.vmp.service.bean.AlarmType; import io.swagger.v3.oas.annotations.media.Schema; import lombok.Data; @@ -13,9 +14,6 @@ import java.util.Set; @Data public class DeviceAlarm { - @Schema(description = "数据库id") - private String id; - @Schema(description = "设备的国标编号") private String deviceId; @@ -220,46 +218,78 @@ public class DeviceAlarm { if (alarmMethodSet.contains("6")) { switch (alarmType) { case "1": - result = "人工视频报警"; + result = "存储设备磁盘故障报警"; break; case "2": - result = "运动目标检测报警"; - break; - case "3": - result = "遗留物检测报警"; - break; - case "4": - result = "物体移除检测报警"; - break; - case "5": - result = "绊线检测报警"; - break; - case "6": - result = "入侵检测报警"; - break; - case "7": - result = "逆行检测报警"; - break; - case "8": - result = "徘徊检测报警"; - break; - case "9": - result = "流量统计报警"; - break; - case "10": - result = "密度检测报警"; - break; - case "11": - result = "视频异常检测报警"; - break; - case "12": - result = "快速移动报警"; + result = "存储设备风扇故障报警"; break; } } return result; } + public AlarmType getAlarmTypeEnum() { + if (alarmType == null) { + return null; + } + char[] charArray = alarmMethod.toCharArray(); + Set alarmMethodSet = new HashSet<>(); + for (char c : charArray) { + alarmMethodSet.add(Character.toString(c)); + } + if (alarmMethodSet.contains("2")) { + switch (alarmType) { + case "1": + return AlarmType.VideoLoss; + case "2": + return AlarmType.DeviceTamper; + case "3": + return AlarmType.StorageFull; + case "4": + return AlarmType.DeviceHighTemperature; + case "5": + return AlarmType.DeviceLowTemperature; + } + } + if (alarmMethodSet.contains("5")) { + switch (alarmType) { + case "1": + return AlarmType.ManualVideo; + case "2": + return AlarmType.MotionDetection; + case "3": + return AlarmType.LeftObjectDetection; + case "4": + return AlarmType.ObjectRemovalDetection; + case "5": + return AlarmType.TripwireDetection; + case "6": + return AlarmType.IntrusionDetection; + case "7": + return AlarmType.ReverseDetection; + case "8": + return AlarmType.LoiteringDetection; + case "9": + return AlarmType.FlowStatistics; + case "10": + return AlarmType.DensityDetection; + case "11": + return AlarmType.VideoAbnormal; + case "12": + return AlarmType.RapidMovement; + } + } + if (alarmMethodSet.contains("6")) { + switch (alarmType) { + case "1": + return AlarmType.StorageFault; + case "2": + return AlarmType.StorageFanFault; + } + } + return null; + } + @Schema(description = "报警类型描述") private String alarmTypeDescription; diff --git a/src/main/java/com/genersoft/iot/vmp/gb28181/event/EventPublisher.java b/src/main/java/com/genersoft/iot/vmp/gb28181/event/EventPublisher.java index b54a403b4..2f326b156 100755 --- a/src/main/java/com/genersoft/iot/vmp/gb28181/event/EventPublisher.java +++ b/src/main/java/com/genersoft/iot/vmp/gb28181/event/EventPublisher.java @@ -2,7 +2,7 @@ package com.genersoft.iot.vmp.gb28181.event; import com.genersoft.iot.vmp.conf.UserSetting; import com.genersoft.iot.vmp.gb28181.bean.*; -import com.genersoft.iot.vmp.gb28181.event.alarm.AlarmEvent; +import com.genersoft.iot.vmp.gb28181.event.alarm.DeviceAlarmEvent; import com.genersoft.iot.vmp.gb28181.event.channel.ChannelEvent; import com.genersoft.iot.vmp.gb28181.event.device.DeviceOfflineEvent; import com.genersoft.iot.vmp.gb28181.event.subscribe.catalog.CatalogEvent; @@ -41,7 +41,7 @@ public class EventPublisher { * @param deviceAlarm */ public void deviceAlarmEventPublish(DeviceAlarm deviceAlarm) { - AlarmEvent alarmEvent = new AlarmEvent(this); + DeviceAlarmEvent alarmEvent = new DeviceAlarmEvent(this); alarmEvent.setAlarmInfo(deviceAlarm); applicationEventPublisher.publishEvent(alarmEvent); } diff --git a/src/main/java/com/genersoft/iot/vmp/gb28181/event/alarm/AlarmEventListener.java b/src/main/java/com/genersoft/iot/vmp/gb28181/event/alarm/AlarmEventListener.java deleted file mode 100755 index 46c4cc14c..000000000 --- a/src/main/java/com/genersoft/iot/vmp/gb28181/event/alarm/AlarmEventListener.java +++ /dev/null @@ -1,32 +0,0 @@ -package com.genersoft.iot.vmp.gb28181.event.alarm; - -import com.genersoft.iot.vmp.gb28181.session.SseSessionManager; -import lombok.extern.slf4j.Slf4j; -import org.jetbrains.annotations.NotNull; -import org.springframework.context.ApplicationListener; -import org.springframework.stereotype.Component; - -import jakarta.annotation.Resource; - -/** - * 报警事件监听器. - * - * @author lawrencehj - * @author xiaoQQya - * @since 2021/01/20 - */ -@Slf4j -@Component -public class AlarmEventListener implements ApplicationListener { - - @Resource - private SseSessionManager sseSessionManager; - - @Override - public void onApplicationEvent(@NotNull AlarmEvent event) { - if (log.isDebugEnabled()) { - log.debug("设备报警事件触发, deviceId: {}, {}", event.getAlarmInfo().getDeviceId(), event.getAlarmInfo().getAlarmDescription()); - } - sseSessionManager.sendForAll("message", event.getAlarmInfo()); - } -} diff --git a/src/main/java/com/genersoft/iot/vmp/gb28181/event/alarm/AlarmEvent.java b/src/main/java/com/genersoft/iot/vmp/gb28181/event/alarm/DeviceAlarmEvent.java similarity index 85% rename from src/main/java/com/genersoft/iot/vmp/gb28181/event/alarm/AlarmEvent.java rename to src/main/java/com/genersoft/iot/vmp/gb28181/event/alarm/DeviceAlarmEvent.java index 11ed3a595..67790f729 100755 --- a/src/main/java/com/genersoft/iot/vmp/gb28181/event/alarm/AlarmEvent.java +++ b/src/main/java/com/genersoft/iot/vmp/gb28181/event/alarm/DeviceAlarmEvent.java @@ -11,12 +11,12 @@ import java.io.Serial; * @data: 2021-01-20 */ -public class AlarmEvent extends ApplicationEvent { +public class DeviceAlarmEvent extends ApplicationEvent { @Serial private static final long serialVersionUID = 1L; - public AlarmEvent(Object source) { + public DeviceAlarmEvent(Object source) { super(source); } diff --git a/src/main/java/com/genersoft/iot/vmp/gb28181/session/SseSessionManager.java b/src/main/java/com/genersoft/iot/vmp/gb28181/session/SseSessionManager.java index 6c88f7df2..fded6caf8 100644 --- a/src/main/java/com/genersoft/iot/vmp/gb28181/session/SseSessionManager.java +++ b/src/main/java/com/genersoft/iot/vmp/gb28181/session/SseSessionManager.java @@ -1,8 +1,10 @@ package com.genersoft.iot.vmp.gb28181.session; import com.genersoft.iot.vmp.conf.DynamicTask; +import com.genersoft.iot.vmp.gb28181.event.alarm.DeviceAlarmEvent; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.scheduling.annotation.Async; import org.springframework.scheduling.annotation.Scheduled; import org.springframework.stereotype.Component; import org.springframework.web.servlet.mvc.method.annotation.SseEmitter; @@ -52,6 +54,11 @@ public class SseSessionManager { } sendForAll("keepalive", "alive"); } + @Async + @org.springframework.context.event.EventListener + public void onApplicationEvent(DeviceAlarmEvent event) { + sendForAll("message", event.getAlarmInfo()); + } public void sendForAll(String event, Object data) { diff --git a/src/main/java/com/genersoft/iot/vmp/gb28181/transmit/event/request/impl/NotifyRequestProcessor.java b/src/main/java/com/genersoft/iot/vmp/gb28181/transmit/event/request/impl/NotifyRequestProcessor.java index b50247ebd..8eb4a6cdd 100755 --- a/src/main/java/com/genersoft/iot/vmp/gb28181/transmit/event/request/impl/NotifyRequestProcessor.java +++ b/src/main/java/com/genersoft/iot/vmp/gb28181/transmit/event/request/impl/NotifyRequestProcessor.java @@ -94,9 +94,6 @@ public class NotifyRequestProcessor extends SIPRequestProcessorParent implements * 处理alarm设备报警Notify */ private void processNotifyAlarm(RequestEvent evt) { - if (!sipConfig.isAlarm()) { - return; - } log.info("[收到Notify-Alarm]:{}", evt.getRequest()); try { FromHeader fromHeader = (FromHeader) evt.getRequest().getHeader(FromHeader.NAME); diff --git a/src/main/java/com/genersoft/iot/vmp/gb28181/transmit/event/request/impl/message/notify/cmd/AlarmNotifyMessageHandler.java b/src/main/java/com/genersoft/iot/vmp/gb28181/transmit/event/request/impl/message/notify/cmd/AlarmNotifyMessageHandler.java index fd892e310..965595be5 100755 --- a/src/main/java/com/genersoft/iot/vmp/gb28181/transmit/event/request/impl/message/notify/cmd/AlarmNotifyMessageHandler.java +++ b/src/main/java/com/genersoft/iot/vmp/gb28181/transmit/event/request/impl/message/notify/cmd/AlarmNotifyMessageHandler.java @@ -190,12 +190,6 @@ public class AlarmNotifyMessageHandler extends SIPRequestProcessorParent impleme continue; } - log.debug("存储报警信息、报警分类"); - // 存储报警信息、报警分类 - if (sipConfig.isAlarm()) { -// deviceAlarmService.add(deviceAlarm); - } - if (redisCatchStorage.deviceIsOnline(sipMsgInfo.getDevice().getDeviceId())) { publisher.deviceAlarmEventPublish(deviceAlarm); } diff --git a/src/main/java/com/genersoft/iot/vmp/service/bean/Alarm.java b/src/main/java/com/genersoft/iot/vmp/service/bean/Alarm.java index 7a5f1d4f2..67035d2f5 100644 --- a/src/main/java/com/genersoft/iot/vmp/service/bean/Alarm.java +++ b/src/main/java/com/genersoft/iot/vmp/service/bean/Alarm.java @@ -18,6 +18,12 @@ public class Alarm { @Schema(description = "关联通道的数据库id") private int channelId; + @Schema(description = "关联通道国标编号") + private String channelDeviceId; + + @Schema(description = "关联通道国标名称") + private String channelName; + @Schema(description = "报警描述") private String description; diff --git a/src/main/java/com/genersoft/iot/vmp/service/impl/AlarmServiceImpl.java b/src/main/java/com/genersoft/iot/vmp/service/impl/AlarmServiceImpl.java index b7fcdd275..990b274fa 100644 --- a/src/main/java/com/genersoft/iot/vmp/service/impl/AlarmServiceImpl.java +++ b/src/main/java/com/genersoft/iot/vmp/service/impl/AlarmServiceImpl.java @@ -1,6 +1,7 @@ package com.genersoft.iot.vmp.service.impl; import com.genersoft.iot.vmp.common.StreamInfo; +import com.genersoft.iot.vmp.gb28181.event.alarm.DeviceAlarmEvent; import com.genersoft.iot.vmp.service.IAlarmService; import com.genersoft.iot.vmp.service.bean.Alarm; import com.genersoft.iot.vmp.service.bean.AlarmType; @@ -9,6 +10,8 @@ import com.genersoft.iot.vmp.utils.DateUtil; import com.github.pagehelper.PageHelper; import com.github.pagehelper.PageInfo; import lombok.RequiredArgsConstructor; +import org.springframework.context.event.EventListener; +import org.springframework.scheduling.annotation.Async; import org.springframework.stereotype.Service; import java.util.List; @@ -19,6 +22,20 @@ public class AlarmServiceImpl implements IAlarmService { private final AlarmMapper alarmMapper; + @Async + @EventListener + public void onApplicationEvent(DeviceAlarmEvent event) { + // 处理国标的报警事件,转换为通用的Alarm对象后缓存,在定时任务中批量保存到数据库 + Alarm alarm = new Alarm(); + alarm.setChannelId(event.getAlarmInfo().getChannelId()); + alarm.setChannelId(deviceAlarmEvent.getAlarmInfo().getChannelId()); + alarm.setAlarmType(AlarmType.valueOf(deviceAlarmEvent.getAlarmInfo().getAlarmType())); + alarm.setAlarmTime(deviceAlarmEvent.getAlarmInfo().getAlarmTime()); + alarm.setAlarmInfo(deviceAlarmEvent.getAlarmInfo().getAlarmInfo()); + + + } + @Override public void saveAlarmInfo(Alarm alarm) { diff --git a/src/main/java/com/genersoft/iot/vmp/storager/dao/AlarmMapper.java b/src/main/java/com/genersoft/iot/vmp/storager/dao/AlarmMapper.java index c334159b5..1ecf49475 100644 --- a/src/main/java/com/genersoft/iot/vmp/storager/dao/AlarmMapper.java +++ b/src/main/java/com/genersoft/iot/vmp/storager/dao/AlarmMapper.java @@ -13,16 +13,23 @@ import java.util.List; public interface AlarmMapper { @Select("") List getAlarms(@Param("alarmType") List alarmType, @Param("beginTimeLong") Long beginTimeLong, diff --git a/web/src/views/alarm/index.vue b/web/src/views/alarm/index.vue index 44ae0899d..2995810f3 100644 --- a/web/src/views/alarm/index.vue +++ b/web/src/views/alarm/index.vue @@ -78,7 +78,8 @@ - + + diff --git a/数据库/2.7.4/初始化-mysql-2.7.4.sql b/数据库/2.7.4/初始化-mysql-2.7.4.sql index b38a3ad02..4c5c3273f 100644 --- a/数据库/2.7.4/初始化-mysql-2.7.4.sql +++ b/数据库/2.7.4/初始化-mysql-2.7.4.sql @@ -529,12 +529,12 @@ create table IF NOT EXISTS wvp_jt_channel ( drop table IF EXISTS wvp_alarm; create table IF NOT EXISTS wvp_alarm ( id serial primary key COMMENT '主键ID', - channelId integer COMMENT '关联通道的数据库id', + channel_id integer COMMENT '关联通道的数据库id', description character varying(255) COMMENT '报警描述', - snapPath character varying(255) COMMENT '报警快照路径', - recordPath character varying(255) COMMENT '报警录像路径', + snap_path character varying(255) COMMENT '报警快照路径', + record_path character varying(255) COMMENT '报警录像路径', longitude double precision COMMENT '报警附带的经度', latitude double precision COMMENT '报警附带的纬度', - alarmType integer COMMENT '报警类别', - alarmTime bigint COMMENT '报警时间' + alarm_type integer COMMENT '报警类别', + alarm_time bigint COMMENT '报警时间' ); diff --git a/数据库/2.7.4/初始化-postgresql-kingbase-2.7.4.sql b/数据库/2.7.4/初始化-postgresql-kingbase-2.7.4.sql index 8ff24201d..06b83dda4 100644 --- a/数据库/2.7.4/初始化-postgresql-kingbase-2.7.4.sql +++ b/数据库/2.7.4/初始化-postgresql-kingbase-2.7.4.sql @@ -923,23 +923,23 @@ COMMENT ON COLUMN wvp_jt_channel.create_time IS '创建时间'; drop table IF EXISTS wvp_alarm; create table IF NOT EXISTS wvp_alarm ( id serial primary key, - channelId integer, + channel_id integer, description character varying(255), - snapPath character varying(255), - recordPath character varying(255), + snap_path character varying(255), + record_path character varying(255), longitude double precision, latitude double precision, - alarmType integer, - alarmTime bigint + alarm_type integer, + alarm_time bigint ) COMMENT ON COLUMN wvp_alarm.id IS '主键ID'; -COMMENT ON COLUMN wvp_alarm.channelId IS '关联通道的数据库id'; +COMMENT ON COLUMN wvp_alarm.channel_id IS '关联通道的数据库id'; COMMENT ON COLUMN wvp_alarm.description IS '报警描述'; -COMMENT ON COLUMN wvp_alarm.snapPath IS '报警快照路径'; -COMMENT ON COLUMN wvp_alarm.recordPath IS '报警录像路径'; +COMMENT ON COLUMN wvp_alarm.snap_path IS '报警快照路径'; +COMMENT ON COLUMN wvp_alarm.record_path IS '报警录像路径'; COMMENT ON COLUMN wvp_alarm.longitude IS '报警附带的经度'; COMMENT ON COLUMN wvp_alarm.latitude IS '报警附带的纬度'; -COMMENT ON COLUMN wvp_alarm.alarmType IS '报警类别'; -COMMENT ON COLUMN wvp_alarm.alarmTime IS '报警时间'; +COMMENT ON COLUMN wvp_alarm.alarm_type IS '报警类别'; +COMMENT ON COLUMN wvp_alarm.alarm_time IS '报警时间'; diff --git a/数据库/2.7.4/更新-mysql-2.7.4.sql b/数据库/2.7.4/更新-mysql-2.7.4.sql index e269c351a..2ad09bc1c 100644 --- a/数据库/2.7.4/更新-mysql-2.7.4.sql +++ b/数据库/2.7.4/更新-mysql-2.7.4.sql @@ -145,14 +145,14 @@ DELIMITER ; drop table IF EXISTS wvp_alarm; create table IF NOT EXISTS wvp_alarm ( id serial primary key COMMENT '主键ID', - channelId integer COMMENT '关联通道的数据库id', + channel_id integer COMMENT '关联通道的数据库id', description character varying(255) COMMENT '报警描述', - snapPath character varying(255) COMMENT '报警快照路径', - recordPath character varying(255) COMMENT '报警录像路径', + snap_path character varying(255) COMMENT '报警快照路径', + record_path character varying(255) COMMENT '报警录像路径', longitude double precision COMMENT '报警附带的经度', latitude double precision COMMENT '报警附带的纬度', - alarmType integer COMMENT '报警类别', - alarmTime bigint COMMENT '报警时间' + alarm_type integer COMMENT '报警类别', + alarm_time bigint COMMENT '报警时间' ); diff --git a/数据库/2.7.4/更新-postgresql-kingbase-2.7.4.sql b/数据库/2.7.4/更新-postgresql-kingbase-2.7.4.sql index c5818daef..31904ec08 100644 --- a/数据库/2.7.4/更新-postgresql-kingbase-2.7.4.sql +++ b/数据库/2.7.4/更新-postgresql-kingbase-2.7.4.sql @@ -51,21 +51,21 @@ ALTER table wvp_device DROP COLUMN IF EXISTS keepalive_time; drop table IF EXISTS wvp_alarm; create table IF NOT EXISTS wvp_alarm ( id serial primary key, - channelId integer, + channel_id integer, description character varying(255), - snapPath character varying(255), - recordPath character varying(255), + snap_path character varying(255), + record_path character varying(255), longitude double precision, latitude double precision, - alarmType integer, - alarmTime bigint + alarm_type integer, + alarm_time bigint ) COMMENT ON COLUMN wvp_alarm.id IS '主键ID'; -COMMENT ON COLUMN wvp_alarm.channelId IS '关联通道的数据库id'; +COMMENT ON COLUMN wvp_alarm.channel_id IS '关联通道的数据库id'; COMMENT ON COLUMN wvp_alarm.description IS '报警描述'; -COMMENT ON COLUMN wvp_alarm.snapPath IS '报警快照路径'; -COMMENT ON COLUMN wvp_alarm.recordPath IS '报警录像路径'; +COMMENT ON COLUMN wvp_alarm.snap_path IS '报警快照路径'; +COMMENT ON COLUMN wvp_alarm.record_path IS '报警录像路径'; COMMENT ON COLUMN wvp_alarm.longitude IS '报警附带的经度'; COMMENT ON COLUMN wvp_alarm.latitude IS '报警附带的纬度'; -COMMENT ON COLUMN wvp_alarm.alarmType IS '报警类别'; -COMMENT ON COLUMN wvp_alarm.alarmTime IS '报警时间'; +COMMENT ON COLUMN wvp_alarm.alarm_type IS '报警类别'; +COMMENT ON COLUMN wvp_alarm.alarm_time IS '报警时间';