中文說明
高效能、高穩定性、跨平台的MQTT客戶端
一款高效能、高穩定性、跨平台的MQTT用戶端,基於socket API開發,可用於嵌入式裝置(FreeRTOS/LiteOS/RT-Thread/TencentOS tiny)、Linux、Windows、Mac,具有非常簡潔的API介面用很少的資源實現了QOS2的服務質量,並且無縫連接mbedtls加密庫。
極高的穩定性:無論是掉線重連、丟包重傳,都嚴格遵守MQTT協定標準,此外大數據量的測試無論是接收或發送都非常穩定,高頻測試也很穩定。
輕量級:整個程式碼專案極為簡單。沒有mbedtls,佔用的資源很少。作者使用esp8266模組與雲端通訊。整個專案程式碼消耗的 RAM 不到 15k。
支援mbedtls加密傳輸,讓網路傳輸更加安全,而且介面層不需要用戶關心,無論是否加密,mqttclient都是固定為用戶提供的API接口,非常兼容一套代表應用層的代碼可以加密或不加密地傳輸。
支援多客戶端,相容於多個客戶端同時運行,一台設備連接多台伺服器。
支援同步和非同步處理,應用程式無需阻塞等待浪費CPU資源。
支援攔截器配置,在某些平台上,客戶端預設會自動訂閱系統主題,每次來自服務端的主題都會變更。這種情況下就需要使用攔截器來攔截分離主題和資料資訊並傳遞給用戶,大大提高靈活性。
使用線上程式碼產生工具,只需極其簡單的配置即可產生程式碼,網址:https://jiejietop.gitee.io/mqtt/index.html
擁有非常簡單的API接口,一般來說,mqttclient配置都有預設值,基本上不用配置就可以使用,也可以任意配置,配置有魯棒性檢測,所以設計的API接口也非常簡單。
多功能參數可配置定制,重連時間間隔、心跳週期、最大訂閱數、命令超時、讀寫緩衝區大小、攔截器處理等。開發環境中使用。
支援自動重新訂閱主題,自動重連後保證主題不會遺失。
支援主題通配符 ""#", "+"` 。
訂閱主題與訊息處理完全分離,使得程式邏輯更加簡單易用,使用者不必處理錯綜複雜的邏輯關係。
mqttclient 中已經實現了保活處理機制,無需使用者處理心理體驗,使用者只需專注於應用功能。
有非常好的設計,設計了佔用很少資源的記錄機制,在報文遺失時進行重傳,保證qos1和qos2服務品質等級保證其服務品質。
有非常好的程式碼風格和想法:整個程式碼採用分層設計,程式碼實現採用非同步處理的思想,減少耦合,提高效能。
在標準BSD套接字之上開發,只要相容於BSD套接字系統即可。
salof的無縫連接:是一個同步非同步日誌輸出框架。空閒時輸出對應的日誌訊息,也可以將訊息寫入flash保存,方便調試。
使用著名的paho mqtt庫包。
沒有其他依賴性。
本專案有一個程式碼產生工具,只需要線上配置即可產生程式碼,極為簡單易用。程式碼產生工具位址為:https://jiejietop.gitee.io/mqtt/index.html

ROM總共10857字節,而RAM的開銷幾乎只依賴動態記憶體。在不使用TLS加密傳輸的情況下,維持QOS0服務品質等級的通訊動態記憶體僅需約3694位元組。包含1024個讀取緩衝區+1024個寫入緩衝區+1024個內部執行緒堆疊大小,與其他MQTT客戶端相比,mqttclient需要很少的RAM資源開銷。
| 程式碼 | 逆滲透數據 | 讀寫數據 | ZI數據 | 物件名稱 |
|---|---|---|---|---|
| 7118 | 第791章 | 0 | 0 | mqttclient.o |
| 第546章 | 0 | 0 | 0 | mqttconnectclient.o |
| 212 | 0 | 0 | 0 | mqttdeserializepublish.o |
| 第476章 | 0 | 4 | 0 | mqttpacket.o |
| 236 | 0 | 0 | 0 | mqttserializepublish.o |
| 310 | 0 | 0 | 0 | mqttsubscribeclient.o |
| 38 | 0 | 0 | 0 | mqttunsubscribeclient.o |
| 56 | 0 | 0 | 0 | 網路類型_tcp.o |
| 62 | 0 | 0 | 0 | 網路.o |
| 24 | 0 | 0 | 0 | 平台記憶體.o |
| 40 | 0 | 0 | 0 | platform_mutex.o |
| 第344章 | 0 | 0 | 0 | platform_net_socket.o |
| 94 | 0 | 0 | 0 | 平台線程.o |
| 70 | 0 | 0 | 0 | platform_timer.o |
| 246 | 0 | 4 | 0 | 隨機.o |
| 62 | 0 | 0 | 0 | mqtt_list.o |
| - | - | - | - | - |
| 10066 | 第791章 | 8 | 0 | 全部的 |
具有非常清晰的層次框架。

