精华内容
下载资源
问答
  • MQTT主题设计

    2019-09-03 16:34:46
    MQTT主题设计:https://blog.csdn.net/qq_28877125/article/details/78360376
    展开全文
  • MQTT topic设计

    千次阅读 2019-03-29 19:49:56
    我已经很久没有对我的旧MQTT主题树结构感到不满,并对如何改进它做了一些思考/研究。谷歌向我指出了Tinkerman关于类似主题的文章,我开始计划改进。 我将重复我在上一篇文章中使用的引用“如果你无法衡量它,你就...

    翻译自:https://harizanov.com/2014/09/mqtt-topic-tree-structure-improvements/

    我已经很久没有对我的旧MQTT主题树结构感到不满,并对如何改进它做了一些思考/研究。谷歌向我指出了Tinkerman  关于类似主题文章,我开始计划改进。

    我将重复我在一篇文章中使用的引用“如果你无法衡量它,你就无法改进它”,只有这次重新将其称为“如果你无法想象它,你就不能改进它”。是的,我的第一个努力是可视化我的MQTT主题树,其余的应该相当容易。

    Ben Hardill在这个主题上 做了一些出色的工作,他的D3 MQTT主题树可视化工具正是我所需要的。让它发挥作用是非常棘手的。我想使用新的Mosquitto MQTT支持websockets,所以我不得不升级到新版本。在构建Mosquitto时必须明确启用Websocket支持,幸好  Jeremy Gooch已经创建了*优秀*指令  ,如果没有这些,我无法做到。

    最后,我不得不修改Ben的  mqttws31.js文件以使用Mosquitto 1.4,我的固定版本在Github上

    随着可视化工作,我做了大约1003次迭代以获得以下结构,仍然有许多节点要添加并且形状粗糙:

    根

     

    根包含三个文件夹,用于将我连接的东西分组为“places”,“cloud”和“people”。我计划在那里添加更多类别,例如,跟踪车辆的“对象”。

    “地点”将包含属于我的物联网家庭自动化系统的地点和属性,从“我们的地方”开始:

     

    我们的地方

    “我们的地方”是一个有花园的房子,所以我打破了两个:“房子”和“外面”。“房子”分为三个子类别:“普通”,“一楼”和“二楼”。“common”部分将包含无法以其他方式分组的公共组件。“外面”显然会在花园里组合任何东西,如外部条件,温室,前门等(所有WIP)

    “Common”类别目前有这些叶节点:

     

    共同

     

    “raspberry pi”分支扩大了:

     

    覆盆子pi

    该“rfm2pi”叶子代表rfm2pi板处理该无线传输,它到来,走出去的叶子。“out”主题用于传输,例如,我用它每5分钟发送一次时间包,并将控制包发送到远程节点。Node-RED  订阅“in”主题中的不同NodeID叶子以处理原始数据包并进一步处理它,向其他分支提供处理过的数据。

    这个分支中的其他叶子是:

    other_common

     

    “功率监视器”节点数据由我的传感屏蔽项目提供,仍然可以很好地工作。

    “太阳能”节点数据由这里描述的热水箱控制器提供,固件从那时起显着改变,但硬件是相同的。请注意,它是一个带有“in”和“out”叶片的双向节点,因为它可以控制水箱中的加热器元件,如果阳光少于加热水所需的阳光。

    “门铃”节点由我的IoT门铃项目提供

    “安全系统”节点由我的家庭安全系统接口项目提供

    “热泵”节点仍在进行中,我计划同时具有“进入”和“出”子主题,因为它可以控制和提供有关热泵状态的信息。在那里使用我的Daikin控制器项目

     

    “一楼”分支具有以下结构:

    第一层

     

     

    我的朋友,OpenEnergyMonitor的 Glyn Hudson 给我发了一个EmonGLCD单元作为礼物,这是“厨房”节点温度的数据提供者。

    我有一个火灾传感器报警项目,正在为“厨房”分支中的“火警”节点供电。

    房子的门,窗和PIR状态由我的安全系统接口项目提供。这些数据有助于中央供暖系统,我计划在窗户打开时停止房间温控器。

    客厅温度由Funky + DS18b20项目提供

    电视状态由设备跟踪项目提供。我也可以使用LG TV控制器项目控制其状态。

     

     

    “二楼”分支有很多待办事项,但目前的形状如下:

    二楼

     

    室温数据提供商是   Funky + DS18b20项目

    PS3游戏控制台状态由  设备跟踪项目提供

     

    “Outside”分支看起来像这样,我还有更多分支要添加:

    外

     

     

    我有两个软件机器人来提供WeatherUnderground的预测和当前的天气数据,非常实用,因为我没有雨/压力/风传感器。我使用预测数据向自己发送霜冻警报并为此类活动准备花园。仍然需要博客关于这些,因为我现在在Node-RED中做这一切。

    惊恐+ DHT22项目为外部温度/湿度的数据提供者。通过增加计算的露点也可以丰富这些数据。

     

    “云”分支自然地将所有与云连接的“事物” 分组,例如EmonCMSPushbulletTwitter,电子邮件,Twilio等。仍然是WIP。

    云

     

    Node-RED流程监视emoncms / out主题并将该数据发送到EmonCMS

    twitter / out主题是发布到我家的Twitter帐户的内容。跟着它?

     

     

    ..最后是“人民”分支:

    人

     

    存在检测项目为我和妻子在家庭主题的存在提供了支持。

    我的键盘项目正在跟踪重量。

    我的位置正在使用OwnTracks进行跟踪,仍然需要关于该项目的博客。

     

    这大致是我现在在MQTT主题树重组项目上的立场。我喜欢看D3的可视化器,它是动画的,数据随着它的到来而飞,非常漂亮。我喜欢将它想象成我家的中枢神经系统可视化。

    展开全文
  • MQTT主题Topic讲解

    万次阅读 2018-09-06 17:17:17
    但是MQTT的通信方式是通过发布/订阅的方式进行的。笔者不知道他是否跟设计模式中的发布订阅模式有没有关系。可是他们思想却有一点相似之处。 客户端知道服务上有很多个主题。就好比如说有很多消息的分类一样子。有...

    参考:https://www.cnblogs.com/hayasi/p/7792191.html
    如果传统的通信方式是客户端和服务端之间一般就直接传输信息。但是MQTT的通信方式是通过发布/订阅的方式进行的。笔者不知道他是否跟设计模式中的发布订阅模式有没有关系。可是他们思想却有一点相似之处。

    客户端知道服务上有很多个主题。就好比如说有很多消息的分类一样子。有社会新闻、体育讲坛等。那么客户端只要找到自己感兴趣的进行订阅就可以了。一个客户端可以向服务器订阅多个主题。而所谓的发布就是客户端对不同的主题进行发布信息。即好比如新闻的发布者一样子。这个时候只要订阅这个主题的客户端就可以接收到来自服务端的新闻。我们的手机常常会接收到一些推送的信息。事实上有很多App应用都是用MQTT协议来进行的。所以不难看出服务端主要是负责客户端和客户端的之间信息的传输和信息管理。大至如图下

    这里写图片描述

    注意:发布者也是客户端。订阅者也是客户端

    主题(Topic )

    如果主题只是一个字符串值的话,那么显然会比较单调。这样子功能也显得比较无力。所以在主题上面就了所谓的分隔符和通配符的说法(个人想法)。分隔符的意思就是让主题可以分层次。就好如说主题“体育讲坛/篮球/NBA”。看到这样子的主题,请问一下你还有什么不明白的话。是不是感觉很有层次感。剩下只有一个问题?如果我们订阅了主题“体育讲坛/篮球/NBA”,并向主题“体育讲坛/篮球”发布一个信息。那么已经订阅主题“体育讲坛/篮球/NBA”的客户端们是不是可以接受到信息呢?反过来讲如果我们订阅了主题“体育讲坛/篮球”,向主题“体育讲坛/篮球/NBA”发信息,客户端们是否又能接受信息呢?

    笔者就以HiveMQ作服务器来做一下上面的小实验。如下

    这里写图片描述

    客验结果显然是失败的——订阅主题“体育讲坛/篮球/NBA”的客户端根本收不到来自主题“体育讲坛/篮球“的发布信息。说明分隔符就是用于主题名的分层次。没有别的意思。

    通过上面的实验我们知道如果想要收到NBA就是必须订阅主题“体育讲坛/篮球/NBA”。可是总是有一些人只要是篮球的新闻有喜欢。怎么办。通配符的功能就出来了。通配符有俩种——”+”和“#”。+为单层的通配符。表示当前这一层的全都合非。这样子以上面的说到的例子来做实验。我们订阅一个主题为“体育讲坛/篮球/+”。按照理解的意思就是只要是在“体育讲坛/篮球”的信息都是我们想要的。结果如下

    这里写图片描述

    我们可以看到笔者在“体育讲坛/篮球/NBA”和“体育讲坛/篮球/ABC”各发布了信息。结果他都能收到。那么如果我们对主题“体育讲坛/篮球”或是主题“体育讲坛/篮球/NBA/福州专场”发布信息呢?笔者试过了很可惜都不行。

    记得我们上面说到有一些人只要跟篮球相关的都喜欢。可是如果使用通配符“+”是可以接近我们的要求。注意是接近。“+”通配符只是表示当前一层的。从当前的第二层就不行了。而本身的层也不算。就像上面的。只有篮球下的子一层才是合非的。讲到这里大家一定会想到用“#“通配符试试。没有错。“#“通配符就是表示当前本身和下面子层所有。如下

    这里写图片描述

    实验的结果很终满足了。

    对于主题,在文档中有一个要求——主题不能以 ”#“ “+” “" 为开头。对于”#“ ” +“的话,大家都好理解。那么”“又是什么鬼。在文档我们可以看到这样子的字符”SYS"“开头的主题一般用于系统内部的一些主题。你们可以去找一些第三方的MQTT服务器。都会有很多以”$“开头的主题。

    展开全文
  • 但是MQTT的通信方式是通过发布/订阅的方式进行的。笔者不知道他是否跟设计模式中的发布订阅模式有没有关系。可是他们思想却有一点相似之处。客户端知道服务上有很多个主题。就好比如说有很多消息的分类一样子。有...

    我们已经把相关的连接报文搞定了。笔者想来想去还是决定先讲解一下订阅报文(SUBSCRIBE )。如果传统的通信方式是客户端和服务端之间一般就直接传输信息。但是MQTT的通信方式是通过发布/订阅的方式进行的。笔者不知道他是否跟设计模式中的发布订阅模式有没有关系。可是他们思想却有一点相似之处。

    客户端知道服务上有很多个主题。就好比如说有很多消息的分类一样子。有社会新闻、体育讲坛等。那么客户端只要找到自己感兴趣的进行订阅就可以了。一个客户端可以向服务器订阅多个主题。而所谓的发布就是客户端对不同的主题进行发布信息。即好比如新闻的发布者一样子。这个时候只要订阅这个主题的客户端就可以接收到来自服务端的新闻。我们的手机常常会接收到一些推送的信息。事实上有很多App应用都是用MQTT协议来进行的。所以不难看出服务端主要是负责客户端和客户端的之间信息的传输和信息管理。大至如图下

    注意:发布者也是客户端。订阅者也是客户端

    主题(Topic )

    如果主题只是一个字符串值的话,那么显然会比较单调。这样子功能也显得比较无力。所以在主题上面就了所谓的分隔符和通配符的说法(个人想法)。分隔符的意思就是让主题可以分层次。就好如说主题“体育讲坛/篮球/NBA”。看到这样子的主题,请问一下你还有什么不明白的话。是不是感觉很有层次感。剩下只有一个问题?如果我们订阅了主题“体育讲坛/篮球/NBA”,并向主题“体育讲坛/篮球”发布一个信息。那么已经订阅主题“体育讲坛/篮球/NBA”的客户端们是不是可以接受到信息呢?反过来讲如果我们订阅了主题“体育讲坛/篮球”,向主题“体育讲坛/篮球/NBA”发信息,客户端们是否又能接受信息呢?

    笔者就以HiveMQ作服务器来做一下上面的小实验。如下

    客验结果显然是失败的——订阅主题“体育讲坛/篮球/NBA”的客户端根本收不到来自主题“体育讲坛/篮球“的发布信息。说明分隔符就是用于主题名的分层次。没有别的意思。

    通过上面的实验我们知道如果想要收到NBA就是必须订阅主题“体育讲坛/篮球/NBA”。可是总是有一些人只要是篮球的新闻有喜欢。怎么办。通配符的功能就出来了。通配符有俩种——"+"和“#”。+为单层的通配符。表示当前这一层的全都合非。这样子以上面的说到的例子来做实验。我们订阅一个主题为“体育讲坛/篮球/+”。按照理解的意思就是只要是在“体育讲坛/篮球”的信息都是我们想要的。结果如下

    我们可以看到笔者在“体育讲坛/篮球/NBA”和“体育讲坛/篮球/ABC”各发布了信息。结果他都能收到。那么如果我们对主题“体育讲坛/篮球”或是主题“体育讲坛/篮球/NBA/福州专场”发布信息呢?笔者试过了很可惜都不行。

    记得我们上面说到有一些人只要跟篮球相关的都喜欢。可是如果使用通配符“+”是可以接近我们的要求。注意是接近。“+”通配符只是表示当前一层的。从当前的第二层就不行了。而本身的层也不算。就像上面的。只有篮球下的子一层才是合非的。讲到这里大家一定会想到用“#“通配符试试。没有错。“#“通配符就是表示当前本身和下面子层所有。如下

    实验的结果很终满足了。

    对于主题,在文档中有一个要求——主题不能以 ”#“ "+" "$" 为开头。对于”#“ ” +“的话,大家都好理解。那么”$“又是什么鬼。在文档我们可以看到这样子的字符"$SYS"。事实上他们是想说”$“开头的主题一般用于系统内部的一些主题。你们可以去找一些第三方的MQTT服务器。都会有很多以”$“开头的主题。

    SUBSCRIBE报文

    通过上面的介绍。笔者想你们一定对MQTT通信方式有了一定的概念。而本章的订阅报文就是用于告诉服务器我想要什么的主题了。通过前面几章的了解。我们知道报文的固定报头是少了的。笔者就以MQTT 3.1.1来介绍吧。如下

    SUBSCRIBE报文的INT值是8。所以对应的二进制为1000。后面的DUP QOS RETAIN对应是0010。其中QOS是必须是01。对订阅者来讲,他一定希望自己的订阅是成功的。所以订阅报文的QOS是01就相当好理解了。如果不理解QOS是什么的话,请看一下前面几章。

    订阅报文也有可变报头,可变报头只有一个消息ID。消息ID是从客端端开始分配的。笔者为什么样子认为呢?主要是看到客户端在发布信息的时候就要求消息ID。所以笔者才会觉得消息ID在客户端进行分配的。当然也不是什么报文都会消息ID的。但是有消息ID一般QOS大于0。

    订阅报文的有效载荷里面存在了相关的订阅订题列表。前面说过可以支持一个客户端多个订阅。列表里面每有一主题项只有俩个值。一个表示主题名,一个表示服务质量要求(Requested QoS)。这里的服务质量要求(Requested QoS)和 固定报头的服务质量的值是一样子。但是用意却是不一样子。这里是指这个订阅者接收这主题的服务质量最大等级。举个列子吧。笔者订阅了一个主题主题“体育讲坛/篮球/NBA”,同时他的服务质量要求(Requested QoS)的值为1。这个时候有一个发布者在这个主题上发布一个服务质QOS为2。笔者还是可以收到这个发布者发来的信息。只是信息的服务质量QOS却变为1了。要明白QOS(1)和QOS(2)的执行行为是不样子的。这个后面章节会讲到。当然如果发布者在这个主题上发布一个服务质QOS为0。这就没有什么区别了。如下

    对于有效载荷笔者这里就不多讲解了。也没有什么可说的。看文档的图片就够了如下。

    宏观上:

    微观上:

    列表出我们可以看他订阅了俩个主题。一个主题”a/b“,一个主题”c/b“。上面列出大概的图片(宏观上)和比较细的图片(微观上)。如果看不懂也没有关系。笔者接下来会用代码来抓一包看看。相信在对照一下就明白列表出画的是什么。

    现在让我们好好想想当服务器接收到来自客户端的订阅报文的时候要做些什么样子的反应呢?首先我们要明白如果服务端接收到一个订阅报文,第一步想到一定是查看订阅报文的格式是不是正确的。相关的主题名是不是为空的。主题名的写法是不是非法。这些一定离不开。当然对应的一些共有的验证笔者就不说了。一切没有问题的情况下,服务器会去看一下当前订阅者前面有没有订阅过相同的主题。如果有就替换当前的。如果没有就创建一下新的。然后服务器在根据当前主题查找一下符合保留的信息。如果有,就发送给当前的订阅者。然后发送一个订阅报文确定(SUBACK )。当然这前后没有规定。先发送一个订阅报文确定(SUBACK ),在处理保留的信息也是可以的。

    注意:在发送符合保留的信息就要对QOS进行处理。上面笔者也讲过了。

    SUBACK 报文

    当服务端处理SUBSCRIBE报文的时候,都会生成一个SUBACK 报文来回应订阅者。笔者这里不想对他太过的讲解。他的内容也很简单。如下

    对于SUBACK 报文的可变报头里面也只有一个消息ID。而且跟SUBSCRIBE报文的消息ID是一样子的。有效载何的内容存放是订阅主题的服务质量要求(Requested QoS)。笔者在MQTT 3.1 文档时面可以看到有多个主题的列子。可是在MQTT 3.1.1里面却没有。那么笔者就把MQTT 3.1.1的放在下里吧。读者们可以自行查看。

    上面列表里面显示返回码,事实上是主题相关的服务质量要求(Requested QoS)。所以就可以知道他可以会返回四个值。如下

    QOS 0:0x00

    QOS 1:0x01

    QOS2 :0x02

    Failure :0x80

    展开全文
  • 主题层级分隔符—“/”:用于分割主题层级,/分割后的主题,这是消息主题层级设计中很重要的符号e.g:aaaa/bbbb和 aaaa/bbbb/cccc 和aaaa/bbbb/cccc/dddd ,这样的消息主题格式,是一个层层递进的关系,可通过多层...
  • 基于SCADA系统使用MQTT,获得一个可用的消息中间件(Message Oriented Middleware, MOM),首先必须...Sparkplug 规范设计在保证含义准确、易于理解同时,避免冗长的主题名给数据交换带宽和时长带来负面影响。 6.1 Sp..
  • MQTT--topic(主题设计

    万次阅读 多人点赞 2017-10-27 01:05:00
    参考博客:http://blog.csdn.net/amwha/article/details/74364175 主题的设计是非常重要的,首先需要了解的就是MQTT主题过滤规则。1、topic 定阅与发布必须要有主题,只有当定阅了某个主题后,才能收到相应主题的...
  • MQTT 02 - MQTT 设计原则

    2019-02-17 18:36:21
    简单。 没有杂七杂八的花俏功能,作为一个...例如可以动态地创建所需主题,然后就发布。 最小化传输的附带信息。 在真正要传说的信息基础上只添加最少量的辅助信息,例如包头。降低带宽依赖,提高传输效率。 ...
  • Golang:MQTT服务集群共享主题设计

    千次阅读 2021-04-03 21:42:21
    本次设计的支持集群的共享订阅的思路,还存在缺陷,无法支持通配符订阅,正在努力实现中,敬请期待,或者有好的点子,欢迎分享哦,谢谢各位。 具体实现用在了该项目中 集群共享订阅 单机共享订阅是非常容易实现的,...
  • 主题的设计是非常重要的,首先需要了解的就是MQTT主题过滤规则。1、topic定阅与发布必须要有主题,只有当定阅了某个主题后,才能收到相应主题的payload,才能进行通信。2、 主题层级分隔符—“/”主题层级分隔符使得...
  • MQTT

    万次阅读 多人点赞 2018-09-16 05:24:46
    设计目的主要是为低带宽和不稳定网络环境下的物联网设备提供服务。 MQTT中的概念 订阅(Subscribtion): 订阅包含主题筛选器(Topic Filter)和最大服务质量(QoS)。订阅会与一个会话(Sessio...
  • mqtt

    2021-01-30 14:23:01
    是为硬件性能低下的远程设备以及网络状况糟糕的情况下而设计的发布/订阅型消息协议, MQTT 协议定义了两种网络实体:消息代理(message broker)与客户端(client)。其中,消息代理用于接收来自客户端的消息并转发...
  • 可以通过这样的方式获取所有的需要匹配的订阅主题 接下来实现一波 // 获取需要匹配的主题,简单方式,没有考虑性能了,怎么简单怎么来 // 下面可优化的地方太多了,性能不是很好 func matchTopicS(topic string) ...
  • 它的设计思想是轻巧、开放、简单、规范,易于实现。这些特点使得它对很多场景来说都是很好的选择,特别是对于受限的环境如机器与机器的通信(M2M)以及物联网环境(IoT)。 目录 发现任何翻译问题或格式问题欢迎提...
  • 1.mqtt的javascript客户端如何订阅多个主题 2.利用MQTT一次订阅多个主题 3.MQTT--topic(主题)设计 4.MQTT主题通配符 5.MQTT topic中的分隔符与通配符 6.MQTT入门(6)- 主题Topics ...
  • MQTT初识

    2020-07-02 14:52:50
    MQTT1 概述2 设计原则3 特性4 MQTT协议原理4.1 MQTT协议实现方式4.2 网络传输与应用消息4.3 MQTT客户端4.4 MQTT服务器4.5 MQTT协议中的订阅、主题、会话4.6 MQTT协议中的方法5 MQTT协议数据包结构5.1 MQTT固定头...
  • MQTT是一种轻量级的发布/订阅消息传递协议,设计用于低带宽环境中的M2M(机器对机器)遥测。 Fastapi-mqtt是使用MQTT的客户端。 有关MQTT的更多信息,请参考此处: Fatapi-mqtt环绕模块。 用于MQTT客户端实现的...
  • MQTT入门详解

    2020-07-20 15:39:51
    MQTT协议中的订阅、主题、会话 MQTT协议中的方法 MQTT协议数据包结构 MQTT固定头 MQTT可变头 Payload消息体 MQTT简介 MQTT(Message Queuing Telemetry Transport,消息队列遥测传输协议),是一种基于...
  • 是想参加全国大学生电子设计大赛,队友抱怨用蓝牙调试每次都要连接太麻烦了,所以想用WIFI,于是想到了MQTT协议,由于MQTT客户端还没有我满意的(接触了两个,MQTT.fx、通信猫,MQTT.fx挺好的,但是不怎么懂英文,...
  • 了解MQTT协议以及利用Netty搭建MQTT服务器MQTT协议协议简介设计原则灵活的发布订阅和主题设计带宽消耗最小化三个可选的 QoS 等级会话保持在线状态感知开源 MQTT 服务器MQTT 发布订阅模式介绍发布订阅模式消息路由...
  • topic可以划分为多个层级,如果是不同的主题,采用“/”分隔, 举例:“/serve/temperature/12345678” 例子中分为了3层主题,第一层表明这是服务器,第二场表明数据是温度,第三层表明这是哪个设备的温度。 第三层...

空空如也

空空如也

1 2 3 4 5 6
收藏数 101
精华内容 40
关键字:

mqtt主题设计