<strike id="kiyse"></strike>
  • <tr id="kiyse"></tr>
  • <strike id="kiyse"></strike><samp id="kiyse"><tbody id="kiyse"></tbody></samp>
    <strike id="kiyse"><s id="kiyse"></s></strike>
    <tr id="kiyse"></tr>
    <noframes id="kiyse"><code id="kiyse"></code></noframes>
    <th id="kiyse"></th>
    <samp id="kiyse"></samp>
  • <th id="kiyse"><s id="kiyse"></s></th>
  • 英創(chuàng)Linux主板支持MQTT應(yīng)用

     2023-9-20     作者:黃志超         

    MQTT(Message Queuing Telemetry Transport) 是一種基于客戶端服務(wù)端架構(gòu)的發(fā)布/訂閱模式的消息傳輸協(xié)議。它的設(shè)計思想是輕巧、開放、 簡單、規(guī)范,易于實現(xiàn)。這些特點使得它對很多場景來說都是很好的選擇,特別是對于受限的環(huán)境如機器與機器的通信(M2M)以及物聯(lián)網(wǎng)環(huán)境(IoT)。


    MQTT 最大的優(yōu)點在于,可以以極少的代碼和有限的帶寬,為連接遠程設(shè)備提供實時可靠的消息服務(wù)。而作為一種低開銷、低帶寬占用的即時通訊協(xié)議,也使其在物聯(lián)網(wǎng)、小型設(shè)備、移動應(yīng)用等方面有較廣泛的應(yīng)用。在MQTT中分為客戶端和服務(wù)器端,客戶端(MQTT Client)可以發(fā)布和訂閱消息,而服務(wù)器端(MQTT Broker)則對多個客戶端發(fā)布或訂閱的各種消息做相應(yīng)的處理轉(zhuǎn)發(fā),如下圖所示:

      1.png


    在MQTT官網(wǎng)就有詳細的中文文檔說明,因此在這里我們就不過多介紹MQTT協(xié)議本身了,有興趣的客戶可以參考資料:https://blog.mcxiaoke.com/mqtt/protocol/MQTT-3.1.1-CN.pdf


    英創(chuàng)公司在Linux主板上移植了Mosquitto開源軟件,以支持基于MQTT的各種應(yīng)用。Mosquitto是一款輕量級的開源軟件,適用于低功耗設(shè)備使用,實現(xiàn)了MQTT 協(xié)議versions 5.0,3.1.1和3.1,因此非常適合在嵌入式設(shè)備上使用。通過Mosquitto軟件,Linux主板可以作為MQTT的客戶端,對消息進行發(fā)布和訂閱,也可以作為MQTT的服務(wù)器端,來處理客戶端發(fā)布和訂閱的消息。


    當(dāng)英創(chuàng)Linux主板作為服務(wù)器端時,可以通過命令mosquitto -c /etc/mosquitto/mosquitto.conf來啟動服務(wù),此時客戶端的設(shè)備就都可以與服務(wù)器建立連接,進行對消息的發(fā)布和訂閱。在/etc/mosquitto/mosquitto.conf文件中有MQTT服務(wù)器的一些配置選項,用戶可以根據(jù)需求修改,具體的說明可以參考https://mosquitto.org/man/mosquitto-conf-5.html。在英創(chuàng)Linux主板中,采用了systemd來管理服務(wù),在配置好后,systemd會在系統(tǒng)啟動完成后,自動啟動mosquitto服務(wù),不需要用戶在手動去執(zhí)行命令了。如果對啟動服務(wù)有特殊的需求,可以通過systemd的標(biāo)準(zhǔn)命令來控制服務(wù)的啟動,常用的命令如下表:

    命令

    作用

    systemctl disable mosquitto

    關(guān)閉開機自啟動服務(wù)

    systemctl enable mosquitto

    開啟開機自啟動服務(wù)

    systemctl stop mosquitto

    停止服務(wù)

    systemctl start mosquitto

    啟動服務(wù)

    systemctl restart mosquitto

    重啟服務(wù)


    當(dāng)英創(chuàng)Linux主板作為客戶端時,需要先連接MQTT服務(wù)器,然后就可以發(fā)布或者訂閱消息了。對應(yīng)的功能可以通過Mosquitto軟件提供的現(xiàn)成工具來測試,mosquitto_pub工具用來發(fā)布消息而mosquitto_sub工具用于訂閱消息。下面我們在本地測試通過MQTT協(xié)議來發(fā)布和訂閱消息,主板中mosquitto服務(wù)是自動啟動的,所以連接到自身啟動的MQTT服務(wù)器(Broker)就可以做本地測試,首先是訂閱主題為test的消息,通過mosquitto_sub工具實現(xiàn)就能實現(xiàn)這個功能,在默認情況下mosquitto_sub工具會連接本地的MQTT服務(wù)器(Broker),也可以通過參數(shù)指定服務(wù)器地址,具體的用法介紹可以參考https://mosquitto.org/man/mosquitto_sub-1.html,測試命令如下圖:

    image.png


    然后我們通過mosquitto_pub工具來向test主題發(fā)布一個消息,內(nèi)容為”Hello World”。同樣默認情況下mosquitto_pub工具會連接本地的MQTT服務(wù)器(Broker),也可以通過參數(shù)指定服務(wù)器地址,具體的用法介紹可以參考https://mosquitto.org/man/mosquitto_pub-1.html,測試命令如下圖:

    image.png


    此時,通過mosquitto_sub工具訂閱消息的終端就會收到剛剛發(fā)布的消息:

    image.png


    另外也可以通過C程序調(diào)用Mosquitto軟件庫中提供的API來進行消息的發(fā)布和訂閱。關(guān)于API的介紹,可以參考Mosquitto軟件的官方文檔,里面有詳細全面的介紹:https://mosquitto.org/api/files/mosquitto-h.html。英創(chuàng)公司基于這些API實現(xiàn)了兩個簡單的基本例程,一個用于發(fā)布消息,一個用于訂閱消息,可以供用戶參考。


    訂閱消息例程的主要代碼如下:

    // 初始化mosquitto庫  
    ret = mosquitto_lib_init();  
    if(ret){  
       printf("Init lib error!\n");  
       return -1;  
    }  
     
    // 創(chuàng)建一個訂閱端實例,名稱為sub_test  
    mosq =  mosquitto_new("sub_test", true, NULL);  
    if(mosq == NULL){  
       printf("New test error!\n");  
       mosquitto_lib_cleanup();  
       return -1;  
    }  
     
    // 設(shè)置回調(diào)函數(shù),在connect的回調(diào)函數(shù)中設(shè)置訂閱的主題(test)  
    mosquitto_connect_callback_set(mosq, my_connect_callback);  
    // 設(shè)置回調(diào)函數(shù),這里都是一些簡單的打印信息  
    mosquitto_disconnect_callback_set(mosq, my_disconnect_callback);  
    mosquitto_subscribe_callback_set(mosq, my_subscribe_callback);  
    mosquitto_message_callback_set(mosq, my_message_callback);  
     
    // 連接至本地MQTT服務(wù)器  
    ret = mosquitto_connect(mosq, "localhost", 1883, KEEP_ALIVE);  
    if(ret){  
       printf("Connect server error!\n");  
       mosquitto_destroy(mosq);  
       mosquitto_lib_cleanup();  
       return -1;  
    }  
     
    // 開始通信:循環(huán)執(zhí)行、直到運行標(biāo)志running被改變  
    while(running)  
    {  
       mosquitto_loop(mosq, -1, 1);  
    }  
     
    // 結(jié)束后的清理工作  
    mosquitto_destroy(mosq);  
    mosquitto_lib_cleanup();


    發(fā)布消息例程的主要代碼如下:

    //初始化libmosquitto庫
    ret = mosquitto_lib_init();
    if(ret){
       printf("Init lib error!\n");
       return -1;
    }
    //創(chuàng)建一個發(fā)布端實例,名稱為pub_test
    mosq =  mosquitto_new("pub_test", true, NULL);
    if(mosq == NULL){
       printf("New pub_test error!\n");
       mosquitto_lib_cleanup();
       return -1;
    }

    //設(shè)置回調(diào)函數(shù),這里都是簡單的打印信息
    mosquitto_connect_callback_set(mosq, my_connect_callback);
    mosquitto_disconnect_callback_set(mosq, my_disconnect_callback);
    mosquitto_publish_callback_set(mosq, my_publish_callback);

    // 連接至本地MQTT服務(wù)器
    ret = mosquitto_connect(mosq, "localhost", 1883, KEEP_ALIVE);
    if(ret){
       printf("Connect server error!\n");
       mosquitto_destroy(mosq);
       mosquitto_lib_cleanup();
       return -1;
    }

    //mosquitto_loop_start作用是開啟一個線程,在線程里不停的調(diào)用 mosquitto_loop() 來處理網(wǎng)絡(luò)信息
    int loop = mosquitto_loop_start(mosq);
    if(loop != MOSQ_ERR_SUCCESS)
    {
       printf("mosquitto loop error\n");
       return 1;
    }

    while(fgets(buff, MSG_MAX_SIZE, stdin) != NULL)
    {
       /* 發(fā)布消息,這里是將fget獲取到的內(nèi)容,作為test主題的消息發(fā)布出去 */
       mosquitto_publish(mosq,NULL,"test",strlen(buff)+1,buff,0,0);
       memset(buff,0,sizeof(buff));
    }

    mosquitto_destroy(mosq);
    mosquitto_lib_cleanup();


    我們運行測試?yán)蹋l(fā)送主題為test的消息,消息內(nèi)容為emtronix,如下圖:

    image.png


    同時在另一個終端中運行訂閱消息的例程,訂閱主題為test的消息,當(dāng)發(fā)布了消息后,例程就會收到消息并打印出來:

    image.png


    感興趣的客戶可以和英創(chuàng)公司的工程師聯(lián)系,索取相關(guān)的資料和例程。



    日本尤物精品视频在线看| 亚洲精品无AMM毛片| 久久久久久九九精品久小说| 国产精品186在线观看在线播放| 久久这里只精品99re免费| 人人妻人人澡人人爽精品日本| 99re视频精品全部免费| 2021国产成人精品国产| 精品久久久久国产免费| 国产精品哟哟视频| 久久99精品九九九久久婷婷| 日韩精品一区二区三区四区| 91精品一区二区| 亚洲国产成人精品无码区花野真一| 久久精品女人天堂AV| 老司机福利精品视频| 奇米精品一区二区三区在| 久久精品国产999大香线焦| 久久久久久久精品成人热色戒 | 国产精品爱搞视频网站| 久久亚洲精品无码观看不卡| 久久精品99视频| 四虎亚洲精品高清在线观看 | 精品国产一区二区三区麻豆| 久久亚洲精品无码网站| 国产高清精品在线| 久久99久久99精品免观看| 免费精品国产自产拍在线观看图片| 国产精品亚洲片在线花蝴蝶| 任你躁在线精品免费| 91精品国产91久久久久久| 日韩精品久久不卡中文字幕| 国产在线精品一区二区不卡麻豆| 久久久无码人妻精品无码| 久久精品熟女亚洲av麻豆| 久久精品国产亚洲5555| 91精品视品在线播放| 国产精品亚洲一区二区三区 | 2020天堂在线亚洲精品专区| 国产三级久久精品三级| 亚洲中文字幕无码久久精品1|