框架最頂層是API函數接口,實現了客戶端的申請、發布、設定參數、連接伺服器、斷開連接、訂閱主題、取消訂閱主題、發布訊息等功能接口。
MQTT訊息包庫採用著名的paho mqtt庫。
使用非同步處理機制來管理所有的ack。它發送訊息時不需要等待伺服器的回應,而只是記錄下來。收到伺服器的ack後,取消這項記錄,效率很高;而當發送mqtt訊息(QoS1/QoS2)後沒有收到伺服器的回應時,訊息將會重傳。
內部實作了一個mqtt的yield線程,統一處理所有的內容,例如超時處理、ack訊息處理、接收伺服器發送的publish訊息,這時候會呼叫回調函數通知用戶收到的數據, *發布後、完成後當訊息處理、心跳訊息(保活)、與伺服器斷開連線時,需嘗試重新連線、重新訂閱主題、重新傳送訊息或回覆* 等。
訊息處理,如讀寫訊息、解碼mqtt訊息、設定訊息(dup flag)、銷毀訊息等操作。
network是網路元件,可以自動選擇資料通道,如果是加密方式,則採用tls加密進行資料傳輸,tls可以選擇mbedtls作為加密後端;也可以是tcp直連方式,最終透過tcp傳輸。
platform是平台抽象層,封裝了來自不同系統的東西,例如socke或AT、執行緒、時間、互斥、記憶體管理**,這些都是和系統打交道的,也是跨平台所必需的封裝。
最右邊是一般內容,清單處理、日誌庫、錯誤處理、軟體隨機數產生器等。
目前已經實現了Linux、TencentOStiny、FreeRTOS、RT-Thread平台(軟體包名為kawaii-mqtt`),另外也可以使用TencentOStinyAT框架,穩定性極佳!
| 平台 | 程式碼位置 |
|---|---|
| Linux | https://github.com/jiejieTop/mqttclient |
| 騰訊OS小 | https://github.com/Tencent/TencentOS-tiny/tree/master/board/Fire_STM32F429 |
| TangenOS Tiny AT 框架 | https://github.com/jiejieTop/gokit3-board-mqttclient |
| RT-執行緒 | https://github.com/jiejieTop/kawaii-mqtt |
| 自由即時作業系統 | https://github.com/jiejieTop/freertos-mqttclient |
| 發布版本 | 描述 |
|---|---|
| [v1.0.0] | 首次發布,完成基礎架構及穩定性驗證 |
| [v1.0.1] | 修正主動斷開伺服器連線時的邏輯處理 |
| [v1.0.2] | 新增功能攔截器,修復一些小bug |
| [v1.0.3] | 避免全域污染,修改log和list相關函數的命名 |
| [v1.0.4] | 網路結構和mbedtls資料通道重新調整 |
| [v1.1.0] | 較大版本更新,重構部分代碼,優化MQTT處理邏輯,提高整體穩定性,支援多客戶端,支援設定遺囑,優化API接口,添加多個雲平台測試代碼和文檔,添加在線代碼生成工具、在線切割配置工具 |
歡迎以 GitHub Issues 的形式提交問題和 bug 報告
mqttclient遵循Apache License v2.0開源協定。鼓勵程式碼共享,尊重原作者的版權。您可以自由使用和修改原始程式碼,也可以將修改後的程式碼發佈為開源或閉源軟體。
sudo apt-get install cmake g++| 測試平台 | 地點 |
|---|---|
| emqx(我的私人部署的伺服器) | ./test/emqx/test.c |
| 百度天工 | ./test/baidu/test.c |
| 統一網 | ./test/onenet/test.c |
| 阿里雲物聯網 | ./test/ali/test.c |
./build.sh執行build.sh腳本後,會在./build/bin/目錄下產生emqx 、 baidu 、 onenet等平台的可執行文件,可直接執行執行程式。
./build/bin/emqx ./make-libmqttclient.sh執行make-libmqttclient.sh腳本後,會在./libmqttclient/lib目錄下產生動態庫檔案libmqttclient.so ,並安裝到系統的/usr/lib目錄下,相關頭檔已拷貝到./libmqttclient.so目錄下./libmqttclient/include您只需在編譯應用程式時連結動態庫即可。 -lmqttclient -lpthread ,動態函式庫的設定檔是基於./test/mqtt_config.h設定。
如果使用交叉編譯器,則應根據所使用的編譯器導出對應的環境變數(這裡使用的交叉編譯器為arm-linux-gnueabihf-gcc),同時也必須設定動態函式庫檔案libmqttclient .so被複製到嵌入式系統的/usr/lib目錄:
export CROSS_COMPILE=arm-linux-gnueabihf-如果需要卸載libmqttclient.so ,請執行以下命令:
./make-libmqttclient.sh remove請參閱文件:
MQTT協議介紹
MQTT協定通訊流程
mqtt客戶端程式碼產生工具
mqttclient配置及切割工具
mqtt客戶端設計與實現
mqttclient連接百度天工五訪問
mqttclient連接OneNET雲端平台
mqttclient連接阿里雲IoT平台