eagler8 发表于 2020-6-18 16:30

MicroPython动手做(32)——物联网之MQTT

<div class='showpostmsg'><p></p>

<p>MQTT<br />
(Message Queuing Telemetry Transport)消息队列遥测传输协议,是一种基于发布/订阅(publish/subscribe)模式的&quot;轻量级&quot;通讯协议,该协议构建于TCP/IP协议上,由IBM在1999年发布。MQTT最大优点在于,可以以极少的代码和有限的带宽,为连接远程设备提供实时可靠的消息服务。作为一种低开销、低带宽占用的即时通讯协议,使其在物联网、小型设备、移动应用等方面有较广泛的应用。</p>

<p>&nbsp;</p>

<p>MQTT是一个基于客户端-服务器的消息发布/订阅传输协议。MQTT协议是轻量、简单、开放和易于实现的,这些特点使它适用范围非常广泛。在很多情况下,包括受限的环境中,如:机器与机器(M2M)通信和物联网(IoT)。其在,通过卫星链路通信传感器、偶尔拨号的医疗设备、智能家居、及一些小型化设备中已广泛使用。</p>
</div><script>                                var loginstr = '<div class="locked">查看精华帖全部内容,请<a href="javascript:;"   style="color:#e60000" class="loginf">登录</a>或者<a href="https://bbs.eeworld.com.cn/member.php?mod=register_eeworld.php&action=wechat" style="color:#e60000" target="_blank">注册</a></div>';
                               
                                if(parseInt(discuz_uid)==0){
                                                                                        (function($){
                                                        var postHeight = getTextHeight(400);
                                                        $(".showpostmsg").html($(".showpostmsg").html());
                                                        $(".showpostmsg").after(loginstr);
                                                        $(".showpostmsg").css({height:postHeight,overflow:"hidden"});
                                                })(jQuery);
                                }
</script><script type="text/javascript">(function(d,c){var a=d.createElement("script"),m=d.getElementsByTagName("script"),eewurl="//counter.eeworld.com.cn/pv/count/";a.src=eewurl+c;m.parentNode.insertBefore(a,m)})(document,523)</script>

eagler8 发表于 2020-6-18 16:44

本帖最后由 eagler8 于 2020-6-18 17:00 编辑

<p></p>

<p>&nbsp;</p>

<p>&nbsp;</p>

<p>MQTT(消息队列遥测传输)<br />
是ISO 标准(ISO/IEC PRF 20922)下基于发布/订阅范式的消息协议。它工作在TCP/IP协议族上,是为硬件性能低下的远程设备以及网络状况糟糕的情况下而设计的发布/订阅型消息协议,为此,它需要一个消息中间件。</p>

<p>&nbsp;</p>

<p>IBM公司的安迪&middot;斯坦福-克拉克及Cirrus Link公司的阿兰&middot;尼普于1999年撰写了该协议的第一个版本。该协议的可用性取决于该协议的使用环境。IBM公司在2013年就向结构化资讯标准促进组织提交了 MQTT 3.1 版规范,并附有相关章程,以确保只能对规范进行少量更改。MQTT-SN是针对非 TCP/IP 网络上的嵌入式设备主要协议的变种,与此类似的还有ZigBee协议。</p>

<p>&nbsp;</p>

<p>纵观行业的发展历程,&ldquo;MQTT&rdquo;中的&ldquo;MQ&rdquo; 是来自于IBM的MQ系列消息队列产品线。然而通常队列本身不需要作为标准功能来支持。可选协议包含了高级消息队列协议,面向文本的消息传递协议,互联网工程任务组约束应用协议,可扩展消息与存在协议,数据分发服务,OPC UA以及web 应用程序消息传递协议。&nbsp;</p>

eagler8 发表于 2020-6-18 17:04

<p></p>

<p>&nbsp;</p>

<p>MQTT协议主要原则</p>

