doum
6 天以前 5e59a6a3b10c0990f494b5a20e1102fd79b0db1b
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
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
package com.doumee.mqtt.config;
 
import org.eclipse.paho.client.mqttv3.*;
import org.eclipse.paho.client.mqttv3.persist.MemoryPersistence;
 
public class MqttClientInit {
        static MqttClient client;
        static MqttClient subClient;
        public static synchronized MqttClient getPublishInstance(MqttConfig config ){
            if(client !=null){
                if(!client.isConnected()){
                    try {
                        client.reconnect();
                    } catch (MqttException e) {
                        throw new RuntimeException(e);
                    }
                }
                return  client;
            }
            try {
                // host为主机名,clientid即连接MQTT的客户端ID,一般以唯一标识符表示,MemoryPersistence设置clientid的保存形式,默认为以内存保存
                String clientId =config.getClientid() +config.getVersion();
                client = new org.eclipse.paho.client.mqttv3.MqttClient(config.getHost(), clientId,new MemoryPersistence());
                // MQTT的连接设置
                MqttConnectOptions   options = new MqttConnectOptions();
                // 设置是否清空session,这里如果设置为false表示服务器会保留客户端的连接记录,设置为true表示每次连接到服务器都以新的身份连接
                options.setCleanSession(false);
                // 设置连接的用户名
                options.setUserName(config.getUsername());
                // 设置连接的密码
                options.setPassword(config.getPassword().toCharArray());
                // 设置超时时间 单位为秒
                options.setConnectionTimeout(10);
                // 设置会话心跳时间 单位为秒 服务器会每隔1.5*20秒的时间向客户端发送个消息判断客户端是否在线,但这个方法并没有重连的机制
                options.setKeepAliveInterval(20);
                //设置断开后重新连接
                options.setAutomaticReconnect(true);
                MqttTopic topic = client.getTopic(clientId+"_close");
                //遗嘱
                options.setWill(topic, "close".getBytes(), 1, true);
                client.connect(options);
            } catch (Exception e) {
                e.printStackTrace();
            }
            return  client;
        }
        public static synchronized MqttClient getSubInstance(MqttConfig config, MqttCallback callBack){
            if(subClient !=null){
                refreshClient();
                return  subClient;
            }
            try {
                // host为主机名,clientid即连接MQTT的客户端ID,一般以唯一标识符表示,MemoryPersistence设置clientid的保存形式,默认为以内存保存
                String clientId =config.getSubclientid() +config.getVersion();
                subClient = new org.eclipse.paho.client.mqttv3.MqttClient(config.getHost(), clientId,new MemoryPersistence());
                // MQTT的连接设置
                MqttConnectOptions   options = new MqttConnectOptions();
                // 设置是否清空session,这里如果设置为false表示服务器会保留客户端的连接记录,设置为true表示每次连接到服务器都以新的身份连接
                options.setCleanSession(false);
                // 设置连接的用户名
                options.setUserName(config.getUsername());
                // 设置连接的密码
                options.setPassword(config.getPassword().toCharArray());
                // 设置超时时间 单位为秒
                options.setConnectionTimeout(10);
                // 设置会话心跳时间 单位为秒 服务器会每隔1.5*20秒的时间向客户端发送个消息判断客户端是否在线,但这个方法并没有重连的机制
                options.setKeepAliveInterval(20);
                // 设置回调
                subClient.setCallback(callBack);
                //设置断开后重新连接
                options.setAutomaticReconnect(true);
                MqttTopic topic = subClient.getTopic(clientId+"_close");
                //遗嘱
                options.setWill(topic, "close".getBytes(), 1, true);
                subClient.connect(options);
            } catch (Exception e) {
                e.printStackTrace();
            }
            return  subClient;
        }
    public static synchronized MqttClient getInstance(MqttClient clientModel,MqttConfig config, MqttCallback callBack){
        if(clientModel !=null){
            refreshClient(clientModel);
            return  clientModel;
        }
        try {
            // host为主机名,clientid即连接MQTT的客户端ID,一般以唯一标识符表示,MemoryPersistence设置clientid的保存形式,默认为以内存保存
            String clientId =config.getClientid() +config.getVersion();
            clientModel = new org.eclipse.paho.client.mqttv3.MqttClient(config.getHost(), clientId,new MemoryPersistence());
            // MQTT的连接设置
            MqttConnectOptions   options = new MqttConnectOptions();
            // 设置是否清空session,这里如果设置为false表示服务器会保留客户端的连接记录,设置为true表示每次连接到服务器都以新的身份连接
            options.setCleanSession(false);
            // 设置连接的用户名
            options.setUserName(config.getUsername());
            // 设置连接的密码
            options.setPassword(config.getPassword().toCharArray());
            // 设置超时时间 单位为秒
            options.setConnectionTimeout(10);
            // 设置会话心跳时间 单位为秒 服务器会每隔1.5*20秒的时间向客户端发送个消息判断客户端是否在线,但这个方法并没有重连的机制
            options.setKeepAliveInterval(20);
            // 设置回调
            clientModel.setCallback(callBack);
            //设置断开后重新连接
            options.setAutomaticReconnect(true);
            MqttTopic topic = clientModel.getTopic(clientId+"_close");
            //遗嘱
            options.setWill(topic, "close".getBytes(), 1, true);
            clientModel.connect(options);
        } catch (Exception e) {
            e.printStackTrace();
        }
        return  clientModel;
    }
 
 
        public static synchronized void refreshClient(  ) {
            try {
                if(subClient !=null &&  !subClient.isConnected()){
                    subClient.reconnect();
                }
            }catch (Exception e){
                e.printStackTrace();
            }
        }
        public static synchronized void refreshClient(MqttClient clientModel  ) {
            try {
                if(clientModel !=null  &&  !clientModel.isConnected()){
                    clientModel.reconnect();
                }
            }catch (Exception e){
                e.printStackTrace();
            }
        }
 
}