目錄
前言
MQTT 協(xié)議簡介
為何選擇 MQTT
MQTT 通訊運作方式
MQTT 協(xié)議幀格式
MQTT服務(wù)器搭建和使用?
公共MQTT 測試服務(wù)器
MQTT服務(wù)器搭建
各種MQTT代理服務(wù)程序比較
Mosquitto安裝
MQTT使用方法
測試MQTT服務(wù)器
程序中使用MQTT
前言
本文隨時更新,轉(zhuǎn)載請注明出處,源地址:http://t.csdn.cn/kCC0B
文檔下載:https://download.csdn.net/download/bandaoyu/86541528
MQTT 協(xié)議簡介
MQTT(Message Queuing Telemetry Transport),是一個物聯(lián)網(wǎng)傳輸協(xié)議,它被設(shè)計用于輕量級的發(fā)布/訂閱式消息傳輸,旨在為低帶寬和不穩(wěn)定的網(wǎng)絡(luò)環(huán)境中的物聯(lián)網(wǎng)設(shè)備提供可靠的網(wǎng)絡(luò)服務(wù)。
MQTT是專門針對物聯(lián)網(wǎng)開發(fā)的輕量級傳輸協(xié)議。MQTT協(xié)議針對低帶寬網(wǎng)絡(luò),低計算能力的設(shè)備,做了特殊的優(yōu)化,使得其能適應(yīng)各種物聯(lián)網(wǎng)應(yīng)用場景。
為何選擇 MQTT
低協(xié)議開銷MQTT 的獨特之處在于,它的每消息標(biāo)題可以短至 2 個字節(jié)。MQ 和 HTTP 都擁有高得多的每消息開銷。對于 HTTP,為每個新請求消息重新建立 HTTP 連接會導(dǎo)致重大的開銷。MQ 和 MQTT 所使用的永久連接顯著減少了這一開銷。
? ?對不穩(wěn)定網(wǎng)絡(luò)的容忍MQTT 和 MQ 能夠從斷開等故障中恢復(fù),而且沒有進一步的代碼需求。但是,HTTP 無法原生地實現(xiàn)此目的,需要客戶端重試編碼,這可能增加冪等性問題。
? ?低功耗MQTT 是專門針對低功耗目標(biāo)而設(shè)計的。HTTP 的設(shè)計沒有考慮此因素,因此增加了功耗。
? ?數(shù)百萬個連接的客戶端在 HTTP 堆棧上,維護數(shù)百萬個并發(fā)連接,需要做許多的工作來提供支持。盡管可以實現(xiàn)此支持,但大多數(shù)商業(yè)產(chǎn)品都為處理這一數(shù)量級的永久連接而進行了優(yōu)化。IBM 提供了 IBM MessageSight,這是一個單機架裝載服務(wù)器,經(jīng)過測試能處理多達(dá) 100 萬個通過 MQTT 并發(fā)連接的設(shè)備。相反,MQ 不是為大量并發(fā)客戶端而設(shè)計的。
? ?推送通知您需要能夠及時地將通知傳遞給客戶。為此,必須采用某種定期輪詢或推送方法;從電池、系統(tǒng)負(fù)載和帶寬角度講,推送是最佳解決方案。
我們的企業(yè)可能需要在沒有第三方中介的情況下發(fā)送敏感的信息。這降低了特定于操作系統(tǒng)的解決方案(比如 Apple iOS、Google Play 通知)作為主要傳輸機制的價值。
HTTP 只允許使用一種稱為COMET 的方法,使用持久的 HTTP 請求來執(zhí)行推送。從客戶端和服務(wù)器的角度講,此方法都很昂貴。MQ 和 MQTT 都支持推送,這是它們的一個基本特性。
? ?客戶端平臺差異HTTP 和 MQTT 客戶端都已在大量平臺上實現(xiàn)。MQTT 的簡單性有助于以極少的精力在額外的客戶端上實現(xiàn) MQTT。
? ?防火墻容錯一些企業(yè)防火墻將出站連接限制到一些已定義的端口。這些端口通常被限制為 HTTP(80 端口)、HTTPS(443 端口)等。HTTP 顯然可以在這些情況下運行。MQTT 可封裝在一個 WebSockets 連接中,顯示為一個 HTTP 升級請求,從而允許在這些情況下運行。MQ 不允許采用這種模式。
事實上,MQTT的應(yīng)用非常之廣泛,幾乎現(xiàn)在隨便找一家大型的硬件、互聯(lián)網(wǎng)企業(yè),都可以找到MQTT的身影,例如Facebook、BP、alibaba、baidu等等

