14 个版本

新版本 0.0.13 2024年8月18日
0.0.12 2024年8月14日
0.0.11 2024年7月7日
0.0.10 2024年6月15日
0.0.3 2024年3月26日

5#wire 中排名

Download history 96/week @ 2024-05-18 230/week @ 2024-05-25 523/week @ 2024-06-01 40/week @ 2024-06-08 238/week @ 2024-06-15 9/week @ 2024-06-22 127/week @ 2024-07-06 6/week @ 2024-07-13 109/week @ 2024-08-10

109 每月下载量
用于 m-bus-parser-cli

MIT 许可证

180KB
3.5K SLoC

m-bus-parser (有线)

Discord Crates.io Downloads License Documentation Build Status

简介

有关贡献,请参阅 CONTRIBUTING.md

m-bus-parser 是一个开源解析器(有时也称为解码器或反序列化器),用于解析 有线 m-bus 协议,并使用 Rust 编写。

"M-Bus 或仪表总线是欧洲标准(EN 13757-2 物理和链路层,EN 13757-3 应用层)用于远程读取水、燃气或电力表。M-Bus 也可用于其他类型的消耗仪表,如供暖系统或水表。M-Bus 接口是为在两根线上进行通信而设计的,使其具有成本效益。" - 维基百科

过时的规范可以在 m-bus 网站 上免费获得。这是一份了解协议的好起点。已经有很多其他规范的实现。

此外,开放计量系统(OMS)小组已发布 m-bus 协议的规范。该规范可在 OMS 网站 或更具体地 此处 免费获取。

例如,不再维护的 rscada 编写的 m-bus 编码器和解码器,使用 C 编写,jMbus,使用 Java 编写,Valley.Net.Protocols.MeterBus,使用 C# 编写,tmbus,使用 JavaScript 编写或 pyMeterBus,使用 Python 编写。

依赖和部署

NPM Wasm 包

npm npm

解析器已作为 npm 包发布,并可在浏览器中使用。示例请参阅网址 https://maebli.github.io/m-bus-parser/

源代码位于本仓库的wasm文件夹中

CLI rust crate

Crates.io Downloads

存在一个命令行界面(CLI),源代码位于子文件夹“cli”中,并在crates.io上发布:https://crates.io/crates/m-bus-parser-cli

库函数的可视化

不要混淆不同类型的帧类型。最初需要理解的是最常见的帧类型 LongFrame。其他类型例如用于搜索从机或设置从机主地址。这对于大多数用户来说不是主要兴趣所在。可视化是在工具 excalidraw 的帮助下制作的。

序列化应用层的可视化

上面的序列化应用层可以进一步分解为可解析的部分。

值信息块序列化

目标

开发状态

该库目前正在开发中。它能够解析链路层但不能解析应用层。下一个目标是解析应用层。一旦实现,该库将作为 v0.1.0 发布。在达到此里程碑后,将设定进一步的目标,例如解密。

当前函数示例

示例取自 https://m-bus.com/documentation-wired/06-application-layer

  1. 将从机设置为地址8,而不更改其他任何内容

输入: 68 06 06 68 | 53 FE 51 | 017A08 | 25 16

使用库解析帧(数据目前还不能用库解析)

   
    use m_bus_parser::frames::{Address, Frame, Function};

    let example = vec![ 
        0x68, 0x06, 0x06, 0x68, 
        0x53, 0xFE, 0x51, 
        0x01, 0x7A, 0x08, 
        0x25, 0x16,
    ];

    let frame = Frame::try_from(example.as_slice()))?;

    if let Frame::ControlFrame { function, address, data } = frame {
        assert_eq!(address, Address::Broadcast { reply_required: true });
        assert_eq!(function, Function::SndUd { fcb: (false)});
        assert_eq!(data, &[0x51,0x01, 0x7A, 0x08]);
    }

依赖关系

~0.6–11MB
~110K SLoC