国产精品电影_久久视频免费_欧美日韩国产激情_成年人视频免费在线播放_日本久久亚洲电影_久久都是精品_66av99_九色精品美女在线_蜜臀a∨国产成人精品_冲田杏梨av在线_欧美精品在线一区二区三区_麻豆mv在线看

物聯網網關開發:基于MQTT消息總線的設計過程(下)

物聯網 物聯網應用
在上一篇文章中物聯網網關開發:基于MQTT消息總線的設計過程(上),我們聊了在一個物聯網系統的網關中,如何利用 MQTT 消息總線,在嵌入式系統內部實現多個進程之間的相互通信問題。

 一、前言

在上一篇文章中物聯網網關開發:基于MQTT消息總線的設計過程(上),我們聊了在一個物聯網系統的網關中,如何利用 MQTT 消息總線,在嵌入式系統內部實現多個進程之間的相互通信問題。

這個通信模型的最大幾個優點是:

  1. 模塊之間解耦合;
  2. 各模塊之間可以并行開發;
  3. 把 TCP 鏈接和粘包問題交給消息總線處理,我們只需要處理業務層的東西;
  4. 調試方便;

以上只是描述了在一個嵌入式系統內部,進程之間的通信方式,那么網關如何與云平臺進行交互呢?

在上一篇文章中已經提到過:網關與云平臺之間的通信方式一般都是客戶指定的,就那么幾種(阿里云、華為云、騰訊云、亞馬遜AWS平臺)。一般都要求網關與云平臺之間處于長連接的狀態,這樣云端的各種指令就可以隨時發送到網關。

這一篇文章,我們就來聊一聊這部分內容。

在公眾號回復:mqtt,獲取示例代碼的網盤地址。

二、與云平臺之間的 MQTT 連接

目前的幾大物聯網云平臺,都提供了不同的接入方式。對于網關來說,應用最多的就是 MQTT 接入。

我們知道,MQTT 只是一個協議而已,不同的編程語言中都有實現,在 C 語言中也有好幾個實現。

在網關內部,運行著一個后臺 deamon: MQTT Broker,其實就是 mosquitto 這個可執行程序,它充當著消息總線的功能。這里請大家注意:因為這個消息總線是運行在嵌入式系統的內部,接入總線的客戶端就是需要相互通信的那些進程。這些進程的數量是有限的,即使是一個比較復雜的系統,最多十幾個進程也就差不多了。因此,mosquitto 這個實現是完全可以支撐系統負載的。

那么,如果在云端部署一個 MQTT Broker,理論上是可以直接使用 mosquitto 這個實現來作為消息總線的,但是你要評估接入的客戶端(也就是網關)在一個什么樣的數量級,考慮到并發的問題,一定要做壓力測試。

對于后臺開發,我的經驗不多,不敢(也不能)多言,誤導大家就罪過了。不過,對于一般的學習和測試來說,在云端直接部署 mosquitto 作為消息總線,是沒有問題的。

三、Proc_Bridge 進程:外部和內部消息總線之間的橋接器

下面這張圖,說明了 Proc_Bridge 進程在這個模型中的作用:


  1. 從云平臺消息總線接收到的消息,需要轉發到內部的消息總線;
  2. 從內部消息總線接收到的消息,需要轉發到云平臺的消息總線;

如果用 mosquitto 來實現,應該如何來實現呢?

1. mosquitto 的 API 接口

