开发部署在云端的设备接入网关服务就不得不提到MQTT,使用MQTT不论是从设备到设备,还是设备到云端服务的双向通讯,都可以获得较好的支持。

MQTT的起源和我的理解
这里基于mosquitto,以一组实际的订阅、发布,使用tcpdump来观察MQTT的通讯。
订阅指定主题的消息mosquitto_"topic/发布消息到指定主题mosquitto_"topic/"-uuser-Ppassword-i"client3"-m"1234567890123456789012345678901234567890"
tcpdump抓取的报文如下:
启动mosquitto_sub命令获得如下报文:==================================16:33:28.668926:Flags[S],seq1177792969,win29200,options[mss1424,sackOK,TSval530570732ecr0,nop,wscale7],length00x0000:525400e4a55cfeee809f324708004568RT\.2G..Eh0x0010:003@.8.:000ca05a075b4633b1c900000000a002Z.[F3..0x0030:7210a45e0000020405900402080a1f9fr..^0x0040::33:28.669001:Flags[S.],seq1053629863,ack1177792970,win28960,options[mss1460,sackOK,TSval3885354501ecr530570732,nop,wscale7],length00x0000:\..:003c000040004006a645ac10000c5147...@.@..:9713075ba05a3ecd1da74633b1caa012[.:712093090000020405b40402080ae795q0x0040::33:28.672229:Flags[.],ack1,win229,options[nop,nop,TSval530570735ecr3885354501],length00x0000:525400e4a55cfeee809f324708004568RT\.2G..Eh0x0010:003458737251479713@.8.:000ca05a075b4633b1ca3ecd1da88010Z.[F3....0x0030:00e5320e00000101080a1f9fddefe795..2.0x0040:ce05..16:33:28.672280:Flags[P.],seq1:42,ack1,win229,options[nop,nop,TSval530570735ecr3885354501],length410x0000:525400e4a55cfeee809f324708004568RT\.2G..Eh0x0010:005d58744851479713ac10.]Xt@.8.:000ca05a075b4633b1ca3ecd1da88018Z.[F3....0x0030:00e537b700000101080a1f9fddefe795..7.0x0040:ce05102700064d5c2003c'..MQIsdp0x0050:0007636c69656e7431000563636e6574..client1..ccnet0x0060:000963636e657430393031..ccnet090116:33:28.672313:Flags[.],ack42,win227,options[nop,nop,TSval3885354505ecr530570735],length00x0000:\..:0034.@.@.QG0x0020:9713075ba05a3ecd1da84633b1f38010[.:00e331e300000101080ae795ce091f9f..1.0x0040:ddef..16:33:28.672562:Flags[P.],seq1:5,ack42,win227,options[nop,nop,TSval3885354505ecr530570735],length40x0000:\..:0038.@.@.QG0x0020:9713075ba05a3ecd1da84633b1f38018[.:00:ddef2002000016:33:28.675753:Flags[.],ack5,win229,options[nop,nop,TSval530570739ecr3885354505],length00x0000:525400e4a55cfeee809f324708004568RT\.2G..Eh0x0010:003458757051479713@.8.:000ca05a075b4633b1f33ecd1dac8010Z.[F3....0x0030:00e531d900000101080a1f9fddf3e795..1.0x0040:ce09..16:33:28.675772:Flags[P.],seq42:56,ack5,win229,options[nop,nop,TSval530570739ecr3885354505],length140x0000:525400e4a55cfeee809f324708004568RT\.2G..Eh0x0010:004258766151479713@.8.:000ca05a075b4633b1f33ecd1dac8018Z.[F3....0x0030:00e546b600000101080a1f9fddf3e795..:ce09820c0001000763636e65742f2300..ccnet/执行mosquitto_pub后得到的报文如下:16:36:40.721513:Flags[S],seq2807988728,win29200,options[mss1424,sackOK,TSval530762785ecr0,nop,wscale7],length00x0000:525400e4a55cfeee809f324708004568RT\.2G..Eh0x0010:003c5dd00d51479713ac10.].@.8.:000ca1ae075ba75e81f800000000a002..[.^..0x0030:72108375900402080a1fa2r..x0x0040:cc210000000001030307.!..16:36:40.721585:Flags[S.],seq4236199326,ack2807988729,win28960,options[mss1460,sackOK,TSval3885546554ecr530762785,nop,wscale7],length00x0000:\..:003c000040004006a645ac10000c5147...@.@..:9713075ba1aefc7f459ea75e81f9a012[.E..^.0x0030:71209e410000020405b40402080ae798q..A0x0040:bc3a1fa2cc2101030307.:!.16:36:40.724732:Flags[.],ack1,win229,options[nop,nop,TSval530762788ecr3885546554],length00x0000:525400e4a55cfeee809f324708004568RT\.2G..Eh0x0010:00345].@.8.:000ca1ae075ba75e81f9fc7f459f8010..[.^.E0x0030:00e53d4600000101080a1fa2cc24e798..=F$..0x0040:bc3a.:16:36:40.724750:Flags[P.],seq1:42,ack1,win229,options[nop,nop,TSval530762788ecr3885546554],length410x0000:525400e4a55cfeee809f324708004568RT\.2G..Eh0x0010:005d5dd2400038064fea51479713ac10.]].@.8.:000ca1ae075ba75e81f9fc7f459f8018..[.^.E0x0030:00e540ef00000101080a1fa2cc24e798..@.$..0x0040:bc3a102700064d5c2003c.:.'..MQIsdp0x0050:0007636c69656e7433000563636e6574..client3..ccnet0x0060:000963636e657430393031..ccnet090116:36:40.724787:Flags[.],ack42,win227,options[nop,nop,TSval3885546557ecr530762788],length00x0000:\..:0034.@.@.QG0x0020:9713075ba1aefc7f459fa75e82228010[.E..^."..0x0030:00e33d1c00000101080ae798bc3d1fa2..=.=..0x0040:cc24.$16:36:40.724978:Flags[P.],seq1:5,ack42,win227,options[nop,nop,TSval3885546557ecr530762788],length40x0000:\..:0038.@.@.QG0x0020:9713075ba1aefc7f459fa75e82228018[.E..^."..0x0030:00e31d0e00000101080ae798bc3d1fa2.=..0x0040:cc2420020000.$.16:36:40.728114:Flags[.],ack5,win229,options[nop,nop,TSval530762791ecr3885546557],length00x0000:525400e4a55cfeee809f324708004568RT\.2G..Eh0x0010:00345].@.8.:000ca1ae075ba75e8222fc7f45a38010..[.^."..E0x0030:00e53d80a1fa2cc27e798..=.'..0x0040:bc3d.=16:36:40.728144:Flags[P.],seq42:82,ack5,win229,options[nop,nop,TSval530762791ecr3885546557],length400x0000:525400e4a55cfeee809f324708004568RT\.2G..Eh0x0010:005c5dd4400038064fe951479713ac10.\].@.8.:000ca1ae075ba75e8222fc7f45a38018..[.^."..E0x0030:00e5a8af00000101080a1fa2cc27e798.'..0x0040:bc3d3026000663636e65742f31323334.=0..ccnet/12340x0050:35363738393033738393056789012345678900x0060:337383930123456789016:36:40.728146:Flags[FP.],seq82:84,ack5,win229,options[nop,nop,TSval530762791ecr3885546557],length20x0000:525400e4a55cfeee809f324708004568RT\.2G..Eh0x0010:00365].@.8.:000ca1ae075ba75e824afc7f45a38019..[.^.J..E0x0030:00e55cdf00000101080a1fa2cc27e798..\.'..0x0040:bc3de000.=..16:36:40.728230:Flags[P.],seq96:136,ack62,win227,options[nop,nop,TSval3885546560ecr530753903],length400x0000:\..:005cd3a940004006d27bac10000c5147.\..@.@..{.QG0x0020:9713075ba05a3ecd1e074633b2078018[.:00e3e34f00000101080ae798bc401fa2O@..0x0040:.ccnet/12340x0050:35363738393033738393056789012345678900x0060:337383930123456789016:36:40.728288:Flags[.],ack85,win227,options[nop,nop,TSval3885546561ecr530762791],length00x0000:\..:0034.@.@.QG0x0020:9713075ba1aefc7f45a3a75e824d8010[.E..^.M..0x0030:00e33ce600000101080ae798bc411fa2...A..0x0040:cc27.'16:36:40.728367:Flags[F.],seq5,ack85,win227,options[nop,nop,TSval3885546561ecr530762791],length00x0000:\..:0034.@.@.QG0x0020:9713075ba1aefc7f45a3a75e824d8011[.E..^.M..0x0030:00e33ce500000101080ae798bc411fa2...A..0x0040:cc27.'16:36:40.731431:Flags[.],ack136,win229,options[nop,nop,TSval530762794ecr3885546560],length00x0000:525400e4a55cfeee809f324708004568RT\.2G..Eh0x0010:003458806551479713@.8.:000ca05a075b4633b2073ecd1e2f8010Z.[F3..../..0x0030:00e554ce00000101080a1fa2cc2ae798..T.*..0x0040:bc40.@16:36:40.731575:Flags[.],ack6,win229,options[nop,nop,TSval530762795ecr3885546561],length00x0000:525400e4a55cfeee809f324708004568RT\.2G..Eh0x0010:003806.@.8:000ca1ae075ba75e824dfc7f45a48010..[.^.M..E0x0030:00e53cdf00000101080a1fa2cc2be798...+..0x0040:
去掉TCP握手和收报报文的常规交互,可知道MQTT订阅发布的完整时序如下:

MQTT发布订阅的实际交互时序图
可以看到AUHT、SUB、PUB、SEND_MESSAGE的报文非常精简,基本只是对必须传送的字段增加了两个字节的长度,因此其对带宽是非常节省的。
TCPDUMP抓取的报文如下:
可看到基于websockets的通讯整体协作图如下:

MQTT在websockets下的工作模
可以看到除了在建立websockets时,有较大的http头信息,其余仍然很精简。而且websocket已经对Browser上送的AUTH、SUB、PUB进行了加密处理,但是对于下发到Browser的信息并没有进行加密处理
这里使用了,下载源码后,修改下文件,将WITH_WEBSOCKETS打开,如下
访问控制文件|--logmqtt运行目录||--|`--|--用户的密码文件
$SYS/Thisonlyaffectsclientswithusername"roger".userrogertopicfoo/barAdd20210722userccnettopicreadccnet/=========================================================|grep-v"#"=========================================================pid_file/home/release/soft/mqtt/mosquitto/_interfaceeth0persistencetruepersistence_location/home/release/soft/mqtt/mosquittoallow_anonymousfalsepassword_file/home/release/soft/mqtt/pwfileacl_file/home/release/soft/mqtt/aclfile
运行Mosquitto
MQTT有很多实现,Mosquitto的魅力在于小而美。有很多开源的实现,基于nodejs、java等,也有商业版本的,更有一些云服务商直接将之PaaS化了。
例如,阿里云将MQTT定义为这样子。一些公司直接基于mqtt搭建其上的物模型,超赞!

阿里云的MQTT服务
版权声明:本站所有作品(图文、音视频)均由用户自行上传分享,仅供网友学习交流,不声明或保证其内容的正确性,如发现本站有涉嫌抄袭侵权/违法违规的内容。请举报,一经查实,本站将立刻删除。