1个不稳定版本
0.3.0 | 2023年8月21日 |
---|
#7 in #amateur-radio
67KB
1.5K SLoC
ax25
本项目旨在为使用Rust编写跨平台数据包无线电软件提供所需的一切。
crate ax25
提供
- 编码和解码AX.25帧(目前支持v2.0)
- 支持
no_std
环境
crate ax25_tnc
提供
- KISS协议
- 通过多种方法连接到TNC,无需更改代码
快速入门
大多数开发人员将希望关注tnc::TncAddress
和tnc::Tnc
。
- 生成或请求用户提供一个地址字符串。其形式为
tnc:tcpkiss:192.168.0.1:8001
或
tnc:linuxif:vk7ntk-2
- 将该字符串解析为地址:
let addr = string.parse::<TncAddress>()?;
- 尝试打开TNC:
let tnc = Tnc::open(&addr)?;
- 使用
send_frame()
和receive_frame()
在无线电上进行通信。 Tnc
可以克隆以供多线程使用。
如果您的应用程序需要直接编码/解码AX.25数据,请参阅frame
模块。
示例
以下是一个包含的示例程序之一,listen.rs
。它是axlisten
的一个拙劣模仿。
use ax25_tnc::tnc::{Tnc, TncAddress};
use std::env;
use time::OffsetDateTime;
fn main() -> Result<(), Box<dyn std::error::Error>> {
let args: Vec<String> = env::args().collect();
if args.len() != 2 {
println!("Usage: {} <tnc-address>", args[0]);
println!("where tnc-address is something like");
println!(" tnc:linuxif:vk7ntk-2");
println!(" tnc:tcpkiss:192.168.0.1:8001");
std::process::exit(1);
}
let addr = args[1].parse::<TncAddress>()?;
let tnc = Tnc::open(&addr)?;
let receiver = tnc.incoming();
while let Ok(frame) = receiver.recv().unwrap() {
println!("{}", OffsetDateTime::now_utc());
println!("{}", frame);
}
Ok(())
}
它产生以下输出。请注意,在Linux接口中使用时必须以sudo
运行。
$ sudo ./target/debug/examples/listen tnc:linuxif:vk7ntk-2
2020-02-02 21:51:11.017220715 +11:00
Source VK7NTK-1
Destination IDENT
Data "hello this is a test"
上面的代码是针对 Ax25Frame
的 Display
实现 - 完整的协议信息可通过其字段获得,此处未打印。
路线图
计划功能
- 支持串行 KISS TNCs(物理、TNC-Pi、Dire Wolf 虚拟终端)
- Paclen 管理
- 更方便的发送/接收接口,用于处理 UI 帧
- 直接使用
kissattach
之外的 linux axports 接口