在线观看www成人影院-在线观看www日本免费网站-在线观看www视频-在线观看操-欧美18在线-欧美1级

0
  • 聊天消息
  • 系統消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發帖/加入社區
會員中心
創作中心

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內不再提示

什么是mqttclient

汽車電子技術 ? 來源:物聯網IoT開發 ? 作者:杰杰mcu ? 2023-02-14 10:48 ? 次閱讀

01

前言

我可能是最懶的半吊子程序員博主了 ,從過年到現在,將近2個月了,沒發過一篇文章,但公眾號每天都有新增的兄弟姐妹關注,非常感謝大家的信任,我呢,就做好自己的事情,該干嘛干嘛,文章嘛,偶爾抽空寫一下發一發,相對于寫文章,我更喜歡看書和寫代碼呢,我每天都有寫代碼的,這不,今天給大家帶來一份商業級穩定性的代碼——mqttclient。

02

關于mqttclient的誕生

談談這份代碼的誕生緣由吧! 從上一年的5月份左右吧,我花了一個多星期去移植阿里的SDK,想要將它用起來,但是奈何一直沒能用成功,歸根結底我還是太菜了,10月份分析完了騰訊的SDK中的MQTT協議部分的代碼,我就想自己寫一個好用的代碼,要非常簡單API接口,還要有很好的穩定性,然后嘛,也是為開源做貢獻,希望有緣人能簡單快速用起來,都說程序員有些奇奇怪怪的理想,且不說改變世界吧,像我這種,我是很希望某些產品中能跑著我寫的代碼,即使我無緣知道甚至遇見它。。。

兜兜轉轉,從11月份開始設計框架,LwIP的源碼與阿里的SDK框架給了我很大的影響,所以整體的設計框架都采用分層設計,此外騰訊的SDK呢讓我決定了使用異步處理的思想來設計整個代碼,然后設計完整體框架之后就愉快地板磚了,沒錯,是愉快地!寫代碼其實是很好玩的事情,特別是當年的想法可以實現的時候,遇到不懂的時候有資料,有人討論,在此特別感謝幾位網上的好基友,在大半夜的還與我討論,解答我的問題~非常nice。

03

介紹一下mqttclient

這一個基于socket API之上的跨平臺MQTT客戶端,擁有非常簡潔的API接口,以極少的資源實現QOS2的服務質量,并且無縫銜接了mbedtls加密庫。

04

談談優勢

  • 基于標準BSD socket之上開發 ,只要是兼容BSD socket的系統均可使用。
  • 穩定 :無論是掉線重連丟包重發,都是嚴格遵循MQTT協議標準執行,除此之外對大數據量的測試無論是收是發,都是非常穩定(一次發送135K數據,3秒一次),高頻測試也是非常穩定(7個主題同時收發,每秒一次,也就是1秒14個mqtt報文,服務質量QoS0、QoS1、QoS2都有)。因為作者以極少的資源設計了記錄機制,對采用QoS1服務質量的報文必須保證到達一次,當發布的主題(qos1、qos2都適用)沒有被服務器收到時會自動重發,而對QoS2服務質量的報文保證有且只有處理一次(如果不相信它穩定性的同學可以自己去修改源碼,專門為QoS2服務質量去做測試,故意不回復PUBREC包,讓服務器重發QoS2報文,且看看客戶端是否有且只有處理一次),而對于掉線重連的穩定性,這種則是基本操作了,沒啥好說的,在自動重連后還會自動重新訂閱主題,保證主題不會丟失,因此在測試中穩定性極好。
  • 輕量級 :整個代碼工程極其簡單,不使用mbedtls情況下,占用資源極少,作者曾使用esp8266模組與云端通信,整個工程代碼消耗的RAM不足15k(包括系統占用的開銷,對數據的處理開銷,而此次還是未優化的情況下,還依舊完美保留了掉線重連的穩定性,但是對應qos1、qos2服務質量的報文則未做測試,因為STM32F103C8T6芯片資源實在是太少了,折騰不起)。
  • 無縫銜接mbedtls加密傳輸 ,讓網絡傳輸更加安全,而且接口層完全不需要用戶理會,無論是否加密,mqttclient對用戶提供的API接口是沒有變化的,這就很好的兼容了一套代應用層的碼可以加密傳輸也可以不加密傳輸。
  • 擁有極簡的API接口 ,總的來說,mqttclient的配置都有默認值,基本無需配置都能使用的,也可以隨意配置,對配置都有健壯性檢測,這樣子設計的API接口也是非常簡單。
  • 有非常好的代碼風格與思想 :整個代碼采用分層式設計,代碼實現采用異步處理的思想,降低耦合,提高性能,具體體現在什么地方呢?很簡單,目前市面上很多MQTT客戶端發布主題都是要阻塞等待ack,這是非常暴力的行為,阻塞當前線程等待服務器的應答,那如果我想要發送數據怎么辦,或者我要重復檢測數據怎么辦,你可能會說,指定阻塞時間等待,那如果網絡延遲,ack遲遲不來,我就白等了嗎,對于qos1、qos2的服務質量怎么辦,所以說這種還是要異步處理的思想,我發布主題,那我發布出去就好了,不需要等待,對于qos1、qos2服務質量的MQTT報文,如果服務器沒收到,那我重發就可以,這種重發也是異步的處理,完全不會阻塞當前線程。
  • MQTT協議支持主題通配符“#”、“+”
  • 訂閱的主題與消息處理完全分離 ,讓編程邏輯更加簡單易用,用戶無需理會錯綜復雜的邏輯關系。
  • mqttclient內部已實現保活處理機制 ,無需用戶過多關心理會,用戶只需專心處理應用功能即可。
  • 無縫銜接salof: 它是一個同步異步日志輸出框架,在空閑時候輸出對應的日志信息,也可以將信息寫入flash中保存,方便調試。
  • 不對外產生依賴。

