增加人脸抓拍,人脸上报消费者
All checks were successful
Build and Push to Target Registry / 构建并推送镜像到目标仓库 (push) Successful in 6m20s
All checks were successful
Build and Push to Target Registry / 构建并推送镜像到目标仓库 (push) Successful in 6m20s
This commit is contained in:
parent
5c9672dc18
commit
be3992c1dc
@ -0,0 +1,19 @@
|
|||||||
|
package org.dromara.sis.config;
|
||||||
|
|
||||||
|
import lombok.Data;
|
||||||
|
import org.springframework.boot.context.properties.ConfigurationProperties;
|
||||||
|
import org.springframework.context.annotation.Configuration;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 海康对接模块配置信息
|
||||||
|
*
|
||||||
|
* @author lxj
|
||||||
|
*/
|
||||||
|
@Data
|
||||||
|
@Configuration
|
||||||
|
@ConfigurationProperties(prefix = "eqp.config.hik")
|
||||||
|
public class HikEqpConfig {
|
||||||
|
|
||||||
|
private String host;
|
||||||
|
|
||||||
|
}
|
@ -1,69 +0,0 @@
|
|||||||
package org.dromara.sis.consumer;
|
|
||||||
|
|
||||||
import lombok.RequiredArgsConstructor;
|
|
||||||
import lombok.extern.slf4j.Slf4j;
|
|
||||||
import org.apache.rocketmq.common.message.MessageExt;
|
|
||||||
import org.apache.rocketmq.spring.annotation.RocketMQMessageListener;
|
|
||||||
import org.apache.rocketmq.spring.core.RocketMQListener;
|
|
||||||
import org.dromara.sis.domain.vo.SisElevatorFloorRefVo;
|
|
||||||
import org.dromara.sis.domain.vo.SisElevatorInfoVo;
|
|
||||||
import org.dromara.sis.sdk.hik.HikApiService;
|
|
||||||
import org.dromara.sis.service.ISisElevatorFloorRefService;
|
|
||||||
import org.dromara.sis.service.ISisElevatorInfoService;
|
|
||||||
import org.springframework.stereotype.Component;
|
|
||||||
|
|
||||||
import java.util.List;
|
|
||||||
import java.util.Objects;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @author lsm
|
|
||||||
* @apiNote CleanLiftAuthRocketConsumer
|
|
||||||
* @since 2025/8/5
|
|
||||||
*/
|
|
||||||
@Slf4j
|
|
||||||
@Component
|
|
||||||
@RequiredArgsConstructor
|
|
||||||
@RocketMQMessageListener(topic = "lift-topic", consumerGroup = "lift-consumer-group")
|
|
||||||
public class CleanLiftAuthRocketConsumer implements RocketMQListener<MessageExt> {
|
|
||||||
|
|
||||||
private final ISisElevatorInfoService sisElevatorInfoService;
|
|
||||||
private final ISisElevatorFloorRefService sisElevatorFloorRefService;
|
|
||||||
private final HikApiService hikApiService;
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public void onMessage(MessageExt ext) {
|
|
||||||
log.info("【消费者】接收消息:消息体 => {}", new String(ext.getBody()));
|
|
||||||
|
|
||||||
// Long deviceId = Long.parseLong(ext.getUserProperty("deviceId"));
|
|
||||||
// Long groupId = Long.parseLong(ext.getUserProperty("groupId"));
|
|
||||||
// Long deviceFloorId = Long.parseLong(ext.getUserProperty("deviceFloorId"));
|
|
||||||
//
|
|
||||||
// // 获取当前电梯信息
|
|
||||||
// SisElevatorInfoVo ele = sisElevatorInfoService.queryById(deviceId);
|
|
||||||
//
|
|
||||||
// // 获取权限组下电梯⇄楼层关联信息
|
|
||||||
// List<SisElevatorFloorRefVo> groupRef = sisElevatorFloorRefService.queryByAuthGroupId(groupId);
|
|
||||||
//
|
|
||||||
// // 取出当前电梯的楼层授权信息
|
|
||||||
// List<SisElevatorFloorRefVo> eleRef = groupRef.stream().filter(o -> Objects.equals(o.getElevatorId(), deviceId)).toList();
|
|
||||||
//
|
|
||||||
// for (SisElevatorFloorRefVo ref : eleRef){
|
|
||||||
// if (ref.getUpChannel() != null && Objects.equals(ref.getFloorId(), deviceFloorId)){
|
|
||||||
// HikApiService.getInstance().controlGateway(ele.getControlIp(), ref.getUpChannel().intValue(), 3);
|
|
||||||
// }
|
|
||||||
//
|
|
||||||
// if (ref.getDownChannel() != null && Objects.equals(ref.getFloorId(), deviceFloorId)){
|
|
||||||
// HikApiService.getInstance().controlGateway(ele.getControlIp(), ref.getDownChannel().intValue(), 3);
|
|
||||||
// }
|
|
||||||
//
|
|
||||||
// if (ref.getInChannel() != null && Objects.equals(ref.getFloorId(), deviceFloorId)){
|
|
||||||
// HikApiService.getInstance().controlGateway(ele.getControlIp(), ref.getInChannel().intValue(), 3);
|
|
||||||
// }
|
|
||||||
// }
|
|
||||||
// todo 暂时应急处理,后续调整业务逻辑
|
|
||||||
for (int i = 1; i < 5; i++) {
|
|
||||||
hikApiService.controlGateway("192.168.24.150", i, 3);
|
|
||||||
}
|
|
||||||
log.info("梯控清除权限完成");
|
|
||||||
}
|
|
||||||
}
|
|
@ -1,39 +0,0 @@
|
|||||||
package org.dromara.sis.producer;
|
|
||||||
|
|
||||||
import lombok.RequiredArgsConstructor;
|
|
||||||
import lombok.extern.slf4j.Slf4j;
|
|
||||||
import org.apache.rocketmq.common.message.Message;
|
|
||||||
import org.apache.rocketmq.spring.core.RocketMQTemplate;
|
|
||||||
import org.springframework.stereotype.Component;
|
|
||||||
|
|
||||||
import javax.annotation.Resource;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @author lsm
|
|
||||||
* @apiNote CleanLiftAuthRocketProducer
|
|
||||||
* @since 2025/8/5
|
|
||||||
*/
|
|
||||||
@Slf4j
|
|
||||||
@Component
|
|
||||||
@RequiredArgsConstructor
|
|
||||||
public class CleanLiftAuthRocketProducer {
|
|
||||||
|
|
||||||
@Resource
|
|
||||||
private RocketMQTemplate rocketMQTemplate;
|
|
||||||
|
|
||||||
public void sendMessage(Long deviceId, Long groupId, Long deviceFloorId, String info, Integer lay) {
|
|
||||||
// 发送延迟消息
|
|
||||||
// RocketMQ预定义了一些延迟等级,每个等级对应不同的延迟时间范围。这些等级从1到18,分别对应1s、5s、10s、30s、1m、2m、3m、4m、5m、6m、7m、8m、9m、10m、20m、30m、1h、2h的延迟时间。
|
|
||||||
org.apache.rocketmq.common.message.Message msg = new Message("lift-topic", "lift-tag", info.getBytes());
|
|
||||||
msg.putUserProperty("deviceId", deviceId.toString());
|
|
||||||
msg.putUserProperty("groupId", groupId.toString());
|
|
||||||
msg.putUserProperty("deviceFloorId", deviceFloorId.toString());
|
|
||||||
msg.setDelayTimeLevel(lay);
|
|
||||||
try {
|
|
||||||
rocketMQTemplate.getProducer().send(msg);
|
|
||||||
log.info("发送RocketMQ消息成功");
|
|
||||||
} catch (Exception e) {
|
|
||||||
log.error("发送RocketMQ消息失败", e);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
@ -0,0 +1,22 @@
|
|||||||
|
package org.dromara.sis.rocketmq;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* rocketmq 常量类
|
||||||
|
*
|
||||||
|
* @author lxj
|
||||||
|
*/
|
||||||
|
public interface RocketMqConstants {
|
||||||
|
// mq topic
|
||||||
|
String TOPIC = "SmartParks";
|
||||||
|
|
||||||
|
// mq GROUP
|
||||||
|
String GROUP = "SmartParksEqp";
|
||||||
|
|
||||||
|
/*-----------------------------------消息tag------------------------------------*/
|
||||||
|
String HIKADD = "ADD_HIK_DEVICE_TAG";
|
||||||
|
// 人脸抓拍上报
|
||||||
|
String FACECAPTURE = "FACE_CAPTURE_REPORT";
|
||||||
|
// 人脸比对
|
||||||
|
String FACECOMPARE = "FACE_COMPARE_REPORT";
|
||||||
|
|
||||||
|
}
|
@ -0,0 +1,43 @@
|
|||||||
|
package org.dromara.sis.rocketmq.consumer;
|
||||||
|
|
||||||
|
import com.alibaba.fastjson.JSONObject;
|
||||||
|
import lombok.RequiredArgsConstructor;
|
||||||
|
import lombok.extern.slf4j.Slf4j;
|
||||||
|
import org.apache.rocketmq.common.message.MessageExt;
|
||||||
|
import org.apache.rocketmq.spring.annotation.RocketMQMessageListener;
|
||||||
|
import org.apache.rocketmq.spring.core.RocketMQListener;
|
||||||
|
import org.dromara.sis.rocketmq.RocketMqConstants;
|
||||||
|
import org.dromara.sis.rocketmq.domain.FaceCapture;
|
||||||
|
import org.dromara.sis.service.IZeroSensationPassageService;
|
||||||
|
import org.springframework.stereotype.Component;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 人脸抓拍消费者
|
||||||
|
*
|
||||||
|
* @author lxj
|
||||||
|
*/
|
||||||
|
|
||||||
|
@Slf4j
|
||||||
|
@Component
|
||||||
|
@RequiredArgsConstructor
|
||||||
|
@RocketMQMessageListener(
|
||||||
|
topic = RocketMqConstants.TOPIC,
|
||||||
|
consumerGroup = RocketMqConstants.GROUP,
|
||||||
|
selectorExpression = RocketMqConstants.FACECAPTURE
|
||||||
|
)
|
||||||
|
public class FaceCaptureConsumer implements RocketMQListener<MessageExt> {
|
||||||
|
|
||||||
|
private final IZeroSensationPassageService zeroSensationPassageService;
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void onMessage(MessageExt ext) {
|
||||||
|
log.info("消费人脸抓拍数据,数据长度={}", ext.getBody().length);
|
||||||
|
try {
|
||||||
|
FaceCapture capture = JSONObject.parseObject(ext.getBody(), FaceCapture.class);
|
||||||
|
zeroSensationPassageService.pass(capture.getDeviceIp(), capture.getSmallImg(), capture.getBigImg());
|
||||||
|
} catch (Exception e) {
|
||||||
|
log.error("消费人脸抓拍数据处理失败,", e);
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,40 @@
|
|||||||
|
package org.dromara.sis.rocketmq.consumer;
|
||||||
|
|
||||||
|
import com.alibaba.fastjson.JSONObject;
|
||||||
|
import lombok.RequiredArgsConstructor;
|
||||||
|
import lombok.extern.slf4j.Slf4j;
|
||||||
|
import org.apache.rocketmq.common.message.MessageExt;
|
||||||
|
import org.apache.rocketmq.spring.annotation.RocketMQMessageListener;
|
||||||
|
import org.apache.rocketmq.spring.core.RocketMQListener;
|
||||||
|
import org.dromara.sis.rocketmq.RocketMqConstants;
|
||||||
|
import org.dromara.sis.rocketmq.domain.FaceCompare;
|
||||||
|
import org.springframework.stereotype.Component;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 人脸比对消费者
|
||||||
|
*
|
||||||
|
* @author lxj
|
||||||
|
*/
|
||||||
|
|
||||||
|
@Slf4j
|
||||||
|
@Component
|
||||||
|
@RequiredArgsConstructor
|
||||||
|
@RocketMQMessageListener(
|
||||||
|
topic = RocketMqConstants.TOPIC,
|
||||||
|
consumerGroup = RocketMqConstants.GROUP,
|
||||||
|
selectorExpression = RocketMqConstants.FACECOMPARE
|
||||||
|
)
|
||||||
|
public class FaceCompareConsumer implements RocketMQListener<MessageExt> {
|
||||||
|
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void onMessage(MessageExt ext) {
|
||||||
|
log.info("消费人脸比对数据,数据长度={}", ext.getBody().length);
|
||||||
|
try {
|
||||||
|
FaceCompare compare = JSONObject.parseObject(ext.getBody(), FaceCompare.class);
|
||||||
|
|
||||||
|
} catch (Exception e) {
|
||||||
|
log.error("消费比对抓拍数据处理失败,", e);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,13 @@
|
|||||||
|
package org.dromara.sis.rocketmq.domain;
|
||||||
|
|
||||||
|
import lombok.Data;
|
||||||
|
|
||||||
|
@Data
|
||||||
|
public class FaceCapture {
|
||||||
|
|
||||||
|
private String deviceIp;
|
||||||
|
|
||||||
|
private byte [] smallImg;
|
||||||
|
|
||||||
|
private byte [] bigImg;
|
||||||
|
}
|
@ -0,0 +1,17 @@
|
|||||||
|
package org.dromara.sis.rocketmq.domain;
|
||||||
|
|
||||||
|
import lombok.Data;
|
||||||
|
|
||||||
|
@Data
|
||||||
|
public class FaceCompare {
|
||||||
|
|
||||||
|
private String deviceId;
|
||||||
|
|
||||||
|
private float similarity;
|
||||||
|
|
||||||
|
private String name;
|
||||||
|
|
||||||
|
private Integer pid;
|
||||||
|
|
||||||
|
private byte[] face;
|
||||||
|
}
|
@ -3,7 +3,9 @@ package org.dromara.sis.sdk.hik;
|
|||||||
import cn.hutool.http.HttpUtil;
|
import cn.hutool.http.HttpUtil;
|
||||||
import com.alibaba.fastjson2.JSONObject;
|
import com.alibaba.fastjson2.JSONObject;
|
||||||
import com.alibaba.fastjson2.TypeReference;
|
import com.alibaba.fastjson2.TypeReference;
|
||||||
|
import jakarta.annotation.Resource;
|
||||||
import lombok.extern.slf4j.Slf4j;
|
import lombok.extern.slf4j.Slf4j;
|
||||||
|
import org.dromara.sis.config.HikEqpConfig;
|
||||||
import org.dromara.sis.sdk.zkmedia.model.R;
|
import org.dromara.sis.sdk.zkmedia.model.R;
|
||||||
import org.springframework.stereotype.Component;
|
import org.springframework.stereotype.Component;
|
||||||
|
|
||||||
@ -17,13 +19,15 @@ import org.springframework.stereotype.Component;
|
|||||||
@Component
|
@Component
|
||||||
public class HikApiService {
|
public class HikApiService {
|
||||||
|
|
||||||
|
@Resource
|
||||||
|
private HikEqpConfig hikEqpConfig;
|
||||||
|
|
||||||
private static final String URL_PREFIX = "http://127.0.0.1/eqp/hik/";
|
private static final String URL_PREFIX = "http://127.0.0.1/eqp/hik/";
|
||||||
private static final String LOGIN_URI = "login";
|
private static final String LOGIN_URI = "login";
|
||||||
private static final String LOGOUT_URI = "logout";
|
private static final String LOGOUT_URI = "logout";
|
||||||
private static final String CHANNEL_LIST = "channel/list";
|
private static final String CHANNEL_LIST = "channel/list";
|
||||||
private static final String FACE_UPLOAD = "flib/add";
|
private static final String FACE_UPLOAD = "flib/add";
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 发起海康设备对接模块请求
|
* 发起海康设备对接模块请求
|
||||||
*
|
*
|
||||||
@ -33,7 +37,7 @@ public class HikApiService {
|
|||||||
* @return 返回请求数据
|
* @return 返回请求数据
|
||||||
*/
|
*/
|
||||||
public <T> T request(String uri, String params, Class<T> cls) {
|
public <T> T request(String uri, String params, Class<T> cls) {
|
||||||
String url = URL_PREFIX + uri;
|
String url = hikEqpConfig.getHost() + uri;
|
||||||
log.info("url: {},params: {}", url, params);
|
log.info("url: {},params: {}", url, params);
|
||||||
String post = HttpUtil.post(url, params);
|
String post = HttpUtil.post(url, params);
|
||||||
R<T> result = JSONObject.parseObject(post, new TypeReference<R<T>>(cls) {
|
R<T> result = JSONObject.parseObject(post, new TypeReference<R<T>>(cls) {
|
||||||
@ -48,11 +52,11 @@ public class HikApiService {
|
|||||||
/**
|
/**
|
||||||
* 执行hiksdk登录
|
* 执行hiksdk登录
|
||||||
*
|
*
|
||||||
* @param ip 设备ip
|
* @param ip 设备ip
|
||||||
* @param port 设备端口
|
* @param port 设备端口
|
||||||
* @param user 设备账号
|
* @param user 设备账号
|
||||||
* @param psw 设备密码
|
* @param psw 设备密码
|
||||||
* @param deviceType 1 摄像机,2: nvr, 3:cvr,4: 梯控
|
* @param deviceType 1 摄像机,2: nvr, 3:cvr,4: 梯控
|
||||||
* @return 返回会否登录成功
|
* @return 返回会否登录成功
|
||||||
*/
|
*/
|
||||||
public boolean login(String ip, short port, String user, String psw, Integer deviceType) {
|
public boolean login(String ip, short port, String user, String psw, Integer deviceType) {
|
||||||
|
@ -14,7 +14,6 @@ import org.dromara.property.api.domain.vo.RemoteFloorVo;
|
|||||||
import org.dromara.sis.domain.enums.ControlTypeEnum;
|
import org.dromara.sis.domain.enums.ControlTypeEnum;
|
||||||
import org.dromara.sis.domain.enums.RosterTypeEnum;
|
import org.dromara.sis.domain.enums.RosterTypeEnum;
|
||||||
import org.dromara.sis.domain.vo.*;
|
import org.dromara.sis.domain.vo.*;
|
||||||
import org.dromara.sis.producer.CleanLiftAuthRocketProducer;
|
|
||||||
import org.dromara.sis.sdk.e8.E8PlatformApi;
|
import org.dromara.sis.sdk.e8.E8PlatformApi;
|
||||||
import org.dromara.sis.sdk.e8.domain.accessControl.req.RemoteOpenDoorReq;
|
import org.dromara.sis.sdk.e8.domain.accessControl.req.RemoteOpenDoorReq;
|
||||||
import org.dromara.sis.sdk.hik.HikApiService;
|
import org.dromara.sis.sdk.hik.HikApiService;
|
||||||
@ -51,7 +50,6 @@ public class ZeroSensationPassageServiceImpl implements IZeroSensationPassageSer
|
|||||||
private final E8PlatformApi e8PlatformApi;
|
private final E8PlatformApi e8PlatformApi;
|
||||||
private final ISisAlarmEventsService alarmEventsService;
|
private final ISisAlarmEventsService alarmEventsService;
|
||||||
private final HikApiService hikApiService;
|
private final HikApiService hikApiService;
|
||||||
private final CleanLiftAuthRocketProducer cleanLiftAuthRocketProducer;
|
|
||||||
|
|
||||||
@DubboReference
|
@DubboReference
|
||||||
private RemoteFloorService remoteFloorService;
|
private RemoteFloorService remoteFloorService;
|
||||||
@ -157,7 +155,6 @@ public class ZeroSensationPassageServiceImpl implements IZeroSensationPassageSer
|
|||||||
hikApiService.controlGateway(ele.getControlIp(), channelRefVo.getUpChannel().intValue(), 2);
|
hikApiService.controlGateway(ele.getControlIp(), channelRefVo.getUpChannel().intValue(), 2);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
cleanLiftAuthRocketProducer.sendMessage(item.getBindId(), 0L, item.getDeviceFloorId(), "清除电梯" + item.getBindId() + "梯控权限", 3);
|
|
||||||
});
|
});
|
||||||
log.info("处理电梯外部按键完成,耗时:{}ms", interval.intervalMs());
|
log.info("处理电梯外部按键完成,耗时:{}ms", interval.intervalMs());
|
||||||
}
|
}
|
||||||
@ -217,11 +214,10 @@ public class ZeroSensationPassageServiceImpl implements IZeroSensationPassageSer
|
|||||||
hikApiService.controlGateway(ele.getControlIp(), ref.getDownChannel().intValue(), 2);
|
hikApiService.controlGateway(ele.getControlIp(), ref.getDownChannel().intValue(), 2);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
cleanLiftAuthRocketProducer.sendMessage(deviceId, groupId, deviceFloorId, "清除电梯" + deviceId + "梯控权限", 3);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// 模拟上下文
|
// 模拟上下文
|
||||||
List<RemoteFloorVo> floorList = SaTokenContextMockUtil.setMockContext(() -> remoteFloorService.queryByBuildingId(ele.getBuildingId()));
|
List<RemoteFloorVo> floorList = SaTokenContextMockUtil.setMockContext(() -> remoteFloorService.queryByBuildingId(ele.getBuildingId()));
|
||||||
if (CollUtil.isEmpty(floorList)) return;
|
if (CollUtil.isEmpty(floorList)) return;
|
||||||
|
|
||||||
if (Objects.equals(controlType, ControlTypeEnum.ELEVATOR_IN_CONTROL.getCode())) {
|
if (Objects.equals(controlType, ControlTypeEnum.ELEVATOR_IN_CONTROL.getCode())) {
|
||||||
|
Loading…
Reference in New Issue
Block a user