最近在uniapp打包成微信小程序的项目中第一次用到了MQTT。使用比较简单,但是还是遇到了一些问题。在此记录一下。
官方文档:MQTT Github
官方MQTT测试工具:MQTTX。测试工具使用说明
MQTT的js文件:mqtt.min.js
先上一点注意事项:
(1) MQTT.js 一个 MQTT 协议的客户端库,用 JavaScript 编写,可用于 Node.js 和浏览器。在 Node.js 端可以通过全局安装使用命令行连接,同时还支持 MQTT ,MQTT TLS 证书连接;值得一提的是 MQTT.js 还对微信小程序有较好的支持。
(2) MQTT可以通过三种方式连接,TCP直连, TLS和WebSocket,但是JavaScript使用 TCP 只能通过 ws 即 Websocket 链接。所以如果服务器是TCP直连,客户端是肯定连不上的,会报 Error in connection establishment 的错误。所以客户端协议只能是ws,wss,wxs(微信)
(3) WebSocket 是一种在单个 TCP 连接上进行全双工通讯的协议。作为一种通信协议,其使用 ws(非加密)、wss(SSL 加密) 作为协议标识。MQTT.js 客户端支持多种协议,连接地址需指明协议类型;
(4) ws: 未加密的 WebSocket 连接,一般使用8083端口。wss: 加密的 WebSocket 连接,一般使用8084端口。mqtt: 未加密的 TCP 连接,一般使用1883端口。mqtts: 加密 TCP 连接。
贴一下代码:
import $mqtt from './mqtt.min.js';
const mqttOptions = {
keepalive: 30,
clean: false,
connectTimeout: 5000, // Timeout
clientId: uni.getStorageSync('clientId'),
// username: 'test',
// password: 'test',
}
const connectUrl = `${mqttHost}:${mqttPort}/mqtt`;
// #ifdef H5
var client = $mqtt.connect('wss://' + connectUrl, mqttOptions);
// #endif
// #ifdef MP-WEIXIN||APP-PLUS
var client = $mqtt.connect('wxs://' + connectUrl, mqttOptions);
// #endif
client.on('connect', () => {
console.log('connect')
// 这是为了给自己发条消息,其它无作用
client.subscribe('test', (err) => {
if (!err) {
client.publish('test', '{}')
}
})
});
// 自动重连
client.on('reconnect', (msg) => {
console.log('reconnect', msg)
});
// 错误
client.on('error', () => {
console.log('error')
});
// 断开
client.on('end', () => {
console.log('end')
});
// 掉线
client.on('offline', (msg) => {
console.log('offline',msg)
});
// 收到消息
client.on('message', (topic, message) => {
// 把arrayBuffer转成字符串
let encodedString = String.fromCharCode.apply(null, new Uint8Array(message));// 全局发送消息
uni.$emit('sendTopicMsg',encodedString);
console.log(encodedString)
})
// 全局监听是否有关闭mqtt的消息的事件
uni.$on('closeMqtt',() => {
client.end(true); // 主动断开连接
})