<p>(1)精简,不添加可有可无的功能;<br />
(2)发布/订阅(Pub/Sub)模式,方便消息在传感器之间传递;<br />
(3)允许用户动态创建主题,零运维成本;<br />
(4)把传输量降到最低以提高传输效率;<br />
(5)把低带宽、高延迟、不稳定的网络等因素考虑在内;<br />
(6)支持连续的会话控制;<br />
(7)理解客户端计算能力可能很低;<br />
(8)提供服务质量管理;<br />
(9)假设数据不可知,不强求传输数据的类型与格式,保持灵活性。</p>

eagler8 发表于 2020-6-18 17:09

<p>MQTT协议主要特性</p>

<p>&nbsp;</p>

<p>MQTT协议工作在低带宽、不可靠的网络的远程传感器和控制设备通讯而设计的协议,它具有以下主要的几项特性:</p>

<p>&nbsp;</p>

<p>(1)使用发布/订阅消息模式,提供一对多的消息发布,解除应用程序耦合。</p>

<p>&nbsp;</p>

<p>这一点很类似于XMPP,但是MQTT的信息冗余远小于XMPP,,因为XMPP使用XML格式文本来传递数据。</p>

<p>&nbsp;</p>

<p>(2)对负载内容屏蔽的消息传输。</p>

<p>&nbsp;</p>

<p>(3)使用TCP/IP提供网络连接。</p>

<p>&nbsp;</p>

<p>主流的MQTT是基于TCP连接进行数据推送的,但是同样有基于UDP的版本,叫做MQTT-SN。这两种版本由于基于不同的连接方式,优缺点自然也就各有不同了。</p>

<p>&nbsp;</p>

<p>(4)有三种消息发布服务质量:</p>

<p>&nbsp;</p>

<p>&quot;至多一次&quot;,消息发布完全依赖底层TCP/IP网络。会发生消息丢失或重复。这一级别可用于如下情况,环境传感器数据,丢失一次读记录无所谓,因为不久后还会有第二次发送。这一种方式主要普通APP的推送,倘若你的智能设备在消息推送时未联网,推送过去没收到,再次联网也就收不到了。</p>

<p>&nbsp;</p>

<p>&quot;至少一次&quot;,确保消息到达,但消息重复可能会发生。</p>

<p>&nbsp;</p>

<p>&quot;只有一次&quot;,确保消息到达一次。在一些要求比较严格的计费系统中,可以使用此级别。在计费系统中,消息重复或丢失会导致不正确的结果。这种最高质量的消息发布服务还可以用于即时通讯类的APP的推送,确保用户收到且只会收到一次。</p>

<p>&nbsp;</p>

<p>(5)小型传输,开销很小(固定长度的头部是2字节),协议交换最小化,以降低网络流量。</p>

<p>&nbsp;</p>

<p>这就是为什么在介绍里说它非常适合&quot;在物联网领域,传感器与服务器的通信,信息的收集&quot;,要知道嵌入式设备的运算能力和带宽都相对薄弱,使用这种协议来传递消息再适合不过了。</p>

<p>&nbsp;</p>

<p>(6)使用Last Will和Testament特性通知有关各方客户端异常中断的机制。</p>

<p>&nbsp;</p>

<p>Last Will:即遗言机制,用于通知同一主题下的其他设备发送遗言的设备已经断开了连接。</p>

<p>&nbsp;</p>

<p>Testament:遗嘱机制,功能类似于Last Will。</p>

eagler8 发表于 2020-6-18 17:27

<p></p>

<p>MQTT 发布和订阅模型<br />
基于 TCP 协议的应用层协议;<br />
采用 C/S 架构;<br />
使用订阅/发布模式,将消息的发送方和接受方解耦;<br />
提供 3 种消息的 QoS(Quality of Service): 至多一次,最少一次,只有一次;<br />
收发消息都是异步的,发送方不需要等待接收方应答。</p>

<p>&nbsp;</p>

