#概述
本文旨在幫助已經購買RAK商業網關產品并且使用內置LoRa Server功能的用戶,了解如何通過MQTT訂閱商業網關內置LoRa Server的數據,使用戶了解商業網關的工作原理,方便用戶在自己的應用服務器獲取節點數據,達到便捷使用應用服務器完成數據展示和數據分析的目的。
本文將以RAK公司的商業網關產品(室內網關RAK7258或室外網關RAK7249)為例,介紹如何配置商業網關使用內置MQTT服務器和私有(外置)MQTT服務器,以及如何訂閱節點數據和向節點發送數據等。
#LoRaWAN和MQTT簡介
本章節介紹LoRaWAN網絡和MQTT網絡,用于幫助用戶對LoRaWAN和MQTT的工作原理有一個簡單直觀的了解。如果您已經熟悉了LoRaWAN和MQTT的工作原理,可跳過此章節。
#LoRaWAN簡介

從上圖可以看出,LoRaWAN網絡包括如下3個角色,各個角色的作用如下所示:
- 終端設備(End Nodes):即節點設備,負責數據采集,并將數據加密后以無線信號的形式傳遞給網關。
- 網關(Concentrator/Gateway):將終端發送的數據透傳給NS服務器。
- NS服務器(Network Server):根據數據身份信息、密鑰對網關轉發的數據進行解密、處理。
RAK簡化LoRaWAN實際部署條件,RAK商業網關集成了NS服務器,它配合節點可以輕松搭建LoRaWAN網絡。
#MQTT簡介
MQTT代表MQ遙測傳輸,是一種發布/訂閱極其簡單和輕量級的消息傳遞協議,用于受限設備和低帶寬、高延遲或不可靠的網絡。設計原則是使網絡帶寬和設備資源要求最小化以及確保可靠性。這些原則使該協議成為物聯網世界的理想選擇。

如上圖所示,MQTT網絡角色包括如下3個,各個角色的作用如下所示:
- 發布者(Publisher):發布信息。
- 訂閱者(Subscriber):收集發布者發布的信息。
- MQTT Broker:接收發布信息并將信息向訂閱者進行展示。
MQTT Broker同比是新聞發布網站,發布者是新聞發布成員,訂閱者是瀏覽、查看新聞的用戶。
#MQTT在LoRaWAN網絡中的作用

實際應用1:使用RAK商業網關內置的MQTT Broker功能。
RAK商業網關獲取數據并發送給內置NS,內置NS將數據發布至內置的MQTT Broker,用戶通過第三方程序訂閱數據。這種應用情況下,RAK商業網關既是發布者,又是MQTT Broker。
注意:
- 如果使用網關內置的MQTT Broker,則無法通過公網訂閱或發布數據。
- 網關內置的MQTT Broker僅適用于項目研發和測試階段,由于內置的MQTT Broker沒有密碼、證書等驗證方式,容易被其他人竊取傳感器數據,因此,不建議在生產部署時使用。
實際應用2:使用用戶私有的MQTT Broker功能。
RAK商業網關獲取數據并發送給內置NS,內置NS將數據發布至第三方MQTT Broker,用戶通過第三方程序訂閱數據。這種應用情況下,RAK商業網關僅為發布者。
#訂閱節點數據和向節點發送數據
本節以RAK商業網關為例,介紹如何通過MQTT.fx工具訂閱節點上報的數據和向節點發送數據。您可以通過單擊MQTT.fx下載MQTT.fx工具(MQTT客戶端)。
#配置商業網關使用內置服務器
1、在瀏覽器地址欄中輸入商業網關的IP地址192.168.230.1,按"Enter",進入如下界面。

2、在打開的商業網關登錄界面中輸入用戶名和密碼,單擊"Login"。
默認用戶名和密碼都為root。
3、在左側導航欄中選擇“LoRa Network > Network Settings”。
4、在“LoRaWAN Network Settings”界面上,設置"Mode"為"Network Server"模式。

5、單擊“Switch mode”切換模式。
約15秒左右,網關即可切換為Network Server模式。在該模式下,商業網關既是網關,又是NS服務器。
#添加節點到商業網關的內置服務器
1、在商業網關左側導航欄中選擇“LoRa Network > Application”,進入應用概覽頁面。
2、輸入應用名稱,單擊“Add”,如下圖所示。
注意:
本示例采用"Type1 : Unified Application Key",即同一Application中,所有節點設備使用相同的Application Key。不需要單獨為設備設置Application Key。支持通過OTAA自動添加設備。如果您想使用“Type2 : Separate Application Key”,請參考Web 平臺配置指南。