MQTT 通訊運作方式
使用發(fā)布/訂閱消息模式,提供一對多的消息發(fā)布,解除應(yīng)用程序耦合;
1.在MQTT通訊過程中,有三種身份,分別是發(fā)布者(publisher)、代理(broker)、和訂閱者(subscriber)。
2.MQTT傳輸?shù)南⒎譃椋褐黝}(topic)和負(fù)載(payload)兩部分:
客戶端向代理發(fā)布topic的消息到代理(MQTT服務(wù)程序),代理將該消息推送到所有訂閱該topic的客戶端。
(發(fā)布消息的客戶端就是發(fā)布者,訂閱topic消息的客戶端就是訂閱者)
MQTT 協(xié)議幀格式
在MQTT協(xié)議中,一個MQTT數(shù)據(jù)包由:固定頭(Fixed header)、可變頭(Variable header)、消息體(payload)三部分構(gòu)成。
協(xié)議幀 = 固定頭部+可變頭部+消息體
-
-
- 固定頭部
-
固定頭和可變頭一般調(diào)用接口函數(shù)自動完成拼裝,并不需要我們手動寫,只做了解。
固定頭部(2Byte) | ||||||||
Byte1 |
Byte2 |
|||||||
Bit7 |
Bit6 |
Bit5 |
Bit4 |
Bit3 |
Bit2 |
Bit1 |
Bit0 |
Bit0~ Bit7 |
Message type |
UDP flag |
Qos level |
RETAIN |
Remaining Length |
Message type(報文類型)有如下種類:
CONNECT//請求連接
CONNACK//請求應(yīng)答
PUBLISH//發(fā)布消息
PUBACK//發(fā)布應(yīng)答
PUBREC//發(fā)布已接收,保證傳遞1
PUBREL//發(fā)布釋放,保證傳遞2
PUBCOMP//發(fā)布完成,保證傳遞3
SUBSCRIBE//訂閱請求
SUBACK//訂閱應(yīng)答
UNSUBSCRIBE//取消訂閱
UNSUBACK//取消訂閱應(yīng)答
PINGREQ//ping請求
PINGRESP//ping響應(yīng)
DISCONNECT//斷開連接
-
-
- 可變頭部
-
固定頭和可變頭一般調(diào)用接口函數(shù)自動完成拼裝,并不需要我們手動寫,只做了解。
可變頭的內(nèi)容因數(shù)據(jù)包類型而不同,較常的應(yīng)用是作為包的標(biāo)識,很多類型數(shù)據(jù)包中都包括一個2字節(jié)的數(shù)據(jù)包標(biāo)識字段。
-
-
- 消息體
-
包含CONNECT、SUBSCRIBE、SUBACK、UNSUBSCRIBE四種類型的消息。

