Parcourir la source

1、调试宝设备 MQTT 登录在线注册表

liweimin il y a 2 semaines
Parent
commit
ca4af5374a

+ 72 - 0
ruoyi-device/src/main/java/com/ruoyi/device/mqtt/handler/DeviceOnlineManager.java

@@ -0,0 +1,72 @@
+package com.ruoyi.device.mqtt.handler;
+
+import com.ruoyi.device.mqtt.vo.DeviceOnlineInfo;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.stereotype.Component;
+
+import java.util.concurrent.ConcurrentHashMap;
+
+/**
+ * 调试宝设备 MQTT 登录在线注册表(deviceSn → 设备信息/用户信息)
+ *
+ * @author lwm
+ */
+@Component
+public class DeviceOnlineManager
+{
+    private static final Logger log = LoggerFactory.getLogger(DeviceOnlineManager.class);
+
+    private final ConcurrentHashMap<Long, DeviceOnlineInfo> onlineMap = new ConcurrentHashMap<>();
+
+    /**
+     * 注册 设备登录信息
+     *
+     * @param info 设备登录信息
+     */
+    public void register(DeviceOnlineInfo info)
+    {
+        if (info == null || info.getDeviceSn() == null)
+        {
+            return;
+        }
+        onlineMap.put(info.getDeviceSn(), info);
+        log.info("设备MQTT登录注册, deviceSn={}, userId={}", info.getDeviceSn(), info.getUserId());
+    }
+
+    /**
+     * 根据设备SN码 获取设备登录信息
+     *
+     * @param deviceSn 设备SN码
+     * @return 设备登录信息
+     */
+    public DeviceOnlineInfo getByDeviceSn(Long deviceSn)
+    {
+        if (deviceSn == null)
+        {
+            return null;
+        }
+        return onlineMap.get(deviceSn);
+    }
+
+    /**
+     * 移除 设备登录信息
+     *
+     * @param deviceSn 设备SN码
+     */
+    public void remove(Long deviceSn)
+    {
+        if (deviceSn == null)
+        {
+            return;
+        }
+        DeviceOnlineInfo removed = onlineMap.remove(deviceSn);
+        if (removed != null)
+        {
+            log.info("设备MQTT在线信息移除, deviceSn={}", deviceSn);
+        } else
+        {
+            log.info("设备MQTT在线信息不存在, deviceSn={}", deviceSn);
+        }
+    }
+}

+ 20 - 0
ruoyi-device/src/main/java/com/ruoyi/device/mqtt/handler/decoder/json/service/DeviceLoginService.java

@@ -17,6 +17,8 @@ import com.ruoyi.device.mqtt.handler.decoder.json.IJsonCmdHandler;
 import com.ruoyi.device.mqtt.vo.CommonHeader;
 import com.ruoyi.device.mqtt.vo.CommonTopic;
 import com.ruoyi.device.service.ITsbUserDeviceService;
+import com.ruoyi.device.mqtt.handler.DeviceOnlineManager;
+import com.ruoyi.device.mqtt.vo.DeviceOnlineInfo;
 import com.ruoyi.framework.web.service.SysPermissionService;
 import com.ruoyi.system.service.ISysUserService;
 import jakarta.annotation.Resource;
@@ -43,6 +45,8 @@ public class DeviceLoginService implements IJsonCmdHandler
     private ISysUserService userService;
     @Resource
     private SysPermissionService permissionService;
+    @Resource
+    private DeviceOnlineManager deviceOnlineManager;
 
     @Override
     public BaseJsonBody handle(CommonTopic topic, CommonHeader header, String bodyJson, CmdTypeEnum cmd)
@@ -116,6 +120,22 @@ public class DeviceLoginService implements IJsonCmdHandler
         }
         Set<String> permissions = permissionService.getMenuPermission(user);
         response.setPermissions(permissions);
+
+        // 4、设备 MQTT 登录成功,注册 deviceSn 在线映射
+        DeviceOnlineInfo onlineInfo = new DeviceOnlineInfo();
+        onlineInfo.setUserId(user.getUserId());
+        onlineInfo.setUserName(user.getUserName());
+        onlineInfo.setPhoneNumber(user.getPhonenumber());
+        onlineInfo.setNickName(user.getNickName());
+        onlineInfo.setRoleName(response.getRoleName());
+        onlineInfo.setPermissions(response.getPermissions());
+        onlineInfo.setDeviceId(bindResult.getDeviceId());
+        onlineInfo.setDeviceSn(request.getDeviceSn());
+        onlineInfo.setDeviceType(request.getDeviceType());
+        onlineInfo.setImei(request.getImei());
+        onlineInfo.setBindTime(bindResult.getBindTime());
+        deviceOnlineManager.register(onlineInfo);
+
         return response;
     }
 

+ 116 - 0
ruoyi-device/src/main/java/com/ruoyi/device/mqtt/vo/DeviceOnlineInfo.java

@@ -0,0 +1,116 @@
+package com.ruoyi.device.mqtt.vo;
+
+import java.util.Date;
+import java.util.Set;
+
+/**
+ * 调试宝设备 MQTT 登录在线信息(以 deviceSn 为 key,因为 deviceSn 是必填的)
+ * 后续使用 deviceSn 获取设备信息/用户信息
+ *
+ * @author lwm
+ */
+public class DeviceOnlineInfo
+{
+    /** 用户信息部分 */
+    private Long userId;
+    private String userName;
+    private String phoneNumber;
+    private String nickName;
+    private String roleName;
+    private Set<String> permissions;
+
+    /** 设备信息部分 */
+    private Long deviceId;
+    private Long deviceSn;
+    private String deviceType;
+    private String imei;
+    private Date bindTime;
+
+    public Long getUserId() {
+        return userId;
+    }
+
+    public void setUserId(Long userId) {
+        this.userId = userId;
+    }
+
+    public String getUserName() {
+        return userName;
+    }
+
+    public void setUserName(String userName) {
+        this.userName = userName;
+    }
+
+    public String getPhoneNumber() {
+        return phoneNumber;
+    }
+
+    public void setPhoneNumber(String phoneNumber) {
+        this.phoneNumber = phoneNumber;
+    }
+
+    public String getNickName() {
+        return nickName;
+    }
+
+    public void setNickName(String nickName) {
+        this.nickName = nickName;
+    }
+
+    public String getRoleName() {
+        return roleName;
+    }
+
+    public void setRoleName(String roleName) {
+        this.roleName = roleName;
+    }
+
+    public Set<String> getPermissions() {
+        return permissions;
+    }
+
+    public void setPermissions(Set<String> permissions) {
+        this.permissions = permissions;
+    }
+
+    public Long getDeviceId() {
+        return deviceId;
+    }
+
+    public void setDeviceId(Long deviceId) {
+        this.deviceId = deviceId;
+    }
+
+    public Long getDeviceSn() {
+        return deviceSn;
+    }
+
+    public void setDeviceSn(Long deviceSn) {
+        this.deviceSn = deviceSn;
+    }
+
+    public String getDeviceType() {
+        return deviceType;
+    }
+
+    public void setDeviceType(String deviceType) {
+        this.deviceType = deviceType;
+    }
+
+    public String getImei() {
+        return imei;
+    }
+
+    public void setImei(String imei) {
+        this.imei = imei;
+    }
+
+    public Date getBindTime() {
+        return bindTime;
+    }
+
+    public void setBindTime(Date bindTime) {
+        this.bindTime = bindTime;
+    }
+}