AIR724模塊Modbus網關,實作MODBUS 和 MQTT、HTTP任意透傳,對接OneNET、Aliyun、EMQTT
今天介紹重點功能,Modbus轉MQTT網關,Modbus及DL645十分常用,但是現在主流通信協議已經是MQTT,實作modbus和mqtt雙向映射非常有用,
對物聯網技術感興趣請加入我們交流群,歡迎各種技術交流,QQ群: 830407941
鳴謝:稀飯放姜大神 https://gitee.com/hotdll
網關架構
功能設計

配置頁面

DTU作為網關設備,實作Modbus RTU資料包和Json字串的映射,主要特征為:
- 定義通用引數: 串口號、串口超時
- 以設備為單位定義采集指令,包含:采集周期,采集指令
- 以暫存器為單位定義映射欄位,欄位在不同設備之間需要保持唯一
- 上傳通道功能: 按設計周期定時采集資料,校驗CRC和超時,讀取成功后轉換為對應欄位,按照設計的立即上傳還是快取上傳上報資料
- 下行通道功能:接收下發的Json資料后,查詢對應欄位配置的設備ID和暫存器格式,組包后發送給設備
功能特點
- 自由設定采集指令,及對應Json欄位
- 支持多個設備的混合組包,不同設備組成同一個Json
- 支持多種暫存器格式,包含Short,Long,Float及位元組順序,和Modbus Slave軟體一致
- 無比強大鉤子函式,結合遠程腳本,可以實作任何設備的讀取,資料計算、轉換,任意格式的資料組包,直接對接任意云平臺
使用實戰
基本使用-連接到EMQTT Server
- 準備:
- 串口1通過485連接到Modbus Slave
- Modbus Slave設備ID為1,設定暫存器長度10
配置如圖

- EMQ Mqtt連接配置
沒什么好說的,測驗服務器

- Modbus配置
定義設備ID1采集指令, 4個資料欄位,采集周期10秒: 01030001000A
暫存器1型別short -> temp
暫存器4型別long -> humi
暫存器6型別float -> volt
暫存器8型別float -> current

先寫入配置,開始通訊測驗
4. 上行通道實驗結果
打開Modbus slave 可以看到資料流:
000020-Rx:01 03 00 01 00 0A 94 0D
000021-Tx:01 03 14 56 78 12 34 56 78 56 78 12 34 43 7F A8 31 C1 23 33 33 00 00 98 77
打開Luatools查看log,可以看到組好的MQTT資料Json
[I]-[modbus full pub] {"humi":305419896,"temp":22136,"current":-10.199,"volt":255.656}
檢查結果,和slave端設定一致,查看mqtt服務器端是否收到資料:
和預期一致,
5.下行通道實驗結果
DTU訂閱主題為:/device/sub/867435053902185
接下來組包資料,我們將資料 修改為{"humi":1552,"temp":100,"current":-110.5,"volt":512.6}
將此json發布到主題,
觀察DTU端log資訊:
[2020-11-21 14:55:18.557] [I]-[訂閱的訊息:] /device/sub/867435053902185
[2020-11-21 14:55:18.557] [I]-[modbus sub1] {"humi":1552,"temp":100,"current":-110.5,"volt":512.6}
[2020-11-21 14:55:18.557] [I]-[modbus sub2] 0110000400020400000610 11
[2020-11-21 14:55:18.582] [I]-[modbus sub2] 010600010064 6
[2020-11-21 14:55:18.582] [I]-[modbus sub2] 01100008000204C2DD0000 11
[2020-11-21 14:55:18.582] [I]-[modbus sub2] 0110000600020444002666 11
可以看到收到對應資訊,并且按照欄位組成了4條寫指令,隨后自動發往設備,接下來檢查slave端資料,

可以看到暫存器1, 4, 6, 8 更新為配置的格式和值,可以看到實驗結果和預期一致,
高級使用-對接OneNet
- 準備
Modbus延續上面的配置,Onenet采用新版物聯網套件,OneNet配置為自動注冊,詳情參看連接教程,配置完DTU重啟就自動連接平臺了,而且自動訂閱了對應主題,

OneNet和EMQ的區別是上傳的資料必須要按照OneJson格式上傳,比如
{
"id": 123,
"dp": {
"temperatrue": [{
"v": 30,
}],
"power": [{
"v": 4.5,
}]
}
}
DTU默認轉換后的資料為Json,需要轉換成的OneJson格式才能被平臺識別,接下來在遠程腳本里面通過Modbus鉤子函式來構造我們自定義的資料包,
2. 自定義資料
新建腳本,輸入以下代碼:
require "log"
require "default"
require "modbus"
-- 這一句非常重要
module("remotedbg", package.seeall)
-- 下行資料的鉤子
local function msgSubHook(data, uid)
log.info("modbus sub1", data.temp)
-- 下行資料我們把“temp” 改變一下
if data.temp then
data.temp = data.temp / 10
log.info("modbus sub2", data.temp)
return data
else
return nil
end
end
-- 上行訊息的鉤子,在這里構造onejson
-- cid: 網路通道
-- msg: 資料內容,table
local function msgPubHook(msg)
-- 包裝上行資料
local buff = {id= 123, dp= {}}
for key, value in pairs(msg) do
buff.dp[key] = {{v=value}}
end
-- 轉json上傳
buff = json.encode(buff)
log.info("modbus pub msg", buff)
return buff
end
-- 設定鉤子
modbus.setPubHook(msgPubHook)
modbus.setSubHook(msgSubHook)
DTU啟動后可以看到上報的資料為
{"id":123,"dp":{"humi":[{"v":1552}],"temp":[{"v":100}],"current":[{"v":-110.499}],"volt":[{"v":512.599}]}}
查看onenet后臺,可以看到資料已經上傳
測驗下發資料,對設備下發指令
{"id":123,"dp":{"humi":[{"v":1552}],"temp":[{"v":100}],"current":[{"v":-110.499}],"volt":[{"v":512.599}]}}
代碼里面我們將下發的temp資料縮小了10倍,查看log,符合預期
[2020-11-23 10:46:33.728] [I]-[modbus sub0] {"humi":2500,"temp":127,"current":-20.5,"volt":12.6}
[2020-11-23 10:46:33.728] [I]-[modbus sub1] table: 0x80d468d0
[2020-11-23 10:46:33.728] [I]-[modbus sub1] 12.7
[2020-11-23 10:46:33.728] [I]-[modbus sub2] 01100004000204C4090000 11
[2020-11-23 10:46:33.753] [I]-[modbus sub2] 01060001000C 6
[2020-11-23 10:46:33.753] [I]-[modbus sub2] 011000080002040000C1A4 11
[2020-11-23 10:46:33.753] [I]-[modbus sub2] 0110000600020449419A99 11
查看結果,temp被縮小10倍從127變為12,符合預期

結論: 對接到onenet成功,對接到其他平臺同理
對物聯網技術感興趣請加入我們交流群,歡迎各種技術交流,
QQ群: 830407941
對我們產品感興趣請查看淘寶,免費定制專案:
DEVELOPLINK
Air724核心板
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/226947.html
標籤:其他
