mqttclient
一個高性能、高穩定性的跨平臺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 socket之上開發 ,只要是兼容BSD socket的系統均可使用。
- 無縫銜接salof :它是一個同步異步日志輸出框架,在空閑時候輸出對應的日志信息,也可以將信息寫入flash中保存,方便調試。
- 使用著名的 paho mqtt 庫封包 。
- 無其他依賴 。
在線代碼生成工具
本項目擁有代碼生成工具,只需要在線配置即可生成代碼,極其簡單易用,代碼生成工具地址:https://jiejietop.gitee.io/mqtt/index.html
在線代碼生成工具
占用資源大小
總計占 10857字節 的ROM,而RAM的開銷則幾乎只依賴動態內存,在不使用TLS加密傳輸的情況下,維持QOS0服務質量等級的通信動態內存大約僅需要3694字節,這包括1024讀緩沖區 + 1024寫緩沖區 + 1024內部線程棧大小,相對于其他MQTT客戶端來說,mqttclient需要的RAM資源開銷極少。
整體框架
擁有非常明確的分層框架。
整體架構
- 在框架的最上方是API函數接口,實現了客戶端的申請、釋放、設置參數、連接服務器、斷開連接、訂閱主題、取消訂閱主題、發布消息等函數接口。
- 使用了著名的paho mqtt庫作為MQTT報文封包庫。
- 采用異步處理的機制去管理所有的ack,它在發送報文的時候不用等待服務器的應答,只是記錄下來,在收到服務器的ack后,取消這個記錄, 效率極高 ;而在發送mqtt報文(QoS1/QoS2)的時候沒有收到服務器的應答時,將重發該報文。
- 內部實現了一個mqtt yield線程,統一處理所有的內容,比如 超時的處理、ack報文的處理、收到來自服務器的publish報文 ,此時會去調用回調函數告知用戶收到的數據,發布釋放、發布完成報文的處理、心跳報文(保持活性),當與服務器斷開連接時需要嘗試重連、重新訂閱主題,重新發送報文或者應答等。
- 報文的處理,如讀寫報文、解碼mqtt報文、設置報文(dup標記)、銷毀報文等操作。
- network是網絡組件,它可以 自動選擇數據通道 ,如果是加密方式則通過tls加密進行數據傳輸,而tls可以選擇mbedtls作為加密后端;也可以是tcp直連方式,最終都是通過tcp傳輸的。
- platform是平臺抽象層,封裝了不同系統的東西,比如 socke或者AT,線程、時間、互斥鎖、內存管理 ,這些是與系統打交道的,也是跨平臺必要的封裝。
- 最右邊的則是通用的內容,list的處理、日志庫、錯誤處理、軟件隨機數發生器等。
支持的平臺
目前已實現了Linux、TencentOS tiny、FreeRTOS、RT-Thread平臺(已做成軟件包,名字為kawaii-mqtt
),除此之外TencentOS tiny的AT框架亦可以使用,并且穩定性極好!
版本
問題
歡迎以 GitHub Issues 的形式提交問題和bug報告
版權和許可
mqttclient 遵循 Apache License v2.0 開源協議。鼓勵代碼共享和尊重原作者的著作權,可以自由的使用、修改源代碼,也可以將修改后的代碼作為開源或閉源軟件發布。
linux平臺下測試使用
安裝cmake:
sudo apt-get install cmake g++
測試程序
編譯 & 運行
./build.sh
運行build.sh腳本后會在 ./build/bin/ 目錄下生成可執行文件 emqx 、 baidu 、onenet等多個平臺的可執行程序,直接運行即可。
./build/bin/emqx
編譯成動態庫libmqttclient.so
./make-libmqttclient.sh
運行make-libmqttclient.sh
腳本后會在 ./libmqttclient/lib
目錄下生成一個動態庫文件libmqttclient.so
,并安裝到系統的/usr/lib
目錄下,相關頭文件已經拷貝到./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
-
嵌入式
+關注
關注
5082文章
19123瀏覽量
305151 -
API
+關注
關注
2文章
1500瀏覽量
62012 -
MQTT
+關注
關注
5文章
651瀏覽量
22504
發布評論請先 登錄
相關推薦
評論