PushCallback.java 9.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231
  1. package com.template.model.mqtt;
  2. import com.alibaba.fastjson.JSONObject;
  3. import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
  4. import com.baomidou.mybatisplus.core.toolkit.ObjectUtils;
  5. import com.template.common.utils.MessageDecryptUtil;
  6. import com.template.model.pojo.AlarmMessage;
  7. import com.template.model.pojo.HouseLock;
  8. import com.template.model.pojo.HouseNumber;
  9. import com.template.model.pojo.UnlockingRecord;
  10. import com.template.services.impl.AlarmMessageServiceImpl;
  11. import com.template.services.impl.HouseLockServiceImpl;
  12. import com.template.services.impl.HouseNumberServiceImpl;
  13. import com.template.services.impl.UnlockingRecordServiceImpl;
  14. import lombok.extern.slf4j.Slf4j;
  15. import org.eclipse.paho.client.mqttv3.IMqttDeliveryToken;
  16. import org.eclipse.paho.client.mqttv3.MqttCallback;
  17. import org.eclipse.paho.client.mqttv3.MqttMessage;
  18. import org.springframework.stereotype.Component;
  19. import java.text.SimpleDateFormat;
  20. import java.time.LocalDateTime;
  21. import java.time.format.DateTimeFormatter;
  22. import java.util.List;
  23. @Slf4j
  24. @Component
  25. public class PushCallback implements MqttCallback {
  26. private MqttPushClient client;
  27. private MqttConfiguration mqttConfiguration;
  28. public PushCallback(MqttPushClient client ,MqttConfiguration mqttConfiguration) {
  29. this.client = client;
  30. this.mqttConfiguration = mqttConfiguration;
  31. }
  32. @Override
  33. public void connectionLost(Throwable cause) {
  34. /** 连接丢失后,一般在这里面进行重连 **/
  35. if(client != null) {
  36. while (true) {
  37. try {
  38. log.info("==============》》》[MQTT] 连接断开,30S之后尝试重连...");
  39. Thread.sleep(30000);
  40. // MqttPushClient mqttPushClient = new MqttPushClient();
  41. // mqttPushClient.connect(mqttConfiguration);
  42. if(MqttPushClient.getClient().isConnected()){
  43. log.info("=============>>重连成功");
  44. break;
  45. }
  46. // break;
  47. //重连
  48. client.reconnect();
  49. // 订阅
  50. // client.subscribe();
  51. } catch (Exception e) {
  52. log.error("=============>>>[MQTT] 连接断开,重连失败!<<=============");
  53. continue;
  54. }
  55. }
  56. }
  57. // log.info(cause.getMessage());
  58. // System.out.println("cause = " + cause);
  59. }
  60. @Override
  61. public void deliveryComplete(IMqttDeliveryToken token) {
  62. //publish后会执行到这里
  63. log.info("publish后会执行到这里");
  64. log.info("pushComplete==============>>>" + token.isComplete());
  65. }
  66. /**
  67. * 监听对应的主题消息
  68. * @param topic
  69. * @param message
  70. * @throws Exception
  71. */
  72. @Override
  73. public void messageArrived(String topic, MqttMessage message) throws Exception {
  74. // subscribe后得到的消息会执行到这里面
  75. String Payload = new String(message.getPayload());
  76. log.info("============》》接收消息主题 : " + topic);
  77. log.info("============》》接收消息Qos : " + message.getQos());
  78. log.info("============》》接收消息内容 : " + Payload);
  79. log.info("============》》接收ID : " + message.getId());
  80. log.info("接收数据结束 下面可以执行数据处理操作");
  81. try {
  82. //实例化入库方法 这里就用到SpringUtil类 来手动的注入
  83. HouseLockServiceImpl houseLockService = SpringUtil.getBean(HouseLockServiceImpl.class);
  84. HouseNumberServiceImpl houseNumberService = SpringUtil.getBean(HouseNumberServiceImpl.class);
  85. UnlockingRecordServiceImpl unlockingRecordService = SpringUtil.getBean(UnlockingRecordServiceImpl.class);
  86. AlarmMessageServiceImpl alarmMessageService = SpringUtil.getBean(AlarmMessageServiceImpl.class);
  87. System.out.println("topic:" + topic);
  88. System.out.println("Qos:" + message.getQos());
  89. System.out.println("message content:" + new String(message.getPayload()));
  90. JSONObject s = MessageDecryptUtil.decryptMessage(message.toString(), "6edfcc178c0f415d8e6628238761976f", "2d00b258183146c0a2b19f55250c4596");
  91. String protocol = s.getString("protocol");
  92. // 设备消息上报
  93. if ("2".equals(protocol)) {
  94. UnlockingRecord unlockingRecord = new UnlockingRecord();
  95. unlockingRecord.setType("消息类型");
  96. String data = s.getString("data");
  97. System.out.println("data = " + data);
  98. JSONObject jsonObject = JSONObject.parseObject(data);
  99. System.out.println("jsonObject = " + jsonObject);
  100. // 结果
  101. String result = jsonObject.getString("result");
  102. // 时间
  103. String messageTime = jsonObject.getString("messageTime");
  104. // 房间luid
  105. String luid = jsonObject.getString("luid");
  106. // 找到房间号
  107. LambdaQueryWrapper<HouseLock> WrapperHL = new LambdaQueryWrapper<>();
  108. WrapperHL.eq(HouseLock::getEquipmentType, luid);
  109. List<HouseLock> list = houseLockService.list(WrapperHL);
  110. if (ObjectUtils.isNotEmpty(list) && list.size() > 0) {
  111. HouseLock houseLock = list.get(0);
  112. Integer houseNumberId = houseLock.getHouseNumberId();
  113. HouseNumber byId = houseNumberService.getById(houseNumberId);
  114. if (ObjectUtils.isNotEmpty(byId)) {
  115. String roomNumber = byId.getRoomNumber();
  116. unlockingRecord.setRoomNumber(roomNumber);
  117. unlockingRecord.setHouseNumberId(houseNumberId);
  118. }
  119. }
  120. // 消息类型
  121. String messageType = jsonObject.getString("messageType");
  122. SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
  123. String format = sdf.format(Long.valueOf(messageTime));
  124. unlockingRecord.setDateTime(format);
  125. if ("1".equals(messageType)) {
  126. //密码开锁
  127. unlockingRecord.setUnlockType("密码开锁");
  128. } else if ("2".equals(messageType)) {
  129. // 远程开锁
  130. unlockingRecord.setUnlockType("远程开锁");
  131. } else if ("3".equals(messageType)) {
  132. //无网络密码开锁
  133. unlockingRecord.setUnlockType("无网络密码开锁");
  134. } else if ("5".equals(messageType)) {
  135. //人脸开锁
  136. unlockingRecord.setUnlockType("人脸开锁");
  137. } else if ("10".equals(messageType)) {
  138. // 电池电量更新
  139. unlockingRecord.setUnlockType("电池电量更新");
  140. }
  141. DateTimeFormatter dateTimeFormatter1 = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");
  142. unlockingRecord.setCreateTime(LocalDateTime.now().format(dateTimeFormatter1));
  143. unlockingRecord.setUpdateTime(LocalDateTime.now().format(dateTimeFormatter1));
  144. unlockingRecord.setCreateUser("1");
  145. unlockingRecord.setUpdateUser("1");
  146. unlockingRecordService.getSave(unlockingRecord);
  147. } else if ("3".equals(protocol)) {
  148. AlarmMessage alarmMessage = new AlarmMessage();
  149. String data = s.getString("data");
  150. JSONObject jsonObject = JSONObject.parseObject(data);
  151. // 消息类型
  152. String messageType = jsonObject.getString("messageType");
  153. // 时间
  154. String messageTime = jsonObject.getString("messageTime");
  155. SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
  156. String format = sdf.format(Long.valueOf(messageTime));
  157. alarmMessage.setMessageTime(format);
  158. // 房间luid
  159. String luid = jsonObject.getString("luid");
  160. // 找到房间号
  161. LambdaQueryWrapper<HouseLock> WrapperHL = new LambdaQueryWrapper<>();
  162. WrapperHL.eq(HouseLock::getEquipmentType, luid);
  163. List<HouseLock> list = houseLockService.list(WrapperHL);
  164. if (ObjectUtils.isNotEmpty(list) && list.size() > 0) {
  165. HouseLock houseLock = list.get(0);
  166. Integer houseNumberId = houseLock.getHouseNumberId();
  167. HouseNumber byId = houseNumberService.getById(houseNumberId);
  168. if (ObjectUtils.isNotEmpty(byId)) {
  169. String roomNumber = byId.getRoomNumber();
  170. alarmMessage.setRoomNumber(roomNumber);
  171. }
  172. }
  173. if ("5".equals(messageType)) {
  174. // 低电量
  175. alarmMessage.setMessageType("低电量");
  176. } else if ("1".equals(messageType)) {
  177. alarmMessage.setMessageType("密码错误(连续失败五次)");
  178. } else if ("4".equals(messageType)) {
  179. alarmMessage.setMessageType("防拆告警");
  180. }
  181. DateTimeFormatter dateTimeFormatter1 = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");
  182. alarmMessage.setCreateTime(LocalDateTime.now().format(dateTimeFormatter1));
  183. alarmMessage.setUpdateTime(LocalDateTime.now().format(dateTimeFormatter1));
  184. alarmMessage.setCreateUser("1");
  185. alarmMessage.setUpdateUser("1");
  186. alarmMessageService.getSave(alarmMessage);
  187. }
  188. }catch (Exception e){
  189. e.printStackTrace();
  190. }
  191. }
  192. }