Browse Source

完成项目和设备组配置

yangxiaokun 3 years ago
parent
commit
b77cf18c2d

+ 9 - 0
src/main/java/com/zy/bms/common/Constant.java

@@ -8,6 +8,15 @@ package com.zy.bms.common;
  */
 public class Constant {
 
+    public static class WX {
+        /**
+         * 微信小程序登录相关配置
+         */
+        public static final String wxAppId = "wxe90699b45e28a0b6";// 小程序唯一标识
+        public static final String wxSecret = "66690a1ffcfe7f1d85a6dcfa38791f25";//小程序的 app secret
+        public static final String grant_type = "authorization_code"; // 授权(必填)
+    }
+
     /**
      * 前缀
      */

+ 2 - 7
src/main/java/com/zy/bms/config/mqtt/MqttConsumerCfg.java

@@ -32,7 +32,7 @@ public class MqttConsumerCfg {
     private MqttPahoClientFactory mqttClientFactory;
 
     //默认监听主题
-    private final String[] defaultTopic = new String[]{"$regdtx2", "$dtx2/#"};
+    private final String[] defaultTopic = new String[]{"$regdtx2", "$dtx2/#", "$dtxlp/#"};
 
     /**
      * MQTT 消息订阅绑定(消费者)
@@ -47,12 +47,7 @@ public class MqttConsumerCfg {
         adapter.setCompletionTimeout(5000);
         // 配置默认Paho消息转换器(qos=0, retain=false, charset=UTF-8)
         adapter.setConverter(new DefaultPahoMessageConverter());
-        /*
-            设置服务质量
-            0 最多一次,数据可能丢失;
-            1 至少一次,数据可能重复;
-            2 只有一次,有且只有一次;最耗性能;
-         */
+        // 设置服务质量 0 最多一次,数据可能丢失; 1 至少一次,数据可能重复; 2 只有一次,有且只有一次;最耗性能;
         adapter.setQos(0);
         // 设置订阅通道
         adapter.setOutputChannel(mqttInboundChannel());

+ 24 - 20
src/main/java/com/zy/bms/controller/UserController.java

@@ -1,7 +1,11 @@
 package com.zy.bms.controller;
 
 
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
 import com.zy.bms.common.ServerResponse;
+import com.zy.bms.entity.User;
+import com.zy.bms.service.IUserService;
+import com.zy.bms.utils.AesUtil;
 import org.springframework.web.bind.annotation.PostMapping;
 import org.springframework.web.bind.annotation.RequestMapping;
 
@@ -10,9 +14,7 @@ import org.springframework.web.bind.annotation.RestController;
 import javax.annotation.Resource;
 
 /**
- * <p>
  * 用户表 前端控制器
- * </p>
  *
  * @author yangxiaokun
  * @since 2021-06-03
@@ -20,23 +22,25 @@ import javax.annotation.Resource;
 @RestController
 @RequestMapping("/bms/api/ubiapp")
 public class UserController {
-//    @Resource
+    @Resource
+    private IUserService userService;
 
-
-//    /**
-//     * 微信登录
-//     *
-//     * @param code 微信登录凭证
-//     * @return 用户openId
-//     */
-//    @PostMapping("login.do")
-//    public ServerResponse login(String code) {
-//        String openId = userService.getWxAppId(code);
-//        if (openId == null) return ServerResponse.createByError();
-//        //保存新用户
-//        if (userService.getByOpenId(openId) == null) {
-//            userService.save(new User(openId));
-//        }
-//        return ServerResponse.createBySuccess(AesUtils.encrypt(openId));
-//    }
+    /**
+     * 微信登录
+     *
+     * @param code 微信登录凭证
+     * @return 用户openId
+     */
+    @PostMapping("login.do")
+    public ServerResponse login(String code) {
+        String openId = userService.getWxAppId(code);
+        if (openId == null) return ServerResponse.error();
+        //保存新用户
+        if (userService.getOne(new QueryWrapper<User>().eq("open_id", openId)) == null) {
+            User user = new User();
+            user.setOpenId(openId);
+            userService.save(user);
+        }
+        return ServerResponse.success(AesUtil.encrypt(openId));
+    }
 }

+ 5 - 0
src/main/java/com/zy/bms/entity/User.java

@@ -32,6 +32,11 @@ public class User implements Serializable {
      */
     private String username;
 
+    /**
+     * 用户名
+     */
+    private String openId;
+
     /**
      * 密码
      */

+ 9 - 12
src/main/java/com/zy/bms/handler/MqttCallbackHandler.java

@@ -29,7 +29,7 @@ public class MqttCallbackHandler {
     @Resource
     private ILogsService logsService;
     @Resource
-    private IDeviceBaseService deviceStaticService;
+    private IDeviceBaseService deviceBaseService;
     @Resource
     private UbiHandlers ubiHandlers;
     @Resource
@@ -44,33 +44,30 @@ public class MqttCallbackHandler {
     public void handle(String topic, String payload) {
         //设备码
         String openNum = Constant.splitOpenNum(topic);
+        //解析数据
         MqttDTO mqttDTO = MqttDTO.parse(payload);
         // 1. 存储日志 --- 接收
         logsService.saveReceive(topic, payload);
         // 2. 根据报文标识代码 M 处理消息
         switch (mqttDTO.getM()) {
-            //设备端注册报文
-            case Constant.M.REGISTER: {
+            case Constant.M.REGISTER: {//设备端注册报文
                 registerHandler(mqttDTO);
                 break;
             }
-            // 心跳包
-            case Constant.M.UBI_HEARTBEAT: {
+            case Constant.M.UBI_HEARTBEAT: {// 心跳包
                 ubiHandlers.heartbeatHandler(openNum, mqttDTO);
                 break;
             }
-            // 获取设备设置信息
-            case Constant.M.UBI_SET_INFO: {
+            case Constant.M.UBI_SET_INFO: {// 获取设备设置信息
                 ubiHandlers.deviceSetHandler(openNum, mqttDTO);
                 break;
             }
-            // 获取设备设置信息
-            case Constant.M.LP_HEARTBEAT: {
+            case Constant.M.LP_HEARTBEAT: {// 获取设备设置信息
                 lpHandlers.deviceInfoHandler(openNum, mqttDTO);
                 break;
             }
         }
-        // 3. 转发消息至网页,忽略注册的报文
+        // 3. 转发消息至网页
         webSocketHandler.massMessage(openNum, payload);
     }
 
@@ -80,7 +77,7 @@ public class MqttCallbackHandler {
     private void registerHandler(MqttDTO mqttDTO) {
         String openNum = mqttDTO.getString("regnum");
         // 查询数据库中是否有此设备
-        DeviceBase device = deviceStaticService.getOne(new QueryWrapper<DeviceBase>().eq("open_num", openNum));
+        DeviceBase device = deviceBaseService.getOne(new QueryWrapper<DeviceBase>().eq("open_num", openNum));
         // 没有该设备,保存至数据库
         if (device == null) {
             device = new DeviceBase();
@@ -90,7 +87,7 @@ public class MqttCallbackHandler {
             device.setUsername("IMEI" + openNum);
             device.setPassword(MD5Util.encode(openNum));
             device.setSn("SN" + openNum);
-            deviceStaticService.save(device);
+            deviceBaseService.save(device);
         }
         // mqtt服务器注册用户
         RabbitMQApi.register(device.getUsername(), device.getPassword());

+ 1 - 0
src/main/java/com/zy/bms/service/ILogsService.java

@@ -3,6 +3,7 @@ package com.zy.bms.service;
 import com.baomidou.mybatisplus.core.metadata.IPage;
 import com.baomidou.mybatisplus.extension.service.IService;
 import com.zy.bms.entity.Logs;
+import com.zy.bms.pojo.dto.MqttDTO;
 import com.zy.bms.pojo.io.LogsIO;
 import com.zy.bms.pojo.vo.LogsVo;
 

+ 4 - 0
src/main/java/com/zy/bms/service/IUserService.java

@@ -15,4 +15,8 @@ import java.util.List;
  */
 public interface IUserService extends IService<User> {
 
+    /**
+     * 通过微信传来的code 换取 appid
+     */
+    String getWxAppId(String code);
 }

+ 3 - 7
src/main/java/com/zy/bms/service/impl/LogsService.java

@@ -44,18 +44,14 @@ public class LogsService extends ServiceImpl<LogsMapper, Logs> implements ILogsS
      *
      * @param topic   主题
      * @param content 内容
-     * @param type    类型
+     * @param type    类型 0:接收 1:发送
      */
     private void saveCommon(String topic, String content, Integer type) {
         MqttDTO tmp = MqttDTO.parse(content);
         //创建日志对象
         Logs entity = Logs.builder().topic(topic).type(type).m(tmp.getM()).content(content).build();
-        //区分注册报文和普通报文,注册报文取设备随机码
-        if (entity.getM().equals(Constant.M.REGISTER) || entity.getM().equals(Constant.M.HANDLE_REGISTER)) {
-            entity.setOpenNum(tmp.getString("regnum"));
-        } else {
-            entity.setOpenNum(Constant.splitOpenNum(topic));
-        }
+        String openNum = Constant.splitOpenNum(topic);
+        entity.setOpenNum(openNum == null ? tmp.getString("regnum") : openNum);
         baseMapper.insert(entity);
     }
 }

+ 19 - 2
src/main/java/com/zy/bms/service/impl/UserServiceImpl.java

@@ -1,16 +1,19 @@
 package com.zy.bms.service.impl;
 
+import com.alibaba.fastjson.JSONObject;
+import com.zy.bms.common.Constant;
 import com.zy.bms.entity.User;
 import com.zy.bms.mapper.UserMapper;
 import com.zy.bms.service.IUserService;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.zy.bms.utils.HttpUtil;
 import org.springframework.stereotype.Service;
+import org.springframework.util.LinkedMultiValueMap;
+import org.springframework.util.MultiValueMap;
 
 
 /**
- * <p>
  * 用户表 服务实现类
- * </p>
  *
  * @author yangxiaokun
  * @since 2021-06-03
@@ -18,4 +21,18 @@ import org.springframework.stereotype.Service;
 @Service
 public class UserServiceImpl extends ServiceImpl<UserMapper, User> implements IUserService {
 
+    public String getWxAppId(String code) {
+        try {
+            // 请求参数
+            MultiValueMap<String, String> paramsMap = new LinkedMultiValueMap<>();
+            paramsMap.add("appid", Constant.WX.wxAppId);
+            paramsMap.add("secret", Constant.WX.wxSecret);
+            paramsMap.add("js_code", code);
+            paramsMap.add("grant_type", Constant.WX.grant_type);
+            String message = HttpUtil.post("https://api.weixin.qq.com/sns/jscode2session", null, paramsMap);
+            return JSONObject.parseObject(message).getString("openid");
+        } catch (Exception e) {
+            return null;
+        }
+    }
 }

+ 3 - 1
src/main/java/com/zy/bms/utils/RabbitMQApi.java

@@ -1,6 +1,7 @@
 package com.zy.bms.utils;
 
 import com.alibaba.fastjson.JSON;
+import lombok.extern.slf4j.Slf4j;
 import org.springframework.http.HttpHeaders;
 
 import java.util.HashMap;
@@ -12,6 +13,7 @@ import java.util.Map;
  * @author yang xiao kun
  * create on 2021/5/14
  */
+@Slf4j
 public class RabbitMQApi {
     /**
      * 向 MQTT 服务器申请用户,供设备进行登录
@@ -42,7 +44,7 @@ public class RabbitMQApi {
                 }
                 count++;
             } catch (InterruptedException e) {
-                e.printStackTrace();
+                log.error("向 MQTT 服务器申请用户失败", e);
                 break;
             }
         }