#codes #group #defined #standard #iec #parse #no-alloc

无std obis

根据IEC 62056-61标准与OBIS代码一起工作

1个稳定版本

使用旧的Rust 2015

1.0.0 2023年6月14日

#1537解析器实现

ISC OR Apache-2.0

25KB
467

obis包提供了解析器和工具,用于处理IEC 62056-61标准定义的OBIS代码。

该包是no_std,使其适用于嵌入式环境和物联网用例。

示例

IEC 62056-61定义了两种OBIS代码。一种是包含所有组的完整代码。这种代码并不特别受欢迎,但它是不含糊的,且不需要上下文来解释。为了解析这些代码,请使用Code类型

use obis::Code;

let input = b"0-0:1.0.0*255";
let (code, _remainder) = Code::parse(input).expect("valid code should parse successfully");
assert_eq!(code.a, 0);
assert_eq!(code.c, 1);
assert_eq!(code.f, 255);

请注意,目前的实现需要使用可能与您的应用程序中使用的不同的分隔符。欢迎提出描述不同用例的问题和更改行为的PR!

附件A中定义了一种简化的OBIS代码。此代码允许省略OBIS代码的某些部分,但这样做会使代码的解释变得上下文相关。例如,您可能需要知道标识符是否来自电表或气表,才能完全解释数据。至少在面向最终用户的世界中,这些代码的使用更为广泛,因此您很可能还想使用ReducedCode

use obis::ReducedCode;

let input = b"0-0:1.0.0(12345)";
let (code, remainder) = ReducedCode::parse(input).expect("valid code should parse successfully");
assert_eq!(code.a(), Some(0));
assert_eq!(code.f(), None);
// groups C and D are mandatory.
assert_eq!(code.c(), 1);
// The remainder can be further parsed as deescribed below.
assert_eq!(remainder, b"(12345)");

请注意,Code::parseReducedCode::parse都会产生一个未解析的缓冲区余量。这对于应用程序以及处理使用OBIS代码的协议特别有用,因为它们通常会将OBIS代码插入到协议的更广泛语法中。返回余量允许在单次遍历中解析整个数据,而无需首先确定组成部分。

依赖项

~180KB