mosquitto 這個實現是基于回調函數的機制來運行的,例如:

  1. // 連接成功時的回調函數 
  2. void my_connect_callback(struct mosquitto *mosq, void *obj, int rc) 
  3.     // ... 
  4.  
  5. // 連接失敗時的回調函數 
  6. void my_disconnect_callback(struct mosquitto *mosq, void *obj, int result) 
  7.     // ... 
  8.  
  9. // 接收到消息時的回調函數 
  10. void my_message_callback(struct mosquitto *mosq, void *obj, const struct mosquitto_message *message) 
  11.   // .. 
  12.  
  13. int main() 
  14.     // 其他代碼 
  15.     // ... 
  16.      
  17.     // 創建一個 mosquitto 對象 
  18.     struct mosquitto g_mosq = mosquitto_new("client_name"trueNULL); 
  19.      
  20.     // 注冊回調函數 
  21.     mosquitto_connect_callback_set(g_mosq, my_connect_callback); 
  22.     mosquitto_disconnect_callback_set(g_mosq, my_disconnect_callback); 
  23.     mosquitto_message_callback_set(g_mosq, my_message_callback); 
  24.     // 這里還有其他的回調函數設置 
  25.    
  26.     // 開始連接到消息總線 
  27.     mosquitto_connect(g_mosq, "127.0.0.1", 1883, 60); 
  28.    
  29.     while(1) 
  30.     { 
  31.       int rc = mosquitto_loop(g_mosq, -1, 1); 
  32.       if (rc) { 
  33.         printf("mqtt_portal: mosquitto_loop rc = %d \n", rc); 
  34.         sleep(1); 
  35.         mosquitto_reconnect(g_mosq); 
  36.       } 
  37.     } 
  38.     mosquitto_destroy(g_mosq); 
  39.     mosquitto_lib_cleanup(); 
  40.     return 0; 

以上代碼就是一個 mosquitto 客戶端的最簡代碼了,使用回調函數的機制,讓程序的開發非常簡單。

mosquitto 把底層的細節問題都幫助我們處理了,只要我們注冊的函數被調用了,就說明發生了我們感興趣的事件

這樣的回調機制在各種開源軟件中使用的比較多,比如:glib 里的定時器、libevent通訊處理libmodbus 里的數據處理、linux 內核中的驅動開發和定時器,都是這個套路,一通百通!

在網關中的每個進程,只需要添加上面這部分代碼,就可以掛載到消息總線上,從而可以與其它進程進行收發數據了。

2. 利用 UserData 指針,實現多個 MQTT 連接

上面的實例僅僅是連接到一個消息總線上,對于一個普通的進程來說,達到了通信的目的。

但是對于 Proc_Bridge 進程來說,還沒有達到目的,因為這個進程處于橋接的位置,需要同時連接到遠程和本地這兩個消息總線上。那么應該如何實現呢?

看一下 mosquitto_new 這個函數的簽名:

  1. /* 
  2.  * obj - A user pointer that will be passed as an argument to any 
  3.  *      callbacks that are specified. 
  4. */ 
  5. /* 
  6. 最后一個參數的作用是:可以設置一個用戶自己的數據(作為指針傳入),那么 
  7. mosquitto 在回調我們的注冊的任何一個函數時,都會把這個指針傳入。 
  8.  
  9. 因此,我們可以利用這個參數來區分這個連接是遠程連接?還是本地連接。 
  10. */ 
  11. libmosq_EXPORT struct mosquitto *mosquitto_new(const char *id, bool clean_session, void *obj); 

所以,我們可以定義一個結構體變量,把一個 MQTT 連接的所有信息都記錄在這里,然后注冊給 mosquitto。當 mosquitto 回調函數時,把這個結構體變量的指針回傳給我們,這樣就拿到了這個連接的所有數據,在某種程度上來說,這也是一種面向對象的思想。

  1. // 從來表示一個 MQTT 連接的結構體 
  2. typedef struct{ 
  3.   char *id; 
  4.   char *name
  5.   char *pw; 
  6.   char *host; 
  7.   int port; 
  8.   pthread_t tHandle; 
  9.   struct mosquitto *mosq; 
  10.   int mqtt_num; 
  11. }MQData; 

完整的代碼已經放到網盤里了,為了讓你先從原理上看明白,我把關鍵幾個地方的代碼貼在這里:

  1. // 分配結構體變量 
  2. MQData userData = (MQData *)malloc(sizeof(MQData)); 
  3.  
  4. // 設置屬于這里連接的參數: id, name 等等 
  5.  
  6. // 創建 mosquitto 對象時,傳入 userData。 
  7. struct mosquitto *mosq = mosquitto_new(userData->id, true, userData); 
  8.  
  9. // 在回調函數中,把 obj 指針前轉成 MQData 指針 
  10. static void messageCB(struct mosquitto *mosq, void *obj, const struct mosquitto_message *message) 
  11.   MQData *userData = (MQData *)obj; 
  12.    
  13.   // 此時就可以根據 userData 指針中的內容分辨出這是哪一個鏈接了 

