最美情侣中文字幕电影,在线麻豆精品传媒,在线网站高清黄,久久黄色视频

歡迎光臨散文網(wǎng) 會(huì)員登陸 & 注冊(cè)

利用消息隊(duì)列遙測(cè)傳輸?shù)腜C與開(kāi)發(fā)板的控制交互

2023-04-19 00:44 作者:17投47中  | 我要投稿

消息隊(duì)列遙測(cè)傳輸即MQTT,這是廣泛應(yīng)用于物聯(lián)網(wǎng)領(lǐng)域的一種基于發(fā)布-訂閱范式的消息協(xié)議。關(guān)于該協(xié)議的理論有較多的資料闡述解釋,可以廣泛參考借鑒,我們重點(diǎn)聚焦如何應(yīng)用?,F(xiàn)在給出一個(gè)很簡(jiǎn)單的場(chǎng)景,要通過(guò)PC監(jiān)測(cè)一個(gè)嵌入式設(shè)備上芯片的溫度,當(dāng)溫度處于正常范圍時(shí)PC控制設(shè)備上的指示燈不亮,溫度過(guò)高時(shí)控制其長(zhǎng)亮,溫度過(guò)低時(shí)控制使其閃爍。由于測(cè)試環(huán)境下無(wú)法真實(shí)模擬這樣的場(chǎng)景,則將其進(jìn)一步簡(jiǎn)化,設(shè)備定時(shí)給PC報(bào)告芯片溫度,PC自由控制設(shè)備上的LED燈的亮滅閃爍。如何做到?

首先要明白MQTT不是在兩個(gè)對(duì)象之間直接傳遞消息,而是通過(guò)服務(wù)器的中轉(zhuǎn)、分發(fā),實(shí)現(xiàn)從設(shè)備A到設(shè)備B的消息傳輸,這里A和B都是MQTT客戶端。其次MQTT的核心思想是“發(fā)布、訂閱”和“主題”,發(fā)布的是屬于某個(gè)主題的消息,訂閱的也是某個(gè)主題的消息。簡(jiǎn)單類(lèi)比一下,你在淘寶買(mǎi)了件商品,商品的物流信息就是一個(gè)“主題”,你作為一個(gè)“客戶端”“訂閱”了這個(gè)“主題”。而售賣(mài)這個(gè)商品的商家是另外一個(gè)“客戶端”,它負(fù)責(zé)往這個(gè)“主題”上“發(fā)布”該商品的物流運(yùn)輸信息。淘寶平臺(tái)就相當(dāng)于服務(wù)端,它將中轉(zhuǎn)物流運(yùn)輸信息并發(fā)送到你手機(jī)上,你這個(gè)客戶端就能收到相關(guān)消息了。在此過(guò)程中你和商家并未直接聯(lián)系,而是使用了類(lèi)似MQTT的機(jī)制取得消息。所以針對(duì)最開(kāi)始說(shuō)的這個(gè)場(chǎng)景,應(yīng)該先確定誰(shuí)要發(fā)什么消息,誰(shuí)要收什么消息,消息的主題有哪些。顯然,我們發(fā)現(xiàn)消息一共就兩種,一是“芯片溫度報(bào)告”,這個(gè)是設(shè)備來(lái)發(fā)布、PC來(lái)訂閱,二是“LED狀態(tài)控制”,設(shè)備訂閱、PC發(fā)布。我們這里用一塊以IMX6ULL為核心芯片的開(kāi)發(fā)板來(lái)作為設(shè)備,它上面自帶了一顆可以自由控制的LED。

顯然在這個(gè)場(chǎng)景中,PC和開(kāi)發(fā)板是兩個(gè)client,那什么是server?實(shí)際上有一些專門(mén)作為MQTT server的地址,例如tcp://mq.tongxinmao.com:18830,它還自帶了可應(yīng)用于windows的MQTT桌面客戶端,所以PC側(cè)的客戶端問(wèn)題也就解決了。那開(kāi)發(fā)板client如何解決?這就需要我們借助MQTT開(kāi)源庫(kù)來(lái)開(kāi)發(fā)自己的客戶端了。MQTT官網(wǎng)就有適用于多種語(yǔ)言的開(kāi)源庫(kù)的源碼可供下載使用,我們選擇Paho C,下載完經(jīng)過(guò)編譯得到將來(lái)開(kāi)發(fā)所需的庫(kù)文件:

