1. 程式人生 > 其它 >10-STM32+CH395Q(乙太網)基本控制篇(自建物聯網平臺)-編寫微信小程式連線MQTT伺服器程式

10-STM32+CH395Q(乙太網)基本控制篇(自建物聯網平臺)-編寫微信小程式連線MQTT伺服器程式

<p><iframe name="ifd" src="https://mnifdv.cn/resource/cnblogs/ZLIOTB/CH395Q/my.html" frameborder="0" scrolling="auto" width="100%" height="1500"></iframe></p>

說明

paho-mqtt.js 是官方原始碼包

mqtt.js是我再次封裝的包

public.js是存放了公共函式(字串轉16進位制,隨機數)

新建一個微信小程式工程

拷貝以下三個檔案到新工程的utils資料夾

連線MQTT

1.根據自己的MQTT伺服器更改以下資訊

2.在軟體啟動的地方呼叫一次連線函式

注:只要寫上連線,內部自動斷線重連

var MQTT = require("./utils/mqtt.js");

MQTT.ConnectMqtt();//連結MQTT

3.編譯下工程,成功連線MQTT,列印如下

4.測試斷線重連

訂閱一個主題

MQTT.subscribeTopic(
"1111", //訂閱1111
0,//訊息等級
function () {
console.log("訂閱成功");
}, function () {
console.log("訂閱失敗");
}
);//訂閱主題

建議

var MQTT = require("../../utils/mqtt.js");
var TimeNumber;//迴圈訂閱裝置主題定時器

    //訂閱裝置釋出的主題
    try { clearInterval(TimeNumber); } catch (e) { }
    TimeNumber = setInterval(function()
    {

      MQTT.subscribeTopic(
        "1111", //訂閱1111
        0,//訊息等級
        function () {
          console.log("訂閱成功");
          clearInterval(TimeNumber);//訂閱成功清除定時
        }, function () {
          console.log("訂閱失敗");
        }
      );//訂閱主題

    }, 1000, "null");//啟動定時器,迴圈訂閱主題,直至訂閱成功

訂閱多個主題

1.本身底層包不支援一次性訂閱多個主題,我修改了底層包

2.使用

var TopicMultiple = ["1111", "2222"];//訂閱的主題
var QosMultiple = [0, 0];//各個主題訊息等級

MQTT.subscribeTopicMultiple(
        TopicMultiple,
        QosMultiple,
        function () {
          console.log("訂閱成功");
        },
        function () {
          console.log("訂閱失敗");
        });

取消訂閱的主題

MQTT.unSubscribeTopic(
      "1111", //取消訂閱的主題
      function()
      { 
        console.log("取消訂閱成功"); 
      }
    );

釋出訊息

1.釋出字串訊息

MQTT.publishTopic(
      "222", //釋出的主題
      "message", //釋出的訊息
      0, //訊息等級
      false, //不需要伺服器保留
      function()//傳送成功回撥
      {
        console.log("傳送訊息成功");
      }
    );

2.釋出16進位制訊息

0xAA 0x88 0xFF 0xdd

MQTT.publishStringToHex(
      "222", //釋出的主題
      "AA 88 FF dd", //釋出的訊息
      0, //訊息等級
      false, //不需要伺服器保留
      function ()//傳送成功回撥
      {
        console.log("傳送訊息成功");
      }
    );

接收訊息

MQTT.SetonMessageArrivedCallBack(
      function (arg)
      {
        console.log(arg.destinationName + "    " + arg.payloadString); 
      }
    );//註冊接收訊息回撥函式

注意:如果接收的資料有16進位制,有字串,需要加入try

MQTT.SetonMessageArrivedCallBack(
      function (arg) {
        try{
          console.log(arg.destinationName + "    " + arg.payloadString);//處理字串訊息
        }catch(e){
          console.log(e);
        }

        try {
          console.log(arg.payloadBytes);//處理16進位制訊息
          let byt = arg.payloadBytes;
        } catch (e) {
          console.log(e);
        }

      }
    );//註冊接收訊息回撥函式

監聽MQTT連線狀態

1.監聽掉線

MQTT.SetonConnectionLostCallBack(function(arg){
      console.log(arg);//列印連結失敗詳細資訊
    });//軟體掉線

2.監聽上線

MQTT.SetonConnectionSuccessCallBack(function(){
      console.log("連線上MQTT");
    });//連線上MQTT

其它

1.封裝的訂閱多個主題函式也支援訂閱一個主題

直接用paho-mqtt.js,訂閱的主題 1111 訊息等級 0

client.subscribeMultiple(
"1111"
,
{ 
qos: 0
,
invocationContext: 
{ 
arg: null 
}, 
onSuccess: function()
{
console.log("訂閱成功");
},
onFailure: function()
{
console.log("訂閱失敗");
} 
}
);

用 mqtt.js

MQTT.subscribeTopicMultiple(
        "1111", //訂閱的主題
        0, //訊息等級
        function () {
          console.log("訂閱成功");
        },
        function () {
          console.log("訂閱失敗");
        });

2.底層程式碼我還修改了一個地方

在 paho-mqtt.js 連線WebSocket的地方增加了一個引數protocols: ['mqtt']

目的是伺服器配置反向代理的時候不用再去寫下面兩句話配置這個引數.

proxy_set_header Sec-WebSocket-Protocol mqtt;

more_clear_headers Sec-WebSocket-Protocol;