Ver Fonte

优化一些功能

yangxiaokun há 4 anos atrás
pai
commit
2410f9cb8e

+ 3 - 2
src/main/java/com/zy/bms/common/Constant.java

@@ -17,12 +17,13 @@ public class Constant {
      */
     public static final String M_CODE_REGISTER = "10";//注册
     public static final String M_CODE_RETURN_CODE = "11";//返回授权码
-    public static final String M_CODE_REGISTER_OK = "13";//注册成功
+    public static final String M_CODE_UPLOAD_LOCATION = "20";//设备上传位置信息
     public static final String M_CODE_GPS_RATE = "31";//定位频率
     public static final String M_CODE_SOS = "33";//紧急呼救
     public static final String M_CODE_VOLUME = "34";//音量
     public static final String M_CODE_AUTO_ANSWER = "36";//自动接听
-    public static final String M_CODE_NEWS = "39";//语音播报
+    public static final String M_CODE_NEWS = "39";//语音播报D
+    public static final String M_CODE_UPLOAD_CALL_RECORD = "40";//设备上传通话记录
     public static final String M_CODE_CONTINUE_GPS = "41";//设备连续定位设置
 
     /**

+ 65 - 25
src/main/java/com/zy/bms/config/mqtt/MqttCallbackHandler.java

@@ -1,21 +1,20 @@
 package com.zy.bms.config.mqtt;
 
 import com.alibaba.fastjson.JSON;
+import com.zy.bms.common.Constant;
+import com.zy.bms.common.exception.ApiRuntimeException;
+import com.zy.bms.model.*;
 import com.zy.bms.redis.DeviceManager;
-import com.zy.bms.service.DeviceLocationService;
-import com.zy.bms.service.DeviceService;
-import com.zy.bms.service.SetToDeviceService;
+import com.zy.bms.service.*;
 import com.zy.bms.utils.CodeGenerator;
+import com.zy.bms.utils.CoordTransformUtil;
+import com.zy.bms.utils.DateTimeUtil;
 import com.zy.bms.utils.GaoDeApiUtil;
 import com.zy.bms.websocket.WebSocketServer;
-import com.zy.bms.model.CallRecords;
-import com.zy.bms.model.Device;
-import com.zy.bms.model.DeviceLocation;
-import com.zy.bms.model.MqttMsgDto;
-import com.zy.bms.service.CallRecordsService;
 import org.springframework.stereotype.Component;
 
 import javax.annotation.Resource;
+import java.util.Map;
 
 /**
  * MQTT 消息返回处理类
@@ -29,6 +28,8 @@ public class MqttCallbackHandler {
     @Resource
     private DeviceService deviceService;
     @Resource
+    private SetBaseService setBaseService;
+    @Resource
     private SetToDeviceService setToDeviceService;
     @Resource
     private DeviceLocationService deviceLocationService;
@@ -48,8 +49,6 @@ public class MqttCallbackHandler {
      * @param payload 消息内容
      */
     void handle(String topic, String payload) {
-        System.out.println(payload);
-        System.out.println("------------------------------------------------------");
         if (topic.contains("/")) {
             webSocketServer.massMessage(topic.split("/")[1], payload);
         }
@@ -57,16 +56,13 @@ public class MqttCallbackHandler {
         MqttMsgDto msgObject = JSON.parseObject(payload, MqttMsgDto.class);
         //根据报文标识代码 M 处理消息
         switch (msgObject.getM()) {
-//            case "10"://设备端注册报文
-//                registerDevice(msgObject);
-//                break;
-//            case "12"://设备注册完成
-//                setToDeviceService.registerOK(msgObject.getData().get("deviceid").toString());
-//                break;
-            case "20":// 设备位置信息上报
+            case Constant.M_CODE_REGISTER://设备端注册报文
+                registerDevice(msgObject);
+                break;
+            case Constant.M_CODE_UPLOAD_LOCATION:// 设备位置信息上报
                 LocationHandler(msgObject);
                 break;
-            case "40"://设备上传通话记录
+            case Constant.M_CODE_UPLOAD_CALL_RECORD://设备上传通话记录
                 CallRecordsHandler(msgObject);
                 break;
         }
@@ -79,10 +75,9 @@ public class MqttCallbackHandler {
         String num = obj.getData().get("num").toString();
         //查询数据库中是否有此设备
         Device device = deviceService.getByNum(num);
+        //没有该设备,保存至数据库
         if (device == null) {
-            device = new Device(num, CodeGenerator.generateClientId(), CodeGenerator.generateShortUuid());
-            //没有该设备,保存至数据库
-            deviceService.save(device);
+            device = createDevice(num);
         }
         //发送消息
         setToDeviceService.returnCodeToDevice(device.getNum(), device.getClientId(), device.getPassword());
@@ -91,8 +86,8 @@ public class MqttCallbackHandler {
     /**
      * 处理上传位置
      */
-    private void LocationHandler(MqttMsgDto obj) {
-        DeviceLocation location = new DeviceLocation(obj);
+    private void LocationHandler(MqttMsgDto msg) {
+        DeviceLocation location = MqttMsgToLocation(msg);
         // 逆地理位置解析
         location.setSite(gaoDeApiService.regeo(location.getLonGcj(), location.getLatGcj()));
         // 保存位置信息--历史记录
@@ -107,12 +102,57 @@ public class MqttCallbackHandler {
     private void CallRecordsHandler(MqttMsgDto obj) {
         CallRecords callRecords = new CallRecords();
         callRecords.setDeviceId(obj.getR().split("/")[1]);
-        callRecords.setType((int) obj.getData().get("type"));
-        callRecords.setKey((String) obj.getData().get("key"));
+        callRecords.setCallType((int) obj.getData().get("type"));
+        callRecords.setKeyNum((String) obj.getData().get("key"));
         callRecords.setPhoneNum((String) obj.getData().get("phnoenum"));
         callRecords.setTalkTime((int) obj.getData().get("talktime"));
         callRecords.setEndTime((String) obj.getData().get("endtime"));
         callRecordsService.save(callRecords);
     }
 
+    /**
+     * 创建设备信息,保存设备基础信息以及设置信息
+     *
+     * @param num 设备随机码
+     */
+    private Device createDevice(String num) {
+        Device device = new Device();
+        device.setNum(num);
+        device.setClientId(CodeGenerator.generateClientId());
+        device.setPassword(CodeGenerator.generateShortUuid());
+        device.setGroupId(1);
+        deviceService.save(device);
+        setBaseService.initSetBase(device.getClientId());
+        return device;
+    }
+
+    /**
+     * 解析信息转为位置对象
+     */
+    private DeviceLocation MqttMsgToLocation(MqttMsgDto msg) {
+        try {
+            DeviceLocation location = new DeviceLocation();
+            Map<String, Object> dataMap = msg.getData();
+            location.setDeviceId(msg.getR().split("/")[1]);
+            location.setBatteryNum((int) dataMap.get("batterynum"));
+            location.setSignalNum((int) dataMap.get("signalnum"));
+            location.setMode((int) dataMap.get("mode"));
+            location.setLon((String) dataMap.get("lon"));
+            location.setLon((String) dataMap.get("lat"));
+            location.setSpeed((String) dataMap.get("speed"));
+            location.setNum((int) dataMap.get("num"));
+            location.setUploadTime(DateTimeUtil.strToTime((String) dataMap.get("createtime")));
+            Object cellInfo = dataMap.get("cellInfo");
+            if (cellInfo != null) {
+                location.setCellInfo(cellInfo.toString());
+            }
+            //转换后的坐标
+            String[] gcj = CoordTransformUtil.wgs84toGcj02(location.getLon(), location.getLat());
+            location.setLonGcj(gcj[0]);
+            location.setLatGcj(gcj[1]);
+            return location;
+        } catch (Exception e) {
+            throw new ApiRuntimeException("处理设备上传位置定位信息出错");
+        }
+    }
 }

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

@@ -31,8 +31,7 @@ public class MqttConsumerCfg {
     private MqttPahoClientFactory mqttClientFactory;
 
     //默认监听主题
-//    private final String[] defaultTopic = new String[]{"$regdtx", "$dtx/#", "HelloWrold"};
-    private final String[] defaultTopic = new String[]{"$regdtx", "$dtx/76f7c742428b4720b363d95d8292b357","$drx/76f7c742428b4720b363d95d8292b357"};
+    private final String[] defaultTopic = new String[]{"$regdtx", "$dtx/#", "$drx/#"};
 
     /**
      * MQTT 消息订阅绑定(消费者)

+ 1 - 2
src/main/java/com/zy/bms/config/mqtt/MqttProducerCfg.java

@@ -41,8 +41,7 @@ public class MqttProducerCfg {
         // 设置异步发送,默认是false(发送时阻塞)
         messageHandler.setAsync(true);
         // 设置默认的服务质量
-        messageHandler.setDefaultQos(1);
-        // messageHandler.setDefaultTopic(producerDefaultTopic);
+        messageHandler.setDefaultQos(0);
         messageHandler.setDefaultRetained(false);
         return messageHandler;
     }

+ 1 - 1
src/main/java/com/zy/bms/controller/SetController.java

@@ -35,7 +35,7 @@ public class SetController {
      * 设置定位频率
      */
     @PostMapping("gpsRate.do")
-    public ServerResponse setNetwork(GpsRateSetIO io) {
+    public ServerResponse gpsRate(GpsRateSetIO io) {
         setService.setGpsRate(io);
         return ServerResponse.createBySuccess();
     }

+ 2 - 2
src/main/java/com/zy/bms/model/CallRecords.java

@@ -24,12 +24,12 @@ public class CallRecords {
     /**
      * 1:播出 2:接听
      */
-    private Integer type;
+    private Integer callType;
 
     /**
      * key1,key1,service
      */
-    private String key;
+    private String keyNum;
 
     /**
      * 通话号码

+ 0 - 17
src/main/java/com/zy/bms/model/Device.java

@@ -12,7 +12,6 @@ import java.time.LocalDateTime;
  */
 @Data
 @TableName("zy_device")
-@NoArgsConstructor
 public class Device {
     @TableId
     private Integer id;
@@ -40,20 +39,4 @@ public class Device {
 
     //设备名
     private String name;
-
-    /**
-     * 注册设备构造器
-     *
-     * @param clientId MQTT 客户端ID
-     * @param password MQTT 密码
-     */
-    public Device(String num, String clientId, String password) {
-        this.num = num;
-        this.clientId = clientId;
-        this.password = password;
-        this.createTime = LocalDateTime.now();
-        this.tags = "";
-        this.status = 0;
-        this.groupId = 1;
-    }
 }

+ 0 - 24
src/main/java/com/zy/bms/model/DeviceLocation.java

@@ -2,13 +2,9 @@ package com.zy.bms.model;
 
 import com.baomidou.mybatisplus.annotation.TableId;
 import com.baomidou.mybatisplus.annotation.TableName;
-import com.zy.bms.utils.CoordTransformUtil;
-import com.zy.bms.utils.DateTimeUtil;
 import lombok.Data;
-import lombok.NoArgsConstructor;
 
 import java.time.LocalDateTime;
-import java.time.format.DateTimeFormatter;
 
 /**
  * 设备定位相关
@@ -16,7 +12,6 @@ import java.time.format.DateTimeFormatter;
  */
 @Data
 @TableName("zy_location")
-@NoArgsConstructor
 public class DeviceLocation {
 
     @TableId
@@ -92,23 +87,4 @@ public class DeviceLocation {
      */
     private String cellInfo;
 
-
-    public DeviceLocation(MqttMsgDto obj) {
-        this.deviceId = obj.getR().split("/")[1];
-        this.batteryNum = (int) obj.getData().get("batterynum");
-        this.signalNum = (int) obj.getData().get("signalnum");
-        this.mode = (int) obj.getData().get("mode");
-        this.lon = obj.getData().get("lon").toString();
-        this.lat = obj.getData().get("lat").toString();
-        this.speed = obj.getData().get("speed").toString();
-        this.num = (int) obj.getData().get("num");
-        this.uploadTime = LocalDateTime.parse(obj.getData().get("createtime").toString(),
-                DateTimeFormatter.ofPattern(DateTimeUtil.Pattern_YDMHMS));
-        this.createTime = LocalDateTime.now();
-        this.cellInfo = obj.getData().get("cellInfo").toString();
-        //转换后的坐标
-        String[] gcj = CoordTransformUtil.wgs84toGcj02(this.lon, this.lat);
-        this.lonGcj = gcj[0];
-        this.latGcj = gcj[1];
-    }
 }

+ 13 - 0
src/main/java/com/zy/bms/service/SetBaseService.java

@@ -17,6 +17,7 @@ import org.springframework.stereotype.Service;
 public class SetBaseService extends ServiceImpl<SetBaseMapper, SetBase> {
 
     /**
+     * 后台
      * 获取全部的设置信息
      *
      * @param deviceId 设备ID
@@ -27,6 +28,18 @@ public class SetBaseService extends ServiceImpl<SetBaseMapper, SetBase> {
         return baseMapper.selectOne(queryWrapper);
     }
 
+    /**
+     * 设备刚注册时,调用此方法,初始化创建设置相关关联关系
+     *
+     * @param deviceId 设备ID
+     */
+    public void initSetBase(String deviceId) {
+        QueryWrapper<SetBase> queryWrapper = new QueryWrapper<>();
+        queryWrapper.eq("deviceId", deviceId);
+        SetBase setBase = new SetBase();
+        setBase.setDeviceId(deviceId);
+        this.saveOrUpdate(setBase, queryWrapper);
+    }
 
     /**
      * 获取音量设置信息

+ 2 - 20
src/main/java/com/zy/bms/service/SetToDeviceService.java

@@ -23,7 +23,7 @@ public class SetToDeviceService {
 
     /**
      * 设置音量
-     *
+     * 铃声音量暂时不可用 ringvol 参数暂时没用
      * @param io 设置参数
      */
     public void setVolume(VolumeSetIO io) {
@@ -31,7 +31,7 @@ public class SetToDeviceService {
         MqttMsgDto msg = new MqttMsgDto(Constant.M_CODE_VOLUME, io.getDeviceId());
         msg.set("msgvol", io.getMsgVol())
                 .set("phonevol", io.getPhoneVol())
-                .set("ringvol", io.getRingVol());
+                .set("msgtype", "1");
         mqttGateway.sendMsgToMqtt(msg.toJson(), io.getTopic());
     }
 
@@ -116,22 +116,4 @@ public class SetToDeviceService {
         msg.setData(data);
         mqttGateway.sendMsgToMqtt(msg.toJson(), Constant.TOPIC_REGISTER_CLIENT);
     }
-
-    /**
-     * 注册完成
-     *
-     * @param clientId MQTT 客户端码
-     */
-    public void registerOK(String clientId) {
-        //发送模板消息给设备
-        MqttMsgDto msg = new MqttMsgDto();
-        msg.setM(Constant.M_CODE_REGISTER_OK);
-        msg.setR("$regdtx");
-        msg.setT("$regdrx");
-        Map<String, Object> data = new HashMap<>();
-        data.put("deviceid", clientId);
-        msg.setData(data);
-        mqttGateway.sendMsgToMqtt(msg.toJson(), Constant.TOPIC_REGISTER_CLIENT);
-    }
-
 }

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

@@ -16,7 +16,7 @@ public class CoordTransformUtil {
     private static final double PI = 3.1415926535897932384626;
     private static final double a = 6378245.0;
     private static final double ee = 0.00669342162296594323;
-    private static final DecimalFormat decimalFormat = new DecimalFormat("#.0000000");//保留七位
+    private static final DecimalFormat decimalFormat = new DecimalFormat("#.000000");//保留七位
 
     /**
      * WGS84转GCj02

+ 12 - 0
src/main/java/com/zy/bms/utils/DateTimeUtil.java

@@ -1,5 +1,8 @@
 package com.zy.bms.utils;
 
+import java.time.LocalDateTime;
+import java.time.format.DateTimeFormatter;
+
 /**
  * 时间格式化工具类
  *
@@ -9,4 +12,13 @@ package com.zy.bms.utils;
 public class DateTimeUtil {
 
     public static final String Pattern_YDMHMS = "yyyy-MM-dd HH:mm:ss";
+
+    /**
+     * 字符串转时间
+     *
+     * @param str 字符串
+     */
+    public static LocalDateTime strToTime(String str) {
+        return LocalDateTime.parse(str, DateTimeFormatter.ofPattern(DateTimeUtil.Pattern_YDMHMS));
+    }
 }