<p>MQTT 跟传统的消息队列相比,有以下一些区别<br />
1. 在传统消息队列中,在发送消息之前,必须先创建相应的队列;在 MQTT 中,不需要预先创建要发布的主题(可订阅的 Topic);<br />
2. 在传统消息队列中,未被消费的消息总是会被保存在某个队列中,直到有一个消费者将其消费;在 MQTT 中,如果发布一个没有被任何客户端订阅的消息,这个消息将被直接扔掉;<br />
3. 在传统消息队列中,一个消息只能被一个客户端获取,在 MQTT 中,一个消息可以被多个订阅者获取,MQTT 协议也不支持指定消息被单一的客户端获取。</p>

<p>&nbsp;</p>

<p>MQTT 的优点<br />
1. 实现简单<br />
2. 提供数据传输的 QoS<br />
3. 轻量、占用带宽低<br />
4. 可传输任意类型的数据<br />
5. 可保持的会话(session)<br />
MQTT 协议可以为大量的低功率、工作网络环境不可靠的物联网设备提供通讯保障。</p>

eagler8 发表于 2020-6-18 18:23

本帖最后由 eagler8 于 2020-6-18 18:28 编辑

<p>MQTT&nbsp;功能构成</p>

<p>MQTT是一种基于发布 - 订阅的&ldquo;轻量级&rdquo;消息传递协议,用于在TCP / IP协议之上使用,它适用于需要&ldquo;小代码占用&rdquo;或网络带宽有限的远程位置的连接。 能实现一对多通信(人们称之为发布或订阅型)的协议。它由3 种功能构成,分别是中介(broker)、发布者(publisher)和订阅者(subscriber)。中介承担着转发MQTT 通信的服务器的作用。相对而言,发布者和订阅者则起着客户端的作用。发布者是负责发送消息的客户端,而订阅 者是负责接收消息的客户端。MQTT 交换的消息都附带&ldquo;主题&rdquo;地址,各个客户端把这个&ldquo;主题&rdquo;视为收信地址,对其执行传输消息的操作。 形象地比喻一下,中介就是接收邮件的邮箱。</p>

<p>&nbsp;</p>

<p></p>

eagler8 发表于 2020-6-18 18:29

<p>MQTT 通信的机制<br />
中介在等待各个客户端对其进行连接。订阅者连接中介,把自己想订阅的主题名称告诉中介。这就叫作订阅。 然后发布者连接中介,以主题为收信地址发送消息。这就是发布。发布者一发布主题,中介就会把消息传递给订阅了该主题的订阅者。如图所示,如果订阅者订阅了主题A,那么只有在发布者发布了主题A 的情况下,中介才会把消息传递给订阅者。订阅者和中介总是处于 连接状态,而发布者则只需在发布时建立连接,不过要在短期内数次发布时,就需要保持连接状态了。因为中介起着转发消息的作用,所以各 个客户端彼此之间没有必要知道对方的IP 地址等网络上的收信地址。又因为多个客户端可以订阅同一个主题,所以发布者和订阅者是一 对多的关系。在设备和服务器的通信中,设备相当于发布者,服务器则相当于订阅者。</p>

<p>&nbsp;</p>

<p></p>

qiantou 发表于 2020-6-19 10:37

<p>很不错</p>

eagler8 发表于 2020-6-19 11:32

qiantou 发表于 2020-6-19 10:37
很不错

<p>谢谢老师的鼓励,还在学习中</p>

eagler8 发表于 2020-6-23 10:37

<p><strong>目录清单</strong><br />
MicroPython动手做(01)&mdash;&mdash;春节后入手了一块K210芯片AI开发板&nbsp;<br />
<a href="https://bbs.eeworld.com.cn/thread-1115786-1-1.html" target="_blank">https://bbs.eeworld.com.cn/thread-1115786-1-1.html</a></p>

<p>MicroPython动手做(02)&mdash;&mdash;尝试搭建K210开发板的IDE环境<br />
<a href="https://bbs.eeworld.com.cn/thread-1115831-1-1.html" target="_blank">https://bbs.eeworld.com.cn/thread-1115831-1-1.html</a></p>

