MQTT 快速入门

现在我们来快速体验一下,使用MQTT进行数据的发布和订阅。

考虑到Mosquitto比较适合初学者,所以选择它来做实验。实验环境是Windows 10 64 bit,Mosquitto版本是1.5.8。

Mosquitto安装

  • 进入Mosquitto下载页面,选择对应的操作系统下载安装。Windows用户下载安装包,一直点击下一步到安装结束,系统默认会安装到"C:\Program Files\mosquitto",为方便使用,将这个路径加到Path环境变量中。安装成功后,会添加一个叫Mosquitto Broker的系统服务,并且会自动启动。

  • 这里顺便讲一下,如果是CentOS用户,可以直接使用yum install mosquitto命令进行安装的。其它平台的安装参见下载页,有详细说明。

  • 使用windows + r,执行命令services.msc,打开windows服务,找到Mosquitto Broker服务,查看服务状态,如果服务没启动,则启动服务。现在就可以连接到Broker了。

订阅主题

打开命令行终端,输入如下命令订阅主题topic1。

$ mosquitto_sub -d -t topic1 
Client mosqsub|3508-SCNWCL0121 sending CONNECT
Client mosqsub|3508-SCNWCL0121 received CONNACK (0)
Client mosqsub|3508-SCNWCL0121 sending SUBSCRIBE (Mid: 1, Topic: topic1, QoS: 0)
Client mosqsub|3508-SCNWCL0121 received SUBACK
Subscribed (mid: 1): 0

以上第一行是命令,使用mosquitto_sub命令订阅主题。

-d 参数表示启用debug模式,这样mosquitto_sub会显示详细的连接以及数据收发过程。

-t topic1 表示需要订阅主题topic1。

这里有些参数没写,都使用了默认值,如host使用了localhost,port使用了1883,并且使用了"mosqsub|3508-SCNWCL0121"作为Client ID,其中3508是进程Id,SCNWCL0121是我的机器名。

如果要指定host,port以及Client Id,可以这样使用。

$ mosquitto_sub -d -h localhost -p 1883 -i subscriber-test -t topic1
Client subscriber-test sending CONNECT
Client subscriber-test received CONNACK (0)
Client subscriber-test sending SUBSCRIBE (Mid: 1, Topic: topic1, QoS: 0)
Client subscriber-test received SUBACK
Subscribed (mid: 1): 0

-h 表示host

-p 表示port

-i 表示客户端ID。

其实所有的命令行使用都可以使用--help进行查阅,输入

$ mosquitto_sub --help

你就会看到它的详细用法,所有参数都显示出来了,很详细。

第二行和第三行是建立连接的过程。

Client mosqsub|3508-SCNWCL0121 sending CONNECT
Client mosqsub|3508-SCNWCL0121 received CONNACK (0)

表示客户端“mosqsub|3508-SCNWCL0121”发送CONNECT,同时Broker回复CONNACK (0)。其中0是状态码,表示连接成功。如果是其它数字,则表示连接失败。失败的原因有很多,比如不支持当前协议,服务器不可用等等,具体可参见Connect Return Code

第四行到第六行是订阅主题的过程,

Client mosqsub|3508-SCNWCL0121 sending SUBSCRIBE (Mid: 1, Topic: topic1, QoS: 0)
Client mosqsub|3508-SCNWCL0121 received SUBACK
Subscribed (mid: 1): 0

sending SUBSCRIBE (Mid: 1, Topic: topic1, QoS: 0)表示发送订阅请求,

Mid是Message Id,从1开始计算,当一个连接发送多条消息时,Mid是递增的。

Topic:topic1表示要订阅的主题时topic1。

QoS:0指定了QoS等级,默认是0。

发布消息

打开一个新的命令行终端,输入以下命令

$ mosquitto_pub -d -t topic1 -m "Hello MQTT"
Client mosqpub|12796-SCNWCL012 sending CONNECT
Client mosqpub|12796-SCNWCL012 received CONNACK (0)
Client mosqpub|12796-SCNWCL012 sending PUBLISH (d0, q0, r0, m1, 'topic1', ... (10 bytes))
Client mosqpub|12796-SCNWCL012 sending DISCONNECT

第一行是发布消息命令,将消息发布到主题topic1,-m 指定了发送消息的内容是"Hello MQTT"。我们同样启用了debug模式。

第二行和第三行是连接过程

第四行是发布的消息信息。

