描述
有許多 Modbus/RS485 應用程式和安裝可以從 RS485 設備和硬體的無線介面中受益。對於具有小數據有效負載且間歇性報告的 RS485 設備,LoRa 無線協定是一個很好的選擇,可以提供長距離和低功耗的優勢。
Dragino 的 RS485-LN 提供了連接各種 RS485 感測器和硬體的方向,發送定制的 Modbus 命令來讀取/控制 RS485 設備,並將產生的 RS485 數據/資訊上傳到 LoRaWAN 網路。本項目設定 RS485-LN 和 Seeed 的 S-TH-01 RS485 溫度濕度感測器,透過 LoRa 查詢溫度濕度資料並上傳溫濕度資料。
這項目亦會討論將感測器節點添加到現有的基於 ChirpStack 的私有 LoRaWAN 網路和 Machinechat 的 JEDI Pro 物聯網軟體平台上。LoRaWAN 網路使用 Seeed 的 IP67 等級工業 LoRaWAN 閘道器, 將 LoRa 感測器封包轉送到在 Seeed 的 ReServer 上運作(安裝了 Ubuntu linux)的專用 ChirpStack LoRaWAN 網路伺服器,。Machinechat 的 JEDI Pro 物聯網平台運作在同一個 ReServer上。
硬體
- Seeed reServer
reServer 基於 ODYSSEY X2 主機板,支援 Intel® Core™ 11th Gen. i3 與 Intel UHD Graphics 48EUs - SenseCAP 室外閘道器 - LoRaWAN US915MHz
SenseCAP LoRaWAN 閘道器基於 LoRaWAN 協議,適用於低功耗、遠距離的環境資料擷取和監測。 - Dragino RS485-LN
Dragino RS485 to LoRaWAN 轉換器(SX1276)RS485-LN-US915MHz - Seeed S-TH-01 溫濕度感測器
工業RS485空氣溫濕度感知器 - Waveshare USB TORS232/485/TTL
工業 USB 轉 RS232/485/TTL 隔離轉換器
軟體
- JEDI Pro 或 JEDI Pro SSE
適用於物聯網資料收集、視覺化、監控和資料儲存的軟體,可整合到物聯網解決方案中。功能包括:收集來自感測器、設備和機器的數據;構建直觀的實時和歷史數據以及系統視圖儀表板;創建規則,自動監控和響應數據情況;透過電子郵件和短信接收警報通知。JEDI Pro SSE 是 JEDI Pro 的 Seeed 工作室版版本,為 Seeed 的 SenseCAP LoRaWAN 感測器系列增加了一個資料收集器 - ChirpStack
ChirpStack 開源 LoRaWAN 網路伺服器堆疊為 LoRaWAN 網路提供開源元件。模組化的架構使得在現有的基礎設施內整合成為可能。 - Modbus
組織是一個由自動化設備的獨立用戶和供應商組成的組織,旨在推動 Modbus 通訊協議套件的採用,並為多個細分市場的分散式自動化系統解決架構問題。
背景
這篇文章是一個後續項目,建立在相關的技術論壇文章「Set up a private LoRaWAN Sensor Network with Machinechat and Seeed SenseCAP」的基礎上。其中詳細介紹了使用 DigiKey 提供的現成硬體和軟體建立一個私人 LoRaWAN 物聯網感測器網路。相關項目中使用的軟體包括 Machinechat 的 JEDI Pro 應用軟體和 ChirpStack 的 LoRaWAN 網路伺服器應用程式。項目中使用的硬體包括 Seeed reServer x86 伺服器和 SenseCAP 室外 LoRaWAN 閘道器。在本項目中,Dragino RS485-LN 用於讀取 Seeed S-TH-1 感測器的溫度、濕度和露點寄存器,並透過 LoRaWAN 網路上傳感測器資料。
Dragino RS485-LN
Dragino RS485-LN 是一款 RS485 轉 LoRaWAN 轉換器,將 RS485 資料轉換成遠端無線 LoRa 有效載荷,傳輸到 LoRaWAN 閘道器。對於資料上行,RS485-LN 配置為向所連接的 RS485 設備發送使用者自訂命令並讀取其回應。然後,RS485-LN 根據使用者定義的規則處理回應,建構資料負載,透過 LoRa 上傳到 LoRaWAN 伺服器。資料下行時,RS485-LN 運作在 LoRaWAN C 類,接收 RS485/Modbus 指令。當 LoRaWAN 伺服器有下行指令時,RS485-LN 將 LoRaWAN 伺服器的指令轉送給所連接的 RS485 設備。RS485-LN 允許使用者監控/控制 RS485 設備,並達到極遠的範圍。 它提供超長距離擴頻通訊和高抗干擾性,同時最大限度地減少電流消耗。
Seeed S-TH-1 RS485 溫濕度感測器
S-TH-01 模組在一個小尺寸感測器中提供工業級感測和緊湊型空氣溫濕度感測。S-TH-1 由 3.6 - 30VDC 電源供電,通訊透過 RS485,遵循 Modbus 協定。
RS485感測器通訊測試
測試與正在使用的感測器的 RS485 通訊始終是一個很好的做法。這是透過使用 Windows PC 上運行的 RealTerm 串行終端來完成的,該終端連接到 USB 到 RS485 轉換器,透過 RS485 連接到被測試的感測器。在本項目中,使用 Waveshare USB 到 RS232/485/TTL 轉換器連接 Seeed 溫度濕度感測器,如下圖所示SeeedSTH1TempRS485Test :
當感測器連接並通電,啟動 RealTerm 並連接到 Waveshare USB 到 RS232/485/TTL 轉換器的COM 連接埠。RS485 通訊可以透過向感測器發送有效命令並監控回應來測試。注意:感測器的位址位於感測器電纜上的標籤上,恰好是十進位42(十六進位0x2A)。
選擇「Send」頁籤,輸入 Modbus 指令為十六進位值,選擇「Send Numbers」。在下面的範例中,指令為「2A0302000002C3A8」(讀取伺服器位址和波特率碼暫存器)
範例 1 (讀取伺服器位址和波特率碼暫存器)
命令(客戶端)- 「2A0302000002C3A8」
2A 伺服器位址
03 Modbus功能碼 3 - 讀取保持暫存器
02 起始位址 Hi 位元組
00 起始位址 Lo 位元組
00 暫存器數量 Hi 位元組
02 暫存器數量 Lo 位元組
C3 CRC Hi 位元組
A8 CRC Lo 位元組
回應(伺服器)- 「2A0304002A000300F8」
2A 伺服器位址
03 Modbus功能碼 3 - 讀取持有暫存器
04 位元組計數
002A 位元組 1,2(伺服器位址 = 2A)
0003 位元組 3,4(波特率碼= 3 = 9600波特)
00 CRC Hi 位元組
F8 CRC Lo 位元組
範例 2 (讀取溫度、濕度和露點暫存器)
命令(客戶端) - 「2A0400000003B610」
2A 伺服器位址
04 Modbus 功能碼 4 -讀取輸入暫存器)
00 起始位址 Hi 位元組
00 起始位址 Lo位元組
00 暫存器數量 Hi 位元組
03 暫存器數量 Lo 位元組
B6 CRC Hi 位元組
10 CRC Lo 位元組
回應(伺服器)- 「2A040607310D1400CFF4ED」
2A 伺服器位址
04 Modbus 功能碼 4 -讀取輸入暫存器
06 位元組計數
0731 位元組 1,2(溫度 = 1841/100 = 18.41C)
0D14 位元組 3,4(濕度 = 3348/100 = 33.48%)
00CF 位元組 5,6(露點 = 207/100 = 2.07C)
F4 CRC Hi 位元組
ED CRC Lo 位元組
關於 Modbus 通訊範例的詳細資訊請參閱 S-TH-1 Air Temperature and HumiditySensor- 規格書的 6.4.2 節。
建立 RS485-LN,實現 RS485 與 LoRa 通信
對於本項目,需要配置 RS485-LN,透過 RS485 向 S-TH-1 感測器發送適當的 Modbus 命令,以讀取輸入暫存器的溫度,濕度和露點。接下來,需要對其進行配置,以建立適當的資料有效負載,以便透過 LoRa 上行到 LoRaWAN 閘道器。為了配置 RS485-LN,需要為其供電,並透過程式電纜連接串行終端,如圖所示方案圖 DraginoRS485LN_ProgramCable。
電氣連接列於下表:
RS485-LN | FTDI 序列電纜 | 電源 | 電腦 |
---|---|---|---|
Vin- | - | GND | - |
Vin+ | - | +12VDC | - |
PRO-txd (紅) | 4 - tx (橙) | - | - |
PRO-rxd (白) | 5 - rx (黃) | - | - |
PRO-gnd (黑) | 1 - gnd (黑) | - | - |
- | USB | - | USB |
在本項目中,RS485-LN 連接到單一 RS485 設備 Seeed S-TH-1 感測器,需要配置發送相應的 RS485 命令來讀取溫度、濕度和露點暫存器,並建立資料負載,透過 LoRa 發送到 LoRaWAN 伺服器。RS485-LN 使用手冊 和 S-TH-1 規格書都是設定 RS485-LN 時需要參考的重要文件。
1 - 配置 RS485-LN Modbus 指令。
RS485-LN 使用「AT+COMMANDx=x y z…」指令類型建立 RS485 指令,傳送到所連接的RS485 設備。由於只有一個 S-TH-1 RS485 設備,因此指令為 「AT+ command1 = 2A 04 000 000 000 03,1」
值 | 描述 |
---|---|
2A | 伺服器位址 |
04 | Modbus 功能代碼 4 -讀取輸入暫存器 |
00 | 起始位址 Hi 位元組 |
00 | 起始位址 Lo 位元組 |
00 | 暫存器數量 Hi 位元組 |
03 | 寄存器的數量 |
1 | 在指令末尾新增CRC-16/MODBUS |
2 - 配置 RS485-LN,從 S-TH-1 感測器響應中建立適當的資料負載。
RS485-LN 使用「AT+DATACUTx=x,y,z…」命令類型來建立要透過 LoRa 上傳的感測器回應的資料有效載荷。由於只有一個 S-TH-1 RS485 設備連接,命令回應是 11 位元組的日誌,所以使用的命令是「AT+DATACUT1=11,2,1~11」(上傳命令回應的所有位元組)
值 | 描述 |
---|---|
11 | AT+COMMAND 的回應長度(以位元組計) |
2 | 按位元組段抓取有效值 |
1~11 | 定義有效值的位置(位元組1到11) |
3 - 配置 RS485-LN 參數的有效載荷版本,取樣率和上傳配置。
本項目設定「AT+PAYVER=9」(有效載荷版本9)、「AT+TDC=60000」(取樣延遲60秒)、「AT+DATAUP=0」(單上行上傳資料)
建立和測試用於 LoRa 通訊的 S-TH-1 和 RS485-LN
將編程線連接串口和 RS485-LN 程式連接器。RS485-LN A+、B-、RS485gnd 和 電源端子接在 S-TH-1 感測器上,如下圖所示。RS485-LN 和 S-TH-1 都由同一個 12VDC 電源供電。
(參考 Scheme-it Project:DraginoRS485_SeeedSTH1_Pcable)
確定 RS485-LN 設備 EUI 和 APPKEY
使用 TeraTerm(或類似的序列終端程式)和 FTDI USB 轉 TTL 適配器連接到如上所示的程式電纜上。連線成功後,先輸入「123456」密碼,再輸入「AT+CFG」列印設定資料(包含裝置 EUI 和 APPKEY)。 註:見下面的範例數據
AT+DEUI=a8 40 41 b1 31 84 7d fa
AT+DADDR=01847DFA
AT+APPKEY=12 34 56 78 90 1a 1b 1c 1d 1f 2a 2b 2c 2d 2e 2f
AT+NWKSKEY=cb ee cf 7c 9d c4 d1 9f c4 64 26 b9 2b d7 8d 91
AT+APPSKEY=f8 d9 c9 a9 f6 55 12 cb fd 5b ab 74 36 ec 62 f1
AT+APPEUI=a8 40 41 00 00 00 01 01
AT+ADR=1
AT+TXP=5
AT+DR=1
AT+DCS=0
AT+PNM=1
AT+RX2FQ=923300000
AT+RX2DR=8
AT+RX1DL=1000
AT+RX2DL=2000
AT+JN1DL=5000
AT+JN2DL=6000
AT+NJM=1
AT+NWKID=00 00 00 00
AT+FCU=698
AT+FCD=740
AT+CLASS=C
AT+NJS=1
AT+RECVB=0:
AT+RECV=0:
AT+VER=v1.3 US915
AT+CFM=0
AT+CFS=0
AT+SNR=0
AT+RSSI=0
AT+RJTDC=20
AT+RPL=4
AT+TDC=60000
AT+PORT=2
AT+RX1WTO=24
AT+RX2WTO=7
AT+INTMOD=2
AT+PWORD=123456
AT+MBFUN=0
AT+BAUDR=9600
AT+PARITY=0
AT+STOPBIT=0
AT+DATAUP=0
AT+PAYVER=9
AT+CHS=0
AT+CHE=0
Use default channel
AT+COMMAND1=2a 04 00 00 00 03 ,1 AT+DATACUT1=11,2,1~11 AT+CMDDL1=0
AT+COMMAND2=0,0 AT+DATACUT2=0,0,0 AT+CMDDL2=0
AT+COMMAND3=0,0 AT+DATACUT3=0,0,0 AT+CMDDL3=0
AT+COMMAND4=0,0 AT+DATACUT4=0,0,0 AT+CMDDL4=0
AT+COMMAND5=0,0 AT+DATACUT5=0,0,0 AT+CMDDL5=0
AT+COMMAND6=0,0 AT+DATACUT6=0,0,0 AT+CMDDL6=0
AT+COMMAND7=0,0 AT+DATACUT7=0,0,0 AT+CMDDL7=0
AT+COMMAND8=0,0 AT+DATACUT8=0,0,0 AT+CMDDL8=0
AT+COMMAND9=0,0 AT+DATACUT9=0,0,0 AT+CMDDL9=0
AT+COMMANDA=0,0 AT+DATACUTA=0,0,0 AT+CMDDLA=0
AT+COMMANDB=0,0 AT+DATACUTB=0,0,0 AT+CMDDLB=0
AT+COMMANDC=0,0 AT+DATACUTC=0,0,0 AT+CMDDLC=0
AT+COMMANDD=0,0 AT+DATACUTD=0,0,0 AT+CMDDLD=0
AT+COMMANDE=0,0 AT+DATACUTE=0,0,0 AT+CMDDLE=0
AT+COMMANDF=0,0 AT+DATACUTF=0,0,0 AT+CMDDLF=0
將 RS485-LN 加入 ChirpStack LoRaWAN 網路伺服器中
(注意:這個專案和下面的步驟假設一個基於 ChirpStack 的私有 LoRaWAN 網路是活躍的,並且在 LoRa-E5 感測器節點的範圍內,參考另一技術文章「Set up a private LoRaWAN Sensor Network with Machinechat and Seeed SenseCAP」)
1 - 在 ChirpStack 中,選擇設備設定檔並建立。名稱設備設定檔「DraginoRS485LN」,LoRaWAN MAC 版本選擇「1.0.3」,LoRaWAN 區域參數版本選擇「A」,ADR 演算法選擇「Default ADR algorithm」,上行間隔輸入「3600」。在 JOIN(OTAA/ABP) 標籤中,選取「Device supports OTAA」。
2 - 在 ChirpStack 中,選擇應用程序,然後選擇「FarmTest」,然後選擇建立。設備名稱輸入「DraginoRS485LN」,設備描述輸入「description」,RS485-LN 輸入「Devince EUI」(由上一步「確定 RS485-LN 設備 EUI 和 APPKEY」),在設備設定檔輸入「DraginoRS485LN」,選擇創建設備 。(注意:對於初始測試和演示,您可能需要勾選「Disable frame-counter validation」選項)
3 - 為裝置新增應用程式金鑰。 從上一個步驟「確定 RS485-LN 設備 EUI 和 APPKEY」 ,並選擇 SET DEVICE-KEYS。
設定 DEVICE-KEYS, RS485-LN 後,應該加入 LoRaWAN 網路並開始上傳感測器資料有效載荷。 您可以前往「Applications/FarmTest」查看 RS485-LN 是否已加入 ChirpStack:
加入 RS485-LN 後,您可以透過展開其中一則訊息來查看它的「DEVICEDATA」:
下面擴展的「設備資料」範例顯示了 Base64 編碼的資料有效負載:
開發和新增 CODEC 到 ChirpStack 設備設定文件
為了使 ChirpStack 從資料有效載荷中解碼更有意義的信息,必須在 DraginoRS485LN 設備設定檔中指定 CODEC。由於 RS485-LN 幾乎可以用於任何 RS485 設備類型和多個設備,因此需要專門為 RS485-LN / S-TH-1 感測器資料負載開發自訂 Java 腳本 CODEC,並保存在設備設定檔中。
1 - 第一步是解碼一個 base64 編碼的有效載荷範例,以確定資料參數和相關位置,以便開發編解碼器。一個範例編碼負載可以從 DraginoRS485LN「設備 DATA」複製,並使用線上 base64 到十六進位解碼器(如 https://www.asciitohex.com/)進行解碼。一個編碼有效載荷的例子是「CSoEBgbnEB8BtIrz」。 這被解碼為十六進位位元組序列「09 2a 04 06 06 e7 10 1f 01 b4 8a f3」。回顧 RS485-LN 配置中使用的「AT+DATACUT」指令,其轉換為以下內容:
值 | 位元組 | 描述 |
---|---|---|
09 | 0 | 有效載荷的版本 |
2a | 1 | 伺服器位址 |
04 | 2 | Modbus 功能代碼 4 -讀取輸入暫存器 |
06 | 3 | 位元組數 |
06 e7 | 4,5 | 位元組 1,2 (temp = 1767/100 = 17.67) |
10 1f | 6,7 | 位元組 3,4 (濕度= 4127/100 = 41.27%) |
01 b4 | 8,9 | 位元組 5,6 (露點= 436/100 = 4.36 C) |
8a | 10 | CRC Hi 位元組 |
f3 | 11 | CRC Lo 位元組 |
2 - 為了這個項目的目的,下面的編解碼器被開發來解碼有效載荷版本,硬件,溫度,濕度和露點值從有效載荷。
// Decode decodes an array of bytes into an object.
// - fPort contains the LoRaWAN fPort number
// - bytes is an array of bytes, e.g. [225, 230, 255, 0]
// - variables contains the device variables e.g. {"calibration": "3.5"} (both the key / value are of type string)
// The function must return an object, e.g. {"temperature": 22.5}
function Decode(fPort, bytes) {
//Payload Formats of RS485LN with S-TH-1 sensor or Unknown HW
var hardware= ((bytes[0])>>3 & (bytes[1])>>5);
var decode = {};
if(hardware=='1')
{
decode.Hardware="RS485LN_STH1";
decode.PayloadVer = parseFloat((bytes[0]).toFixed());
decode.STH1_temp= parseFloat(((bytes[4]<<24>>16 | bytes[5])/100).toFixed(3));
decode.STH1_humid= parseFloat(((bytes[6]<<24>>16 | bytes[7])/100).toFixed(3));
decode.STH1_dewpt= parseFloat(((bytes[8]<<24>>16 | bytes[9])/100).toFixed(3));
}
else
{
decode.Hardware= "Unknown HW";
}
if(bytes.length==12)
{
return decode;
}
}
3 - 測試編解碼器
進入「設備設定檔」,選擇「Dragino RS485LN」。選擇「CODEC」並將上面的 Javascript 程式碼貼到解碼部分,然後選擇「UPDATE-DEVICE PROFILE」。現在開啟「Applications/FarmTest/Devices/DraginoRS485LN」,查看「DEVICE DATA」。打開一個框架,你應該會看到編碼和解碼的 JSON 數據,如下圖所示。
設定和測試 ChirpStack HTTP 整合與 JEDI Pro 通用 LoRaWAN 自訂資料收集器
修改 ChirpStack,增加 HTTP 集成,用於將 LoRaWAN 元資料和感測器資料轉送至指定 IP 位址。Machinechat 的通用 LoRaWAN 自訂資料收集器外掛程式用於監聽指定的 IP 位址並解析 LoRaWAN 資料以供審查(啟用偵錯時)並在JEDI Pro平台中使用。
(註1:自訂資料收集器由兩個檔案組成,lorawan-linux.bin 和 config.yml
(註 2:如果你之前已經在你的系統上設定了 ChirpStack HTTP 集成,你可以跳過第 1-4 節,直接進入第 5 步)
1 - 在 ChirpStack 中啟用 HTTP 整合。
在 ChirpStack 整合介面中選擇「新增」。
2 - 配置 HTTP 集成
選擇「JSON」作為有效載荷封送器,為 Endpoint URL 新增 IP 位址(使用與 config.yml 配置相同的 IP 位址) ,然後選擇 ADD INTEGRATION
3 - 拷貝 lorawan-linux.bin 和 config.yml 到 Ubuntu Linux Mini-PC 上安裝 JEDI Pro 的~/jedi/plugins 目錄下。修改 config. yml 檔案開啟調試,並指定 IP 監聽位址。
(注意:如果你之前已經安裝了 lorawan-linux.bin 和 config.yml 檔案。對於不同的感測器,你所需要做的就是編輯 config.yml 如步驟 5 所示,加入 S-TH-! 感測器溫度、濕度和露點參數)。
4 - 在 Ubuntu Linux Mini-PC 的終端機上使用「./lorawan-linux.bin ./config.yml」在命令列上執行自訂插件並監視輸出資料。資料應類似於以下內容(注意:記住使 lorawan-linux.bin 檔案可執行):
5 - 編輯 config.yml 檔案以將 LoRaWAN 資料對應到 JEDI Pro 資料參數並停用偵錯。對於這個項目範例,編輯 propertyNames,以便 LoRaWAN cSproperty:“SHT1_temp” 對應到 mcProperty:“SHT1Temperature”,LoRaWAN cSproperty:“SHT1_humid” 對應到 mcProperty:“SHT1mcidity”,LoRaWAN cSproperty:“1/degProperty” 」。 透過將 “setDebug:” 設為 false 來停用偵錯並儲存檔案。
設定 JEDI Pro 自訂資料收集器和資料儀表板
在 JEDI Pro 中,選擇「Settings」選項卡,然後選擇「Data Collectors」,然後選擇「Add Collector」。((注意:如果您之前已經將 LoRaWAN 自訂資料收集器新增至 JEDI 應用程式中,則無需執行此步驟)
如下圖所示配置 「Collector」。將資料收集器命名為「LoRaWAN」(或您喜歡的任何名稱),選擇「Collector Type」為「Custom Plug-In」,選擇「LoRaWAN -linux.bin」作為插件可執行文件,輸入配置 config.yml 檔(例如:“/home/scottr/jedi/plugins/config.yml Plug-in 選項),選取「Run As Background Process and Monito」複選框,然後選擇「VALIDATE PLUG-IN」以驗證功能。
在 JEDI Pro 中,選擇「Data Dashboards」,然後選擇「+」來新增一個圖表。配置 STH1 溫度,濕度,露點的資料圖表,並選擇「新增」以包含在您的資料儀表板中。
結論
RS485LN 顯著擴展了專用 LoRaWAN 的功能,可以增加幾乎任何類型的 RS485/Modbus 感測器或設備。另一個潛在的好處是在現有的 RS485/Modbus 安裝中添加無線 LoRaWAN 網路和物聯網軟體平台資料收集、視覺化、監控和資料儲存功能。項目範例可以根據需要輕鬆擴展和修改其他感測器,應用程式和用例。
參考資料
- Seeed - Getting Started with reServer
- Seeed - SenseCAP Outdoor Gateway - LoRaWAN US915MHz
- Seeed - Product Model: S-TH-01, RS485-Industrial-grade air temperature and humidity sensor
- Dragino - RS485-LN – RS485 to LoRaWAN Converter User Manual
- Sparkfun - Serial Terminal Basics
- Getting Started with machinechat’s JEDI One IoT Platform
- Machinechat - Building a private, edge-based LoRaWAN IoT sensor network