<p>MicroPython动手做(03)&mdash;&mdash;零基础学MaixPy之开机运行<br />
<a href="https://bbs.eeworld.com.cn/thread-1116184-1-1.html" target="_blank">https://bbs.eeworld.com.cn/thread-1116184-1-1.html</a></p>

<p>MicroPython动手做(04)&mdash;&mdash;零基础学MaixPy之基本示例<br />
<a href="https://bbs.eeworld.com.cn/thread-1116438-1-1.html" target="_blank">https://bbs.eeworld.com.cn/thread-1116438-1-1.html</a></p>

<p>MicroPython动手做(05)&mdash;&mdash;零基础学MaixPy之LCD液晶屏<br />
<a href="https://bbs.eeworld.com.cn/thread-1116577-1-1.html" target="_blank">https://bbs.eeworld.com.cn/thread-1116577-1-1.html</a></p>

<p>MicroPython动手做(06)&mdash;&mdash;零基础学MaixPy之单目摄像头<br />
<a href="https://bbs.eeworld.com.cn/thread-1116591-1-1.html" target="_blank">https://bbs.eeworld.com.cn/thread-1116591-1-1.html</a></p>

<p>MicroPython动手做(07)&mdash;&mdash;零基础学MaixPy之机器视觉<br />
<a href="https://bbs.eeworld.com.cn/thread-1116617-1-1.html" target="_blank">https://bbs.eeworld.com.cn/thread-1116617-1-1.html</a></p>

<p>MicroPython动手做(08)&mdash;&mdash;零基础学MaixPy之识别颜色&nbsp;<br />
<a href="https://bbs.eeworld.com.cn/thread-1116662-1-1.html" target="_blank">https://bbs.eeworld.com.cn/thread-1116662-1-1.html</a></p>

<p>MicroPython动手做(09)&mdash;&mdash;零基础学MaixPy之人脸识别<br />
<a href="https://bbs.eeworld.com.cn/thread-1116720-1-1.html" target="_blank">https://bbs.eeworld.com.cn/thread-1116720-1-1.html</a></p>

<p>MicroPython动手做(10)&mdash;&mdash;零基础学MaixPy之神经网络KPU<br />
<a href="https://bbs.eeworld.com.cn/thread-1116925-1-1.html" target="_blank">https://bbs.eeworld.com.cn/thread-1116925-1-1.html</a></p>

<p>MicroPython动手做(11)&mdash;&mdash;搭建掌控板IDE环境<br />
<a href="https://bbs.eeworld.com.cn/thread-1117964-1-1.html" target="_blank">https://bbs.eeworld.com.cn/thread-1117964-1-1.html</a></p>

<p>MicroPython动手做(12)&mdash;&mdash;掌控板之Hello World<br />
<a href="https://bbs.eeworld.com.cn/thread-1118180-1-1.html" target="_blank">https://bbs.eeworld.com.cn/thread-1118180-1-1.html</a></p>

<p>MicroPython动手做(13)&mdash;&mdash;掌控板之RGB三色灯&nbsp;<br />
<a href="https://bbs.eeworld.com.cn/thread-1118275-1-1.html" target="_blank">https://bbs.eeworld.com.cn/thread-1118275-1-1.html</a></p>

<p>MicroPython动手做(14)&mdash;&mdash;掌控板之OLED屏幕<br />
<a href="https://bbs.eeworld.com.cn/thread-1118389-1-1.html" target="_blank">https://bbs.eeworld.com.cn/thread-1118389-1-1.html</a></p>

<p>MicroPython动手做(15)&mdash;&mdash;掌控板之AB按键<br />
<a href="https://bbs.eeworld.com.cn/thread-1118496-1-1.html" target="_blank">https://bbs.eeworld.com.cn/thread-1118496-1-1.html</a></p>