另外一個問題:不知道你是否注意到示例中的 mosquitto_loop() 這個函數?這個函數需要放在 while 死循環中不停的調用,才能出發 mosuiqtto 內部的事件。(其實在 mosuiqtto 中,還提供了另一個簡化的函數 mosquitto_loop_forever)。

也就是說:在每個連接中,需要持續的觸發 mosquitto 底層的事件,才能讓消息系統順利的收發。因此,在示例代碼中,使用兩個線程分別連接到云平臺的總線和內部的總線。

四、總結

經過這兩篇文章,基本上把一個物聯網系統的網關中,最基本的通信模型聊完了,相當于是一個程序的骨架吧,剩下的事情就是處理業務層的細節問題了。

萬里長征,這才是第一步!

對于一個網關來說,還有其他更多的問題需要處理,比如:MQTT 連接的鑒權(用戶名+密碼,證書)、通信數據的序列化和反序列化、加密和解密等等,以后慢慢聊吧,希望我們一路前行!

 

責任編輯:姜華 來源: IOT物聯網小鎮
相關推薦

2021-02-21 08:31:45

物聯網MQTT消息

2019-12-27 10:42:45

HTTPMQTT物聯網

2023-01-31 15:35:46

物聯網邊緣計算工業物聯網

2021-09-07 05:52:26

物聯網網關工業物聯網物聯網

2022-01-08 21:49:00

物聯網網關PLC物聯網

2020-07-08 07:36:40

物聯網數據技術

2023-09-18 15:36:37

物聯網物聯網生態系統

2020-10-31 21:40:35

物聯網網關物聯網IOT

2020-10-11 17:01:18

物聯網網關工業物聯網物聯網

2022-11-02 10:59:34

2020-07-12 15:18:38

物聯網傳感器技術

2020-11-23 08:13:27

物聯網

2019-11-28 14:11:00

物聯網網關物聯網IOT

2014-10-29 10:33:46

物聯網

2021-12-02 18:18:21

消費網關工業物聯網網關物聯網

2023-09-19 16:10:28

2023-10-20 13:43:16

2019-09-10 13:39:38

物聯網網關物聯網IOT

2021-01-12 09:51:43

工業物聯網物聯網網關物聯網

2019-02-24 21:27:26

物聯網網關物聯網IOT
點贊
收藏

51CTO技術棧公眾號

