guifei zhu
2024-09-18 ba616e9307681da4781b7610ec3c27721d793379
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
137
138
139
140
141
/* main.js 项目主入口注入实例 */
// import mqttTool from './lib/mqttTool.js'
// Vue.prototype.$mqttTool = mqttTool
 
/* 使用范例见 /pages/index/index.vue */
// mqtt协议:H5使用ws/wss APP-PLUS使用wx/wxs
 
var mqtt = require('mqtt/dist/mqtt.js')
 
//客户端
let mqttTool = {
    client: null
}
 
//连接息
mqttTool.connect = function(params){
    let options = {
        clientId: params.clientId,
        username: params.username,
        password: params.password,
        clean: true,
        keepalive:10,  //心跳 单位:s
        connectTimeout: 10*1000, //连接超时 单位:ms
        cleanSession: true
    }
    let client = mqtt.connect(params.url, options);
    mqttTool.client = client
    return client;
}
 
mqttTool.end = function(){
    return new Promise((resolve, reject) => {
        if(mqttTool.client == null){
            resolve('未连接')
            console.log('App_text' + ":end 未连接")
            return;
        }
        mqttTool.client.end()
        mqttTool.client = null
        resolve('连接终止')
    })
}
 
mqttTool.reconnect = function(){
    return new Promise((resolve, reject) => {
        if(mqttTool.client == null){
            resolve('未连接')
            console.log('App_text' + ":reconnect 未连接")
            return;
        }
        mqttTool.client.reconnect()
    })
}
 
mqttTool.subscribe = function(params){
    return new Promise((resolve, reject) => {
        if(mqttTool.client == null){
            resolve('未连接')
            console.log('App_text' + ":unconnect 未连接")
            return;
        }
        mqttTool.client.subscribe(params.topic, {qos:params.qos}, function(err,res) {
            console.log(err,res)
            if (!err && res.length>0) {
                resolve('订阅成功')
                console.log('App_text' + ":subscribe success 订阅成功")
            }else{
                resolve('订阅失败')
                console.log('App_text' + ":subscribe failed 订阅失败")
                return;
            } 
        })  
    })
}
 
mqttTool.unsubscribe = function(params){
    return new Promise((resolve, reject) => {
        if(mqttTool.client == null){
            resolve('未连接')
            console.log('App_text' + ":unconnect 未连接")
            return;
        }
        mqttTool.client.unsubscribe(params.topic, function(err) {
            if (!err) {
                resolve('取消订阅成功')
                console.log('App_text' + ":unsubscribe success 取消订阅成功")
            }else{
                resolve('取消订阅失败')
                console.log('App_text' + ":unsubscribe failed 取消订阅失败")
                return;
            } 
        })  
    })
}
 
mqttTool.publish = function(params){
    return new Promise((resolve, reject) => {
        if(mqttTool.client == null){
            resolve('未连接')
            console.log('App_text' + ":unconnect 未连接")
            return;
        }
        mqttTool.client.publish(params.topic, params.message, function(err){
            if (!err) {
                resolve(params.topic + '-' + params.message + '-发送成功')
                console.log('App_text' + ":publish success 发送成功")
            }else{
                resolve(params.topic + '-' + params.message + '-发送失败')
                console.log('App_text' + ":publish failed 发送失败")
                return;
            } 
        })
    })
}
 
//消息处理
mqttTool.message = function(){
    return new Promise((resolve, reject) => {
        if(mqttTool.client == null){
            resolve('未连接')
            console.log('App_text' + ":unconnect 未连接")
            return;
        }
        if(mqttTool.client != null && ! mqttTool.client.connected){
            mqttTool.client.reconnect()
        }
         
        mqttTool.client.on('message', function(topic, message, buffer) {
            console.info(topic)
            console.info(message)
             setTimeout(() => {
                  resolve({topic, message, buffer })
                }, 300)
        })
     
    })
}
 
 
 
export default mqttTool