前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >ESA2GJK1DH1K微信小程序篇: 小程序MQTT底层优化 - 支持一次订阅多个主题

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

作者头像
杨奉武
发布2020-01-14 14:42:39
1.1K0
发布2020-01-14 14:42:39
举报
文章被收录于专栏:知识分享知识分享

说明

  有人做项目发现,底层的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);

本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2020-01-06 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 说明
  • 修改说明
  • 使用说明:
  • 修改后的底层js文件,导入源文件,替换以前使用的即可
  • 使用本人再次封装的mqtt.js
  • 调用:
  • 导入源文件替换原先使用的即可
  • 提示
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档