AIR724 4G模块Modbus网关,实现MODBUS 和 MQTT任意透传

AIR724模块Modbus网关,实现MODBUS 和 MQTT、HTTP任意透传,对接OneNET、Aliyun、EMQTT

今天介绍重点功能,Modbus转MQTT网关。Modbus及DL645十分常用,但是现在主流通信协议已经是MQTT,实现modbus和mqtt双向映射非常有用。
固件和代码请查看Gitee, 对物联网技术感兴趣请加入我们交流群,欢迎各种技术交流,免费白嫖 QQ群: 830407941


对我们产品感兴趣请查看淘宝,免费定制项目
DEVELOPLINK ______ Air724核心板


网关架构

功能设计
在这里插入图片描述
配置页面
在这里插入图片描述

DTU作为网关设备,实现Modbus RTU数据包和Json字串的映射,主要特征为:

  • 支持的Modbus功能码:01,02,03,04,05,06,16
  • 支持的Modbus数据类型:Short,Long, Float, BCD, Coils
  • 支持的字节顺序:ABCD CDAB BADC DCBA
  • 定义通用参数: 串口号、串口超时
  • 以设备为单位定义采集指令,包含:采集周期,采集指令
  • 以寄存器为单位定义映射字段,字段在不同设备之间需要保持唯一
  • 上传通道功能: 按设计周期定时采集数据,校验CRC和超时,读取成功后转换为对应字段,按照设计的立即上传还是缓存上传上报数据
  • 下行通道功能:接收下发的Json数据后,查询对应字段配置的设备ID和寄存器格式,组包后发送给设备

功能特点

  1. 自由设置采集指令,及对应Json字段
  2. 支持多个设备的混合组包,不同设备组成同一个Json
  3. 支持多种寄存器格式,包含Short,Long,Float及字节顺序,和Modbus Slave软件一致
  4. 无比强大钩子函数,结合远程脚本,可以实现任何设备的读取,数据计算、转换,任意格式的数据组包,直接对接任意云平台

使用实战

基本使用-连接到EMQTT Server
  1. 准备:
  • 串口1通过485连接到Modbus Slave
  • Modbus Slave设备ID为1,设置寄存器长度10
    配置如图
    在这里插入图片描述
  1. EMQ Mqtt连接配置
    没什么好说的,测试服务器
    在这里插入图片描述
  2. 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
  1. 准备
    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核心板

Modbus是一种常用的通信协议,而MQTT则是一种轻量级的消息传输协议。如果需要将Modbus数据换成MQTTJSON格式,可以采用以下步骤: 1. 通过Modbus协议读取数据,并获取需要换的数据。 2. 将数据换成JSON格式。 3. 使用MQTT协议发送JSON格式的数据到指定的MQTT服务器。 以下是一个简单的Python代码示例,可以将Modbus数据换成MQTTJSON格式: ```python import paho.mqtt.client as mqtt import json import struct from pymodbus.client.sync import ModbusTcpClient # Modbus服务器地址和端口号 SERVER_HOST = '127.0.0.1' SERVER_PORT = 502 # MQTT服务器地址和端口号 MQTT_HOST = 'localhost' MQTT_PORT = 1883 # MQTT主题 MQTT_TOPIC = 'modbus/json' # Modbus数据地址和长度 MODBUS_ADDRESS = 0 MODBUS_LENGTH = 2 # 连接到Modbus服务器 client = ModbusTcpClient(SERVER_HOST, SERVER_PORT) client.connect() # 读取Modbus数据 result = client.read_input_registers(MODBUS_ADDRESS, MODBUS_LENGTH) # 换数据为JSON格式 data = { 'value1': struct.unpack('>f', result.registers[0:2])[0], 'value2': struct.unpack('>f', result.registers[2:4])[0], } json_data = json.dumps(data) # 发送JSON数据到MQTT服务器 mqtt_client = mqtt.Client() mqtt_client.connect(MQTT_HOST, MQTT_PORT) mqtt_client.publish(MQTT_TOPIC, json_data) # 关闭连接 client.close() mqtt_client.disconnect() ``` 在上面的代码中,我们使用了pymodbus和paho-mqtt两个Python库,分别用于读取Modbus数据和发送MQTT消息。具体地,我们使用ModbusTcpClient连接到Modbus服务器,读取指定地址和长度的数据,并将其换成JSON格式。然后,我们使用paho-mqtt库连接到MQTT服务器,将JSON格式的数据发布到指定主题。最后,我们关闭连接,释放资源。
评论 7
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值