SetService.java 4.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134
  1. package com.zy.bms.service;
  2. import com.zy.bms.common.Constant;
  3. import com.zy.bms.common.dto.MqttMsgDto;
  4. import com.zy.bms.config.mqtt.MqttGateway;
  5. import com.zy.bms.model.Device;
  6. import com.zy.bms.model.SetBase;
  7. import com.zy.bms.model.News;
  8. import com.zy.bms.utils.BeanUtil;
  9. import com.zy.bms.common.io.wechat.*;
  10. import com.zy.bms.websocket.WebSocketServer;
  11. import org.springframework.stereotype.Component;
  12. import javax.annotation.Resource;
  13. import java.util.HashMap;
  14. import java.util.Map;
  15. /**
  16. * 设备设置 Service
  17. *
  18. * @author chen_yi
  19. * Create on 2021/3/27
  20. */
  21. @Component
  22. public class SetService {
  23. @Resource
  24. private SetBaseService setBaseService;
  25. @Resource
  26. private SetNewsService setNewsService;
  27. @Resource
  28. private MqttGateway mqttGateway;
  29. @Resource
  30. private MqttLogService mqttLogService;
  31. @Resource
  32. private WebSocketServer webSocketServer;
  33. /**
  34. * 设置设备
  35. *
  36. * @param code 设置指令
  37. * @param io 设置信息
  38. */
  39. public void set(String code, SetIO io) {
  40. MqttMsgDto msgDto = getMqttMsgDtoByCode(code, io);
  41. // 1. 向设备发送设置指令
  42. mqttGateway.sendMsgToMqtt(msgDto.toJson(), io.getTopic());
  43. // 2. 设置信息保存至数据库
  44. saveToDataBase(code, io);
  45. // 3. 存储消息日志
  46. mqttLogService.saveLog(io.getTopic(), msgDto.toJson(), 1);
  47. // 4. 消息转发前端webSocket
  48. String deviceId = io.getTopic().split("/")[1];
  49. webSocketServer.massMessage(deviceId, msgDto.toJson());
  50. }
  51. /**
  52. * 服务器返回授权码
  53. */
  54. public void returnCodeToDevice(Device device) {
  55. //发送模板消息给设备
  56. MqttMsgDto msgDto = new MqttMsgDto();
  57. msgDto.setM(Constant.M_CODE_RETURN_CODE);
  58. msgDto.setR(Constant.TOPIC_REGISTER_CLIENT);
  59. msgDto.setT(Constant.TOPIC_REGISTER_SERVER);
  60. Map<String, Object> data = new HashMap<>();
  61. data.put("regnum", device.getNum());
  62. data.put("deviceid", device.getClientId());
  63. data.put("password", device.getPassword());
  64. msgDto.setData(data);
  65. // 3. 存储消息日志
  66. mqttLogService.saveLog(Constant.TOPIC_REGISTER_CLIENT, msgDto.toJson(), 1);
  67. }
  68. /**
  69. * 存储至数据库
  70. */
  71. private void saveToDataBase(String code, SetIO io) {
  72. //发送语音播报单独处理
  73. if (code.equals(Constant.M_CODE_NEWS)) {
  74. News entity = BeanUtil.cast(io, News.class);
  75. setNewsService.save(entity);
  76. } else {
  77. SetBase entity = BeanUtil.cast(io, SetBase.class);
  78. setBaseService.updateByDeviceId(entity);
  79. }
  80. }
  81. /**
  82. * 组装需要发送的模板消息
  83. *
  84. * @param code 协议中 M 值
  85. * @param io 设置信息
  86. * @return 模板消息对象
  87. */
  88. private MqttMsgDto getMqttMsgDtoByCode(String code, SetIO io) {
  89. MqttMsgDto result = new MqttMsgDto(code, io.getDeviceId());
  90. switch (code) {
  91. //自动接听
  92. case Constant.M_CODE_AUTO_ANSWER: {
  93. result.set("autoanswer", io.getAutoAnswer());
  94. break;
  95. }
  96. //音量
  97. case Constant.M_CODE_VOLUME: {
  98. result.set("msgvol", io.getMsgVol()).set("phonevol", io.getPhoneVol()).set("msgtype", 1);
  99. break;
  100. }
  101. //定位频率
  102. case Constant.M_CODE_GPS_RATE: {
  103. result.set("GPS_rate", io.getGpsRate());
  104. break;
  105. }
  106. //语音播报
  107. case Constant.M_CODE_NEWS: {
  108. result.set("newstype", io.getNewsType()).set("newstime", io.getNewsTime()).set("news", io.getNews());
  109. break;
  110. }
  111. //SOS紧急呼叫
  112. case Constant.M_CODE_SOS: {
  113. result.set("key0_name", io.getKey0Name()).set("key0_phone", io.getKey0Phone())
  114. .set("key1_name", io.getKey1Name()).set("key1_phone", io.getKey1Phone())
  115. .set("key2_name", io.getKey2Name()).set("key2_phone", io.getKey2Phone());
  116. break;
  117. }
  118. //持续定位
  119. case Constant.M_CODE_CONTINUE_GPS: {
  120. result.set("highfreq", io.getHighFreq());
  121. break;
  122. }
  123. }
  124. return result;
  125. }
  126. }