ESA2GJK1DH1K微信小程序篇: 小程序MQTT底层优化 - 支持一次订阅多个主题

2020-01-14 14:42:39 浏览数 (1)

说明

  有人做项目发现,底层的MQTT包不支持订阅一次订阅多个主题!

  我看了下官方提供的底层源码,确实是不可以订阅多个主题

  故:我给大家重新完善了一下底层,使其可以一次性订阅多个主题

  为了不改动原先的源码,本人在底层源码的基础上增加了 subscribeMultiple 函数

修改说明

  为了可以帮到更多的人,公开添加的支持订阅多个主题的函数部分

  我在底层源码增加了第一部分

  源码:

代码语言:javascript复制
    /*
    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);
    };

 我在底层源码增加了第二部分

 源码:

代码语言:javascript复制
      this.subscribeMultiple = function (filter, subscribeOptions) {
        client.subscribeMultiple(filter, subscribeOptions);
      };

使用说明:

修改后的底层js文件,导入源文件,替换以前使用的即可

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

https://cloud.tencent.com/developer/article/1536490   先看下这一节

调用:

var TopicMultiple = "1111", "2222";

var QosMultiple = 0, 0;

代码语言:txt复制
MQTT.subscribeTopicMultiple(TopicMultiple, QosMultiple, this.SubscribeTopicSuccess, this.SubscribeTopicFailure);

导入源文件替换原先使用的即可

提示

  该函数也支持订阅一个主题

  一,直接用 paho-mqtt.js

  订阅的主题 1111 消息等级 0

代码语言:javascript复制
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);

0 人点赞