#parser #messages #sml #meter #smart #language #sml-parser

hackdose-sml-parser

智能电表使用的智能信息语言解析器

15个版本 (8个破坏性更新)

0.10.0 2023年2月10日
0.7.0 2022年12月23日
0.1.0 2022年11月12日

#1283解析器实现

Download history 24/week @ 2024-04-02

每月75次下载
用于 hackdose-server

MIT/Apache

72KB
1K SLoC

Hackdose SML-parser

ISKRA™智能电表等设备发出的SML消息的解析器。它目前使用peg-crate将SML表示为解析表达式语法。它还包括OBIS号码映射。

用法

此crate有三种不同的版本

消息流

这可能是最常见的应用:将异步字节流转换为SML消息流。请参阅examples/serial-stream.rs中的示例。

传输

此层处理从原始字节流中的SML消息流。

应用

application模块消耗已解析的SML消息体。

一旦您获得了SML设备(例如智能电表)的数据,您可以使用库如下

use hackdose_sml_parser::application::{
    domain::AnyValue, domain::SmlMessageEnvelope, obis::Obis, parser::parse_body,
};

pub fn find_total_power(body: &[u8]) -> Option<i32> {
    let result = parse_body(body);
    let result = result.ok()?;
    for list in result.messages {
        match list {
            SmlMessageEnvelope::GetOpenResponse(_) => continue,
            SmlMessageEnvelope::GetListResponse(body) => {
                let values = &body.value_list;
                let usage = values.iter().find(|value| {
                    value.object_name == Obis::SumActiveInstantaneousPower.obis_number()
                });

                if let Some(usage) = usage {
                    if let AnyValue::Signed(value) = usage.value {
                        return Some(value as i32);
                    }
                }
            }
            SmlMessageEnvelope::GetCloseResponse => continue,
        }
    }
    return None;
}

致谢

库内部的大部分工作实际上是由Kevin Mehall的peg crate完成的。我还欠Stefan Weigert关于SML协议的出色博客文章,它使我能够逐步开发语法,而不是首先阅读80页的规范

贡献

任何贡献都将受到高度赞赏。我发布了这个库(它是hackdose的一部分),以节省大家为实施另一个解析器而进行的努力,并将注意力集中在更有趣的任务上。

许可证

此crate可在MIT和Apache 2许可证下双授权,任选其一。

依赖关系

~3–5MB
~83K SLoC