<p>MicroPython动手做(16)&mdash;&mdash;掌控板之图片图像显示<br />
<a href="https://bbs.eeworld.com.cn/thread-1118945-1-1.html" target="_blank">https://bbs.eeworld.com.cn/thread-1118945-1-1.html</a></p>

<p>MicroPython动手做(17)&mdash;&mdash;掌控板之触摸引脚<br />
<a href="https://bbs.eeworld.com.cn/thread-1119462-1-1.html" target="_blank">https://bbs.eeworld.com.cn/thread-1119462-1-1.html</a></p>

<p>MicroPython动手做(18)&mdash;&mdash;掌控板之声光传感器<br />
<a href="https://bbs.eeworld.com.cn/thread-1119583-1-1.html" target="_blank">https://bbs.eeworld.com.cn/thread-1119583-1-1.html</a></p>

<p>MicroPython动手做(19)&mdash;&mdash;掌控板之蜂鸣器与音乐<br />
<a href="https://bbs.eeworld.com.cn/thread-1119668-1-1.html" target="_blank">https://bbs.eeworld.com.cn/thread-1119668-1-1.html</a></p>

<p>MicroPython动手做(20)&mdash;&mdash;掌控板之三轴加速度<br />
<a href="https://bbs.eeworld.com.cn/thread-1119998-1-1.html" target="_blank">https://bbs.eeworld.com.cn/thread-1119998-1-1.html</a></p>

<p>MicroPython动手做(21)&mdash;&mdash;掌控板之磁场传感器<br />
<a href="https://bbs.eeworld.com.cn/thread-1120188-1-1.html" target="_blank">https://bbs.eeworld.com.cn/thread-1120188-1-1.html</a></p>

<p>MicroPython动手做(22)&mdash;&mdash;掌控板之无线广播<br />
<a href="https://bbs.eeworld.com.cn/thread-1120835-1-1.html" target="_blank">https://bbs.eeworld.com.cn/thread-1120835-1-1.html</a></p>

<p>MicroPython动手做(23)&mdash;&mdash;掌控板之WiFi与蓝牙<br />
<a href="https://bbs.eeworld.com.cn/thread-1120934-1-1.html" target="_blank">https://bbs.eeworld.com.cn/thread-1120934-1-1.html</a></p>

<p>MicroPython动手做(24)&mdash;&mdash;掌控板之拓展掌控宝&nbsp;<br />
<a href="https://bbs.eeworld.com.cn/thread-1121208-1-1.html" target="_blank">https://bbs.eeworld.com.cn/thread-1121208-1-1.html</a></p>

<p>MicroPython动手做(25)&mdash;&mdash;语音合成与语音识别<br />
<a href="https://bbs.eeworld.com.cn/thread-1123752-1-1.html" target="_blank">https://bbs.eeworld.com.cn/thread-1123752-1-1.html</a></p>

<p>MicroPython动手做(26)&mdash;&mdash;物联网之OneNET<br />
<a href="https://bbs.eeworld.com.cn/thread-1125172-1-1.html" target="_blank">https://bbs.eeworld.com.cn/thread-1125172-1-1.html</a></p>

<p>MicroPython动手做(27)&mdash;&mdash;物联网之微信小程序<br />
<a href="https://bbs.eeworld.com.cn/thread-1125520-1-1.html" target="_blank">https://bbs.eeworld.com.cn/thread-1125520-1-1.html</a></p>

<p>MicroPython动手做(28)&mdash;&mdash;物联网之Yeelight<br />
<a href="https://bbs.eeworld.com.cn/thread-1125939-1-1.html" target="_blank">https://bbs.eeworld.com.cn/thread-1125939-1-1.html</a></p>

<p>MicroPython动手做(29)&mdash;&mdash;物联网之SIoT<br />
<a href="https://bbs.eeworld.com.cn/thread-1126090-1-1.html" target="_blank">https://bbs.eeworld.com.cn/thread-1126090-1-1.html</a></p>