在應用配置頁面根據頁面提示配置應用信息,如下圖所示。

- Name:應用名稱,用戶自定義。
- Auto Add LoRa Device:是否開啟自動添加設備。開啟后,如果設備的Application Key與Application EUI通過身份驗證,設備將被自動添加到服務器上。
- Application EUI:標識唯一的應用提供者,開啟自動添加設備后需要填寫。單擊讓系統自動生成Application EUI。需與節點設備三元組信息中的“AppEUI”保持一致。
- Application Key:由應用程序擁有者分配給終端。單擊讓系統自動生成Application Key。需與節點設備三元組信息中的“AppKey”保持一致。
- Description:應用描述信息,用戶自定義。
注意:您也可以使用Micro USB線連接節點設備到PC,后使用串口工具打開相應端口分別發送AT+APPEUI
和AT+APPKEY
獲取Application EUI和Application Key的值后填寫到此處,可省去后續配置節點的步驟。本示例采用系統自動生成的方法。
4、單擊"Save & Apply"保存配置。
5、在系統自動返回的應用概覽頁面,單擊"Edit"進入應用配置頁面添加節點。

6、輸入節點的Device EUI后,單擊“Add”,如下圖所示。Device EUI可在節點設備的標簽上獲取,也可使用Micro USB線連接節點設備到PC,后使用串口工具打開相應端口發送AT+DEVEUI
進行查詢。

7、在節點配置頁面配置節點設備信息,如下圖所示。

- Device name:節點設備名稱,用戶自定義。
- Class:節點設備類型,需與節點保持一致。這里以節點出廠默認配置Class A為例。
- Join mode:節點設備的入網方式,需與節點保持一致。這里以節點設備出廠默認配置OTAA為例。
- Frame-counter Width:報文序號計數器長度。
- LoRaWAN MAC Version:LoRaWAN協議版本號。
- LoRaWAN Regional Parameters Reversion:LoRaWAN區域參數版本號。
- Enable LPTP:是否開啟LPTP協議。LPTP協議是RAK自定義的LoRa?報文分片/重組協議,僅部分RAK節點產品(RAK7421、RAK7431及RAK4203)支持。
- Description:節點的描述信息,用戶自定義。
8、單擊"Save & Apply"保存配置。
#使用商業網關內置的MQTT Broker
用戶可通過商業網關內置的Application Server Integration功能使用MQTT客戶端訂閱NS Topic消息來獲取節點數據,也可以使用MQTT客戶端向節點發送數據。
#配置商業網關使用內置的MQTT Broker
1、在商業網關左側導航欄中選擇"LoRa Network > Global Integration"。
2、在"Application Server Integration"頁面上,設置應用服務器集成的相關參數。
如果使用內置的MQTT Broker,則“MQTT Broker Address”和“MQTT Broker Port”參數的值保持默認即可。如果您不了解MQTT協議的topic,建議保持MQTT topic相關參數的默認配置。此處使用內置的MQTT Broker,全部參數保持默認配置,如下圖所示。

3、單擊"Save & Apply"保存配置。
#通過MQTT.fx客戶端訂閱節點數據
1、打開MQTT.fx工具,主界面如下圖所示。

2、單擊左上角的新建圖標,如下圖所示。

3、在下圖中紅框處輸入網關的IP地址。

4、單擊“Connect”。最右側的黑色圓形變成綠色,說明已經成功連接到網關內置的MQTT Broker。

5、選擇“Subscribe”頁簽。
6、在“Subscribe”頁簽的輸入框中輸入待訂閱的topic,單擊輸入框右側的“Subscribe”。
輸入待訂閱的topic時,topic的格式應該與商業網關"Application Server Integration"頁面上Uplink Topic的格式保持一致,如下圖所示,其中,application_ID需要替換成實際的application ID的值,device_EUI需要替換成節點的device_EUI的值。

application ID的值和device_EUI的值請參考下面兩個圖來獲取。


以上面兩個圖中獲取的application ID和device_EUI的值為例,則需要在輸入框中輸入的topic為:application/2/device/00d939567c667e1e/rx,如下圖所示。

· 如果要訂閱一個應用下的所有節點數據,例如:要訂閱應用2下的所有節點數據,則需要輸入如下topic:
application/2/device/+/rx
· 如果要訂閱所有應用下的所有節點數據,則需要輸入如下topic:
application/+/device/+/rx
7、使用節點成功join之后發送一條數據。例如:要在節點側發送一條“HelloRakwireless”,因為節點需要接收16進制的數據,將“Hello Rakwireless”轉換為16進制,即“48656c6c6f52616b776972656c657373”,則發送的AT命令如下圖所示。

