2.4G设备上报技术方案
This commit is contained in:
@ -1,12 +1,21 @@
|
|||||||
package com.fuyuanshen.global.mqtt.receiver;
|
package com.fuyuanshen.global.mqtt.receiver;
|
||||||
|
|
||||||
import cn.hutool.core.lang.Dict;
|
import cn.hutool.core.lang.Dict;
|
||||||
|
import cn.hutool.json.JSONObject;
|
||||||
import com.fuyuanshen.common.core.constant.GlobalConstants;
|
import com.fuyuanshen.common.core.constant.GlobalConstants;
|
||||||
import com.fuyuanshen.common.core.utils.StringUtils;
|
import com.fuyuanshen.common.core.utils.StringUtils;
|
||||||
import com.fuyuanshen.common.json.utils.JsonUtils;
|
import com.fuyuanshen.common.json.utils.JsonUtils;
|
||||||
import com.fuyuanshen.common.redis.utils.RedisUtils;
|
import com.fuyuanshen.common.redis.utils.RedisUtils;
|
||||||
|
import com.fuyuanshen.equipment.domain.Device;
|
||||||
|
import com.fuyuanshen.equipment.domain.DeviceType;
|
||||||
|
import com.fuyuanshen.equipment.domain.form.DeviceForm;
|
||||||
|
import com.fuyuanshen.equipment.domain.query.DeviceTypeQueryCriteria;
|
||||||
|
import com.fuyuanshen.equipment.mapper.DeviceMapper;
|
||||||
|
import com.fuyuanshen.equipment.mapper.DeviceTypeMapper;
|
||||||
|
import com.fuyuanshen.equipment.service.DeviceService;
|
||||||
import com.fuyuanshen.global.mqtt.base.NewMqttRuleContext;
|
import com.fuyuanshen.global.mqtt.base.NewMqttRuleContext;
|
||||||
import com.fuyuanshen.global.mqtt.base.NewMqttRuleEngine;
|
import com.fuyuanshen.global.mqtt.base.NewMqttRuleEngine;
|
||||||
|
import com.fuyuanshen.global.mqtt.config.MqttGateway;
|
||||||
import com.fuyuanshen.global.mqtt.constants.DeviceRedisKeyConstants;
|
import com.fuyuanshen.global.mqtt.constants.DeviceRedisKeyConstants;
|
||||||
import com.fuyuanshen.global.queue.MqttMessageQueueConstants;
|
import com.fuyuanshen.global.queue.MqttMessageQueueConstants;
|
||||||
import lombok.extern.slf4j.Slf4j;
|
import lombok.extern.slf4j.Slf4j;
|
||||||
@ -22,6 +31,9 @@ import java.util.Objects;
|
|||||||
|
|
||||||
import static com.fuyuanshen.global.mqtt.constants.DeviceRedisKeyConstants.DEVICE_KEY_PREFIX;
|
import static com.fuyuanshen.global.mqtt.constants.DeviceRedisKeyConstants.DEVICE_KEY_PREFIX;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 注册设备消息接收处理
|
||||||
|
*/
|
||||||
@Service
|
@Service
|
||||||
@Slf4j
|
@Slf4j
|
||||||
public class RegisEquipReceiverMessageHandler implements MessageHandler {
|
public class RegisEquipReceiverMessageHandler implements MessageHandler {
|
||||||
@ -29,23 +41,103 @@ public class RegisEquipReceiverMessageHandler implements MessageHandler {
|
|||||||
@Autowired
|
@Autowired
|
||||||
private NewMqttRuleEngine newRuleEngine;
|
private NewMqttRuleEngine newRuleEngine;
|
||||||
|
|
||||||
|
@Autowired
|
||||||
|
private MqttGateway mqttGateway;
|
||||||
|
|
||||||
|
|
||||||
|
@Autowired
|
||||||
|
private DeviceMapper deviceMapper;
|
||||||
|
@Autowired
|
||||||
|
private DeviceService deviceService;
|
||||||
|
|
||||||
|
@Autowired
|
||||||
|
private DeviceTypeMapper deviceTypeMapper;
|
||||||
|
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void handleMessage(Message<?> message) throws MessagingException {
|
public void handleMessage(Message<?> message) throws MessagingException {
|
||||||
|
|
||||||
Object payload = message.getPayload();
|
Object payload = message.getPayload();
|
||||||
MessageHeaders headers = message.getHeaders();
|
MessageHeaders headers = message.getHeaders();
|
||||||
String receivedTopic = Objects.requireNonNull(headers.get("mqtt_receivedTopic")).toString();
|
String receivedTopic = Objects.requireNonNull(headers.get("mqtt_receivedTopic")).toString();
|
||||||
|
|
||||||
|
// 只处理 regis/equip/# 主题的消息
|
||||||
|
if (!receivedTopic.startsWith("regis/equip/")) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
// 从主题中提取设备ID
|
||||||
|
String[] topicParts = receivedTopic.split("/");
|
||||||
|
if (topicParts.length < 3) {
|
||||||
|
log.warn("Invalid topic format: {}", receivedTopic);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
String deviceTypeName = topicParts[2]; // HBY100-J
|
||||||
|
|
||||||
String receivedQos = Objects.requireNonNull(headers.get("mqtt_receivedQos")).toString();
|
String receivedQos = Objects.requireNonNull(headers.get("mqtt_receivedQos")).toString();
|
||||||
String timestamp = Objects.requireNonNull(headers.get("timestamp")).toString();
|
String timestamp = Objects.requireNonNull(headers.get("timestamp")).toString();
|
||||||
|
|
||||||
log.info("MQTT3 payload= {} \n receivedTopic = {} \n receivedQos = {} \n timestamp = {}",
|
log.info("MQTT3 payload= {} \n receivedTopic = {} \n receivedQos = {} \n timestamp = {}",
|
||||||
payload, receivedTopic, receivedQos, timestamp);
|
payload, receivedTopic, receivedQos, timestamp);
|
||||||
|
|
||||||
|
// 解析JSON payload获取imei和mac
|
||||||
Dict payloadDict = JsonUtils.parseMap(payload.toString());
|
Dict payloadDict = JsonUtils.parseMap(payload.toString());
|
||||||
if (receivedTopic == null || payloadDict == null) {
|
if (payloadDict == null) {
|
||||||
|
log.warn("Failed to parse payload JSON");
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
String imei = payloadDict.getStr("imei");
|
||||||
|
String mac = payloadDict.getStr("mac");
|
||||||
|
|
||||||
|
log.info("Extracted IMEI: {}, MAC: {}", imei, mac);
|
||||||
|
|
||||||
|
// 验证必要字段
|
||||||
|
if (StringUtils.isEmpty(imei) || StringUtils.isEmpty(mac)) {
|
||||||
|
log.warn("Missing required fields - IMEI: {}, MAC: {}", imei, mac);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
DeviceTypeQueryCriteria criteria = new DeviceTypeQueryCriteria();
|
||||||
|
criteria.setTypeName(deviceTypeName);
|
||||||
|
DeviceType deviceType = deviceTypeMapper.queryByName(criteria);
|
||||||
|
if (deviceType == null) {
|
||||||
|
log.warn("Device type not found for name: {}", deviceTypeName);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
Device device = deviceMapper.selectDeviceByImei(imei);
|
||||||
|
if (device != null) {
|
||||||
|
log.warn("Device already exists for IMEI: {}", imei);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
// 提取MAC地址后6位
|
||||||
|
String macSuffix = mac.replaceAll(":", "").substring(6); // 43:73:43:33:53:33 -> 335333
|
||||||
|
// 构建设备名称和蓝牙名称:设备类型+MAC后6位
|
||||||
|
String deviceName = deviceTypeName + "-" + macSuffix; // HBY100-335333
|
||||||
|
|
||||||
|
DeviceForm deviceForm = new DeviceForm();
|
||||||
|
deviceForm.setDeviceImei(imei);
|
||||||
|
deviceForm.setDeviceMac(mac);
|
||||||
|
deviceForm.setDeviceName(deviceName);
|
||||||
|
deviceForm.setBluetoothName(deviceName);
|
||||||
|
deviceForm.setDeviceType(deviceType.getId());
|
||||||
|
|
||||||
|
try {
|
||||||
|
deviceService.addDevice(deviceForm);
|
||||||
|
} catch (Exception e) {
|
||||||
|
throw new RuntimeException(e);
|
||||||
|
}
|
||||||
|
|
||||||
|
// 解析原始JSON数据
|
||||||
|
JSONObject originalData = new JSONObject();
|
||||||
|
originalData.put("code", 200);
|
||||||
|
// 发送到MQTT
|
||||||
|
String topic = "regis/" + imei;
|
||||||
|
mqttGateway.sendMsgToMqtt(topic, originalData.toString());
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|||||||
@ -209,6 +209,20 @@ public class DeviceServiceImpl extends ServiceImpl<DeviceMapper, Device> impleme
|
|||||||
|
|
||||||
DeviceTypeGrants typeGrants = new DeviceTypeGrants();
|
DeviceTypeGrants typeGrants = new DeviceTypeGrants();
|
||||||
|
|
||||||
|
// 修改为:
|
||||||
|
Long userId;
|
||||||
|
LoginUser loginUser;
|
||||||
|
try {
|
||||||
|
loginUser = LoginHelper.getLoginUser();
|
||||||
|
userId = loginUser != null ? loginUser.getUserId() : 1938143703108689922L; // 如果没有登录用户,使用默认系统用户ID
|
||||||
|
} catch (Exception e) {
|
||||||
|
userId = 1938143703108689922L; // 出现异常时使用默认系统用户ID
|
||||||
|
loginUser = new LoginUser();
|
||||||
|
loginUser.setUserId(userId);
|
||||||
|
loginUser.setNickname("admin");
|
||||||
|
loginUser.setTenantId("894078"); // 设置租户ID
|
||||||
|
}
|
||||||
|
|
||||||
if (deviceForm.getDeviceType() != null) {
|
if (deviceForm.getDeviceType() != null) {
|
||||||
DeviceTypeQueryCriteria queryCriteria = new DeviceTypeQueryCriteria();
|
DeviceTypeQueryCriteria queryCriteria = new DeviceTypeQueryCriteria();
|
||||||
queryCriteria.setDeviceTypeId(deviceForm.getDeviceType());
|
queryCriteria.setDeviceTypeId(deviceForm.getDeviceType());
|
||||||
@ -281,8 +295,8 @@ public class DeviceServiceImpl extends ServiceImpl<DeviceMapper, Device> impleme
|
|||||||
throw new RuntimeException("设备类型名称已存在,无法新增!!!");
|
throw new RuntimeException("设备类型名称已存在,无法新增!!!");
|
||||||
}
|
}
|
||||||
|
|
||||||
LoginUser loginUser = LoginHelper.getLoginUser();
|
|
||||||
newDeviceType.setCreateByName(loginUser.getNickname());
|
newDeviceType.setCreateByName(loginUser.getNickname());
|
||||||
|
newDeviceType.setTenantId(loginUser.getTenantId());
|
||||||
deviceTypeMapper.insert(newDeviceType);
|
deviceTypeMapper.insert(newDeviceType);
|
||||||
|
|
||||||
// 重新查询确保获取到正确的ID
|
// 重新查询确保获取到正确的ID
|
||||||
@ -294,6 +308,7 @@ public class DeviceServiceImpl extends ServiceImpl<DeviceMapper, Device> impleme
|
|||||||
deviceTypeGrants.setCustomerId(loginUser.getUserId());
|
deviceTypeGrants.setCustomerId(loginUser.getUserId());
|
||||||
deviceTypeGrants.setGrantorCustomerId(loginUser.getUserId());
|
deviceTypeGrants.setGrantorCustomerId(loginUser.getUserId());
|
||||||
deviceTypeGrants.setGrantedAt(new Date());
|
deviceTypeGrants.setGrantedAt(new Date());
|
||||||
|
deviceTypeGrants.setTenantId(loginUser.getTenantId());
|
||||||
deviceTypeGrantsMapper.insert(deviceTypeGrants);
|
deviceTypeGrantsMapper.insert(deviceTypeGrants);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -318,13 +333,13 @@ public class DeviceServiceImpl extends ServiceImpl<DeviceMapper, Device> impleme
|
|||||||
|
|
||||||
BeanUtil.copyProperties(deviceForm, device, true);
|
BeanUtil.copyProperties(deviceForm, device, true);
|
||||||
device.setDeviceNo(createDeviceNo());
|
device.setDeviceNo(createDeviceNo());
|
||||||
LoginUser loginUser = LoginHelper.getLoginUser();
|
|
||||||
device.setCurrentOwnerId(loginUser.getUserId());
|
device.setCurrentOwnerId(loginUser.getUserId());
|
||||||
device.setOriginalOwnerId(loginUser.getUserId());
|
device.setOriginalOwnerId(loginUser.getUserId());
|
||||||
device.setCreateByName(loginUser.getNickname());
|
device.setCreateByName(loginUser.getNickname());
|
||||||
device.setTypeName(deviceType.getTypeName());
|
device.setTypeName(deviceType.getTypeName());
|
||||||
device.setDeviceType(deviceType.getId());
|
device.setDeviceType(deviceType.getId());
|
||||||
device.setDevicePic(deviceType.getDevicePic());
|
device.setDevicePic(deviceType.getDevicePic());
|
||||||
|
device.setTenantId(loginUser.getTenantId());
|
||||||
if (device.getDeviceImei() != null) {
|
if (device.getDeviceImei() != null) {
|
||||||
device.setPubTopic("A/" + device.getDeviceImei());
|
device.setPubTopic("A/" + device.getDeviceImei());
|
||||||
device.setSubTopic("B/" + device.getDeviceImei());
|
device.setSubTopic("B/" + device.getDeviceImei());
|
||||||
@ -336,7 +351,7 @@ public class DeviceServiceImpl extends ServiceImpl<DeviceMapper, Device> impleme
|
|||||||
// 查询设备类型的文件列表
|
// 查询设备类型的文件列表
|
||||||
// 4. 核心优化:同步设备类型的文件列表 (一行代码)
|
// 4. 核心优化:同步设备类型的文件列表 (一行代码)
|
||||||
appBusinessFileService.cloneFiles(deviceType.getId(), device.getId());
|
appBusinessFileService.cloneFiles(deviceType.getId(), device.getId());
|
||||||
//同步设备类型的视频列表
|
// 同步设备类型的视频列表
|
||||||
appOperationVideoService.cloneFiles(deviceType.getId(), device.getId());
|
appOperationVideoService.cloneFiles(deviceType.getId(), device.getId());
|
||||||
|
|
||||||
// 新增设备类型记录
|
// 新增设备类型记录
|
||||||
@ -351,10 +366,12 @@ public class DeviceServiceImpl extends ServiceImpl<DeviceMapper, Device> impleme
|
|||||||
assignments.setActive(DeviceActiveStatusEnum.ACTIVE.getCode());
|
assignments.setActive(DeviceActiveStatusEnum.ACTIVE.getCode());
|
||||||
String lever = USER_ID_SEPARATOR + loginUser.getUserId();
|
String lever = USER_ID_SEPARATOR + loginUser.getUserId();
|
||||||
assignments.setLever(lever);
|
assignments.setLever(lever);
|
||||||
|
assignments.setTenantId(loginUser.getTenantId());
|
||||||
deviceAssignmentsService.save(assignments);
|
deviceAssignmentsService.save(assignments);
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
private String createDeviceNo() {
|
private String createDeviceNo() {
|
||||||
String uuidStr = UUID.fastUUID().toString(); // 获取带 - 的标准格式字符串
|
String uuidStr = UUID.fastUUID().toString(); // 获取带 - 的标准格式字符串
|
||||||
return uuidStr.replaceAll("-", "");
|
return uuidStr.replaceAll("-", "");
|
||||||
|
|||||||
Reference in New Issue
Block a user