<p>&nbsp;MicroPython动手做(30)&mdash;&mdash;物联网之Blynk</p>

<p><a href="https://bbs.eeworld.com.cn/thread-1126427-1-1.html" target="_blank">https://bbs.eeworld.com.cn/thread-1126427-1-1.html</a></p>

<p>MicroPython动手做(31)&mdash;&mdash;物联网之Easy IoT&nbsp;</p>

<p><a href="https://bbs.eeworld.com.cn/thread-1126903-1-1.html" target="_blank">https://bbs.eeworld.com.cn/thread-1126903-1-1.html</a></p>

<p>MicroPython动手做(32)&mdash;&mdash;物联网之MQTT<br />
<a href="https://bbs.eeworld.com.cn/thread-1128464-1-1.html" target="_blank">https://bbs.eeworld.com.cn/thread-1128464-1-1.html</a></p>

<p>MicroPython动手做(33)&mdash;&mdash;物联网之天气预报<br />
<a href="https://bbs.eeworld.com.cn/thread-1128721-2-1.html" target="_blank">https://bbs.eeworld.com.cn/thread-1128721-2-1.html</a></p>

<p>MicroPython动手做(34)&mdash;&mdash;通用传感器的综合运用<br />
<a href="https://bbs.eeworld.com.cn/thread-1129058-1-1.html" target="_blank">https://bbs.eeworld.com.cn/thread-1129058-1-1.html</a></p>

水淹沙漠 发表于 2021-9-27 11:42

<p>很详细了,MQTT协议的的物理介质有哪些?</p>

damiaa 发表于 2021-9-27 15:19

<p>不错。不过玩MQTT的话。有电脑就足够玩起来了。</p>

eagler8 发表于 2021-9-29 10:45

水淹沙漠 发表于 2021-9-27 11:42
很详细了,MQTT协议的的物理介质有哪些?

<p>谢谢老师鼓励,这个不太懂</p>

eagler8 发表于 2021-9-29 10:45

damiaa 发表于 2021-9-27 15:19
不错。不过玩MQTT的话。有电脑就足够玩起来了。

<p>谢谢老师的鼓励</p>

damiaa 发表于 2021-9-29 12:33

水淹沙漠 发表于 2021-9-27 11:42
很详细了,MQTT协议的的物理介质有哪些?

<p></p>

<p>mqtt&nbsp; 是基于TCP的, 要有个broker (消息代理服务器) 还有发布者客户端,订阅者客户端&nbsp; 发布者发布信息,订阅这就收信息。</p>

<p>在电脑,或者其他有tcp的设备中都可以部署。也可以部署到云服务器上。</p>

<p>一般broker部署在电脑里或者云服务器上。也可以部署在Linux设备中,比如树莓派。</p>

<p>publisher subscriber可以在电脑中也可以在设备中。</p>

Zick2222 发表于 2022-5-31 08:53

很有学习价值,谢谢楼主分享

eagler8 发表于 2022-6-4 05:58

Zick2222 发表于 2022-5-31 08:53
很有学习价值,谢谢楼主分享

<p><img height="63" src="https://bbs.eeworld.com.cn/static/editor/plugins/hkemoji/sticker/facebook/victory.gif" width="61" />早上好,谢谢鼓励</p>

xiaosong06 发表于 2022-8-31 12:02

<p>学习了~</p>

eagler8 发表于 2022-8-31 12:22

xiaosong06 发表于 2022-8-31 12:02
学习了~

<p><img height="48" src="https://bbs.eeworld.com.cn/static/editor/plugins/hkemoji/sticker/facebook/handshake.gif" width="48" />谢谢鼓励</p>

极限零 发表于 2022-9-8 20:14

<p>去年的贴啊,我说怎么好像看过。。。</p>

<p>不过今年又流行UDP了,HTTP3中把UDP的丢包问题解决了,不知道能不能用到物联设备上</p>
页: [1] 2
查看完整版本: MicroPython动手做(32)——物联网之MQTT