#message #wireless #lora #data #protocols #parts #networking

no-std bin+lib orouter-wireless

Overline 网络无线协议的实现

1 个不稳定版本

0.1.1 2023 年 12 月 5 日
0.1.0 2023 年 12 月 4 日

#12 in #lora

MIT 许可证

39KB
646

orouter-wireless (ōRouter 无线协议)

定义和实现 oRouter 物理无线层使用的协议(目前使用 LoRa)

应用层消息理论上可以无限多,但 LoRa 一次只能传输 255B。此协议负责将消息拆分为适当的部分,并添加必要的信息,以便在接收端所有部分到达时可以重新组合。

crate::MessageSlicer 负责拆分部分,并在使用 oRouter 传输数据之前使用。 crate::MessagePool 在接收端使用,将应用层/逻辑消息的部分组合在一起以形成原始消息。注意,部分不需要按顺序到达,只需要所有部分最终都要到达。

crate::WirelessMessagePart 代表使用 oRouters 无线芯片传输/接收的原始数据块。此包实现并使用以下方案进行消息部分

名称 字节数 描述
网络字节 2 网络字节。始终为 0xAA 0xCC(将在下一个版本中可配置)
哈希值 6 哈希值 - 前 3B 是随机的,后 3B 将消息的部分组合成一个前缀
部分号 1 部分号 1、2 或 3(仅支持 3 部分消息)
总计数 1 具有此前缀的消息的总数
长度 1 数据长度
消息类型 1 Overline 消息类型
数据类型 1 字节识别数据类型,如果前一个字段是数据
数据 1 - 240 实际数据
CRC16 2 整个消息(标题 + 数据)的 CRC16

使用 crate::MessageSlicer 拆分数据以进行无线传输的示例

use orouter_wireless::{MessageSlicer, MessageType, network};

fn main() {
    // VVV in practice provide a good random seed here VVV
    let mut slicer = orouter_wireless::MessageSlicer::new(1234u64, network::DEFAULT);
    let messages = slicer
        .slice(&[0xc0, 0xff, 0xee], MessageType::Data, 0x01).unwrap();
    println!("slices = {:?}", messages);
}

使用 crate::MessagePool 从接收到的消息部分组装数据的示例

use orouter_wireless::MessagePool;

fn main() {
    let mut message_pool = MessagePool::default();
    // this represents a message part received from oRouter
    //
    // in this example, there is 1 part of total 1 forming the whole message, because the data
    // contained in the message are short
    for part in vec![
        vec![
            0xaa, 0xcc, 0x1b, 0xf2, 0x73, 0x86, 0x80, 0xe1, 0x01, 0x01,
            0x05, 0x01, 0x01, 0x41, 0x48, 0x4f, 0x59, 0x21, 0x53, 0xef
        ]
    ] {
        match message_pool.try_insert(part.clone()) {
            Ok(Some(message)) => assert_eq!(message.data(), b"AHOY!"),
            Ok(None) => {}
            Err(_) => {
                eprintln!(
                    "error while trying to insert message = {:02x?}",
                    part
                )
            }
        }
    }
}

依赖关系

~22–720KB
~13K SLoC