|
@@ -1,244 +0,0 @@
|
|
|
-package com.yunfeiyun.agmp.iots.mq;
|
|
|
|
|
-
|
|
|
|
|
-import com.alibaba.fastjson2.JSONArray;
|
|
|
|
|
-import com.alibaba.fastjson2.JSONObject;
|
|
|
|
|
-import com.baomidou.mybatisplus.core.toolkit.ObjectUtils;
|
|
|
|
|
-import com.yunfeiyun.agmp.common.framework.message.MqMsg;
|
|
|
|
|
-import com.yunfeiyun.agmp.common.utils.JSONUtils;
|
|
|
|
|
-import com.yunfeiyun.agmp.common.utils.StringUtils;
|
|
|
|
|
-import com.yunfeiyun.agmp.iot.common.constant.devicetype.IotDeviceDictConst;
|
|
|
|
|
-import com.yunfeiyun.agmp.iot.common.constant.devicetype.IotDeviceDictEnum;
|
|
|
|
|
-import com.yunfeiyun.agmp.iot.common.constant.mq.IotMqConstant;
|
|
|
|
|
-import com.yunfeiyun.agmp.iot.common.model.IotWarncheck;
|
|
|
|
|
-import com.yunfeiyun.agmp.iot.common.model.cmd.CmdGroupModel;
|
|
|
|
|
-import com.yunfeiyun.agmp.iots.core.cmd.core.CmdDispatcherService;
|
|
|
|
|
-import com.yunfeiyun.agmp.iots.core.manager.MqttManager;
|
|
|
|
|
-import com.yunfeiyun.agmp.iots.device.common.HttpDevice;
|
|
|
|
|
-import com.yunfeiyun.agmp.iots.service.IIotFirmdevService;
|
|
|
|
|
-import com.yunfeiyun.agmp.iots.service.impl.WarnService;
|
|
|
|
|
-
|
|
|
|
|
-import lombok.extern.slf4j.Slf4j;
|
|
|
|
|
-import org.springframework.amqp.rabbit.annotation.Exchange;
|
|
|
|
|
-import org.springframework.amqp.rabbit.annotation.Queue;
|
|
|
|
|
-import org.springframework.amqp.rabbit.annotation.QueueBinding;
|
|
|
|
|
-import org.springframework.amqp.rabbit.annotation.RabbitListener;
|
|
|
|
|
-import org.springframework.beans.factory.annotation.Autowired;
|
|
|
|
|
-import org.springframework.beans.factory.annotation.Qualifier;
|
|
|
|
|
-import org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor;
|
|
|
|
|
-import org.springframework.stereotype.Component;
|
|
|
|
|
-
|
|
|
|
|
-import javax.annotation.Resource;
|
|
|
|
|
-import java.util.ArrayList;
|
|
|
|
|
-import java.util.HashMap;
|
|
|
|
|
-import java.util.List;
|
|
|
|
|
-import java.util.Map;
|
|
|
|
|
-
|
|
|
|
|
-
|
|
|
|
|
-/**
|
|
|
|
|
- * @author zhangn
|
|
|
|
|
- */
|
|
|
|
|
-@Slf4j
|
|
|
|
|
-@Component
|
|
|
|
|
-public class IotsMqReceiver {
|
|
|
|
|
-
|
|
|
|
|
- @Autowired
|
|
|
|
|
- private CmdDispatcherService cmdDispatcherService;
|
|
|
|
|
-
|
|
|
|
|
- @Autowired
|
|
|
|
|
- private MqttManager mqttManager;
|
|
|
|
|
-
|
|
|
|
|
- @Autowired
|
|
|
|
|
- private IIotFirmdevService iIotFirmdevService;
|
|
|
|
|
-
|
|
|
|
|
-
|
|
|
|
|
-
|
|
|
|
|
-
|
|
|
|
|
-
|
|
|
|
|
- @Autowired
|
|
|
|
|
- private WarnService warnService;
|
|
|
|
|
- @Autowired
|
|
|
|
|
- @Qualifier("cmdAsyncTaskExecutor")
|
|
|
|
|
- private ThreadPoolTaskExecutor cmdAsyncTaskExecutor;
|
|
|
|
|
- @Resource
|
|
|
|
|
- private Map<String, HttpDevice> httpDeviceMap;
|
|
|
|
|
-
|
|
|
|
|
- /**
|
|
|
|
|
- * 指令集执行状态消息处理
|
|
|
|
|
- *
|
|
|
|
|
- * @param content
|
|
|
|
|
- */
|
|
|
|
|
- @RabbitListener(bindings = @QueueBinding(value = @Queue(IotMqConstant.TOPIC_TASK)
|
|
|
|
|
- , exchange = @Exchange(value = "amq.topic", durable = "true", type = "topic")
|
|
|
|
|
- , key = IotMqConstant.TOPIC_TASK))
|
|
|
|
|
- public void recvTask(String content) {
|
|
|
|
|
- log.info("【IOTS】收到iotm的 任务 messageBody={}", content);
|
|
|
|
|
- try {
|
|
|
|
|
- MqMsg mqMsg = JSONObject.parseObject(content, MqMsg.class);
|
|
|
|
|
- log.info("【IOTS】收到iotm的 任务 cmd groups ={}", mqMsg.getCmd());
|
|
|
|
|
- CmdGroupModel cmdGroupModel = JSONUtils.toObject(mqMsg.getCmd(), CmdGroupModel.class);
|
|
|
|
|
- cmdDispatcherService.handleCmd(cmdGroupModel);
|
|
|
|
|
- } catch (Exception e) {
|
|
|
|
|
- log.error("【IOTS】【接收消息:指令集任务】【异常】", e);
|
|
|
|
|
- }
|
|
|
|
|
-
|
|
|
|
|
- }
|
|
|
|
|
-
|
|
|
|
|
- /**
|
|
|
|
|
- * 创建设备,并进行订阅
|
|
|
|
|
- * 1. 解析数据
|
|
|
|
|
- * 2. 订阅设备
|
|
|
|
|
- * 3. 订阅结果返回给iotm
|
|
|
|
|
- *
|
|
|
|
|
- * @param content
|
|
|
|
|
- */
|
|
|
|
|
- @RabbitListener(bindings = @QueueBinding(value = @Queue(IotMqConstant.DEVICE_CREATE)
|
|
|
|
|
- , exchange = @Exchange(value = "amq.topic", durable = "true", type = "topic")
|
|
|
|
|
- , key = IotMqConstant.DEVICE_CREATE))
|
|
|
|
|
- public void recvDeviceCreate(String content) {
|
|
|
|
|
- log.info("【IOTS】收到iotm的 设备创建消息 messageBody={}", content);
|
|
|
|
|
- try {
|
|
|
|
|
- MqMsg mqMsg = JSONObject.parseObject(content, MqMsg.class);
|
|
|
|
|
- log.info("【IOTS】收到iotm的 设备创建消息 messageBody ={} | {} ", mqMsg.getCmd(), mqMsg.getData());
|
|
|
|
|
- Map<String, List<String>> serviceDeviceMap = getServiceDeviceMap(mqMsg);
|
|
|
|
|
- //mqttManager.topicBatchUnSubscribeDevices(serviceDeviceMap);
|
|
|
|
|
-
|
|
|
|
|
- } catch (Exception e) {
|
|
|
|
|
- log.error("【IOTS】【接收消息:设备创建】【异常】", e);
|
|
|
|
|
- }
|
|
|
|
|
- }
|
|
|
|
|
-
|
|
|
|
|
- @RabbitListener(bindings = @QueueBinding(value = @Queue(IotMqConstant.DEVICE_DELETE)
|
|
|
|
|
- , exchange = @Exchange(value = "amq.topic", durable = "true", type = "topic")
|
|
|
|
|
- , key = IotMqConstant.DEVICE_DELETE))
|
|
|
|
|
- public void recvDeviceDelete(String s) {
|
|
|
|
|
- log.info("【IOTS】收到iotm的 设备删除消息 messageBody={}", s);
|
|
|
|
|
- try {
|
|
|
|
|
- MqMsg mqMsg = JSONObject.parseObject(s, MqMsg.class);
|
|
|
|
|
- log.info("【IOTS】收到iotm的 设备删除消息 messageBody ={} | {} ", mqMsg.getCmd(), mqMsg.getData());
|
|
|
|
|
- Map<String, List<String>> serviceDeviceMap = getServiceDeviceMap(mqMsg);
|
|
|
|
|
- //mqttManager.topicBatchUnSubscribeDevices(serviceDeviceMap);
|
|
|
|
|
-
|
|
|
|
|
- } catch (Exception e) {
|
|
|
|
|
- log.error("【IOTS】【接收消息:设备删除】【异常】", e);
|
|
|
|
|
- }
|
|
|
|
|
- }
|
|
|
|
|
-
|
|
|
|
|
- /***
|
|
|
|
|
- *
|
|
|
|
|
- * 用于创建设备后需要主动获取最新信息,但是又不是mqtt协议
|
|
|
|
|
- * 己根据类型自行实现策略 zhangn 2024年6月5日
|
|
|
|
|
- * @param content
|
|
|
|
|
- */
|
|
|
|
|
- @RabbitListener(bindings = @QueueBinding(value = @Queue(IotMqConstant.DEVICE_CREATE_V2)
|
|
|
|
|
- , exchange = @Exchange(value = "amq.topic", durable = "true", type = "topic")
|
|
|
|
|
- , key = IotMqConstant.DEVICE_CREATE_V2))
|
|
|
|
|
- public void recvDeviceCreateV2(String content) {
|
|
|
|
|
- log.info("【IOTS】收到iotm的 设备创建消息V2 messageBody={}", content);
|
|
|
|
|
- try {
|
|
|
|
|
- MqMsg mqMsg = JSONObject.parseObject(content, MqMsg.class);
|
|
|
|
|
- log.info("【IOTS】收到iotm的 设备创建消息V2 messageBody ={} | {} ", mqMsg.getCmd(), mqMsg.getData());
|
|
|
|
|
- JSONArray mqArray = JSONArray.parseArray(mqMsg.getCmd());
|
|
|
|
|
- List<String> xphDevCodeList = new ArrayList<>();
|
|
|
|
|
- List<String> xphGpQxzDevCodeList = new ArrayList<>();
|
|
|
|
|
- for (Object msg : mqArray) {
|
|
|
|
|
- JSONObject deviceInfo = (JSONObject) msg;
|
|
|
|
|
- String devtypeBid = deviceInfo.getString("devtypeBid");
|
|
|
|
|
- String devBid = deviceInfo.getString("devBid");
|
|
|
|
|
- // 自己判断处理
|
|
|
|
|
- if (IotDeviceDictConst.TYPE_HS_YBQ_DWB.equals(devtypeBid) || IotDeviceDictConst.TYPE_HS_YBQ_CMB.equals(devtypeBid) || IotDeviceDictConst.TYPE_HS_YBQ_DBB.equals(devtypeBid)) {
|
|
|
|
|
-
|
|
|
|
|
- } else if (IotDeviceDictConst.TYPE_XPH_WSKZ.equals(devtypeBid)
|
|
|
|
|
- || IotDeviceDictConst.TYPE_XPH_TRSH_CL.equals(devtypeBid)
|
|
|
|
|
- || IotDeviceDictConst.TYPE_XPH_WSHJ_JC.equals(devtypeBid)) {
|
|
|
|
|
- xphDevCodeList.add(deviceInfo.getString("devCode"));
|
|
|
|
|
- } else if (IotDeviceDictConst.TYPE_XPH_GP_QXZ.equals(devtypeBid)) {
|
|
|
|
|
- xphGpQxzDevCodeList.add(deviceInfo.getString("devCode"));
|
|
|
|
|
- }
|
|
|
|
|
- }
|
|
|
|
|
-
|
|
|
|
|
- } catch (Exception e) {
|
|
|
|
|
- log.error("【IOTS】【接收消息:设备创建V2】【异常】", e);
|
|
|
|
|
- }
|
|
|
|
|
- }
|
|
|
|
|
-
|
|
|
|
|
- private Map<String, List<String>> getServiceDeviceMap(MqMsg mqMsg) {
|
|
|
|
|
- JSONArray mqArray = JSONArray.parseArray(mqMsg.getCmd());
|
|
|
|
|
- List<String> devBidList = new ArrayList<>();
|
|
|
|
|
- Map<String, List<String>> serviceKeyMap = new HashMap<>();
|
|
|
|
|
- for (Object msg : mqArray) {
|
|
|
|
|
- JSONObject deviceInfo = (JSONObject) msg;
|
|
|
|
|
- String devCode = deviceInfo.getString("devCode");
|
|
|
|
|
- String firmBizId = deviceInfo.getString("firmBid");
|
|
|
|
|
- String devtypeBid = deviceInfo.getString("devtypeBid");
|
|
|
|
|
- String devBid = deviceInfo.getString("devBid");
|
|
|
|
|
- devBidList.add(devBid);
|
|
|
|
|
-
|
|
|
|
|
- String k = firmBizId + devtypeBid;
|
|
|
|
|
- if (!serviceKeyMap.containsKey(k)) {
|
|
|
|
|
- serviceKeyMap.put(k, new ArrayList<>());
|
|
|
|
|
- }
|
|
|
|
|
- serviceKeyMap.get(k).add(devCode);
|
|
|
|
|
- }
|
|
|
|
|
- Map<String, String> serviceNameMap = iIotFirmdevService.getServiceNameMap(devBidList);
|
|
|
|
|
- Map<String, List<String>> serviceDeviceMap = new HashMap<>();
|
|
|
|
|
- for (Map.Entry<String, List<String>> entry : serviceKeyMap.entrySet()) {
|
|
|
|
|
- String k = entry.getKey();
|
|
|
|
|
- List<String> v = entry.getValue();
|
|
|
|
|
- if (serviceNameMap.containsKey(k)) {
|
|
|
|
|
- serviceDeviceMap.put(serviceNameMap.get(k), v);
|
|
|
|
|
- }
|
|
|
|
|
- }
|
|
|
|
|
- return serviceDeviceMap;
|
|
|
|
|
- }
|
|
|
|
|
-
|
|
|
|
|
- /**
|
|
|
|
|
- * ”预警检查“消息处理
|
|
|
|
|
- *
|
|
|
|
|
- * @param content
|
|
|
|
|
- */
|
|
|
|
|
- @RabbitListener(bindings = @QueueBinding(value = @Queue(IotMqConstant.TOPIC_WARNCHECK)
|
|
|
|
|
- , exchange = @Exchange(value = "amq.topic", durable = "true", type = "topic")
|
|
|
|
|
- , key = IotMqConstant.TOPIC_WARNCHECK))
|
|
|
|
|
- public void recvWarncheck(String content) {
|
|
|
|
|
- log.info("【IOTS】收到 预警检查 任务 messageBody={}", content);
|
|
|
|
|
- try {
|
|
|
|
|
- MqMsg mqMsg = JSONObject.parseObject(content, MqMsg.class);
|
|
|
|
|
- log.info("【IOTS】收到 预警检查 任务 cmd ={}", mqMsg.getCmd());
|
|
|
|
|
- IotWarncheck warncheck = JSONUtils.toObject(mqMsg.getCmd(), IotWarncheck.class);
|
|
|
|
|
- warnService.check(warncheck);
|
|
|
|
|
- } catch (Exception e) {
|
|
|
|
|
- log.error("【IOTS】【接收消息:预警检查 任务】【异常】", e);
|
|
|
|
|
- }
|
|
|
|
|
- }
|
|
|
|
|
- /**
|
|
|
|
|
- * 用于更新同步指定类型设备的所有同步接口,
|
|
|
|
|
- * 一般用于http对接设备,用于从平台拉取设备所有信息
|
|
|
|
|
- * */
|
|
|
|
|
- @RabbitListener(bindings = @QueueBinding(value = @Queue(IotMqConstant.DEVICE_ALL_SYN)
|
|
|
|
|
- , exchange = @Exchange(value = "amq.topic", durable = "true",type = "topic")
|
|
|
|
|
- , key=IotMqConstant.DEVICE_ALL_SYN))
|
|
|
|
|
- public void recvDeviceRefresh(String content){
|
|
|
|
|
- log.info("【IOTS】收到设备信息同步任务 messageBody={}",content);
|
|
|
|
|
- try {
|
|
|
|
|
- MqMsg mqMsg = JSONObject.parseObject(content,MqMsg.class);
|
|
|
|
|
- JSONObject param = JSONObject.parseObject(mqMsg.getCmd(),JSONObject.class);
|
|
|
|
|
- String devTypeBid = param.getString("devTypeBid");
|
|
|
|
|
- if(StringUtils.isEmpty(devTypeBid)){
|
|
|
|
|
- log.error("【IOTS】设备信息同步任务异常,devTypeBid为空");
|
|
|
|
|
- return;
|
|
|
|
|
- }
|
|
|
|
|
- IotDeviceDictEnum iotDeviceDictEnum = IotDeviceDictEnum.findEnumByCode(devTypeBid);
|
|
|
|
|
- if(ObjectUtils.isNull(iotDeviceDictEnum)){
|
|
|
|
|
- log.error("【IOTS】设备信息同步任务异常,未对接的设备类型");
|
|
|
|
|
- return;
|
|
|
|
|
- }
|
|
|
|
|
- HttpDevice httpDevice = httpDeviceMap.get(iotDeviceDictEnum.getCode());
|
|
|
|
|
- httpDevice.sysAllDevice();
|
|
|
|
|
- }catch (Exception e){
|
|
|
|
|
- log.error("【IOTS】执行设备信息同步任务失败",e);
|
|
|
|
|
- }
|
|
|
|
|
- }
|
|
|
|
|
-
|
|
|
|
|
-
|
|
|
|
|
-
|
|
|
|
|
-}
|
|
|