8、在MQTT.fx界面上查看已訂閱的節點數據,如下圖所示。

上圖中"data"字段的值即為節點發送的數據,只是這些數據進行了base64編碼,對"data"字段的值進行base64解碼后即可看到原始數據。
9、查看商業網關web管理界面上節點發送的數據是否與MQTT.fx界面上一致。

#通過MQTT.fx客戶端向節點發送數據
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"的取值即要發送的數據,需要對數據進行base64編碼。
"fPort"的取值即要發送的端口號,有效端口號為1~255。
輸入topic時,topic的格式應該與商業網關"Application Server Integration"頁面上Downlink Topic的格式保持一致,如下圖所示,其中,application_ID需要替換成實際的application ID的值,device_EUI需要替換成節點的device_EUI的值。

application ID的值和device_EUI的值請參考下面兩個圖來獲取。


以上面兩個圖中獲取的application ID和device_EUI的值為例,則需要在輸入框2中輸入的topic為:application/2/device/00d939567c667e1e/tx,如下圖所示。

注意:
通過MQTT.fx客戶端向節點發送數據后,Class C模式下節點會立刻收到MQTT.fx下發的數據,Class A模式下節點會在下一次上發數據之后收到MQTT.fx下發的數據。
3、在節點端查看接收到的數據,如下圖所示。

#使用用戶私有的MQTT Broker
本節介紹在商業網關上配置用戶私有的MQTT Broker信息、連接MQTT客戶端與用戶私有的MQTT Broker、通過MQTT客戶端訂閱節點數據和通過MQTT客戶端向節點發送數據的具體方法。
#配置商業網關使用用戶私有的MQTT Broker
1、在商業網關左側導航欄中選擇"LoRa Network > Global Integration"。
2、在"Application Server Integration"頁面上,設置應用服務器集成的相關參數。
如果要使用用戶私有的MQTT Broker,則需要配置如下參數。
- MQTT Broker Address:用戶私有的MQTT服務器的IP地址。
- MQTT Broker Port:MQTT服務器的端口號,默認端口號為1883。
- Enable User Authentication:打開用戶認證開關。
- Username:訪問MQTT服務器的用戶名。
- Password:訪問MQTT服務器的用戶密碼。
如果您不了解MQTT協議的topic,建議保持MQTT topic相關參數的默認配置。
此處使用用戶私有的MQTT Broker且保持MQTT topic相關參數的默認配置,如下圖所示。

3、單擊"Save & Apply"保存配置。
#連接MQTT.fx客戶端至用戶私有的MQTT Broker
1、打開MQTT.fx。
2、單擊設置圖標,如下圖所示。

系統彈出“Edit Connection Profiles”對話框。
3、在“Edit Connection Profiles”對話框中,單擊左下角的+。
4、設置“Profile Name”、“Broker Address”、"Broker Port",單擊“User Credentials”,輸入“User Name”和“Password”,如下圖所示。