国产午夜在线观看| 日韩国产欧美在线视频| 欧美激情视频一区二区| 欧美日韩黄色| 国产精品久久久久久av下载红粉| 亚洲色图二区| 亚洲五月六月| 91丨porny丨户外露出| 米奇在线777| 欧美高清性hdvideosex| 国产另类xxxxhd高清| 久久久久国产一区二区三区| 久久美女视频| 日韩福利视频| 久久久久久久久久电影| 未来日记在线观看| 亚洲第五色综合网| 日韩毛片免费看| 国产精品久久久久久久久久久久| 一区二区自拍| 美女黄色免费看| 亚洲视频在线观看三级| 午夜视频在线| 粗暴蹂躏中文一区二区三区| 亚洲影视一区二区三区| mm131午夜| 亚洲福利一区二区三区| 亚洲图区一区| 国内成人精品视频| 亚洲精品1区| 亚洲中文字幕久久精品无码喷水| 欧美亚洲综合在线| 久久99成人| 精品无人区一区二区三区| 91尤物视频在线观看| 狠狠色伊人亚洲综合网站l| 国产亚洲精品久久久久动| 国产不卡av一区二区| 亚洲高清资源综合久久精品| 成人免费小视频| 97在线视频免费观看完整版| 欧美有码在线观看| 另类中文字幕网| 欧美vide| 久久夜精品香蕉| 91av免费看| 欧美视频网站| 96久久精品| 黑人巨大精品欧美一区二区免费| 最新真实国产在线视频| 91麻豆精品国产综合久久久久久| 国产精品日本一区二区不卡视频| 成人在线观看91| 国产精品情趣视频| 日韩123区| 91在线观看欧美日韩| 久久久久99精品国产片| 成人av影院在线观看| 91亚洲精华国产精华| 你懂的视频在线一区二区| 成人午夜电影小说| 亚洲第一综合| 欧美mv日韩mv亚洲| 国产美女福利在线| 欧美一区二区三区……| 国产呦萝稀缺另类资源| 日韩黄色影片| 国内揄拍国内精品| 福利电影一区二区| 国产桃色电影在线播放| 2019国产精品视频| 一区二区三区四区激情| 日韩精品久久久久久久软件91| 亚洲精品日韩精品| 欧美日韩大陆一区二区| 你真棒插曲来救救我在线观看| 一区二区三区在线免费视频| 日本电影在线观看网站| 国产97在线|亚洲| 一区二区亚洲视频| 国产爆乳无码一区二区麻豆| 在线观看视频一区二区| 欧洲grand老妇人| 午夜免费高清视频| 日韩中文字幕国产| 激情五月激情综合网| 青草影视电视剧免费播放在线观看| 91九色在线观看| 色综合中文综合网| 亚洲国产网址| 久久久久久亚洲精品美女| 97国产精品视频| 国产精品久久久久久久久果冻传媒 | 日韩男人天堂| 亚洲日本一区二区| 国产精品欧美三级在线观看| 免费网站在线观看视频| 欧美性猛片aaaaaaa做受| 麻豆精品av| 国产91在线视频观看| 亚洲精品乱码久久久久久金桔影视| 欧美精品福利| 欧洲一级在线观看| 成人黄色av网站| 亚洲国产综合91精品麻豆| 四虎影视精品| 日本在线丨区| 成人高清免费在线| 欧美美女搞黄| 日韩少妇内射免费播放18禁裸乳| 国产精品日韩欧美| 欧美特级www| 91精品国产91久久久久久密臀| а√最新版地址在线天堂| 欧美劲爆第一页| 精品国产电影一区| 婷婷久久综合| 免费电影网站在线视频观看福利| 91在线观看免费| 欧洲美女免费图片一区| 精品视频在线看| 国产精品一区二区黑丝| 国产精品一区二区三区av| 成人欧美一区| 国产九九热视频| 一区二区三区国产福利| 国产精品久久久久久久久粉嫩av | 亚洲无线视频| 香港伦理在线| 97在线资源| 中文字幕免费在线| 国产精品第一| 爱看av在线入口| 成全视频全集| 日韩免费视频播放| 性视频一区二区三区| 一级一片免费播放| 国产无限制自拍| 欧洲亚洲一区| 欧美午夜理伦三级在线观看| 欧美性色综合网| 免费观看成人www动漫视频| 欧美年轻男男videosbes| 中文字幕一区二区三区四区不卡| 最新欧美人z0oozo0| 99精品电影| 国产精品一线天粉嫩av| 国产网红女主播精品视频| 97在线观看免费观看高清| 国内在线高清免费视频| 噜噜噜久久亚洲精品国产品麻豆| 97自拍视频| 国产精品久久久久秋霞鲁丝| 国产69精品久久久久久| 57pao成人国产永久免费| 亚洲xxxxx| 欧美一级黄色网| 日韩av电影手机在线| 欧美大秀在线观看| 日韩精品一区二区三区在线 | 久久午夜精品一区二区| 欧美精品国产| 99在线精品免费视频九九视| 国产精品多人| 久久草av在线| 中文字幕 久热精品 视频在线| 亚洲午夜激情网站| 精品国产露脸精彩对白| 一本一道久久a久久精品逆3p| 欧美成人国产一区二区| 亚洲精品国精品久久99热一| 中文字幕免费精品一区| 亚洲自拍偷拍第一页| 欧美一级视频免费在线观看| 国产精品三上| 欧美大胆在线视频| 欧美一级视频免费在线观看| 国产精品一区二区av| 成人av小说网| 日韩免费精品| 成人av在线影院| 国产一区二区三区免费视频| 日韩精品一区二区三区电影| 成人在线免费公开观看视频| 国产综合色区在线观看| 在线看片不卡| 美女视频网站久久| 欧美午夜www高清视频| 久久五月天综合| 国产天堂视频在线观看| 激情在线小视频| 国产尤物精品| 中文字幕一区二区三区在线不卡| 日本精品一区二区三区在线| 草碰在线视频| 91美女在线视频| 午夜精品一区二区三区av| 国产一区电影| 91婷婷韩国欧美一区二区| 91在线观看免费高清完整版在线观看 |