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

    千次阅读 2019-03-29 19:49:56
    翻译自:https://harizanov.com/2014/09/mqtt-topic-tree-structure-improvements/ 我已经很久没有对我的旧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的可视化器,它是动画的,数据随着它的到来而飞,非常漂亮。我喜欢将它想象成我家的中枢神经系统可视化。

    展开全文
  • 关于Topic设计的思考

    2020-04-11 15:36:26
    文章目录前言Topics通配符Topic,payload设计方案参考 前言 topic 的数量随着业务的增长逐渐增多,如何正确的设计 topic 成了当务之急。在这篇文章中,将重点讨论MQTT 主题和最佳实践。 Topics 分隔符"/" topic是...

    前言

    topic 的数量随着业务的增长逐渐增多,如何正确的设计 topic 成了当务之急。在这篇文章中,将重点讨论MQTT 主题和最佳实践。

    Topics

    • 分隔符"/"

    topic是UTF-8字符串,broker用于过滤客户端的消息,一个topic由一个或多个主题层组成,每个主题级别用/分割。

    home/floor/room/sensor
    

    通配符

    • 单级通配符:"+"
      单一级别的通配符可以代替一个主题级别,如果包含任意字符串而不是通配符,则任何主题都与包含单级通配符的主题相匹配:
    home/floor/+/temp  //此主题订阅与以下主题匹配或不匹配,√:匹配 ×:不匹配
    
    home/floor/kitchen/temp √
    home/floor/room/temp √ 
    home/floor/kitchen/brightness ×
    home/firstfloor/kitchen/temp ×
    home/floor/kitchen/fridge/temp ×
    
    
    • 多级通配符:"#"
      多级通配符覆盖任意数量的主题级别,必须是主题中的最后一个字符,并且前面有/,例如:
    home/floor/# //此主题订阅与以下主题匹配或不匹配,√:匹配 ×:不匹配
    
    home/floor/kitchen/temp √
    home/floor/livingroom/brightness √
    home/firstfloor/kitchen/temp ×
    

    Topic,payload设计方案

    topic和payload设计方案一般有如下两种,当然还有其它更多的组合

    //1.topic携带尽可能多的信息 payload
    plant1/machineA/sensorX/temp/value 20
    plant1/machineA/sensorX/temp/unit ℃
    plant1/machineA/sensorX/temp/date 2020-04-11 12:12:12
    
    //2.topic payload携带尽可能多的信息
    plant1/machineA/
    {
      ["sensorX": {
                   "value": 20,
                   "unit": "C",
                   "timestamp": "2018-08-01T12:00:30.123Z"
                    }
      ]
    }
    

    尽管可以按照自己的喜好设计topic,应当注意的是,不同的设计会带来不同的影响,除了影响语义的清晰性,也可能影响系统性能。

    例如屋子里有10个传感器,

    在风格house/sensor01…house/sensor1中,house/sensor01 消息只发给sensor01(只有一个订阅者)

    在风格house中,10个传感器都订阅它,payload为{“sensor01”:“on”}的消息将发送给10个传感器,每个传感器都需要检查消息以查看他是否适合自己。

    因此有如下建议:

    • 为单个设备或一小组设备使用相同的topic

    • 为data和commands使用单独的topic

    • 消息payload中的数据应该是特定设备的

    • 消息payload中与设备的多个属性相关的数据是json编码的

    topic命名注意:

    • 每个主题必须至少有一个有效的字符,可以包含空格,区分大小写。

    • 不要在最前面加/,例如:

    /home/floor/house
    

    等于在最前面有一个空字符串层级,完全没有必要,且增加了broker的处理,

    home/floor/house
    

    才是合理的。

    • 使用英文+数字字符,不要使用空格、特殊字符,会增加处理的复杂性,以及带来可能的兼容性问题

    • 将设备id或者识别码包含在topic中,便于订阅特定设备、后续过滤、权限控制

    • 命名简单明确,太长了看太累,看不懂会困惑,容易出错,topic应该尽可能详细,能定位到不同的设备和消息

    如果你有三个传感器在卧室中,你应该这样命名主题:
    
    myhome/livingroom/temperature,
    myhome/livingroom/brightness, 
    myhome/livingroom/humidity,
    
    而不是通过myhome/livingroom发送所有的值。这样也便于你使用其他的 MQTT 功能,
    
    • 命令字保持一致,放在最后,例如:
    home/bedroom/bedlight/rgb/set
    
    • 不要忘记可扩展性
      主题是一个灵活的概念,不需要预先为其分配空间,但发布者和订阅者双方都应该知晓主题。所以思考如何能在添加新功能时仍可以很好地扩展当前主题就显得尤为重要。例如,当你的智能家居系统需要增加一些新的传感器时,应该可以在不改变主题架构的前提下将其添加进去。

    参考

    mqtt-essentials 10篇文档
    MQTT Topic and Payload Design Notes

    展开全文
  • MQTT topic匹配规则基础1.主题层级分隔符—“/”:用于分割主题层级,/分割后的主题,这是消息主题层级设计中很重要的符号e.g:aaaa/bbbb和 aaaa/bbbb/cccc 和aaaa/bbbb/cccc/dddd ,这样的消息主题格式,是一个层层...

    MQTT topic匹配规则基础

    1.主题层级分隔符—“/”:

    用于分割主题层级,/分割后的主题,这是消息主题层级设计中很重要的符号

    e.g:aaaa/bbbb和 aaaa/bbbb/cccc 和aaaa/bbbb/cccc/dddd ,这样的消息主题格式,是一个层层递进的关系,可通过多层通配符同时匹配两者,或者单层通配符只匹配一个。 这在现实场景中,可以应用到:公司的部门层级推送、国家城市层级推送等包含层级关系的场景。

    2.单层通配符—-“+”:

    单层通配符只能匹配一层主题。e.g: aaaa/+ 可以匹配 aaaa/bbbb ,但是不能匹配aaaa/bbbb/cccc。 单独的+号可以匹配单层的所有推送

    3.多层通配符—-“#”:

    #:多层通配符,多层通配符可以匹配于多层主题。比如: aaaa/# 不但可以匹配aaaa/bbbb,还可以匹配aaaa/bbbb/cccc/dddd。 也就是说,多层通配符可以匹配符合通配符之前主题层级的所有子集主题。单独的#匹配所有的消息主题.

    4.通配符 —-“$”:

    通配符“$”表示匹配一个字符,只要不是放在主题的最开头,即:

    $xx/$xx/xx$

    其它情况下都表示匹配一个字符。

    如果客户端想同时接受以 “SYS/”开头主题的消息和不以 开头主题的消息, 它需要同时订阅 “#” 和 ““$SYS/#”。

    5.总结:

    a、所有的主题名和主题过滤器必须至少包含一个字符b、主题名或主题过滤器以前置或后置斜杠 “/” 区分c、只包含斜杠 “/” 的主题名或主题过滤器是合法的d、主题名和主题过滤器是 UTF-8 编码字符串, 它们不能超过 65535 字节e、主题名和主题过滤器是区分大小写的注: 单层通配符和多层通配符只能用于订阅(subscribe)消息而不能用于发布(publish)消息,层级分隔符两种情况下均可使用

    MQTT topic 设计实践:

    不要在最前面加/比如:/home/device/light, 等于在最前面有一个空字符串层级,这完全没有必要而且增加了broker之类的处理,home/device/light才是合理的。就使用英文+数字字符,不要使用空格、特殊字符这些都会增加处理的复杂性,有时候还会有兼容性问题将设备ID或识别码包含在topic中多方面原因:便于订阅特定设备、便于后续的过滤、便于权限控制不要在运行中创建 topic这个好理解,交流还是有预期比较好。在规模较大的系统中,随意的创建 topic 会导致维护困难、处理复杂度增加,最主要的肯定非常容易导致遗漏和未知行为。命名简单明确太长了看太累,看不懂会困惑,太累或困惑都容易出错;topic 应该尽可能细致,能详细定位到不同的设备和消息

    Mosquitto 系统topic功能

    mosquitto的系统topic主要是以$SYS开头的topic,这些topic只能mosquitto自己发送,客户端只能订阅,无法发送;mosquitto的系统topic主要用于mosquitto对外发布一些自身状态的消息,例如当前客户端连接数量等等,如下所示:

    当前mosquitto维持的客户端数量:$SYS/broker/clients/total

    当前mosquitto维护的活跃的客户端数量:$SYS/broker/clients/inactive等等;

    展开全文
  • MQTT协议在topic设计上的想法 集群方式使用EMQTT的方案:http://emqtt.com/docs/v2/cluster.html 假设有异地多中心 假设EMQTT的node节点之前有数据的分发 问题: 按照上面文档说明的路由表的方案的话,在每个节点...

    MQTT协议在topic设计上的想法

    633187-20171223162357865-1309053204.png

    问题:
    按照上面文档说明的路由表的方案的话,在每个节点都订阅#的话可能会导致一条消息被路由多于1次。
    论证:
    假设集群中有两台机器A、B,
    A维护sub Topic:A1、A2
    B维护sub Topic:B1、B2
    在A、B分别订阅#,那么在B上pub topic A1的情况下,B会将改消息路由给A,实际上B、A收到了重复了一条消息。
    解决方案:
    在一些场景上需要为topic设计前缀,前缀设计方案:
    * 负载单元,每台机器的负载能力不一致,可以设计A机器的负载单位数量为3,B机器的负载单位为2,此时A机器应该有/A1/、/A2/、/A3/,B应该有/B1/、/B2/;
    按照业务划分,例如:厂商、地区、聊天室;
    如果上面猜测为实际的话,对于系统的负载和逻辑都有很大的影响,那么解决方案为
    topic的设计方式:
    A维护sub topic为A/A1、A/A2
    B维护sub topic为B/B1、B/B2
    在A上sub topic为A/#
    在B上sub topic为B/#
    * 也可以只在A或者B上sub #,不推荐这种方式

    集群中使用auth插件,auth插件的数据驱动为Redis、MySQL的话,可以使用同一个数据库。

    转载于:https://www.cnblogs.com/zzx11235/articles/8093702.html

    展开全文
  • 1.若没有分区,一个topic对应的消息集在分布式集群服务组中,就会分布不均匀,即可能导致某台服务器A记录当前topic的消息集很多,若此topic的消息压力很大的情况下,服务器A就可能导致压力很大,吞吐也容易导致瓶颈...
  • Topic Model的分类和设计原则 http://blog.csdn.net/xianlingmao/article/details/7065318 topic model的介绍性文章已经很多,在此仅做粗略介绍,本文假设读者已经较为熟悉Topic Medel。 Topic Model (LDA)认为...
  • 1.topic的命名原则和基础 topic可以划分为多个层级,如果是不同的主题,采用“/”分隔, 举例:“/serve/temperature/12345678” 例子中分为了3层主题,第一层表明这是服务器,第二场表明数据是温度,第三层表明这是...
  • 本文主要介绍RocketMQ中Topic、Tag、GroupName的概念、设计初衷以及使用方法。 一.Topic 首先看看官方的定义: Topic是生产者在发送消息和消费者在拉取消息的类别。Topic与生产者和消费者之间的关系非常松散。 ...
  • 使用了这个模式确实有利于模块解耦合,但是当模块比较多,topic设计就出现了问题。 请问用过这种模式的大神,你见过好的topic是如何设计的?多层topic有没有好一点的处理办法?topic对应的数据格式又...
  • 主题的设计是非常重要的,首先需要了解的就是MQTT主题过滤规则。1、topic定阅与发布必须要有主题,只有当定阅了某个主题后,才能收到相应主题的payload,才能进行通信。2、 主题层级分隔符—“/”主题层级分隔符使得...
  • MQTT--topic(主题)设计

    万次阅读 多人点赞 2017-10-27 01:05:00
    1、topic 定阅与发布必须要有主题,只有当定阅了某个主题后,才能收到相应主题的payload,才能进行通信。2、 主题层级分隔符—“/” 主题层级分隔符使得主题名结构化。如果存在分隔符,它将主题名分割为多个主题...
  • topic model的介绍性文章已经很多,在此仅做粗略介绍,本文假设读者已经较为熟悉Topic Medel。 Topic Model (LDA)认为一个离散数据集合(如文档集合,图片集合,为行文方便,本文统统以文档集合作为描述对象,...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 2,475
精华内容 990
关键字:

topic设计