ESA2GJK1DH1K微信小程序篇: 小程序MQTT底層優化 - 支持一次訂閱多個主題


 

 

說明

  有人做項目發現,底層的MQTT包不支持訂閱一次訂閱多個主題!

  我看了下官方提供的底層源碼,確實是不可以訂閱多個主題

  故:我給大家重新完善了一下底層,使其可以一次性訂閱多個主題

  為了不改動原先的源碼,本人在底層源碼的基礎上增加了 subscribeMultiple 函數

  

修改說明

  為了可以幫到更多的人,公開添加的支持訂閱多個主題的函數部分

  我在底層源碼增加了第一部分

  

 

 

 

   源碼:

  

    /*
    subscribeMultiple
     */
    ClientImpl.prototype.subscribeMultiple = function (filter, subscribeOptions) {
      this._trace("Client.subscribe", filter, subscribeOptions);
      if (!this.connected)
        throw new Error(format(ERROR.INVALID_STATE, ["not connected"]));
      var wireMessage = new WireMessage(MESSAGE_TYPE.SUBSCRIBE);

      if (typeof filter == "object"){
        if (filter.length>0){
          wireMessage.topics = [];
          wireMessage.requestedQos=[];
          for (var i = 0; i < filter.length ;i++){
            if ((typeof filter[i]) == 'string'){
              wireMessage.topics[i] = filter[i];

              if (subscribeOptions.qos !== undefined){
                if ((typeof subscribeOptions.qos[i]) == 'number'){
                  if (subscribeOptions.qos[i] >= 0 && subscribeOptions.qos[i] <= 2){
                    wireMessage.requestedQos[i] = subscribeOptions.qos[i];
                  }
                  else{
                    throw new Error("Invalid argument: Qos is 0,1,2 Can not be" + subscribeOptions.qos[i]);
                  }
                }
                else{
                  throw new Error("Invalid argument: Qos is 0,1,2 Can not be" + subscribeOptions.qos[i]);
                }
              }
              else{
                wireMessage.requestedQos[i]=0;
              }
            }
            else{
              throw new Error("Invalid argument:" + filter[i]);
            }
          }
        }
      }
      else
      {
        wireMessage.topics = [filter];
        if (subscribeOptions.qos !== undefined)
          wireMessage.requestedQos = [subscribeOptions.qos];
        else
          wireMessage.requestedQos = [0];
      }

      if (subscribeOptions.onSuccess) {
        wireMessage.onSuccess = function (grantedQos) { subscribeOptions.onSuccess({ invocationContext: subscribeOptions.invocationContext, grantedQos: grantedQos }); };
      }

      if (subscribeOptions.onFailure) {
        wireMessage.onFailure = function (errorCode) { subscribeOptions.onFailure({ invocationContext: subscribeOptions.invocationContext, errorCode: errorCode, errorMessage: format(errorCode) }); };
      }

      if (subscribeOptions.timeout) {
        wireMessage.timeOut = new Timeout(this, subscribeOptions.timeout, subscribeOptions.onFailure, [{
          invocationContext: subscribeOptions.invocationContext,
          errorCode: ERROR.SUBSCRIBE_TIMEOUT.code,
          errorMessage: format(ERROR.SUBSCRIBE_TIMEOUT)
        }]);
      }

      // All subscriptions return a SUBACK.
      this._requires_ack(wireMessage);
      this._schedule_message(wireMessage);
    };

 

 我在底層源碼增加了第二部分

  

 

 

 

 

 源碼:

  

      this.subscribeMultiple = function (filter, subscribeOptions) {
        client.subscribeMultiple(filter, subscribeOptions);
      };

 

 

 

使用說明:

  

 

修改后的底層js文件,導入源文件,替換以前使用的即可

 

  

 

使用本人再次封裝的mqtt.js

https://www.cnblogs.com/yangfengwu/p/11832651.html   先看下這一節

 

 

調用:

  

var TopicMultiple = ["1111", "2222"];
var QosMultiple = [0, 0];

MQTT.subscribeTopicMultiple(TopicMultiple, QosMultiple, this.SubscribeTopicSuccess, this.SubscribeTopicFailure);

 

導入源文件替換原先使用的即可

 

 

 

提示

  該函數也支持訂閱一個主題

  一,直接用 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, this.SubscribeTopicSuccess, this.SubscribeTopicFailure);

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM