前提:小程序使用mqtt做实时连接声音播报,但是mqtt总是断开连接,导致有信息接收不到。 先讲一下公司用的是 paho-mqtt.js 文件,连接socket域名的时候 报错 AMQJS0007E Socket error:undefined,查找好多文档,最后看到有人讲说 使用最新的mqtt.js 就可以了。从此我的试一试的路开始了
-
我先是安装好mqtt.js之后,连接socket 报错 WS is undefined 这个问题报错的文件指向的是mqtt.js 文件,我就想是不是我不会用这个mqtt.js 所以我又查询了用法,发现自己用的并没有问题
-
有人讲是mqtt.js文件版本问题,转到3.1.0就可以了,然后我又换成了相应的版本,发现报错变成了 websocket is undefined 我又接着找问题,后来才知道 mqtt.js 使用的socket 域名和 paho-mqtt.js不一样.
paho-mqtt.js 域名 wss://+url+path mqtt.js 域名 wxs://+url+path (socket 域名定义还是wss 只是在这里调用的时候变成了wxs)
改了域名之后就没有报这个错了
- 然后又尝试连接,项目启动之后又变成了 n.createConection is not a function
- 发现是最新的mqtt.js 版本会出现这个问题,换成mqtt.js 4.1.0 版本就可以了
- 当时连接的是阿里云公共的服务器 wss://broker.emqx.io:8084/mqtt 真机调试可以连接了
- 使用自己申请的socket 还是报错 closeSocket:fail taskID not exist
最后发现是 域名过期或ssl协议版本过期的原因,更新了域名和ssl 协议之后就都可以使用了,不管是paho-mqtt连接还是 mqtt 连接,都成功了!!!!!
贴上代码
var { Client, Message } = require('./paho-mqtt.js');
import uuid from './uuid';
client = new Client("wss://broker.emqx.io:8084/mqtt", uuid());
function connection() {
var that = this;
var options = {
cleanSession:true,
userName: '',
password: '',
reconnect: true,
keepAliveInterval: 30,
timeout: 2,
onSuccess: function() {
wx.showToast({
title: '服务器已连接!',
})
},
onFailure: function(e) {
console.log(e,"链接失败") //链接失败
wx.showModal({
title: '提示',
content: '断开链接是否重连?',
success: function (res) {
if (res.cancel) {
} else {
}
},
})
}
};
console.log(client.isConnected(),"是否链接1")
if (client.isConnected()) {
console.log("之前有链接,续断没")
wx.closeSocket();
return;
}
client.onConnectionLost = function (responseObject) {
if (responseObject.errorCode !== 0) {
console.log("onConnectionLost:" + responseObject);
}
};
console.log(client.isConnected(), "是否链接2")
client.connect(options);
client.onMessageArrived = function(message) {
// console.log('received msg:' + message.toString());
};
// 这是mqtt.js连接方式
// let mqttOptions = {
// protocolVersion: 4, //MQTT连接协议版本
// clientId: 'mqttid_' + Math.random().toString(16).substr(2, 8),
// clean: true,
// username: '',
// password: '',
// reconnectPeriod: 1000, // 1000毫秒,两次重新连接之间的间隔
// connectTimeout: 30 * 1000, // 1000毫秒,两次重新连接之间的间隔
// resubscribe: true // 如果连接断开并重新连接,则会再次自动订阅已订阅的主题(默认true)
// };
// client = mqtt.connect("wxs://broker.emqx.io:8084/mqtt", mqttOptions);
// client.on('reconnect', (error) => {
// console.log('正在重连:', error)
// })
// client.on('error', (error) => {
// console.log('连接失败:', error)
// })
// client.on('connect', (e) => {
// console.log('成功连接服务器')
// //订阅一个主题
// client.subscribe('message.queue', {
// qos: 0
// }, function(err) {
// if (!err) {
// console.log("订阅成功")
// }
// })
// })
// client.on('message', function (topic, message) {
// console.log('received msg:' + message.toString());
// })
}
mqtt.js 文件就用 npm i mqtt@4.1.0 就可以了