5、單擊右下角的“OK”。
6、“Edit Connection Profiles”對話框自動關閉,MQTT.fx主界面中已自動選擇了剛創建的Profile。
7、在MQTT.fx主界面中單擊“Connect”。最右側的黑色圓形變成綠色,說明已經成功連接到用戶私有的MQTT Broker。
#通過MQTT.fx客戶端訂閱節點數據
具體方法請參考通過MQTT.fx客戶端訂閱節點信息。
#通過MQTT.fx客戶端向節點發送數據
具體方法請參考通過MQTT.fx客戶端向節點發送數據。
前面章節介紹了通過MQTT如何訂閱節點的上行數據Uplink以及如何向節點下發數據Downlink,節點還有其他三種類型的數據,分別是Join、Ack和Status。其中Join是節點入網時的信息,Ack是向節點下發數據之后節點回復的確認信息,Status是節點的電池電量信息。
下面將分別介紹這五種數據的具體格式和含義。
#Uplink
{
"applicationID": "1", // 節點所屬應用的id
"applicationName": "test-app", // 節點所屬應用的名稱
"devEUI": "3637343457387e11", // 節點的devEUI
"deviceName": "dev-5205", // 節點名稱
"timestamp": 1592730721, // 接收到節點數據的Unix時間戳
"fCnt": 6,
"fPort": 2,
"data": "AQIDBA==", // base64編碼后的數據,解碼之后就是節點實際上發的數據
"data_encode": "base64", // 數據的編碼類型
"adr": true, // 節點是否開啟了adr
"rxInfo": [ // 所有接收到節點數據的網關信息
? {
? "gatewayID": "d896e0fff010611e", // 網關的gateway_id
? "loRaSNR": 13.3, // 當前網關的信噪比
? "rssi": -71, // 當前網關的RSSI
? "location": { // 對應網關的經緯度以及海拔信息
? "latitude": 0,
? "longitude": 0,
? "altitude": 0
? }
? }
],
"txInfo": {
? "frequency": 486300000, // 節點發送數據使用的的頻率
? "dr": 2 // 節點當前的data rate
}
}
#Downlink
{
"devEUI":"3637343457387e11", // 節點的devEUI信息
"confirmed": true, // This dl pkt need confirm or not.
"fPort": 2, // The port will be used for sending this packet
"data": "AgAAAA==" // 發送給節點的數據,經過base64編碼
}
#Join
{
"applicationID": "1",
"applicationName": "test-app",
"deviceName": "dev-5205",
"devEUI": "3637343457387e11",
"devAddr": "02000001" // Join成功之后分配給節點的短地址
}
#Ack
只有服務器給節點下發了confirmed類型的數據后,節點才會回復Ack。
注意:節點不一定立即回復Ack,Ack可能會在節點下一次發送上行數據時攜帶。
{
"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, // 電池剩于電量的分級。254表示電源滿電狀態,1表示電池電量即將耗盡。
"margin": 8, // 是最近一次成功接收DevStatusReq命令的解調信噪比
"externalPowerSource": false, // 是否使用了額外的電源
"batteryLevelUnavailable": false, // 節點的電量級別是否有效
"batteryLevel": 100 // batteryLevelUnavailabl為true的情況下,batteryLevel表示電量百分比
}
#程序示例
以下是使用python代碼調用MQTT訂閱節點的上行數據并將對應內容打印出來,每收到一條上行數據,程序會主動向節點發送一個下行數據,內容是“Hello rak”。使用代碼前請仔細閱讀代碼注釋。
以下源碼基于python3運行環境,在運行代碼前,需要使用命令pip3 install paho-mqtt
安裝依賴庫。
#!/usr/bin/env python
import json
import base64
import paho.mqtt.client as mqtt
from datetime import datetime
\# mqtt服務器IP
mqtt_ip = '111.230.247.253'
\# mqtt服務器端口
mqtt_port = 1883
\# mqtt用戶名
mqtt_username = 'rakwireless'
\# mqtt密碼
mqtt_password = 'rakwireless.com'
\# mqtt訂閱topic。該topic可以訂閱所有節點信息
mqtt_rx_topic = 'application/+/device/+/rx'
\# 將字符串轉換為16進制
def str_to_hex(s):
return r"\x"+r'\x'.join([hex(ord(c)).replace('0x', '') for c in s])
\# 一旦訂閱到消息,回調此方法
def on_message(mqttc, obj, msg):
on_print_rak_node_info(msg.payload)
\# 打印訂閱到的節點信息
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"))
? \# 將時間戳轉換為本地時間
? 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
\# 訂閱到節點的數據之后,向節點發送“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']
? \# 商業網關默認的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")
? \# 發布消息
? 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
\# 如果沒有用戶名和密碼,請注釋改行
mqttc.username_pw_set(mqtt_username, password=mqtt_password)
\# 連接mqtt broker,心跳時間為60s
mqttc.connect(mqtt_ip, mqtt_port, 60)
mqttc.subscribe(mqtt_rx_topic, 0)
mqttc.loop_forever()
-
節點
+關注
關注
0文章
220瀏覽量
24746 -
MQTT
+關注
關注
5文章
661瀏覽量
23328 -
RAK
+關注
關注
0文章
48瀏覽量
2238
發布評論請先 登錄
相關推薦
MQTT物聯網平臺有哪些?有哪些功能?

基于MQTT協議的車云通信設計

MQTT物聯網云平臺有什么功能
MQTT協議網關的工作原理及功能特性

MQTT網關:物聯網中的關鍵橋梁

合宙Air780EP模塊——AT指令MQTT接入OneNET開發指南

MQTT應用看這篇!合宙Air780EP_LuatOS_MQTT應用指南

基于MQTT協議云平臺的Modbus轉MQTT網關

780EP模塊 AT開發-MQTT應用指南

MQTT物聯網平臺是什么
為什么使用MQTT而不是HTTP?

評論