aijinhui
2023-11-24 c2e9f82dfe87e9bd967d8445bd4b5b632f3f0d1a
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
package com.ruoyi.utils.qymqtt.newM;
 
import java.math.BigDecimal;
import java.nio.charset.StandardCharsets;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.List;
import java.util.Map;
 
import com.ruoyi.common.utils.spring.SpringUtils;
import com.ruoyi.sy.domain.ArdSyCarLock;
import com.ruoyi.sy.domain.ArdSyCarRtu;
import com.ruoyi.sy.service.ArdSyCarLockService;
import com.ruoyi.sy.service.ArdSyCarRtuService;
import lombok.extern.slf4j.Slf4j;
import org.eclipse.paho.client.mqttv3.IMqttClient;
import org.eclipse.paho.client.mqttv3.IMqttDeliveryToken;
import org.eclipse.paho.client.mqttv3.MqttCallback;
import org.eclipse.paho.client.mqttv3.MqttMessage;
 
import com.alibaba.fastjson.JSON;
 
@Slf4j
public class MessageCallback implements MqttCallback  {
 
    private SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
 
    //注入电子锁Bean
    ArdSyCarRtuService carRtuService = SpringUtils.getBean(ArdSyCarRtuService.class);
    ArdSyCarLockService carLockService = SpringUtils.getBean(ArdSyCarLockService.class);
 
 
    @Override//丢失了对服务端的连接后触发的回调
    public void connectionLost(Throwable arg0) {
        // 资源的清理  重连
        System.out.println(arg0.getMessage());
        arg0.printStackTrace();
        System.out.println("丢失了对服务端的连接");
    }
 
    @Override //消息发布者消息发布完成产生的回调
    public void deliveryComplete(IMqttDeliveryToken token) {
        System.out.println("deliveryComplete---------" + token.isComplete());
        int messageId = token.getMessageId();
        String[] topics = token.getTopics();
        String clientId = token.getClient().getClientId();
//        byte[] msg = token.getMessage().getPayload();
        String topicStr = "";
        for(String topic : topics){
            topicStr = topicStr + topic + ",";
        }
        topicStr = topicStr.substring(0, topicStr.length() - 1);
        System.out.println("消息发布完成,messageId="+messageId+",topics="+topicStr+",clientId="+clientId);
    }
 
    @Override//消息订阅者收到消息后触发的回调
    public void messageArrived(String topic, MqttMessage message) throws Exception {
        try {
            System.out.println("【车辆锁主题】:"+topic+"【车辆锁信息】:"+new String(message.getPayload(), StandardCharsets.UTF_8));
            //出来回调数据
            List<ArdSyCarLock> ardSyCarLocks = carLockService.data(new String(message.getPayload(), StandardCharsets.UTF_8));
            //根据topic查询RTUID
            ArdSyCarRtu ardSyCarRtu = carRtuService.subscribeByCarId(topic);
            String RTU = ardSyCarRtu.getId();
            //根据RTUID查询锁
            List<ArdSyCarLock> ardSyCarLockList = carLockService.carLock(RTU);
            for (int i = 0; i < ardSyCarLocks.size(); i++) {
                ArdSyCarLock ardSyCarLockData = ardSyCarLocks.get(i);
                String relay = ardSyCarLockData.getRelay();
                Integer relayInfo = ardSyCarLockData.getRelayInfo();
                String current = ardSyCarLockData.getCurrents();
                Double currentInfo = ardSyCarLockData.getCurrentInfo();
                for (int j = 0; j < ardSyCarLockList.size(); j++) {
                    ArdSyCarLock lock = ardSyCarLockList.get(j);
                    String relay1 = lock.getRelay();
                    String current1 = lock.getCurrents();
                    Integer relayInfo1 = lock.getRelayInfo();
                    Double currentInfo1 = lock.getCurrentInfo();
                    Boolean upd = false;
                    if(relay.equals(relay1)){
                        if(!relayInfo.equals(relayInfo1)){
                            lock.setRelayInfo(relayInfo);
                            upd = true;
                        }
                    }
                    if(current.equals(current1)){
                        if(!currentInfo.equals(currentInfo1)){
                            lock.setCurrentInfo(currentInfo);
                            upd = true;
                        }
                    }
                    if(upd){
                        int num = carLockService.updLock(lock);
//                        log.debug("修改"+num+"数据");
                    }
                }
            }
        } catch (Exception e) {
            log.debug("车辆电磁锁处理mqtt消息异常:" + e);
        }
 
    }
 
}