物联网学习(7)——MQTT

10 主流通信方式——MQTT

前面我们讲解了物联网设备之间怎样互相发现彼此。在物联网学习(3)中,我们提到了物联网设备之间的网络协议。今天我们来详细学习最流行的通信方式——MQTT协议。

10.1 快速上手

首先我们来快速上手一个例子,来对MQTT有一个直观的印象,有助于我们理解后面的详细内容。

首先,让我们安装hbmqtt,这时开源的MQTT Broker软件,是使用Python 3实现的。因此我们在安装好Python 3之后(Python 3的安装我们不在这里介绍,网上有大把的资料),使用pip3工具直接安装hbmqtt。

pip3 install hbmqtt==0.9.5

安装完成之后,就可以使用hbmqtt_sub和hbmqtt_pub命令来订阅消息和发布消息。

注意:我安装的Python 3.9,配合最新的hbmqtt 0.9.6,连接的时候总是报错,因此上面使用的时hbmqtt 0.9.5

中间的MQTT Broker,我们先采用免费开放的在线Broker服务。我们先使用最简单的1883端口非加密方式来传输消息。

首先,我们需要确定一个主题,比如叫做/afrag/wang/iot
接着,我们可以输入如下的命令,在Elipse提供的MQTT Broker服务上订阅/afrag/wang/iot主题:

hbmqtt_sub --url mqtt://test.mosquitto.org:1883 -t /afrag/wang/iot

然后,我们启动另外一个终端窗口(当然也可以在另外一个机器上),输入以下的命令来发布消息:

hbmqtt_pub --url mqtt://test.mosquitto.org:1883 -t /afrag/wang/iot -m Hello,World!

每个程序猿都非常熟悉的经典的Hello World!

从第一个订阅的终端窗口中,我们可以看到已经收到了Hello World!消息,一个完整的消息传输过程就完成了。

10.2 为什么MQTT最流行

为什么MQTT这么流行?原因有两个方面:

  1. MQTT自身的强大
  • MQTT的发布-订阅模式符合大部分物联网应用场景。
  • 轻量级的特性,能够满足物联网中通信资源受限设备的需求
  • 低功耗的优化设计,满足物联网中设备能源受限的需求
  • 针对不同的网络环境,提供了不同的服务质量等级
  • 支持数据安全需求
  1. 完善的生态环境
  • 无论是客户端还是服务端,都有多种开源实现,并且支持多种语言。
  • 有商业产品的支持
  • 资料完善、社区活跃

10.3 再详细一点

10.3.1 发布-订阅模式

前面我们的快速上手,使用的就是发布-订阅模式。这个模式支持一个消息同时被多个订阅者订阅,这个是发布-订阅模式的典型特征,非常符合大多数物联网应用场景。一个设备发出的消息,能够出发多个下游操作,并且是完全解耦的。同时,网络不稳定造成的临时下线,不会影响工作。

10.3.2 轻量级协议

MQTT采用的是二进制的编码格式,这样能够充分利用字节位,使得协议头很紧凑,减少网络传输的数据量。下图是MQTT协议的头格式的示意图:

MQTT协议头格式

其中,第一个字节分成了两个部分:高4位(47位)和低4位(03位)。其中高4位是数量包类型的标识位。MQTT 3.1.1版本定义了14中数据包的类型,通过这4位指明使用的是哪一种数据包格式。低4位是数据包标志位,每一个bit可以表示不同的含义。

第二个字节表示数据包的长度,单位为byte。其中最高位表示数据包长度数据是否延续到第三个字节,因此这一位称为延续位。如果有第三个字节,那么第三个字节和第二个字节一样,最高位位延续位。最长可以延续到第五个字节。因此表示长度的数字一共可以有 4 * 7 = 28 bit,所以MQTT的数据包最长可以有256MB(包含协议头)。

同时,MQTT的交互流程设计的非常简单,消息交互的类型比较少(因此数据包类型只需要4个bit),下面的图中是MQTT 3.1.1定义的数据包类型及对应的功能和消息流向。

MQTT 3.1.1定义的数据包类型

10.3.3 低功耗设计

在MQTT协议中,很注重低功耗的优化设计。比如对应Keepalive机制,MQTT定义了PINGREQ和PINGRESP两种消息类型,这两个消息都是2个字节的定长消息,非常轻量。并且,如果在规定的时间内,发送了业务消息,就不会重复发送PINGREQ和PINGRESP消息,避免不必要的消息发送。
另外,如果Client在发送消息的时候,使用的主题和上一个消息一样,就可以省略主题名。对于很多传感器,发送的消息一直是同一个主题,这样积累起来会省略很多带宽和能耗。

10.3.4 不同的服务质量等级

为了能够适应物联网应用中不同的通信条件,MQTT协议设计了3种不同的QoS级别,我们可以根据实际的场景灵活选择。

  • QoS 0,表示的是“最多一次“送达,也就是消息可能会丢失,但是不会重复。
  • QoS 1,表示的是”至少一次“送达,也就是消息可能会重复,但是不会丢失。
  • QoS 2, 表示的是”恰好一次“送达,也就是消息有且只有一次送达,不会丢失,也不会重复。

10.3.5 安全的数据传输

MQTT提供了用户名/密码的身份验证机制,在建立连接的过程种,可以通过判断用户名和密码的正确性来判断是否能够建立连接。

MQTT支持SSL/TLS的加密通信方式,采用加密通信后,MQTT就转换位MQTTS(类似HTTP和HTTPS)。要使用MQTTS,首先去这个链接下载一份证书。然后,在前面的命令种,将mqtt://修改为mqtts://就可以,将端口号修改为mqtts的端口号8883, 同时指定要使用的证书的就可以了,例如:

hbmqtt_sub --url mqtts://test.mosquitto.org:8883 -t /afrag/wang/iot --ca-file mosquitto.org.crt
hbmqtt_pub --url mqtts://test.mosquitto.org:8883 -t /afrag/wang/iot -m Hello,World! --ca-file mosquitto.org.crt
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 206,013评论 6 481
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 88,205评论 2 382
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 152,370评论 0 342
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 55,168评论 1 278
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 64,153评论 5 371
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,954评论 1 283
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,271评论 3 399
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,916评论 0 259
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 43,382评论 1 300
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,877评论 2 323
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,989评论 1 333
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,624评论 4 322
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,209评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,199评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,418评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,401评论 2 352
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,700评论 2 345

推荐阅读更多精彩内容