Client mosqpub|12796-SCNWCL012 sending PUBLISH (d0, q0, r0, m1, 'topic1', ... (10 bytes))

其中d0, q0, r0, m1,分别是发布消息指定的参数,这里使用默认参数。

d0表示DUP为0,DUP是是否重复标记,如果是第一次发送消息,则设置为0。如果是重复投递,比如QoS设置为1,客户端发送消息超时后服务器还没有回复,客户端为确保消息能发出去,于是再发一次,这是DUP就设置为1,表明这个消息是重复发送的。

q0表示QoS为0。

r0表示RETAIN为0。RETAIN意思是是否要求Broker帮我保留这条消息,如果设置为1,则服务器会保留当前消息。当下一次有新的客户端连接并订阅topic1时,服务器自动发送这条保留的消息给客户端。

m1表示消息序号,默认从1开始。

topic1是发布到这个主题。

... (10 bytes)没有显示消息内容,但是显示了消息长度是10个字节。

最后一行是断开连接。

Client mosqpub|12796-SCNWCL012 sending DISCONNECT

接收消息

发布完消息后,再回到之前订阅的终端,会显示接收到的消息。

Client mosqsub|11104-SCNWCL012 received PUBLISH (d0, q0, r0, m0, 'topic1', ... (10 bytes))
topic1 Hello MQTT

第一行显示收到PUBLISH数据包,第二行打印出接收到的数据。

总结

Mosquitto是很容易使用的MQTT实现,包含了服务端和客户端。在这个实验中,我们其实就执行了两条命令。

$ mosquitto_sub -d -t topic1 
$ mosquitto_pub -d -t topic1 -m "Hello MQTT"

分别表示订阅主题和发布消息,当另一个客户端发送消息成功后,订阅端会收到消息并打印出来。

在以上命令中,-d参数非常有用,是我们学习MQTT协议的利器,这里举个列子。

QoS是服务质量保证,在发布消息时,当QoS设置为0,那么客户端发送消息后,Broker是不做回复的。

QoS设置为1时,客户端发送消息后,会等待Broker确认,如果等不到PUBACK,那么过一段时间后会重新发送。这样确保Broker能收到消息。我们来对比一下。

$ mosquitto_pub -d -t topic1 -m "Hello MQTT"
Client mosqpub|6188-SCNWCL0121 sending CONNECT
Client mosqpub|6188-SCNWCL0121 received CONNACK (0)
Client mosqpub|6188-SCNWCL0121 sending PUBLISH (d0, q0, r0, m1, 'topic1', ... (10 bytes))
Client mosqpub|6188-SCNWCL0121 sending DISCONNECT
$ mosquitto_pub -d -q 1 -t topic1 -m "Hello MQTT"
Client mosqpub|14788-SCNWCL012 sending CONNECT
Client mosqpub|14788-SCNWCL012 received CONNACK (0)
Client mosqpub|14788-SCNWCL012 sending PUBLISH (d0, q1, r0, m1, 'topic1', ... (10 bytes))
Client mosqpub|14788-SCNWCL012 received PUBACK (Mid: 1)
Client mosqpub|14788-SCNWCL012 sending DISCONNECT

当我们发送消息时,如果增加参数-q 1,表示QoS设置成1。数据包就会多出一个回复。

Client mosqpub|14788-SCNWCL012 received PUBACK (Mid: 1)

QoS的实现机制比较复杂,后续我会专门写一篇文章讲MQTT QoS,有兴趣的可以自己点击链接先去看看。


所有文章在Github上同步,你也可以访问我的个人博客点击查看

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

推荐阅读更多精彩内容

  • 什么是MQTT MQTT是Message Queuing Telemetry Transport的缩写,它是一个基...
    曾彪彪阅读 1,786评论 0 2
  • 网络编程 1. 概论 建立连接:通过IP或者域名来连接两台设备,通过端口号找到对应的通信程序 通信协议:要传输的数...
    陵无山阅读 3,791评论 0 12
  • 早在1999年,IBM的Andy Stanford-Clark博士以及Arcom公司ArlenNipper博士发明...
    梁睿坤阅读 4,047评论 0 8
  • MQTT简介: 随着物联网的火热,机器之间(Machine-to-Machine,M2M)的大规模沟通需要不同的...
    独行侠_ef93阅读 3,974评论 0 2
  • 初始 MQTT 物联网 (internet of thing) ,表示的是可以把一些带某些传感器的设备(终端),接...
    人话博客阅读 2,234评论 0 49