我們只實(shí)現(xiàn)能夠使一個(gè)客戶端正常工作的基本操作。Paho庫(kù)提供了一系列可供應(yīng)用程序調(diào)用的API,其中與client相關(guān)的必要接口聲明在頭文件MQTTClient.h中,每個(gè)數(shù)據(jù)結(jié)構(gòu)和接口都配有相當(dāng)詳細(xì)的說(shuō)明描述,基本都是一看便能明白其中的含義。想要使用客戶端必須先創(chuàng)建一個(gè)MQTTClient對(duì)象,其對(duì)應(yīng)的接口如下。其第一個(gè)參數(shù)就是一個(gè)用void*表示的client句柄,第二個(gè)參數(shù)是服務(wù)端的地址,MQTTClient.h規(guī)定了它的正確格式,第三個(gè)參數(shù)是client標(biāo)識(shí),每個(gè)想要連接到server的client必須提供一個(gè)獨(dú)特的標(biāo)識(shí),如果標(biāo)識(shí)有重復(fù),則server按照同一個(gè)client處理。建立client成功后,如果本client要接收消息,則必須設(shè)置相關(guān)的回調(diào)函數(shù),一般最多可以設(shè)置三中回調(diào),包括連接丟失callback、接收消息callback及發(fā)送消息callback,它們分別用于處理client與server連接斷開(kāi)、收到server分發(fā)的消息及成功發(fā)送消息的后續(xù)動(dòng)作。對(duì)于一個(gè)要接收消息的client,設(shè)置接收callback必不可少。然后client調(diào)用MQTTClient_connect向server發(fā)起連接,在調(diào)用它之前需要設(shè)置連接選項(xiàng),這個(gè)數(shù)據(jù)結(jié)構(gòu)規(guī)定了MQTT消息傳輸中的關(guān)鍵參數(shù),例如心跳間隔、是否清除會(huì)話、是否可靠連接、用戶名密碼等等。一旦連接成功了,client就可以開(kāi)始往某個(gè)主題發(fā)布消息,訂閱了該主題的client就會(huì)收到,或者訂閱某個(gè)主題,之后有其它c(diǎn)lient給相同主題發(fā)消息時(shí),這邊就可以收到。相關(guān)的接口均在頭文件中有詳細(xì)說(shuō)明。

在本例中,如前所述可以規(guī)定PC與開(kāi)發(fā)板交互的消息主題如下:

MQTT規(guī)定消息的主題都是字符串形式,PC發(fā)布亮燈控制消息到fuyumeng/led_control,正常情況下開(kāi)發(fā)板將收到指令,執(zhí)行點(diǎn)燈操作。開(kāi)發(fā)板周期性發(fā)布當(dāng)前的芯片溫度到fuyumeng/temperature_notify,正常情況下PC的MQTT客戶端就會(huì)周期性獲知芯片溫度。LED的控制直接通過(guò)操作/sys/class/led目錄下設(shè)備的屬性完成,可實(shí)現(xiàn)亮、滅和閃爍。芯片溫度則可通過(guò)直接讀取/sys/class/thermal/thermal_zone0/temp屬性值獲得。對(duì)開(kāi)發(fā)板而言,使其成為一個(gè)可用的client的主要配置流程為:

對(duì)應(yīng)于這個(gè)流程的開(kāi)發(fā)板client主要代碼如下:

主函數(shù)中開(kāi)發(fā)板每隔10s讀取一次芯片溫度并發(fā)布,PC理應(yīng)也以10s為周期收到這個(gè)消息。接收回調(diào)中根據(jù)收到的指令執(zhí)行相應(yīng)的LED操作。編譯該程序并將可執(zhí)行文件載入開(kāi)發(fā)板并啟動(dòng)該進(jìn)程,正常情況下開(kāi)發(fā)板client就已經(jīng)生效了。PC側(cè)的客戶端可以直接使用mq.tongxinmao.com提供的windows客戶端exe如下:

點(diǎn)擊啟用連接到server,然后訂閱主題就可以看到exe中持續(xù)收到的芯片溫度信息了,看時(shí)間間隔基本上是10s:

這里收到的數(shù)據(jù)是原始讀數(shù)并未進(jìn)行轉(zhuǎn)換處理。PC側(cè)在接收的同時(shí),可以發(fā)送不同的LED命令給開(kāi)發(fā)板,這時(shí)可以看到開(kāi)發(fā)板側(cè)進(jìn)程收到了消息,同時(shí)可以看到開(kāi)發(fā)板上的LED按照要求動(dòng)作:


利用消息隊(duì)列遙測(cè)傳輸?shù)腜C與開(kāi)發(fā)板的控制交互的評(píng)論 (共 條)

分享到微博請(qǐng)遵守國(guó)家法律
济南市| 聂拉木县| 清新县| 锦屏县| 庆元县| 邹城市| 绥中县| 兴化市| 博白县| 德惠市| 青浦区| 于田县| 宁强县| 苍梧县| 雅江县| 灵宝市| 株洲县| 肥乡县| 辽宁省| 涡阳县| 黑河市| 天长市| 宣化县| 元朗区| 崇州市| 汪清县| 九龙坡区| 澄城县| 垦利县| 射洪县| 太仓市| 桐乡市| 屯昌县| 普兰店市| 始兴县| 津南区| 闽侯县| 阿巴嘎旗| 噶尔县| 潜江市| 会理县|