小程序连接mqtt 报错 AMQJS0007E Socket error:undefined

903 阅读2分钟

前提:小程序使用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 就可以了