你好
正如我最近写的(
关于MQTT / UDP的第一篇简短文章 ),MQTT / UDP是基于MQTT的协议,但是:
- 在UDP广播之上(不需要代理,几乎不需要配置)
- 实施起来非常简单(C + UDP / IP堆栈上有10行-并且您从传感器发送数据)
- 每个人都听到
在某种程度上,这是CAN,但在以太网之上。
为什么
我的公寓实际上已经在诸如“房子不是真正的少尿症”之类的系统控制下生活了几年。 称其为智能将是多余的,但是光线和气候是自动的。 想象灾难的规模-系统占用了一个充满塞子的机架,机架宽约19英寸,高2米。 机架的两堵墙几乎占据了地板。
当我设计所有这些时,容错的问题首先出现。 已经有几年的运作证明:这是事实。 否认一切。 早晚。 但是机电继电器尚未发生故障,这是它们上防止故障的最后一梯。
容错之后的下一个问题是动物园。 由于自然而然的生活,我的好奇心和急需,常规PC上的Unix,Aries PLC,Raspberr + Orange PI,Atmega模块,基于NodeMCU的模块(ESP8266)都存在于系统中,并且所有这些都通过modbus相互传递485,modbus TCP,http和侧面挂着一个躁动不安的MQTT代理,这是尝试在整个阵营中切换到该代理的未成功尝试的产物。
为什么尝试切换到MQTT失败。 首先,对于部分铁来说,它很重或很复杂。 在CodeSys PLC中隐藏的Pascal片段上,只有受虐狂可以编写MQTT。 但是然后您需要调试。 类似地,在atmega上:您可以塞入,但要塞紧。 但这不是全部麻烦。
MQTT本身(在3.1.1处都可以接受)坚持要求向所有收件人(包括发件人)发送PUBLISH数据包(即,我们向代理发送的消息)。 这种疯狂的效果令人着迷-相同的OpenHAB无法以相同的名称在MQTT中发送和接收数据。 这意味着不可能基于MQTT(几个更新同一对象的值并使用它的模块)来组织总线。 这正是PLC通讯的组织方式,主要的灯光控件存在于其中,OpenHAB(用于控制来自Web界面和移动应用程序的灯光)以及智能开关(我希望能够在此处和此处添加)在其中进行组织。 也就是说,当然可以解决此问题,但是实际上,这意味着构建您自己的协议SURFACE MQTT,这似乎已经太多了。
同时,我需要什么? 发送参数值的更新并在所有感兴趣的点获取它。 实际上,祖父为此做了UDP广播地址。
在Habré上的最后一篇文章发表之后,很长时间以来,一位读者以不可靠的UDP协议责备我。 我推测性地回答了他,对于物联网,UDP比TCP更加可靠:网络上的数据包丢失50%时,TCP不仅会掉下来,而且通常情况下,通过UDP发送测量值的温度传感器只会丢失一半的计数,这会影响系统以任何方式运行。 一般而言。
但这是投机性的。 但是,还给一个人提供了新年假期,以便喝完香槟问自己:我们今天是否将家庭局域网放在铁锹上? 而且无论如何。
我接受了MQTT / UDP并编写了原始测试。 一侧发送连续的数据包,并且在数据包之间尽可能不间断。 第二个考虑速度和数据包丢失。 实验很简单:我们启动了这种嘲弄,并同时通过两台高清电视播放了来自互联网的电影,台式计算机将一个巨大的文件写入了NAS。
评价结果。 我等了一切,但是... UDP的最大损失达到了一半,并且两台电视都停止显示。 所以我还是个悲观主义者。 在实际的家庭网络中,UDP传递的可靠性接近绝对。 不过,我可能会制作一个带有确认的版本并重新发送软件包。 困难很少,但问题已完全消除。
第二个问题是安全性,但是正确的是,如果它们侵入我的家庭网络,那么温度传感器的数据丢失将是我最不高兴的事情。 但是,再次出现了在问题跟踪器中对软件包进行数字签名的任务,并且我已经了解了如何扩展MQTT软件包以实现其实现。
通常,我计划在前一天在家庭网络中的第一对设备上切换到MQTT / UDP。
我建议您在程序和设备中尝试一下:
英文 存储库和
文档 。
可用内容:
Java,Python和C的相当完整的实现。 Lua的基本实现。 到目前为止,仅发送Arduino和CodeSys PLC(已在Aries上进行了测试和工作,但应该可以执行任何操作)。
GUI工具查看正在发生的事情并进行干预:

用Python,Lua和Java发送和接收数据的程序。
Python连接器,用于与常规MQTT以及直接与OpenHAB集成。 它们制定了防止循环的保护措施,在向前传递后的5秒钟内禁止反向广播消息。 此外,还有一个库可限制重复数据的流动。 她检查在指定时间内是否已有该主题的更新,如果已更新,则仅在数据已更改时才跳过新更新。
我计划逐步逐步完全采用该协议,这是我想从传感器获得的一个示例:

一间屋子里有3个感应器(无论是在街上还是在街上,都没关系)。 他们通过MQTT / UDP发送样本。 这些读数由主要的智能家居系统(OpenHAB),历史数据库和显示居民温度的墙壁监控器同时接收。
MQTT / UDP的全部魅力在于,在这样的方案中,任何块的失败都不会给其他所有人造成任何问题。 这是该协议迷人的简单性。
此外,具有重复的冗余控制方案可以在同一方案中轻松实现。 可以复制数据库服务器而没有任何问题。 复制与管理相关的模块将更加棘手。 例如,聆听温度可对散热器进行控制。 但这可能是下一个故事。 今天,我计划专注于从传感器收集信号并在智能家居的模块之间进行交换。