15个版本 (8个破坏性更新)
0.10.0 | 2023年2月10日 |
---|---|
0.7.0 | 2022年12月23日 |
0.1.0 | 2022年11月12日 |
#1283 在 解析器实现
每月75次下载
用于 hackdose-server
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