文章目录

  • 前言
  • Topics
  • 通配符
  • Topic,payload设计方案
  • 参考

前言

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

关于Topic设计的思考相关推荐

  1. SAP MM 关于采购组设计的思考

    SAP MM 关于采购组设计的思考 在项目实践中,SAP MM中的采购组的设计有如下2种常见的方式: 1)采购组与采购员对应起来.一个采购组可以对应一个采购员,也可以对应一组采购员.笔者参与的好几个项 ...

  2. HDLBits答案(6)_硬件模块设计的思考方式

    硬件模块设计的思考方式 HDLBits链接 基本的逻辑门操作 题目描述1:将输入端口in和输出端口out连接. Solution1: module top_module (input in,outpu ...

  3. 【案例讨论】从案例引发的对缓存设计的思考,干货讨论,绝对不玩虚的

    主题:从案例引发的对缓存设计的思考 背景: 谈到性能优化,势必要谈到缓存架构的设计与使用.几乎是所有人都知道缓存的威力,但是知道终归只是知道,如何真正合理的在自己的项目中进行使用,又是另外一回事了.我 ...

  4. 生鲜配送ERP系统_对商品模块数据模型与界面设计的思考【Java 开源版】杭州生鲜配送系统_升鲜宝_SaaS全链路生鲜供应链管理系统_升鲜宝

    生鲜配送ERP系统_对商品模块数据模型与界面设计的思考及简要分析[Java 开源版]杭州生鲜配送系统_升鲜宝_SaaS全链路生鲜供应链管理系统_升鲜宝 一直在研究与改造自己的生鲜配送系统,越来越觉得后 ...

  5. 手机游戏的分析,设计,思考

    问题导向 本文是对于手机游戏产品的分析,设计,思考 如果你都有了答案,可以忽略本文章,或去产品学习地图寻找更多答案 前言 本文将分享作者对于游戏的一些理解与分析,主要分为几个方面,并且简单分析< ...

  6. 计算机导论第五讲MOOC模拟答案,MOOC理念指导下的计算机导论课程_微课堂_设计与思考_朱淑鑫...

    MOOC理念指导下的计算机导论课程 "微课堂"设计与思考 朱淑鑫,徐焕良,任守纲,李晓晖 (南京农业大学 信息科学与技术学院,江苏 南京210095) 摘要:在MOOC理念的指导下 ...

  7. 关于小梅哥ADC128S022驱动设计的思考

    此篇文章,主要讲述经过视频点拨后自己动手写adc_driver.v代码所遇到的若干问题. 文章目录 1. 开篇,各模块连接关系 2. ADC时序分析 2.1 DIN的变化 2.2 rdata的变化 2 ...

  8. 服务拆分的设计和思考(B2B 技术共享第九篇)

    本文主要想给大家分享一下,宋小菜这三年来,是如何从单点巨石系统演变成领域驱动的服务化设计的.这个演变现在还在继续,我们在实践过程中遇到了很多坑,也收获了经验和思考. 一.早期的系统 1.1 唯快不破 ...

  9. 网站设计的思考 (转)

    1.定位你的网站主题和名称 2.定位你的网站CI形象 3.确定网站的栏目和版块 4.确定网站的目录结构和链接结构 5.确定网站的整体风格和创意设计 6.首页的设计 7.版面布局的原理 8.网页色彩搭配 ...

最新文章

  1. 我们工作到底为了什么(坚持全篇看完你将受益匪浅)(转)
  2. Ubuntu 安装SVN服务器端
  3. Debugging into .NET Core源代码的两种方式
  4. 24 | 二叉树基础(下):有了如此高效的散列表,为什么还需要二叉树?
  5. 人脸识别腾讯安排上了!孩子不能再任意冒用家长身份信息
  6. DXUT框架剖析(8)
  7. 家庭安防监控设备搭建
  8. mysql遵循acid_关系型数据库遵循ACID规则
  9. 机器学习实战 利用sklearn库预测科比生涯数据
  10. 软件项目管理的基本流程
  11. scrapy爬取晋江免费小说(章节)+ cookie爬vip章节
  12. ABAP -- 删除重复项
  13. macOS在IDEA上集成PLANTUML Graphviz绘制UML图并导出SVG
  14. 郝萌主的微信公众号上线了
  15. python操作ymal文件之PyYAML库的使用
  16. 关于mos管的压降问题(项目遇到问题总结)
  17. 想体验.NET7又不想安装体验版,Windows沙盒了解一下
  18. 汽车零售软件的全球与中国市场2022-2028年:技术、参与者、趋势、市场规模及占有率研究报告
  19. Oauth2.0 github认证登录实现
  20. 16.GridView宫格的实现及其显示其…

热门文章

  1. 双目相机实现物体三维重建,得到三维点云
  2. 硬核干货Java集合详解
  3. ff14不同服务器有什么影响,FF14转服后的各种弊端分析 切勿盲目跟风
  4. [git]fatal: unable to read config file 'xxx/.gitconfig': No such file or directory
  5. python:画python,即绘制蟒蛇图像
  6. 【网络】OSI七层模型
  7. 小程序实现滚动加载(懒加载)
  8. Jsp:WebRoot与WebContent区别
  9. 网络分析仪测试线损_手把手教你用2端口网络分析仪进行阻抗调试分析--网络分析仪维修...
  10. 网络分析仪E5071C 使用