mqttclient
一個(gè)高性能、高穩(wěn)定性的跨平臺(tái)MQTT客戶端
一個(gè)高性能、高穩(wěn)定性的跨平臺(tái)MQTT客戶端,基于socket API之上開發(fā),可以在嵌入式設(shè)備(FreeRTOS/LiteOS/RT-Thread/TencentOS tiny)、Linux、Windows、Mac上使用,擁有非常簡(jiǎn)潔的API接口,以極少的資源實(shí)現(xiàn)QOS2的服務(wù)質(zhì)量,并且無縫銜接了mbedtls加密庫。
優(yōu)勢(shì):
- 具有極高的穩(wěn)定性 :無論是 掉線重連 , 丟包重發(fā) ,都是嚴(yán)格遵循MQTT協(xié)議標(biāo)準(zhǔn)執(zhí)行,除此之外對(duì)大數(shù)據(jù)量的測(cè)試無論是收是發(fā),都是非常穩(wěn)定,高頻測(cè)試也是非常穩(wěn)定。
- 輕量級(jí) :整個(gè)代碼工程極其簡(jiǎn)單,不使用mbedtls情況下,占用資源極少,作者曾使用esp8266模組與云端通信,整個(gè)工程代碼消耗的RAM不足15k。
- 支持mbedtls加密傳輸 ,讓網(wǎng)絡(luò)傳輸更加安全,而且接口層完全不需要用戶理會(huì),無論是否加密,mqttclient對(duì)用戶提供的API接口是固定的,這就很好的兼容了一套代應(yīng)用層的碼可以加密傳輸也可以不加密傳輸。
- 支持多客戶端 ,同時(shí)兼容多個(gè)客戶端運(yùn)行工作,一個(gè)設(shè)備連接多個(gè)的服務(wù)器。
- 支持同步異步處理 ,應(yīng)用程序無需阻塞等待浪費(fèi)CPU資源。
- 支持?jǐn)r截器配置 ,在某些平臺(tái)中,客戶端會(huì)默認(rèn)自動(dòng)訂閱系統(tǒng)主題,而且每次來自服務(wù)器的主題都是變動(dòng)的,此時(shí)需要使用攔截器進(jìn)行攔截,分離主題與數(shù)據(jù)信息,并遞交給用戶,極大提高靈活性。
- 擁有在線代碼生成工具 ,極其簡(jiǎn)單配置就可以生成對(duì)應(yīng)的代碼,地址:https://jiejietop.gitee.io/mqtt/index.html
- 擁有極簡(jiǎn)的API接口 ,總的來說,mqttclient的配置都有默認(rèn)值,基本無需配置都能使用的,也可以隨意配置,對(duì)配置都有健壯性檢測(cè),這樣子設(shè)計(jì)的API接口也是非常簡(jiǎn)單。
- 多功能參數(shù)可配置可裁剪 ,重連時(shí)間間隔、心跳周期、最大訂閱數(shù)量、命令超時(shí)、讀寫緩沖區(qū)大小、攔截器處理等等參數(shù)功能可裁剪可配置,滿足開發(fā)者在復(fù)雜、簡(jiǎn)單等各種開發(fā)環(huán)境下的使用需求。
- 支持自動(dòng)重新訂閱主題 ,在自動(dòng)重連后保證主題不會(huì)丟失。
- 支持主題通配符
“#”、“+”
。 - 訂閱的主題與消息處理完全分離 ,讓編程邏輯更加簡(jiǎn)單易用,用戶無需理會(huì)錯(cuò)綜復(fù)雜的邏輯關(guān)系。
- mqttclient內(nèi)部已實(shí)現(xiàn)保活處理機(jī)制 ,無需用戶過多關(guān)心理會(huì),用戶只需專心處理應(yīng)用功能即可。
- 擁有非常好的設(shè)計(jì) ,以極少的資源設(shè)計(jì)了 記錄機(jī)制 ,當(dāng)報(bào)文在丟失的時(shí)候進(jìn)行重發(fā)操作,確保qos1、qos2服務(wù)質(zhì)量等級(jí)的報(bào)文保證其服務(wù)質(zhì)量。
- 有非常好的代碼風(fēng)格與思想 :整個(gè)代碼采用分層式設(shè)計(jì),代碼實(shí)現(xiàn)采用異步處理的思想,降低耦合,提高性能。
- 基于標(biāo)準(zhǔn)BSD socket之上開發(fā) ,只要是兼容BSD socket的系統(tǒng)均可使用。
- 無縫銜接salof :它是一個(gè)同步異步日志輸出框架,在空閑時(shí)候輸出對(duì)應(yīng)的日志信息,也可以將信息寫入flash中保存,方便調(diào)試。
- 使用著名的 paho mqtt 庫封包 。
- 無其他依賴 。
在線代碼生成工具
本項(xiàng)目擁有代碼生成工具,只需要在線配置即可生成代碼,極其簡(jiǎn)單易用,代碼生成工具地址:https://jiejietop.gitee.io/mqtt/index.html
在線代碼生成工具
占用資源大小
總計(jì)占 10857字節(jié) 的ROM,而RAM的開銷則幾乎只依賴動(dòng)態(tài)內(nèi)存,在不使用TLS加密傳輸?shù)那闆r下,維持QOS0服務(wù)質(zhì)量等級(jí)的通信動(dòng)態(tài)內(nèi)存大約僅需要3694字節(jié),這包括1024讀緩沖區(qū) + 1024寫緩沖區(qū) + 1024內(nèi)部線程棧大小,相對(duì)于其他MQTT客戶端來說,mqttclient需要的RAM資源開銷極少。
整體框架
擁有非常明確的分層框架。
整體架構(gòu)
- 在框架的最上方是API函數(shù)接口,實(shí)現(xiàn)了客戶端的申請(qǐng)、釋放、設(shè)置參數(shù)、連接服務(wù)器、斷開連接、訂閱主題、取消訂閱主題、發(fā)布消息等函數(shù)接口。
- 使用了著名的paho mqtt庫作為MQTT報(bào)文封包庫。
- 采用異步處理的機(jī)制去管理所有的ack,它在發(fā)送報(bào)文的時(shí)候不用等待服務(wù)器的應(yīng)答,只是記錄下來,在收到服務(wù)器的ack后,取消這個(gè)記錄, 效率極高 ;而在發(fā)送mqtt報(bào)文(QoS1/QoS2)的時(shí)候沒有收到服務(wù)器的應(yīng)答時(shí),將重發(fā)該報(bào)文。
- 內(nèi)部實(shí)現(xiàn)了一個(gè)mqtt yield線程,統(tǒng)一處理所有的內(nèi)容,比如 超時(shí)的處理、ack報(bào)文的處理、收到來自服務(wù)器的publish報(bào)文 ,此時(shí)會(huì)去調(diào)用回調(diào)函數(shù)告知用戶收到的數(shù)據(jù),發(fā)布釋放、發(fā)布完成報(bào)文的處理、心跳報(bào)文(保持活性),當(dāng)與服務(wù)器斷開連接時(shí)需要嘗試重連、重新訂閱主題,重新發(fā)送報(bào)文或者應(yīng)答等。
- 報(bào)文的處理,如讀寫報(bào)文、解碼mqtt報(bào)文、設(shè)置報(bào)文(dup標(biāo)記)、銷毀報(bào)文等操作。
- network是網(wǎng)絡(luò)組件,它可以 自動(dòng)選擇數(shù)據(jù)通道 ,如果是加密方式則通過tls加密進(jìn)行數(shù)據(jù)傳輸,而tls可以選擇mbedtls作為加密后端;也可以是tcp直連方式,最終都是通過tcp傳輸?shù)摹?/li>
- platform是平臺(tái)抽象層,封裝了不同系統(tǒng)的東西,比如 socke或者AT,線程、時(shí)間、互斥鎖、內(nèi)存管理 ,這些是與系統(tǒng)打交道的,也是跨平臺(tái)必要的封裝。
- 最右邊的則是通用的內(nèi)容,list的處理、日志庫、錯(cuò)誤處理、軟件隨機(jī)數(shù)發(fā)生器等。
支持的平臺(tái)
目前已實(shí)現(xiàn)了Linux、TencentOS tiny、FreeRTOS、RT-Thread平臺(tái)(已做成軟件包,名字為kawaii-mqtt
),除此之外TencentOS tiny的AT框架亦可以使用,并且穩(wěn)定性極好!
版本
問題
歡迎以 GitHub Issues 的形式提交問題和bug報(bào)告
版權(quán)和許可
mqttclient 遵循 Apache License v2.0 開源協(xié)議。鼓勵(lì)代碼共享和尊重原作者的著作權(quán),可以自由的使用、修改源代碼,也可以將修改后的代碼作為開源或閉源軟件發(fā)布。
linux平臺(tái)下測(cè)試使用
安裝cmake:
sudo apt-get install cmake g++
測(cè)試程序
編譯 & 運(yùn)行
./build.sh
運(yùn)行build.sh腳本后會(huì)在 ./build/bin/ 目錄下生成可執(zhí)行文件 emqx 、 baidu 、onenet等多個(gè)平臺(tái)的可執(zhí)行程序,直接運(yùn)行即可。
./build/bin/emqx
編譯成動(dòng)態(tài)庫libmqttclient.so
./make-libmqttclient.sh
運(yùn)行make-libmqttclient.sh
腳本后會(huì)在 ./libmqttclient/lib
目錄下生成一個(gè)動(dòng)態(tài)庫文件libmqttclient.so
,并安裝到系統(tǒng)的/usr/lib
目錄下,相關(guān)頭文件已經(jīng)拷貝到./libmqttclient/include
目錄下,將其拷貝到你的工程中即可,編譯應(yīng)用程序的時(shí)候只需要鏈接動(dòng)態(tài)庫即可-lmqttclient -lpthread
,動(dòng)態(tài)庫的配置文件是根據(jù)./test/mqtt_config.h
配置的。
如果你是用交叉編譯器的話,則應(yīng)該根據(jù)你使用的編譯器導(dǎo)出對(duì)應(yīng)的環(huán)境變量(此處使用的交叉編譯器是arm-linux-gnueabihf-gcc),同時(shí)你也必須將動(dòng)態(tài)庫文件libmqttclient.so
拷貝到你的嵌入式系統(tǒng)的/usr/lib
目錄下:
export CROSS_COMPILE=arm-linux-gnueabihf-
如若需要卸載 libmqttclient.so ,執(zhí)行以下命令即可:
./make-libmqttclient.sh remove
-
嵌入式
+關(guān)注
關(guān)注
5068文章
19014瀏覽量
303226 -
API
+關(guān)注
關(guān)注
2文章
1484瀏覽量
61810 -
MQTT
+關(guān)注
關(guān)注
5文章
649瀏覽量
22427
發(fā)布評(píng)論請(qǐng)先 登錄
相關(guān)推薦
評(píng)論