3 个版本 (破坏性)
0.3.0 | 2024年7月12日 |
---|---|
0.2.0 | 2022年9月9日 |
0.1.0 | 2022年8月30日 |
#342 in 网络编程
130 每月下载量
67KB
1.5K SLoC
ModbusMQTT
Modbus 设备与 MQTT 之间的桥梁。
目前还处于早期阶段,但计划是
- 支持自定义 Modbus 传输(Sungrow WiNet-S 已实现)
- Modbus RTU 尚未测试,因为我没有串行 Modbus 设备,但从理论上讲应该可以工作。请告诉我
- 支持读取输入寄存器
- 支持读取保持寄存器
- 支持 设置 保持寄存器
- 支持可选自动配置 Home Assistant 实体,包括使用 MQTT Number 等为保持寄存器,允许设置值。
- TLS MQTT 连接
- WebSocket MQTT 连接
注意:目前不支持 MQTTv5。
安装
从源码安装
目前,使用 cargo install
是安装的最简单方法。要么在最新开发版本的签出中运行它,要么运行 cargo install modbus-mqtt
以安装最新版本。
预编译版本
如果您不想设置 Rust 工具链,您很可能在上述 GitHub Actions 标签 中找到构建的二进制文件作为构建工件。
Docker
$ docker run -it --rm bjeanes/modbus-mqtt:edge --help
标签
v#
,v#.#
,v#.#.#
- semver 版本(major.minor.patch
)latest
- 对应于最新的 semver 标签构建edge
- 来自main
的最新可构建分支,可能是不稳定的*-alpine
- 上面的 alpine 版本
运行中
启动二进制程序,传递给MQTT服务器的URL,包括任何凭证
$ modbus-mqtt mqtt://$MQTT_HOST[:$MQTT_PORT]/[$CUSTOM_MODBUS_TOPIC]
当前支持的协议仅为 tcp://
/mqtt://
,但打算支持: mqtts://
、ssl://
/tls://
、ws://
和wss://
。
ModbusMQTT监控并发布的默认主题是modbus-mqtt
。您可以通过更改MQTT URL的路径部分来更改此主题。
此外,您可以通过使用查询参数来更改其他MQTT选项,例如设置自定义的client_id
"mqtt://1.2.3.4/?client_id=$CUSTOM_CLIENT_ID"
有关支持的选项的完整列表,请检查MQTT客户端库的源代码。
连接到Modbus设备
要连接到Modbus设备,您需要将连接详情发布到MQTT的$prefix/$connection_id/connect
主题下。这些消息应该被标记为保留,这样当ModbusMQTT重启或崩溃时,它会重新连接到您的设备。
例如,一个简单的配置可能如下
// PUBLISH modbus-mqtt/solar-inverter/connect
{
"host": "10.10.10.219",
"proto": "tcp",
}
如果连接成功,您将看到如下消息发送到MQTT服务器
// modbus-mqtt/solar-inverter/state
"connected"
完整的连接示例
请检查examples/
目录中的示例,并请随时分享您自己的示例,注明相应的供应商/设备信息。
以下JSON包含所有支持的连接配置字段,其中可选字段显示默认值。
{
// Common fields
"address_offset": 0, // optional
"unit": 1, // optional, aliased to "slave"
// TCP:
"proto": "tcp",
"host": "1.2.3.4",
"port": 502, // optional
// RTU / Serial:
"proto": "rtu",
"tty": "/dev/ttyACM0",
"data_bits": "Eight", // optional (TODO: accept numeric and lowercase)
// valid: Five, Six, Seven, Eight
"stop_bits": "One", // optional (TODO: accept numeric and lowercase)
// valid: One, Two
"flow_control": "None", // optional (TODO: accept lowercase)
// valid: None, Software, Hardware
"parity": "None", // optional (TODO: accept lowercase)
// valid: None, Odd, Even
// Sungrow WiNet-S dongle
"proto": "winet-s",
"host": "1.2.3.4",
}
监控寄存器
向$MODBUS_MQTT_TOPIC/$CONNECTION_ID/$ADDRESS
发送以下负载(可选字段显示默认值)
{
"address": 5123, // REQUIRED
"register_type": "input", // OPTIONAL
"name": null, // OPTIONAL - gives the register a name which is used in the register MQTT topics (must be a valid topic component)
"interval": "1m", // OPTIONAL - how often to update the registers value to MQTT
// e.g.: 3s (every 3 seconds)
// 2m (every 2 minutes)
// 1h (every 1 hour)
"swap_bytes": false, // OPTIONAL
"swap_words": false, // OPTIONAL
"type": "s16", // OPTIONAL
// valid: s8, s16, s32, s64 (signed)
// u8, u16, u32, u64 (unsigned)
// f32, f64 (floating point)
"scale": 0, // OPTIONAL - number in register will be multiplied by 10^(scale)
// e.g.: to turn kW into W, you would provide scale=3
// to turn W into kW, you would provide scale=-3
"offset": 0, // OPTIONAL - will be added to the final result (AFTER scaling)
}
寄存器缩写
在发出connect
负载时,您可以可选地包含一个顶级的registers
数组,包含上述寄存器模式。如果存在,这些负载将作为如果用户分别指定了每个寄存器一样,被重播到MQTT服务器。
这是指定连接的推荐方式,但寄存器被分开列出,以便它们也可以动态添加。
开发
TODO:设置类似于https://hub.docker.com/r/oitc/modbus-server的东西以进行测试
类似的项目
依赖关系
~9–23MB
~361K SLoC