-
- MQTT協(xié)議規(guī)定的方法
(重要,無論在那個框架里這是通用的)
(1)Connect????與服務(wù)器建立連接。
(2)Disconnect????與服務(wù)器斷開TCP/IP會話。
(3)Subscribe????訂閱。
(4)UnSubscribe????取消訂閱。
(5)Publish????發(fā)送消息請求,發(fā)送完成后返回應(yīng)用程序線程。
-
- MQTT支持三種消息發(fā)布服務(wù)質(zhì)量(QoS)
對消息中間件,估計大家不得不關(guān)心的就是消息的可靠性,也就是消息的發(fā)布服務(wù)質(zhì)量,可喜的是,MQTT支持三種消息發(fā)布服務(wù)質(zhì)量(QoS):
“至多一次”(QoS==0),消息發(fā)布完全依賴底層 TCP/IP 網(wǎng)絡(luò)。會發(fā)生消息丟失或重復(fù)。這一級別可用于如下情況,環(huán)境傳感器數(shù)據(jù),丟失一次讀記錄無所謂,因為不久后還會有第二次發(fā)送。
“至少一次”(QoS==1),確保消息到達(dá),但消息重復(fù)可能會發(fā)生。
“只有一次”(QoS==2),確保消息到達(dá)一次。這一級別可用于如下情況,在計費系統(tǒng)中,消息重復(fù)或丟失會導(dǎo)致不正確的結(jié)果。小型傳輸,開銷很小(固定長度的頭部是 2 字節(jié)),協(xié)議交換最小化,以降低網(wǎng)絡(luò)流量。
通過設(shè)置協(xié)議幀中的“可變頭部”中的Qos位指定

