MQTT(Message Queuing Telemetry Transport,消息队列遥测传输协议),是一种基于发布/订阅(publish/subscribe)模式的"轻量级"通讯协议,该协议构建于TCP/IP协议上,由IBM在1999年发布。MQTT最大优点在于,可以以极少的代码和有限的带宽,为连接远程设备提供实时可靠的消息服务。作为一种低开销、低带宽占用的即时通讯协议,使其在物联网、小型设备、移动应用等方面有较广泛的应用。
mqtt 可在后台实现传输,也可通过socket 实现小程序端和后台数据消息发布和订阅。
一、mqtt 使用
1、下载库
微信小程序使用mqtt是通过websocket来实现,需要用到mqtt.js这一个第三方库。
JS客户端库:https://github.com/mqttjs/MQTT.js#store
百度网盘下载:https://pan.baidu.com/s/14QDQigXATzaA-dPVfUdwDA
提取码: r3u2
2、创建mqtt连接
const Mqtt = 'wxs://wwww/mqtt';
const host = 'wxs://wwww/mqtt';
var mqttClient = {};
var client = null;
var status = false;
mqttClient.mqttObj = () =>{
return client;
}
let clientIds = 'mqttjs_' + Math.random().toString(16).substr(2, 8);
mqttClient.initMqtt = (clientId)=>{
if(client ==null){
console.log("初始化连接mqtt...");
options.clientId = clientId;
clientIds = clientId;
client = mqtt.connect(host, options);
}else{
console.log(client.connected)
if(!client.connected){
console.log("断开重连mqtt...");
options.clientId = clientId;
client = mqtt.connect(host, options);
}
}
}
3、断开连接
mqttClient.disconnect = ()=>{
if(null !=client){
console.log("断开连接mqtt...");
client.end(true);
client = null;
status = false;
}
}
4、订阅主题
mqttClient.initTopic = ()=>{
wx.request({
url: API.getTopic,
header: {
'content-type': 'application/json',
'cookie': wx.getStorageSync("sessionid")
},
success :(res) =>{
if(res.data.code == 0){
let data = res.data.data;
// console.log(data);
for(let i=0;i<data.length;i++){
mqttClient.subscribe(data[i]+"_device");
}
}
},
fail:(res)=>{
wx.reLaunch({
url: '/pages/login/login'
})
}
});
}
mqttClient.subscribe = (title)=>{
// console.log("订阅消息",title);
client.subscribe(title, {
qos:0
});
}
5、接收消息
if(mqttClient.mqttObj() !=null){
mqttClient.mqttObj().on('message', (topic, message, packet) => {
// console.log('111',message.toString());
let data = message.toString();
let dataJson = JSON.parse(data);
// console.log(dataJson);
});
}
二、nginx 转发websockt
1、配置
location /mqtt {
proxy_pass http://localhost:61614;
proxy_redirect off;
proxy_set_header Host localhost:1883;
proxy_set_header Sec-WebSocket-Protocol mqtt;
#more_clear_headers Sec-WebSocket-Protocol;
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";
}
2、注意事项
(1)小程序必须使域名和ssl
(2)小程序MQTT 连接后台使用websocket 协议,所有必须做转换
(3)mqtt 配置连接时间,不然很容易中断,不能很好的实时收到消息
var defaultConnectOptions = {
keepalive: 3,
reschedulePings: true,
protocolId: 'MQTT',
protocolVersion: 4,
reconnectPeriod: 1000,
connectTimeout: 10 * 1000,
clean: true,
resubscribe: true
}