1 个不稳定版本
0.1.1 | 2023 年 12 月 5 日 |
---|---|
0.1.0 |
|
#12 in #lora
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