激情综合丁香-激情综合六月-激情综合婷婷亚洲图片-激情综合图区-激情综合网五月

英創Linux主板支持MQTT應用

 2023-9-20     作者:黃志超     [nemail]    
[lablebox]

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


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

  1.png


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


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


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

命令

作用

systemctl disable mosquitto

關閉開機自啟動服務

systemctl enable mosquitto

開啟開機自啟動服務

systemctl stop mosquitto

停止服務

systemctl start mosquitto

啟動服務

systemctl restart mosquitto

重啟服務


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

image.png


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

image.png


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

image.png


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


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

// 初始化mosquitto庫  
ret = mosquitto_lib_init();  
if(ret){  
   printf("Init lib error!\n");  
   return -1;  
}  
 
// 創建一個訂閱端實例,名稱為sub_test  
mosq =  mosquitto_new("sub_test", true, NULL);  
if(mosq == NULL){  
   printf("New test error!\n");  
   mosquitto_lib_cleanup();  
   return -1;  
}  
 
// 設置回調函數,在connect的回調函數中設置訂閱的主題(test)  
mosquitto_connect_callback_set(mosq, my_connect_callback);  
// 設置回調函數,這里都是一些簡單的打印信息  
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服務器  
ret = mosquitto_connect(mosq, "localhost", 1883, KEEP_ALIVE);  
if(ret){  
   printf("Connect server error!\n");  
   mosquitto_destroy(mosq);  
   mosquitto_lib_cleanup();  
   return -1;  
}  
 
// 開始通信:循環執行、直到運行標志running被改變  
while(running)  
{  
   mosquitto_loop(mosq, -1, 1);  
}  
 
// 結束后的清理工作  
mosquitto_destroy(mosq);  
mosquitto_lib_cleanup();


發布消息例程的主要代碼如下:

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

//設置回調函數,這里都是簡單的打印信息
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服務器
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作用是開啟一個線程,在線程里不停的調用 mosquitto_loop() 來處理網絡信息
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)
{
   /* 發布消息,這里是將fget獲取到的內容,作為test主題的消息發布出去 */
   mosquitto_publish(mosq,NULL,"test",strlen(buff)+1,buff,0,0);
   memset(buff,0,sizeof(buff));
}

mosquitto_destroy(mosq);
mosquitto_lib_cleanup();


我們運行測試例程,發送主題為test的消息,消息內容為emtronix,如下圖:

image.png


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

image.png


感興趣的客戶可以和英創公司的工程師聯系,索取相關的資料和例程。



[lablebox]
主站蜘蛛池模板: 国产高清不卡一区二区三区| 夜夜综合| 亚洲第二区| 大尺度做爰床戏呻吟免费观| 国产1区2区三区不卡| 日本大片成人免费播放| 日韩系列在线| 黄色一级视频网| 成人精品福利| 69成人做爰视频在线观看| 国产午夜毛片一区二区三区| 国产乱人伦精品一区二区| 午夜激情福利在线| 亚洲ss| 婷婷黄色| 成熟自由日本语热亚洲人| 999热在线精品观看全部| 国产视频在线观看免费| 国产一级做a爰片久久毛片男| 日本高清在线3344www| 欧美在线观看免费一区视频 | 青草视频久久| 美国一级片在线| 亚洲美女一级毛片| 亚洲国产乱| 黄色视屏日本| 欧美一级爆毛片| 五十路一区二区三区视频| 欧美69视频在线| 国产精品手机视频一区二区| 亚洲精品欧美综合四区| 亚洲精品人成网在线播放蜜芽| 91丁香亚洲综合社区| 色综合久久中文| 一级中国毛片| 久久r精品| 国产在线91观看免费观看| 毛片视频网址| 亚洲国产成人久久| 黄色网页在线看| 亚洲夜色综合久久|