• 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);

  • 相关阅读:
    arguments.callee
    vue的生命周期
    Vue中的v-cloak用法
    控制input只能输入数字和两位小数
    css3新单位vw、vh的使用详解
    关于图片的Base64编码
    Logic and Fault simulation
    scan design flow(二)
    scan design flow(一)
    异构计算
  • 原文地址:https://www.cnblogs.com/yangfengwu/p/12157005.html
Copyright © 2020-2023  润新知