05

mqttclient整體框架

擁有非常明確的分層框架。

圖片

06

mqttclient適配的平臺

目前已實現了LinuxTencentOS tiny、RT-Thread平臺(已做成軟件包,這個名字比較騷氣,叫kawaii-mqtt( 卡哇伊?( ′???` )****)),除此之外TencentOS tiny的AT框架亦可以使用(RAM消耗不足15K),并且穩定性極好!歡迎下載并且測試。

平臺 代碼位置
Linux https://github.com/jiejieTop/mqttclient
TencentOS tiny https://github.com/Tencent/TencentOS-tiny/tree/master/board/Fire_STM32F429
TencentOS tiny AT 框架 https://github.com/jiejieTop/gokit3-board-mqttclient
RT-Thread https://github.com/jiejieTop/kawaii-mqtt

07

mqttclient測試(Linux平臺)

1. 安裝cmake

sudo apt-get install cmake

2. 配置連接參數

mqttclient/test/test.c文件中修改以下內容:

init_params.connect_params.network_params.network_ssl_params.ca_crt = test_ca_get();    /* CA證書 */
    init_params.connect_params.network_params.addr = "xxxxxxx";                             /* 服務器域名 */
    init_params.connect_params.network_params.port = "8883";                                /* 服務器端口號 */
    init_params.connect_params.user_name = "xxxxxxx";                                       /* 用戶名 */
    init_params.connect_params.password = "xxxxxxx";                                        /* 密碼 */
    init_params.connect_params.client_id = "xxxxxxx";                                       /* 客戶端id */

3. 編譯運行

./build.sh

運行build.sh腳本后會在 ./build/bin/目錄下生成可執行文件mqtt-client,直接運行即可。


08

mqttclient的配置

mbedtls

默認不打開mbedtls,當然只需要配置一個宏定義即可打開mbedtls加密。

salof

salof 全稱是:Synchronous Asynchronous Log Output Framework(同步異步日志輸出框架),它是一個同步異步日志輸出框架,在空閑時候輸出對應的日志信息,并且該庫與mqttclient無縫銜接。

配置對應的日志輸出級別:

#define BASE_LEVEL      (0)
#define ASSERT_LEVEL    (BASE_LEVEL + 1)            /* 日志輸出級別:斷言級別(非常高優先級) */
#define ERR_LEVEL       (ASSERT_LEVEL + 1)          /* 日志輸出級別:錯誤級別(高優先級) */
#define WARN_LEVEL      (ERR_LEVEL + 1)             /* 日志輸出級別:警告級別(中優先級) */
#define INFO_LEVEL      (WARN_LEVEL + 1)            /* 日志輸出級別:信息級別(低優先級) */
#define DEBUG_LEVEL     (INFO_LEVEL + 1)            /* 日志輸出級別:調試級別(更低優先級) */

#define         LOG_LEVEL                   WARN_LEVEL      /* 日志輸出級別 */

日志其他選項:

  • 終端帶顏色
  • 時間戳
  • 標簽

mqttclient的基本配置

配置mqtt等待應答列表的最大值,對于qos1 qos2服務質量有要求的可以將其設置大一點,當然也必須資源跟得上,它主要是保證qos1 qos2的mqtt報文能準確到達服務器。

#define     MQTT_ACK_HANDLER_NUM_MAX            64

選擇MQTT協議的版本,默認為4,表示使用MQTT 3.1.1版本,而3則表示為MQTT 3.1版本。

#define     MQTT_VERSION                        4           // 4 is mqtt 3.1.1

設置默認的保活時間,它主要是保證MQTT客戶端與服務器的保持活性連接,單位為 秒 ,比如MQTT客戶端與服務器100S沒有發送數據了,有沒有接收到數據,此時MQTT客戶端會發送一個ping包,確認一下這個會話是否存在,如果收到服務器的應答,那么說明這個會話還是存在的,可以隨時收發數據,而如果不存在了,就清除會話。

#define     MQTT_KEEP_ALIVE_INTERVAL            100         // unit: second

默認的命令超時,它主要是用于socket讀寫超時,在MQTT初始化時可以指定:

#define     MQTT_DEFAULT_CMD_TIMEOUT            4000

默認主題的長度,主題是支持通配符的,如果主題太長則會被截斷:

#define     MQTT_TOPIC_LEN_MAX                  64

默認的算法數據緩沖區的大小,如果要發送大量數據則修改大一些,在MQTT初始化時可以指定:

#define     MQTT_DEFAULT_BUF_SIZE               1024

線程相關的配置,如線程棧,線程優先級,線程時間片等:

在linux環境下可以是不需要理會這些參數的,而在RTOS平臺則需要配置,如果不使用mbedtls,線程棧2048字節已足夠,而使用mbedtls加密后,需要配置4096字節以上。

#define     MQTT_THREAD_STACK_SIZE              2048    // 線程棧
#define     MQTT_THREAD_PRIO                    5       // 線程優先級
#define     MQTT_THREAD_TICK                    50      // 線程時間片

默認的重連時間間隔,當發生掉線時,會以這個時間間隔嘗試重連:

#define     MQTT_RECONNECT_DEFAULT_DURATION     1000

其他不需要怎么配置的東西:

#define     MQTT_MAX_PACKET_ID                  (0xFFFF - 1)    // mqtt報文id
#define     MQTT_MAX_CMD_TIMEOUT                20000           //最大的命令超時參數
#define     MQTT_MIN_CMD_TIMEOUT                1000            //最小的命令超時參數

ps:以上參數基本不需要怎么配置的,直接用即可~

09

mqttclient設計思想

設計思想

  • 整體采用分層式設計,代碼實現采用異步設計方式,降低耦合。
  • 消息的處理使用回調的方式處理:用戶指定[訂閱的主題]與指定[消息的處理函數]
  • 不對外產生依賴

方便大家更容易理解mqttclient的代碼與設計思想,讓大家能夠修改源碼與使用,還可以提交pr或者issues,開源的世界期待各位大神的參與,感謝!

除此之外以下代碼的記錄機制與其超時處理機制是非常好的編程思想,大家有興趣一定要看源代碼!

不是所有人都喜歡看代碼的,整個mqttclient的實現在今天的第二篇推文中講解,此處就不再多說了,源碼地址是:https://github.com/jiejieTop/mqttclient。

聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發燒友網立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規問題,請聯系本站處理。 舉報投訴
  • 框架
    +關注

    關注

    0

    文章

    403

    瀏覽量

    17558
  • LwIP
    +關注

    關注

    2

    文章

    88

    瀏覽量

    27427
  • SDK
    SDK
    +關注

    關注

    3

    文章

    1047

    瀏覽量

    46325
收藏 人收藏

    評論

    相關推薦

    請問MQTT示例程序不能連接到broker是什么原因?怎么解決?

    failed運行http://m2m.demos.ibm.com/mqttclient/提示 Failed to connect to messagesight.ibm.com:1883請問是我設置有問題嗎?還是 http://m2m.demos.ibm.com 這個現在不能用了?謝謝!
    發表于 06-07 03:56

    制作自己的wifi開關 ESP8266 lua開發連接本地emqtt服務器實現遠程控制

    ;quot; ClientPublishTopic = "111"MqttClient=mqtt.Client(Clientid,3,MqttUserName
    發表于 11-07 22:24

    【鈦極小龜試用體驗】阿里云物聯網云端通訊及控制實驗

    (USER_NAME); System.err.println(USER_PASS); connOpts.setAutomaticReconnect(true); MqttClient mqttClient
    發表于 11-21 11:05

    在鴻蒙系統上使用MQTT編程

    的軟件包,相關github鏈接如下:https://gitee.com/qidiyun/harmony_mqtt 這里提供一個簡單的編程示例:這里我們使用MQTTClient編程模型,他支持多任務
    發表于 11-18 17:14

    【睿賽德 RW007 WiFi 模塊試用連載】在正點原子F407探索者上的MQTT網關

    rt_thread_t app_mqtt_thread = RT_NULL;/* 定義一個MQTT客戶端結構體 */static MQTTClient client;/* 收到訂閱的"
    發表于 07-19 22:43

    求助,pahomqtt編譯時提示缺少pipe是什么情況?

    packages/pahomqtt-latest/MQTTClient-RT/paho_mqtt_pipe.c:363:16: error: 'MQTTClient {aka struct
    發表于 05-10 09:42

    mqtt線程卡死導致publish消息無反應是什么原因導致的?

    \x00",6); if(!MqttClient.isonline){LOG_E("Wait MQTT Connect"); } while
    發表于 05-24 15:14

    分享一下mqttclient的設計與實現方式

    設計思想整體采用分層式設計,代碼實現采用異步設計方式,降低耦合。消息的處理使用回調的方式處理:用戶指定訂閱的主題與指定消息的處理函數。不依賴外部任何文件。API接口mqttclient擁有非常簡潔
    發表于 08-09 11:27

    MQTT協議與百度天工物接入連接并進行通信

    ,然后點擊連接。在連接成功后,可以添加訂閱的主題名字,向指定的主題發送內容:手動安裝相關的依賴包這些依賴包是使用mqttclient庫去連接百度云時必須要安裝的。sudo apt-get -y
    發表于 08-09 11:34

    使用w5500 kawaii-mqtt時需要注意的一個點

    記錄使用jiejie mqttclient遇到的問題,先吐槽下rtt目前的mqtt組件包,都經不起推敲,umqtt感覺很不錯,可惜作者因為一些原因也不維護了。差點就想試著移植esp-idf里面
    發表于 09-05 16:39

    mymqtt軟件包和SAL同時打開時編譯報錯咋辦?

    mymqtt和SAL時,編譯報錯,如下:../packages/mymqtt-latest/MQTTClient-C/mqtt_client.c:270:17: error: storage size of 'so_linger' isn't known當把SAL關閉時,編譯正常,并且mqtt的功能也能正常使用
    發表于 02-03 14:24

    NodeMCU ESP8266上的pinMode導致循環啟動錯誤如何解決?

    temp;float hum;AsyncMqttClient mqttClient;Ticker mqttReconnectTimer;WiFiEventHandler wifiConnectHandler
    發表于 02-21 08:23

    MQTT如何退出重新連接循環?

    () { /* 循環直到我們重新連接 */ while (!mqttClient.connected()) { /*#ifdef SERIAL_DEBUG*/ Serial.print(\"
    發表于 04-28 06:40

    mqttclient跨平臺MQTT客戶端

    ./oschina_soft/gitee-mqttclient.zip
    發表于 06-21 11:55 ?1次下載
    <b class='flag-5'>mqttclient</b>跨平臺MQTT客戶端

    MQTT在線代碼生產工具

    mqttclient代碼生產工具主要是用于配置MQTT的參數,并且生成相應的代碼,因為是可視化的配置,極易使用。
    的頭像 發表于 02-28 16:09 ?1856次閱讀
    MQTT在線代碼生產工具
    主站蜘蛛池模板: 日本色视| 国产 日韩 欧美 高清 | 手机免费看a | 有没有免费的视频在线观看 | 国产三级观看久久 | 91极品视频在线观看 | 99国产精品久久久久久久成人热 | 久青草国产在线视频_久青草免 | 韩国免费特一级毛片 | 可以免费看黄色的网站 | 国产亚洲3p一区二区三区 | 婷婷综合激情 | 欧美肉到失禁高h视频在线 欧美三级成人 | 高清不卡免费一区二区三区 | 国产在线观看www鲁啊鲁免费 | 亚洲一区欧美一区 | 美女张开大腿让男人桶 | 高清成年美女xx免费网站黄 | 黄视频网站入口 | ts国产 | 色五月丁香五月综合五月 | www色综合| 精品国产污网站在线观看15 | 欧美肥穴| 欧美性videofree精品 | 四虎影院黄色片 | 日本人的色道www免费一区 | 男女午夜特黄毛片免费 | 不卡视频一区二区 | 日韩黄a级成人毛片 | 美女被免网站在线视频 | 国产一级做a爱免费视频 | 欧美性色黄大片四虎影视 | 1024手机在线看 | 久久精品高清 | 欧美性性性性性ⅹxxbbbb | 高清视频一区二区三区 | 五月婷婷在线视频 | 欧美狠狠 | 无毒不卡在线播放 | 国产精品久久久久久久久久妇女 |