#概述
本文旨在幫助已經(jīng)購買RAK商業(yè)網(wǎng)關(guān)產(chǎn)品并且使用內(nèi)置LoRa Server功能的用戶,了解如何通過MQTT訂閱商業(yè)網(wǎng)關(guān)內(nèi)置LoRa Server的數(shù)據(jù),使用戶了解商業(yè)網(wǎng)關(guān)的工作原理,方便用戶在自己的應(yīng)用服務(wù)器獲取節(jié)點(diǎn)數(shù)據(jù),達(dá)到便捷使用應(yīng)用服務(wù)器完成數(shù)據(jù)展示和數(shù)據(jù)分析的目的。
本文將以RAK公司的商業(yè)網(wǎng)關(guān)產(chǎn)品(室內(nèi)網(wǎng)關(guān)RAK7258或室外網(wǎng)關(guān)RAK7249)為例,介紹如何配置商業(yè)網(wǎng)關(guān)使用內(nèi)置MQTT服務(wù)器和私有(外置)MQTT服務(wù)器,以及如何訂閱節(jié)點(diǎn)數(shù)據(jù)和向節(jié)點(diǎn)發(fā)送數(shù)據(jù)等。
#LoRaWAN和MQTT簡介
本章節(jié)介紹LoRaWAN網(wǎng)絡(luò)和MQTT網(wǎng)絡(luò),用于幫助用戶對(duì)LoRaWAN和MQTT的工作原理有一個(gè)簡單直觀的了解。如果您已經(jīng)熟悉了LoRaWAN和MQTT的工作原理,可跳過此章節(jié)。
#LoRaWAN簡介
Figure 1: LoRaWAN網(wǎng)絡(luò)包含的角色從上圖可以看出,LoRaWAN網(wǎng)絡(luò)包括如下3個(gè)角色,各個(gè)角色的作用如下所示:
- 終端設(shè)備(End Nodes):即節(jié)點(diǎn)設(shè)備,負(fù)責(zé)數(shù)據(jù)采集,并將數(shù)據(jù)加密后以無線信號(hào)的形式傳遞給網(wǎng)關(guān)。
- 網(wǎng)關(guān)(Concentrator/Gateway):將終端發(fā)送的數(shù)據(jù)透?jìng)鹘oNS服務(wù)器。
- NS服務(wù)器(Network Server):根據(jù)數(shù)據(jù)身份信息、密鑰對(duì)網(wǎng)關(guān)轉(zhuǎn)發(fā)的數(shù)據(jù)進(jìn)行解密、處理。
RAK簡化LoRaWAN實(shí)際部署條件,RAK商業(yè)網(wǎng)關(guān)集成了NS服務(wù)器,它配合節(jié)點(diǎn)可以輕松搭建LoRaWAN網(wǎng)絡(luò)。
#MQTT簡介
MQTT代表MQ遙測(cè)傳輸,是一種發(fā)布/訂閱極其簡單和輕量級(jí)的消息傳遞協(xié)議,用于受限設(shè)備和低帶寬、高延遲或不可靠的網(wǎng)絡(luò)。設(shè)計(jì)原則是使網(wǎng)絡(luò)帶寬和設(shè)備資源要求最小化以及確??煽啃浴_@些原則使該協(xié)議成為物聯(lián)網(wǎng)世界的理想選擇。
Figure 2: MQTT網(wǎng)絡(luò)角色如上圖所示,MQTT網(wǎng)絡(luò)角色包括如下3個(gè),各個(gè)角色的作用如下所示:
- 發(fā)布者(Publisher):發(fā)布信息。
- 訂閱者(Subscriber):收集發(fā)布者發(fā)布的信息。
- MQTT Broker:接收發(fā)布信息并將信息向訂閱者進(jìn)行展示。
MQTT Broker同比是新聞發(fā)布網(wǎng)站,發(fā)布者是新聞發(fā)布成員,訂閱者是瀏覽、查看新聞的用戶。
#MQTT在LoRaWAN網(wǎng)絡(luò)中的作用
Figure 3: MQTT在LoRaWAN網(wǎng)絡(luò)中的作用實(shí)際應(yīng)用1:使用RAK商業(yè)網(wǎng)關(guān)內(nèi)置的MQTT Broker功能。
RAK商業(yè)網(wǎng)關(guān)獲取數(shù)據(jù)并發(fā)送給內(nèi)置NS,內(nèi)置NS將數(shù)據(jù)發(fā)布至內(nèi)置的MQTT Broker,用戶通過第三方程序訂閱數(shù)據(jù)。這種應(yīng)用情況下,RAK商業(yè)網(wǎng)關(guān)既是發(fā)布者,又是MQTT Broker。
注意:
- 如果使用網(wǎng)關(guān)內(nèi)置的MQTT Broker,則無法通過公網(wǎng)訂閱或發(fā)布數(shù)據(jù)。
- 網(wǎng)關(guān)內(nèi)置的MQTT Broker僅適用于項(xiàng)目研發(fā)和測(cè)試階段,由于內(nèi)置的MQTT Broker沒有密碼、證書等驗(yàn)證方式,容易被其他人竊取傳感器數(shù)據(jù),因此,不建議在生產(chǎn)部署時(shí)使用。
實(shí)際應(yīng)用2:使用用戶私有的MQTT Broker功能。
RAK商業(yè)網(wǎng)關(guān)獲取數(shù)據(jù)并發(fā)送給內(nèi)置NS,內(nèi)置NS將數(shù)據(jù)發(fā)布至第三方MQTT Broker,用戶通過第三方程序訂閱數(shù)據(jù)。這種應(yīng)用情況下,RAK商業(yè)網(wǎng)關(guān)僅為發(fā)布者。
#訂閱節(jié)點(diǎn)數(shù)據(jù)和向節(jié)點(diǎn)發(fā)送數(shù)據(jù)
本節(jié)以RAK商業(yè)網(wǎng)關(guān)為例,介紹如何通過MQTT.fx工具訂閱節(jié)點(diǎn)上報(bào)的數(shù)據(jù)和向節(jié)點(diǎn)發(fā)送數(shù)據(jù)。您可以通過單擊MQTT.fx下載MQTT.fx工具(MQTT客戶端)。
#配置商業(yè)網(wǎng)關(guān)使用內(nèi)置服務(wù)器
1、在瀏覽器地址欄中輸入商業(yè)網(wǎng)關(guān)的IP地址192.168.230.1,按"Enter",進(jìn)入如下界面。
Figure 4: 商業(yè)網(wǎng)關(guān)登錄界面2、在打開的商業(yè)網(wǎng)關(guān)登錄界面中輸入用戶名和密碼,單擊"Login"。
默認(rèn)用戶名和密碼都為root。
3、在左側(cè)導(dǎo)航欄中選擇“LoRa Network > Network Settings”。
4、在“LoRaWAN Network Settings”界面上,設(shè)置"Mode"為"Network Server"模式。
Figure 5: 配置RAK7249使用內(nèi)置服務(wù)器5、單擊“Switch mode”切換模式。
約15秒左右,網(wǎng)關(guān)即可切換為Network Server模式。在該模式下,商業(yè)網(wǎng)關(guān)既是網(wǎng)關(guān),又是NS服務(wù)器。
#添加節(jié)點(diǎn)到商業(yè)網(wǎng)關(guān)的內(nèi)置服務(wù)器
1、在商業(yè)網(wǎng)關(guān)左側(cè)導(dǎo)航欄中選擇“LoRa Network > Application”,進(jìn)入應(yīng)用概覽頁面。
2、輸入應(yīng)用名稱,單擊“Add”,如下圖所示。
注意:
本示例采用"Type1 : Unified Application Key",即同一Application中,所有節(jié)點(diǎn)設(shè)備使用相同的Application Key。不需要單獨(dú)為設(shè)備設(shè)置Application Key。支持通過OTAA自動(dòng)添加設(shè)備。如果您想使用“Type2 : Separate Application Key”,請(qǐng)參考Web 平臺(tái)配置指南。
Figure 6: 新增應(yīng)用在應(yīng)用配置頁面根據(jù)頁面提示配置應(yīng)用信息,如下圖所示。
Figure 7: 配置應(yīng)用- Name:應(yīng)用名稱,用戶自定義。
- Auto Add LoRa Device:是否開啟自動(dòng)添加設(shè)備。開啟后,如果設(shè)備的Application Key與Application EUI通過身份驗(yàn)證,設(shè)備將被自動(dòng)添加到服務(wù)器上。
- Application EUI:標(biāo)識(shí)唯一的應(yīng)用提供者,開啟自動(dòng)添加設(shè)備后需要填寫。單擊讓系統(tǒng)自動(dòng)生成Application EUI。需與節(jié)點(diǎn)設(shè)備三元組信息中的“AppEUI”保持一致。
- Application Key:由應(yīng)用程序擁有者分配給終端。單擊讓系統(tǒng)自動(dòng)生成Application Key。需與節(jié)點(diǎn)設(shè)備三元組信息中的“AppKey”保持一致。
- Description:應(yīng)用描述信息,用戶自定義。
注意:您也可以使用Micro USB線連接節(jié)點(diǎn)設(shè)備到PC,后使用串口工具打開相應(yīng)端口分別發(fā)送AT+APPEUI
和AT+APPKEY
獲取Application EUI和Application Key的值后填寫到此處,可省去后續(xù)配置節(jié)點(diǎn)的步驟。本示例采用系統(tǒng)自動(dòng)生成的方法。
4、單擊"Save & Apply"保存配置。
5、在系統(tǒng)自動(dòng)返回的應(yīng)用概覽頁面,單擊"Edit"進(jìn)入應(yīng)用配置頁面添加節(jié)點(diǎn)。
Figure 8: 應(yīng)用概覽頁面6、輸入節(jié)點(diǎn)的Device EUI后,單擊“Add”,如下圖所示。Device EUI可在節(jié)點(diǎn)設(shè)備的標(biāo)簽上獲取,也可使用Micro USB線連接節(jié)點(diǎn)設(shè)備到PC,后使用串口工具打開相應(yīng)端口發(fā)送AT+DEVEUI
進(jìn)行查詢。
7、在節(jié)點(diǎn)配置頁面配置節(jié)點(diǎn)設(shè)備信息,如下圖所示。
Figure 10: 配置節(jié)點(diǎn)設(shè)備信息- Device name:節(jié)點(diǎn)設(shè)備名稱,用戶自定義。
- Class:節(jié)點(diǎn)設(shè)備類型,需與節(jié)點(diǎn)保持一致。這里以節(jié)點(diǎn)出廠默認(rèn)配置Class A為例。
- Join mode:節(jié)點(diǎn)設(shè)備的入網(wǎng)方式,需與節(jié)點(diǎn)保持一致。這里以節(jié)點(diǎn)設(shè)備出廠默認(rèn)配置OTAA為例。
- Frame-counter Width:報(bào)文序號(hào)計(jì)數(shù)器長度。
- LoRaWAN MAC Version:LoRaWAN協(xié)議版本號(hào)。
- LoRaWAN Regional Parameters Reversion:LoRaWAN區(qū)域參數(shù)版本號(hào)。
- Enable LPTP:是否開啟LPTP協(xié)議。LPTP協(xié)議是RAK自定義的LoRa?報(bào)文分片/重組協(xié)議,僅部分RAK節(jié)點(diǎn)產(chǎn)品(RAK7421、RAK7431及RAK4203)支持。
- Description:節(jié)點(diǎn)的描述信息,用戶自定義。
8、單擊"Save & Apply"保存配置。
#使用商業(yè)網(wǎng)關(guān)內(nèi)置的MQTT Broker
用戶可通過商業(yè)網(wǎng)關(guān)內(nèi)置的Application Server Integration功能使用MQTT客戶端訂閱NS Topic消息來獲取節(jié)點(diǎn)數(shù)據(jù),也可以使用MQTT客戶端向節(jié)點(diǎn)發(fā)送數(shù)據(jù)。
#配置商業(yè)網(wǎng)關(guān)使用內(nèi)置的MQTT Broker
1、在商業(yè)網(wǎng)關(guān)左側(cè)導(dǎo)航欄中選擇"LoRa Network > Global Integration"。
2、在"Application Server Integration"頁面上,設(shè)置應(yīng)用服務(wù)器集成的相關(guān)參數(shù)。
如果使用內(nèi)置的MQTT Broker,則“MQTT Broker Address”和“MQTT Broker Port”參數(shù)的值保持默認(rèn)即可。如果您不了解MQTT協(xié)議的topic,建議保持MQTT topic相關(guān)參數(shù)的默認(rèn)配置。此處使用內(nèi)置的MQTT Broker,全部參數(shù)保持默認(rèn)配置,如下圖所示。
Figure 11: 配置商業(yè)網(wǎng)關(guān)使用內(nèi)置的MQTT Broker3、單擊"Save & Apply"保存配置。
#通過MQTT.fx客戶端訂閱節(jié)點(diǎn)數(shù)據(jù)
1、打開MQTT.fx工具,主界面如下圖所示。
Figure 12: MQTT.fx工具主界面2、單擊左上角的新建圖標(biāo),如下圖所示。
Figure 13: 新建圖標(biāo)3、在下圖中紅框處輸入網(wǎng)關(guān)的IP地址。
Figure 14: 輸入網(wǎng)關(guān)的IP地址4、單擊“Connect”。最右側(cè)的黑色圓形變成綠色,說明已經(jīng)成功連接到網(wǎng)關(guān)內(nèi)置的MQTT Broker。
Figure 15: 成功連接到網(wǎng)關(guān)內(nèi)置的MQTT Broker5、選擇“Subscribe”頁簽。
6、在“Subscribe”頁簽的輸入框中輸入待訂閱的topic,單擊輸入框右側(cè)的“Subscribe”。
輸入待訂閱的topic時(shí),topic的格式應(yīng)該與商業(yè)網(wǎng)關(guān)"Application Server Integration"頁面上Uplink Topic的格式保持一致,如下圖所示,其中,application_ID需要替換成實(shí)際的application ID的值,device_EUI需要替換成節(jié)點(diǎn)的device_EUI的值。
Figure 16: Uplink Topic參數(shù)application ID的值和device_EUI的值請(qǐng)參考下面兩個(gè)圖來獲取。
Figure 17: 獲取application IDFigure 18: 獲取device_EUI
以上面兩個(gè)圖中獲取的application ID和device_EUI的值為例,則需要在輸入框中輸入的topic為:application/2/device/00d939567c667e1e/rx,如下圖所示。
· 如果要訂閱一個(gè)應(yīng)用下的所有節(jié)點(diǎn)數(shù)據(jù),例如:要訂閱應(yīng)用2下的所有節(jié)點(diǎn)數(shù)據(jù),則需要輸入如下topic:
application/2/device/+/rx
· 如果要訂閱所有應(yīng)用下的所有節(jié)點(diǎn)數(shù)據(jù),則需要輸入如下topic:
application/+/device/+/rx
7、使用節(jié)點(diǎn)成功join之后發(fā)送一條數(shù)據(jù)。例如:要在節(jié)點(diǎn)側(cè)發(fā)送一條“HelloRakwireless”,因?yàn)楣?jié)點(diǎn)需要接收16進(jìn)制的數(shù)據(jù),將“Hello Rakwireless”轉(zhuǎn)換為16進(jìn)制,即“48656c6c6f52616b776972656c657373”,則發(fā)送的AT命令如下圖所示。
Figure 20: 在節(jié)點(diǎn)側(cè)發(fā)送數(shù)據(jù)示例8、在MQTT.fx界面上查看已訂閱的節(jié)點(diǎn)數(shù)據(jù),如下圖所示。
Figure 21: 在MQTT.fx界面上查看已訂閱的節(jié)點(diǎn)數(shù)據(jù)上圖中"data"字段的值即為節(jié)點(diǎn)發(fā)送的數(shù)據(jù),只是這些數(shù)據(jù)進(jìn)行了base64編碼,對(duì)"data"字段的值進(jìn)行base64解碼后即可看到原始數(shù)據(jù)。
9、查看商業(yè)網(wǎng)關(guān)web管理界面上節(jié)點(diǎn)發(fā)送的數(shù)據(jù)是否與MQTT.fx界面上一致。
Figure 22: 查看商業(yè)網(wǎng)關(guān)web管理界面#通過MQTT.fx客戶端向節(jié)點(diǎn)發(fā)送數(shù)據(jù)
1、在MQTT.fx工具的主界面上,選擇“Publish”頁簽。
2、在“Publish”頁簽的輸入框2中輸入topic,在輸入框3中輸入{"confirmed": true,"data": "SGVsbG8=","fPort":10},單擊“Publish”。
注意:
{"confirmed": true,"data": "SGVsbG8=","fPort": 10}中字段的說明如下所示:
"confirmed"的取值包括true和false。
"data"的取值即要發(fā)送的數(shù)據(jù),需要對(duì)數(shù)據(jù)進(jìn)行base64編碼。
"fPort"的取值即要發(fā)送的端口號(hào),有效端口號(hào)為1~255。
輸入topic時(shí),topic的格式應(yīng)該與商業(yè)網(wǎng)關(guān)"Application Server Integration"頁面上Downlink Topic的格式保持一致,如下圖所示,其中,application_ID需要替換成實(shí)際的application ID的值,device_EUI需要替換成節(jié)點(diǎn)的device_EUI的值。
Figure 23: Downlink Topic參數(shù)application ID的值和device_EUI的值請(qǐng)參考下面兩個(gè)圖來獲取。
Figure 24: 獲取application IDFigure 25: 獲取device_EUI以上面兩個(gè)圖中獲取的application ID和device_EUI的值為例,則需要在輸入框2中輸入的topic為:application/2/device/00d939567c667e1e/tx,如下圖所示。
Figure 26: 通過MQTT.fx向節(jié)點(diǎn)發(fā)送數(shù)據(jù)注意:
通過MQTT.fx客戶端向節(jié)點(diǎn)發(fā)送數(shù)據(jù)后,Class C模式下節(jié)點(diǎn)會(huì)立刻收到MQTT.fx下發(fā)的數(shù)據(jù),Class A模式下節(jié)點(diǎn)會(huì)在下一次上發(fā)數(shù)據(jù)之后收到MQTT.fx下發(fā)的數(shù)據(jù)。
3、在節(jié)點(diǎn)端查看接收到的數(shù)據(jù),如下圖所示。
Figure 27: 查看節(jié)點(diǎn)端接收到的數(shù)據(jù)#使用用戶私有的MQTT Broker
本節(jié)介紹在商業(yè)網(wǎng)關(guān)上配置用戶私有的MQTT Broker信息、連接MQTT客戶端與用戶私有的MQTT Broker、通過MQTT客戶端訂閱節(jié)點(diǎn)數(shù)據(jù)和通過MQTT客戶端向節(jié)點(diǎn)發(fā)送數(shù)據(jù)的具體方法。
#配置商業(yè)網(wǎng)關(guān)使用用戶私有的MQTT Broker
1、在商業(yè)網(wǎng)關(guān)左側(cè)導(dǎo)航欄中選擇"LoRa Network > Global Integration"。
2、在"Application Server Integration"頁面上,設(shè)置應(yīng)用服務(wù)器集成的相關(guān)參數(shù)。
如果要使用用戶私有的MQTT Broker,則需要配置如下參數(shù)。
- MQTT Broker Address:用戶私有的MQTT服務(wù)器的IP地址。
- MQTT Broker Port:MQTT服務(wù)器的端口號(hào),默認(rèn)端口號(hào)為1883。
- Enable User Authentication:打開用戶認(rèn)證開關(guān)。
- Username:訪問MQTT服務(wù)器的用戶名。
- Password:訪問MQTT服務(wù)器的用戶密碼。
如果您不了解MQTT協(xié)議的topic,建議保持MQTT topic相關(guān)參數(shù)的默認(rèn)配置。
此處使用用戶私有的MQTT Broker且保持MQTT topic相關(guān)參數(shù)的默認(rèn)配置,如下圖所示。
Figure 28: 配置商業(yè)網(wǎng)關(guān)使用用戶私有的MQTT Broker3、單擊"Save & Apply"保存配置。
#連接MQTT.fx客戶端至用戶私有的MQTT Broker
1、打開MQTT.fx。
2、單擊設(shè)置圖標(biāo),如下圖所示。
Figure 29: 設(shè)置圖標(biāo)系統(tǒng)彈出“Edit Connection Profiles”對(duì)話框。
3、在“Edit Connection Profiles”對(duì)話框中,單擊左下角的+。
4、設(shè)置“Profile Name”、“Broker Address”、"Broker Port",單擊“User Credentials”,輸入“User Name”和“Password”,如下圖所示。
Figure 30: 新建Profile并配置參數(shù)5、單擊右下角的“OK”。
6、“Edit Connection Profiles”對(duì)話框自動(dòng)關(guān)閉,MQTT.fx主界面中已自動(dòng)選擇了剛創(chuàng)建的Profile。
7、在MQTT.fx主界面中單擊“Connect”。最右側(cè)的黑色圓形變成綠色,說明已經(jīng)成功連接到用戶私有的MQTT Broker。
#通過MQTT.fx客戶端訂閱節(jié)點(diǎn)數(shù)據(jù)
具體方法請(qǐng)參考通過MQTT.fx客戶端訂閱節(jié)點(diǎn)信息。
#通過MQTT.fx客戶端向節(jié)點(diǎn)發(fā)送數(shù)據(jù)
具體方法請(qǐng)參考通過MQTT.fx客戶端向節(jié)點(diǎn)發(fā)送數(shù)據(jù)。
前面章節(jié)介紹了通過MQTT如何訂閱節(jié)點(diǎn)的上行數(shù)據(jù)Uplink以及如何向節(jié)點(diǎn)下發(fā)數(shù)據(jù)Downlink,節(jié)點(diǎn)還有其他三種類型的數(shù)據(jù),分別是Join、Ack和Status。其中Join是節(jié)點(diǎn)入網(wǎng)時(shí)的信息,Ack是向節(jié)點(diǎn)下發(fā)數(shù)據(jù)之后節(jié)點(diǎn)回復(fù)的確認(rèn)信息,Status是節(jié)點(diǎn)的電池電量信息。
下面將分別介紹這五種數(shù)據(jù)的具體格式和含義。
#Uplink
{
"applicationID": "1", // 節(jié)點(diǎn)所屬應(yīng)用的id
"applicationName": "test-app", // 節(jié)點(diǎn)所屬應(yīng)用的名稱
"devEUI": "3637343457387e11", // 節(jié)點(diǎn)的devEUI
"deviceName": "dev-5205", // 節(jié)點(diǎn)名稱
"timestamp": 1592730721, // 接收到節(jié)點(diǎn)數(shù)據(jù)的Unix時(shí)間戳
"fCnt": 6,
"fPort": 2,
"data": "AQIDBA==", // base64編碼后的數(shù)據(jù),解碼之后就是節(jié)點(diǎn)實(shí)際上發(fā)的數(shù)據(jù)
"data_encode": "base64", // 數(shù)據(jù)的編碼類型
"adr": true, // 節(jié)點(diǎn)是否開啟了adr
"rxInfo": [ // 所有接收到節(jié)點(diǎn)數(shù)據(jù)的網(wǎng)關(guān)信息
? {
? "gatewayID": "d896e0fff010611e", // 網(wǎng)關(guān)的gateway_id
? "loRaSNR": 13.3, // 當(dāng)前網(wǎng)關(guān)的信噪比
? "rssi": -71, // 當(dāng)前網(wǎng)關(guān)的RSSI
? "location": { // 對(duì)應(yīng)網(wǎng)關(guān)的經(jīng)緯度以及海拔信息
? "latitude": 0,
? "longitude": 0,
? "altitude": 0
? }
? }
],
"txInfo": {
? "frequency": 486300000, // 節(jié)點(diǎn)發(fā)送數(shù)據(jù)使用的的頻率
? "dr": 2 // 節(jié)點(diǎn)當(dāng)前的data rate
}
}
#Downlink
{
"devEUI":"3637343457387e11", // 節(jié)點(diǎn)的devEUI信息
"confirmed": true, // This dl pkt need confirm or not.
"fPort": 2, // The port will be used for sending this packet
"data": "AgAAAA==" // 發(fā)送給節(jié)點(diǎn)的數(shù)據(jù),經(jīng)過base64編碼
}
#Join
{
"applicationID": "1",
"applicationName": "test-app",
"deviceName": "dev-5205",
"devEUI": "3637343457387e11",
"devAddr": "02000001" // Join成功之后分配給節(jié)點(diǎn)的短地址
}
#Ack
只有服務(wù)器給節(jié)點(diǎn)下發(fā)了confirmed類型的數(shù)據(jù)后,節(jié)點(diǎn)才會(huì)回復(fù)Ack。
注意:節(jié)點(diǎn)不一定立即回復(fù)Ack,Ack可能會(huì)在節(jié)點(diǎn)下一次發(fā)送上行數(shù)據(jù)時(shí)攜帶。
{
"applicationID": "1",
"applicationName": "test-app",
"deviceName": "dev-5205",
"devEUI": "3637343457387e11",
"acknowledged": true,
"fCnt": 7
}
#Device Status
{
"applicationID": "1",
"applicationName": "test-app",
"deviceName": "dev-5205",
"devEUI": "3637343457387e11",
"battery": 254, // 電池剩于電量的分級(jí)。254表示電源滿電狀態(tài),1表示電池電量即將耗盡。
"margin": 8, // 是最近一次成功接收DevStatusReq命令的解調(diào)信噪比
"externalPowerSource": false, // 是否使用了額外的電源
"batteryLevelUnavailable": false, // 節(jié)點(diǎn)的電量級(jí)別是否有效
"batteryLevel": 100 // batteryLevelUnavailabl為true的情況下,batteryLevel表示電量百分比
}
#程序示例
以下是使用python代碼調(diào)用MQTT訂閱節(jié)點(diǎn)的上行數(shù)據(jù)并將對(duì)應(yīng)內(nèi)容打印出來,每收到一條上行數(shù)據(jù),程序會(huì)主動(dòng)向節(jié)點(diǎn)發(fā)送一個(gè)下行數(shù)據(jù),內(nèi)容是“Hello rak”。使用代碼前請(qǐng)仔細(xì)閱讀代碼注釋。
以下源碼基于python3運(yùn)行環(huán)境,在運(yùn)行代碼前,需要使用命令pip3 install paho-mqtt
安裝依賴庫。
#!/usr/bin/env python
import json
import base64
import paho.mqtt.client as mqtt
from datetime import datetime
\# mqtt服務(wù)器IP
mqtt_ip = '111.230.247.253'
\# mqtt服務(wù)器端口
mqtt_port = 1883
\# mqtt用戶名
mqtt_username = 'rakwireless'
\# mqtt密碼
mqtt_password = 'rakwireless.com'
\# mqtt訂閱topic。該topic可以訂閱所有節(jié)點(diǎn)信息
mqtt_rx_topic = 'application/+/device/+/rx'
\# 將字符串轉(zhuǎn)換為16進(jìn)制
def str_to_hex(s):
return r"\x"+r'\x'.join([hex(ord(c)).replace('0x', '') for c in s])
\# 一旦訂閱到消息,回調(diào)此方法
def on_message(mqttc, obj, msg):
on_print_rak_node_info(msg.payload)
\# 打印訂閱到的節(jié)點(diǎn)信息
def on_print_node_rx_info(json_rx):
try:
? devEUI = json_rx['devEUI']
? applicationID = json_rx['applicationID']
? applicationName = json_rx['applicationName']
? deviceName = json_rx['deviceName']
? timestamp = json_rx['timestamp']
? fCnt = json_rx['fCnt']
? fPort = json_rx['fPort']
? data = json_rx['data']
? data_hex = str_to_hex(base64.b64decode(data).decode("utf-8"))
? \# 將時(shí)間戳轉(zhuǎn)換為本地時(shí)間
? str_local_time = datetime.fromtimestamp(timestamp)
? print('---------------- devEUI:[%s] rxpk info -------------------' % devEUI)
? print('+\t applicationName:\t%s' % applicationName)
? print('+\t applicationID:\t\t%s' % applicationID)
? print('+\t deviceName:\t\t%s' % deviceName)
? print('+\t datetime:\t\t%s' % str_local_time)
? print('+\t fCnt:\t\t\t%d' % fCnt)
? print('+\t fPort:\t\t\t%d' % fPort)
? print('+\t data:\t\t\t%s' % data)
? print('+\t data_hex:\t\t%s' % data_hex)
? print('----------------------------------------------------------')
except Exception as e:
? print(e)
finally:
? pass
\# 訂閱到節(jié)點(diǎn)的數(shù)據(jù)之后,向節(jié)點(diǎn)發(fā)送“Hello rak”字符串
def on_print_rak_node_info(payload):
json_str = payload.decode()
try:
? json_rx = json.loads(json_str)
? on_print_node_rx_info(json_rx)
? dev_eui = json_rx['devEUI']
? app_id = json_rx['applicationID']
? \# 商業(yè)網(wǎng)關(guān)默認(rèn)的tx topic
? tx_topic = 'application/%s/device/%s/tx' % (app_id, dev_eui)
? str_hello = "Hello Rak"
? tx_msg = '{"confirmed":true,"fPort":10,"data":"%s" }' % str(base64.b64encode(str_hello.encode("utf-8")), "utf-8")
? \# 發(fā)布消息
? mqttc.publish(tx_topic, tx_msg, qos=0, retain=False)
? print('Send \'Hello rak\' to node %s' % dev_eui)
except Exception as e:
? raise e
finally:
? pass
mqttc = mqtt.Client()
mqttc.on_message = on_message
\# 如果沒有用戶名和密碼,請(qǐng)注釋改行
mqttc.username_pw_set(mqtt_username, password=mqtt_password)
\# 連接mqtt broker,心跳時(shí)間為60s
mqttc.connect(mqtt_ip, mqtt_port, 60)
mqttc.subscribe(mqtt_rx_topic, 0)
mqttc.loop_forever()
-
節(jié)點(diǎn)
+關(guān)注
關(guān)注
0文章
218瀏覽量
24419 -
MQTT
+關(guān)注
關(guān)注
5文章
650瀏覽量
22487 -
RAK
+關(guān)注
關(guān)注
0文章
48瀏覽量
2081
發(fā)布評(píng)論請(qǐng)先 登錄
相關(guān)推薦
評(píng)論