MQTT服務(wù)器搭建和使用?
公共MQTT 測試服務(wù)器
MQTT是成熟的物聯(lián)網(wǎng)協(xié)議,網(wǎng)上已經(jīng)公開很多公用的MQTT代理/服務(wù)器 供開發(fā)人員測試,其中常用的一個就是:
地址:mq.tongxinmao.com
端口:18831
用MQTT客戶端連上以上服務(wù)器,就可以發(fā)布和訂閱MQTT消息。
MQTT服務(wù)器搭建
各種MQTT代理服務(wù)程序比較
備注:
截至2018-12-18QoS 0:服務(wù)質(zhì)量 0,最多傳輸一次。QoS 1:服務(wù)質(zhì)量1,至少傳輸一次。QoS 2:服務(wù)質(zhì)量2,僅僅傳輸一次。auth:驗證,身份驗證授權(quán)。bridge:橋接,服務(wù)器代理之間連接$SYS:主題過濾器通配符,訂閱后能夠接收到所有以此通配符開頭的主題的消息。dynamic topics:動態(tài)主題cluster:集群
Server |
QoS 0 |
QoS 1 |
QoS 2 |
auth |
bridge |
$SYS |
SSL |
dynamic topics |
cluster |
websockets |
plugin system |
2lemetry |
? |
? |
? |
? |
? |
§ |
? |
? |
? |
? |
? |
Apache ActiveMQ |
? |
? |
? |
? |
? |
? |
? |
? |
? |
? |
? |
Apache ActiveMQ Artemis |
? |
? |
? |
? |
? |
? |
? |
? |
? |
? |
? |
Bevywise IoT Platform |
? |
? |
? |
? |
rm |
? |
? |
? |
? |
? |
rm |
emitter |
? |
§ |
? |
? |
? |
? |
? |
? |
? |
? |
? |
emqttd |
? |
? |
? |
? |
? |
? |
? |
? |
? |
? |
? |
flespi |
? |
? |
? |
? |
? |
? |
? |
? |
? |
? |
? |
GnatMQ |
? |
? |
? |
? |
? |
? |
? |
? |
? |
? |
? |
HBMQTT |
? |
? |
? |
? |
? |
? |
? |
? |
? |
? |
? |
HiveMQ |
? |
? |
? |
? |
? |
? |
? |
? |
? |
? |
? |
IBM MessageSight |
? |
? |
? |
? |
? |
? |
? |
? |
§ |
? |
? |
JoramMQ |
? |
? |
? |
? |
? |
? |
? |
? |
? |
? |
? |
Mongoose |
? |
? |
? |
? |
? |
? |
? |
? |
? |
? |
? |
moquette |
? |
? |
? |
? |
? |
? |
? |
? |
rm |
? |
? |
mosca |
? |
? |
? |
? |
? |
? |
? |
? |
? |
? |
? |
mosquitto |
? |
? |
? |
? |
? |
? |
? |
? |
§ |
? |
? |
MQTT.js |
? |
? |
? |
§ |
? |
? |
? |
? |
? |
? |
? |
MqttWk |
? |
? |
? |
? |
? |
? |
? |
? |
? |
? |
? |
RabbitMQ |
? |
? |
? |
? |
? |
? |
? |
? |
? |
? |
? |
RSMB |
? |
? |
? |
? |
? |
? |
? |
? |
? |
? |
? |
Software AG Universal Messaging |
? |
? |
? |
? |
? |
? |
? |
? |
? |
rm |
? |
Solace |
? |
? |
? |
? |
§ |
? |
? |
? |
? |
? |
? |
SwiftMQ |
? |
? |
? |
? |
? |
? |
? |
? |
? |
? |
? |
Trafero Tstack |
? |
? |
? |
? |
? |
? |
? |
? |
? |
? |
? |
VerneMQ |
? |
? |
? |
? |
? |
? |
? |
? |
? |
? |
? |
WebSphere MQ |
? |
? |
? |
? |
? |
? |
? |
? |
? |
? |
? |
說明:?表示支持,?表示不支持,?表示未知,§表示支持但有限制,rm表示(roadmap)路線圖規(guī)劃中也就是計劃支持。
(本次選擇相對簡單的Mosquitto舉例子)
Mosquitto安裝
Mosquitto是一個實現(xiàn)了MQTT3.1協(xié)議的代理服務(wù)器,由MQTT協(xié)議創(chuàng)始人之一的Andy Stanford-Clark開發(fā),它為我們提供了非常棒的輕量級數(shù)據(jù)交換的解決方案。
在Linux系統(tǒng)上安裝Mosquitto,建議使用源碼安裝模式,最新的源碼可從http://mosquitto.org/files/source/地址中獲取。解壓之后,我們可以在源碼目錄里面找到主要的配置文件config.mk,其中包含了所有Mosquitto的安裝選項,詳細(xì)的參數(shù)說明如下:
?C++ Code?
1234567891011121314151617181920212223242526272829303132333435363738394041424344454647 |
#?是否支持tcpd/libwrap功能.#WITH_WRAP:=yes#?是否開啟SSL/TLS支持#WITH_TLS:=yes#?是否開啟TLS/PSK支持#WITH_TLS_PSK:=yes#?Comment?out?to?disable?client?client?threading?support.#WITH_THREADING:=yes#?是否使用嚴(yán)格的協(xié)議版本(老版本兼容會有點問題)#WITH_STRICT_PROTOCOL:=yes#?是否開啟橋接模式#WITH_BRIDGE:=yes#?是否開啟持久化功能#WITH_PERSISTENCE:=yes#?是否監(jiān)控運行狀態(tài)#WITH_MEMORY_TRACKING:=yes |
這里需要注意的是,默認(rèn)情況下Mosquitto的安裝需要OpenSSL的支持;如果不需要SSL,則需要關(guān)閉config.mk里面的某些與SSL功能有關(guān)的選項(WITH_TLS、WITH_TLS_PSK)。接著,就是運行make install進行安裝,完成之后會在系統(tǒng)命令行里發(fā)現(xiàn)mosquitto、mosquitto_passwd、mosquitto_pub和mosquitto_sub四個工具(截圖如下),分別用于啟動代理、管理密碼、發(fā)布消息和訂閱消息。
配置&運行
安裝完成之后,所有配置文件會被放置于/etc/mosquitto/目錄下,其中最重要的就是Mosquitto的配置文件,即mosquitto.conf,以下是詳細(xì)的配置參數(shù)說明。
?C++ Code?
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353 |
#?=================================================================#?General?configuration#?=================================================================#?客戶端心跳的間隔時間#retry_interval?20#?系統(tǒng)狀態(tài)的刷新時間#sys_interval?10#?系統(tǒng)資源的回收時間,0表示盡快處理#store_clean_interval?10#?服務(wù)進程的PID#pid_file?/var/run/mosquitto.pid#?服務(wù)進程的系統(tǒng)用戶#user?mosquitto#?客戶端心跳消息的最大并發(fā)數(shù)#max_inflight_messages?10#?客戶端心跳消息緩存隊列#max_queued_messages?100#?用于設(shè)置客戶端長連接的過期時間,默認(rèn)永不過期#persistent_client_expiration#?=================================================================#?Default?listener#?=================================================================#?服務(wù)綁定的IP地址#bind_address#?服務(wù)綁定的端口號#port?1883#?允許的最大連接數(shù),-1表示沒有限制#max_connections?-1#?cafile:CA證書文件#?capath:CA證書目錄#?certfile:PEM證書文件#?keyfile:PEM密鑰文件#cafile#capath#certfile#keyfile#?必須提供證書以保證數(shù)據(jù)安全性#require_certificate?false#?若require_certificate值為true,use_identity_as_username也必須為true#use_identity_as_username?false#?啟用PSK(Pre-shared-key)支持#psk_hint#?SSL/TSL加密算法,可以使用“openssl?ciphers”命令獲取#?as?the?output?of?that?command.#ciphers#?=================================================================#?Persistence#?=================================================================#?消息自動保存的間隔時間#autosave_interval?1800#?消息自動保存功能的開關(guān)#autosave_on_changes?false#?持久化功能的開關(guān)persistence?true#?持久化DB文件#persistence_file?mosquitto.db#?持久化DB文件目錄#persistence_location?/var/lib/mosquitto/#?=================================================================#?Logging#?=================================================================#?4種日志模式:stdout、stderr、syslog、topic#?none?則表示不記日志,此配置可以提升些許性能log_dest?none#?選擇日志的級別(可設(shè)置多項)#log_type?error#log_type?warning#log_type?notice#log_type?information#?是否記錄客戶端連接信息#connection_messages?true#?是否記錄日志時間#log_timestamp?true#?=================================================================#?Security#?=================================================================#?客戶端ID的前綴限制,可用于保證安全性#clientid_prefixes#?允許匿名用戶#allow_anonymous?true#?用戶/密碼文件,默認(rèn)格式:username:password#password_file#?PSK格式密碼文件,默認(rèn)格式:identity:key#psk_file#?pattern?write?sensor/%u/data#?ACL權(quán)限配置,常用語法如下:#?用戶限制:user?<username>#?話題限制:topic?[read|write]?<topic>#?正則限制:pattern?write?sensor/%u/data#acl_file#?=================================================================#?Bridges#?=================================================================#?允許服務(wù)之間使用“橋接”模式(可用于分布式部署)#connection?<name>#address?<host>[:<port>]#topic?<topic>?[[[out?|?in?|?both]?qos-level]?local-prefix?remote-prefix]#?設(shè)置橋接的客戶端ID#clientid#?橋接斷開時,是否清除遠(yuǎn)程服務(wù)器中的消息#cleansession?false#?是否發(fā)布橋接的狀態(tài)信息#notifications?true#?設(shè)置橋接模式下,消息將會發(fā)布到的話題地址#?$SYS/broker/connection/<clientid>/state#notification_topic#?設(shè)置橋接的keepalive數(shù)值#keepalive_interval?60#?橋接模式,目前有三種:automatic、lazy、once#start_type?automatic#?橋接模式automatic的超時時間#restart_timeout?30#?橋接模式lazy的超時時間#idle_timeout?60#?橋接客戶端的用戶名#username#?橋接客戶端的密碼#password#?bridge_cafile:橋接客戶端的CA證書文件#?bridge_capath:橋接客戶端的CA證書目錄#?bridge_certfile:橋接客戶端的PEM證書文件#?bridge_keyfile:橋接客戶端的PEM密鑰文件#bridge_cafile#bridge_capath#bridge_certfile#bridge_keyfile#?自己的配置可以放到以下目錄中include_dir?/etc/mosquitto/conf.d |
最后,啟動Mosquitto服務(wù)很簡單,直接運行命令行即可開啟服務(wù):
mosquitto -c /etc/mosquitto/mosquitto.conf -d
MQTT使用方法
測試MQTT服務(wù)器
方法:
如現(xiàn)在有一個MQTT服務(wù)器(MQTT Broker),可以把我門剛才搭建的服務(wù)器來拿來做這個測試,暫且叫做S:
地址:mq.tongxinmao.com
端口:18831
兩個需要MQTT通信的設(shè)備均下載安裝MQTT客戶端軟件,兩個設(shè)備都運行MQTT客戶端軟件,且都連接上MQTT服務(wù)器S:
然后一個設(shè)備A的MQTT客戶端訂閱一個主題:“/topic/qos0”(訂閱主題的client就是subscriber);
另一個設(shè)備B的MQTT客戶端向MQTT服務(wù)器A發(fā)布一個主題為:“/topic/qos0”的消息”hello,BZL first mqtt message!”。(發(fā)布主題的client就是Publisher)
可以看到訂閱主題“/topic/qos0”的A的客戶端收到了消息”hello,BZL first mqtt message!”。
初體驗實例:
我們安裝通信貓通信調(diào)試軟件(內(nèi)嵌MQTT客戶端):通信貓調(diào)試助手http://www.tongxinmao.com/Topic/Detail/id/6
(這里為了簡便,發(fā)布和訂閱都用同一個電腦)
打開軟件,點擊“網(wǎng)絡(luò)”--->”MQTT”,在參數(shù)界面,輸入MQTT服務(wù)器地址和端口號:
地址:mq.tongxinmao.com
端口:18831
用戶名和密碼:TEST,TEST
輸入訂閱主題:“/topic/qos0”
輸入發(fā)布主題:“/topic/qos0”
勾選”啟動“連接上MQTT服務(wù)器,
然后在數(shù)據(jù)框輸入要發(fā)布是消息,然后點擊發(fā)布。這樣所有訂閱主題“/topic/qos0”的客戶端都可以接收到該消息:
把上面的MQTT服務(wù)器地址和端口號替換成我們剛才部署的Mosquitto的地址和監(jiān)聽端口,就可以測試我們自己搭建的MQTT服務(wù)器了。
程序中使用MQTT
我們上面是用的客戶端工具測試MQTT,程序中使用MQTT指的是程序成為MQTT通信系統(tǒng)的客戶端,向MQTT服務(wù)器訂閱主題或發(fā)布MQTT消息。
程序要向MQTT服務(wù)器訂閱主題或者發(fā)布MQTT消息,則工程中包含MQTT客戶端的庫文件,然后程序調(diào)用庫中的MQTT接口函數(shù),向MQTT服務(wù)器訂閱主題或發(fā)布消息。
以python為例,paho.mqtt.client是python的一個MQTT客戶端庫(包):
?Python Code?
12345 |
#?encoding:?utf-8#!/usr/bin/python3 import?paho.mqtt.client?as?mqtt?????????????????#導(dǎo)入mqtt客戶端的包client?=?mqtt.Client()??????????????????????????#調(diào)用mqtt客戶端庫的函數(shù)創(chuàng)建對象client.username_pw_set(”myUsername”, ”myPassword”) client.connect("114.55.242.49",?1883,?60)??????#調(diào)用mqtt客戶端庫client對象的connect方法連接上MQTT服務(wù)器client.subscribe("/topic/qos0")????????????????#訂閱主題client.loop_forever() |
使用Python發(fā)送、訂閱消息
需要用到的包為paho-mqttpip install paho-mqtt
?Python Code?
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748 |
#?-*-?coding:?utf-8?-*-#?以下代碼在2019年2月28日?python3.6環(huán)境下運行通過import?paho.mqtt.client?as?mqttimport?jsonimport?timeHOST?=?"10.8.9.21"PORT?=?1883client_id?=?"1083421xxxxx"???????????????????????#?沒有就不寫,此處部分內(nèi)容用xxx代替原內(nèi)容,下同def?on_connect(client,?userdata,?flags,?rc):print("Connected?with?result?code?"+str(rc))????client.subscribe("data/receive")?????????#?訂閱消息def?on_message(client,?userdata,?msg):print("主題:"+msg.topic+"?消息:"+str(msg.payload.decode('utf-8')))def?on_subscribe(client,?userdata,?mid,?granted_qos):print("On?Subscribed:?qos?=?%d"?%?granted_qos)def?on_disconnect(client,?userdata,?rc):if?rc?!=?0:print("Unexpected?disconnection?%s"?%?rc)data?=?{"type":2,"timestamp":?time.time(),"messageId":"9fcda359-89f5-4933-xxxx","command":"xx/recommend","data":{"openId":"xxxx","appId":xxxx,"recommendType":"temRecommend"????}}param?=?json.dumps(data)client?=?mqtt.Client(client_id)client.username_pw_set("xxxxxx",?"xxxxxx")client.on_connect?=?on_connectclient.on_message?=?on_messageclient.on_subscribe?=?on_subscribeclient.on_disconnect?=?on_disconnectclient.connect(HOST,?PORT,?60)client.publish("data/send",?payload=param,?qos=0)?????#?發(fā)送消息client.loop_forever() |
python MQTT客戶端
?需要安裝的python庫
?使用python編寫程序進行測試MQTT的發(fā)布和訂閱功能。首先要安裝:pip install paho-mqtt
測試發(fā)布(pub)
?我的MQTT部署在阿里云的服務(wù)器上面,所以我在本機上編寫了python程序進行測試。
然后在shell里面重新打開一個終端,訂閱一個主題為“chat”?mosquitto_sub -t chat
?在本機上測試遠(yuǎn)程的MQTT的發(fā)布功能就是把自己作為一個發(fā)送信息的人,當(dāng)自己發(fā)送信息的時候,所有訂閱過該主題(topic)的對象都將收到自己發(fā)送的信息。?
mqtt_client.py
# encoding: utf-8
import paho.mqtt.client as mqtt
HOST = "101.200.46.138"
PORT = 1883
def test():
client = mqtt.Client()
client.connect(HOST, PORT, 60)
client.publish("chat","hello liefyuan",2) # 發(fā)布一個主題為'chat',內(nèi)容為‘hello liefyuan’的信息
client.loop_forever()
if __name__ == '__main__':
test()
發(fā)布/訂閱測試
# -*- coding: utf-8 -*-
import paho.mqtt.client as mqtt
MQTTHOST = "101.200.46.138"
MQTTPORT = 1883
mqttClient = mqtt.Client()
# 連接MQTT服務(wù)器
def on_mqtt_connect():
mqttClient.connect(MQTTHOST, MQTTPORT, 60)
mqttClient.loop_start()
# publish 消息
def on_publish(topic, payload, qos):
mqttClient.publish(topic, payload, qos)
# 消息處理函數(shù)
def on_message_come(lient, userdata, msg):
print(msg.topic + " " + ":" + str(msg.payload))
# subscribe 消息
def on_subscribe():
mqttClient.subscribe("/server", 1)
mqttClient.on_message = on_message_come # 消息到來處理函數(shù)
def main():
on_mqtt_connect()
on_publish("/test/server", "Hello Python!", 1)
on_subscribe()
while True:
pass
if __name__ == '__main__':
main()
注解函數(shù):
client.connect(self, host, port, keepalive, bind_address)
client.publish(self, topic, payload, qos, retain)
client.subscribe(self, topic, qos)
測試訂閱(sub)
?在本機上編寫程序測試訂閱功能,就是讓自己的程序作為一個接收者,同一個主題沒有發(fā)布(pub)信息的時候,就自己一直等候。文章來源:http://www.zghlxwxcb.cn/news/detail-428639.html
# encoding: utf-8
import paho.mqtt.client as mqtt
def on_connect(client, userdata, flags, rc):
print("Connected with result code "+str(rc))
client.subscribe("chat")
def on_message(client, userdata, msg):
print(msg.topic+" " + ":" + str(msg.payload))
client = mqtt.Client()
client.on_connect = on_connect
client.on_message = on_message
client.connect("www.liefyuan.top", 1883, 60)
client.loop_forever()
C語言?MQTT客戶端
http://t.csdn.cn/bHxPj文章來源地址http://www.zghlxwxcb.cn/news/detail-428639.html
到了這里,關(guān)于【MQTT】MQTT簡介+安裝+使用 python MQTT客戶端的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!