package com.template.model.mqtt; import com.alibaba.fastjson.JSONObject; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.core.toolkit.ObjectUtils; import com.template.common.utils.MessageDecryptUtil; import com.template.model.pojo.AlarmMessage; import com.template.model.pojo.HouseLock; import com.template.model.pojo.HouseNumber; import com.template.model.pojo.UnlockingRecord; import com.template.services.impl.AlarmMessageServiceImpl; import com.template.services.impl.HouseLockServiceImpl; import com.template.services.impl.HouseNumberServiceImpl; import com.template.services.impl.UnlockingRecordServiceImpl; import lombok.extern.slf4j.Slf4j; import org.eclipse.paho.client.mqttv3.IMqttDeliveryToken; import org.eclipse.paho.client.mqttv3.MqttCallback; import org.eclipse.paho.client.mqttv3.MqttMessage; import org.springframework.stereotype.Component; import java.text.SimpleDateFormat; import java.time.LocalDateTime; import java.time.format.DateTimeFormatter; import java.util.List; @Slf4j @Component public class PushCallback implements MqttCallback { private MqttPushClient client; private MqttConfiguration mqttConfiguration; public PushCallback(MqttPushClient client ,MqttConfiguration mqttConfiguration) { this.client = client; this.mqttConfiguration = mqttConfiguration; } @Override public void connectionLost(Throwable cause) { /** 连接丢失后,一般在这里面进行重连 **/ if(client != null) { while (true) { try { log.info("==============》》》[MQTT] 连接断开,30S之后尝试重连..."); Thread.sleep(30000); // MqttPushClient mqttPushClient = new MqttPushClient(); // mqttPushClient.connect(mqttConfiguration); if(MqttPushClient.getClient().isConnected()){ log.info("=============>>重连成功"); break; } // break; //重连 client.reconnect(); // 订阅 // client.subscribe(); } catch (Exception e) { log.error("=============>>>[MQTT] 连接断开,重连失败!<<============="); continue; } } } // log.info(cause.getMessage()); // System.out.println("cause = " + cause); } @Override public void deliveryComplete(IMqttDeliveryToken token) { //publish后会执行到这里 log.info("publish后会执行到这里"); log.info("pushComplete==============>>>" + token.isComplete()); } /** * 监听对应的主题消息 * @param topic * @param message * @throws Exception */ @Override public void messageArrived(String topic, MqttMessage message) throws Exception { // subscribe后得到的消息会执行到这里面 String Payload = new String(message.getPayload()); log.info("============》》接收消息主题 : " + topic); log.info("============》》接收消息Qos : " + message.getQos()); log.info("============》》接收消息内容 : " + Payload); log.info("============》》接收ID : " + message.getId()); log.info("接收数据结束 下面可以执行数据处理操作"); try { //实例化入库方法 这里就用到SpringUtil类 来手动的注入 HouseLockServiceImpl houseLockService = SpringUtil.getBean(HouseLockServiceImpl.class); HouseNumberServiceImpl houseNumberService = SpringUtil.getBean(HouseNumberServiceImpl.class); UnlockingRecordServiceImpl unlockingRecordService = SpringUtil.getBean(UnlockingRecordServiceImpl.class); AlarmMessageServiceImpl alarmMessageService = SpringUtil.getBean(AlarmMessageServiceImpl.class); System.out.println("topic:" + topic); System.out.println("Qos:" + message.getQos()); System.out.println("message content:" + new String(message.getPayload())); JSONObject s = MessageDecryptUtil.decryptMessage(message.toString(), "6edfcc178c0f415d8e6628238761976f", "2d00b258183146c0a2b19f55250c4596"); String protocol = s.getString("protocol"); // 设备消息上报 if ("2".equals(protocol)) { UnlockingRecord unlockingRecord = new UnlockingRecord(); unlockingRecord.setType("消息类型"); String data = s.getString("data"); System.out.println("data = " + data); JSONObject jsonObject = JSONObject.parseObject(data); System.out.println("jsonObject = " + jsonObject); // 结果 String result = jsonObject.getString("result"); // 时间 String messageTime = jsonObject.getString("messageTime"); // 房间luid String luid = jsonObject.getString("luid"); // 找到房间号 LambdaQueryWrapper WrapperHL = new LambdaQueryWrapper<>(); WrapperHL.eq(HouseLock::getEquipmentType, luid); List list = houseLockService.list(WrapperHL); if (ObjectUtils.isNotEmpty(list) && list.size() > 0) { HouseLock houseLock = list.get(0); Integer houseNumberId = houseLock.getHouseNumberId(); HouseNumber byId = houseNumberService.getById(houseNumberId); if (ObjectUtils.isNotEmpty(byId)) { String roomNumber = byId.getRoomNumber(); unlockingRecord.setRoomNumber(roomNumber); unlockingRecord.setHouseNumberId(houseNumberId); } } // 消息类型 String messageType = jsonObject.getString("messageType"); SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); String format = sdf.format(Long.valueOf(messageTime)); unlockingRecord.setDateTime(format); if ("1".equals(messageType)) { //密码开锁 unlockingRecord.setUnlockType("密码开锁"); } else if ("2".equals(messageType)) { // 远程开锁 unlockingRecord.setUnlockType("远程开锁"); } else if ("3".equals(messageType)) { //无网络密码开锁 unlockingRecord.setUnlockType("无网络密码开锁"); } else if ("5".equals(messageType)) { //人脸开锁 unlockingRecord.setUnlockType("人脸开锁"); } else if ("10".equals(messageType)) { // 电池电量更新 unlockingRecord.setUnlockType("电池电量更新"); } DateTimeFormatter dateTimeFormatter1 = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss"); unlockingRecord.setCreateTime(LocalDateTime.now().format(dateTimeFormatter1)); unlockingRecord.setUpdateTime(LocalDateTime.now().format(dateTimeFormatter1)); unlockingRecord.setCreateUser("1"); unlockingRecord.setUpdateUser("1"); unlockingRecordService.getSave(unlockingRecord); } else if ("3".equals(protocol)) { AlarmMessage alarmMessage = new AlarmMessage(); String data = s.getString("data"); JSONObject jsonObject = JSONObject.parseObject(data); // 消息类型 String messageType = jsonObject.getString("messageType"); // 时间 String messageTime = jsonObject.getString("messageTime"); SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); String format = sdf.format(Long.valueOf(messageTime)); alarmMessage.setMessageTime(format); // 房间luid String luid = jsonObject.getString("luid"); // 找到房间号 LambdaQueryWrapper WrapperHL = new LambdaQueryWrapper<>(); WrapperHL.eq(HouseLock::getEquipmentType, luid); List list = houseLockService.list(WrapperHL); if (ObjectUtils.isNotEmpty(list) && list.size() > 0) { HouseLock houseLock = list.get(0); Integer houseNumberId = houseLock.getHouseNumberId(); HouseNumber byId = houseNumberService.getById(houseNumberId); if (ObjectUtils.isNotEmpty(byId)) { String roomNumber = byId.getRoomNumber(); alarmMessage.setRoomNumber(roomNumber); } } if ("5".equals(messageType)) { // 低电量 alarmMessage.setMessageType("低电量"); } else if ("1".equals(messageType)) { alarmMessage.setMessageType("密码错误(连续失败五次)"); } else if ("4".equals(messageType)) { alarmMessage.setMessageType("防拆告警"); } DateTimeFormatter dateTimeFormatter1 = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss"); alarmMessage.setCreateTime(LocalDateTime.now().format(dateTimeFormatter1)); alarmMessage.setUpdateTime(LocalDateTime.now().format(dateTimeFormatter1)); alarmMessage.setCreateUser("1"); alarmMessage.setUpdateUser("1"); alarmMessageService.getSave(alarmMessage); } }catch (Exception e){ e.printStackTrace(); } } }