#amateur-radio #ham-radio #radio #packet #ham #amateur

ax25_tnc

通过数据包无线电TNC发送和接收AX.25

1个不稳定版本

0.3.0 2023年8月21日

#7 in #amateur-radio

Apache-2.0

67KB
1.5K SLoC

ax25

crates.io crates.io docs.rs docs.rs

本项目旨在为使用Rust编写跨平台数据包无线电软件提供所需的一切。

crate ax25提供

  • 编码和解码AX.25帧(目前支持v2.0)
  • 支持no_std环境

crate ax25_tnc提供

  • KISS协议
  • 通过多种方法连接到TNC,无需更改代码

快速入门

大多数开发人员将希望关注tnc::TncAddresstnc::Tnc

  1. 生成或请求用户提供一个地址字符串。其形式为
    tnc:tcpkiss:192.168.0.1:8001
    tnc:linuxif:vk7ntk-2
  2. 将该字符串解析为地址:let addr = string.parse::<TncAddress>()?;
  3. 尝试打开TNC:let tnc = Tnc::open(&addr)?;
  4. 使用send_frame()receive_frame()在无线电上进行通信。
  5. 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"

上面的代码是针对 Ax25FrameDisplay 实现 - 完整的协议信息可通过其字段获得,此处未打印。

路线图

计划功能

  • 支持串行 KISS TNCs(物理、TNC-Pi、Dire Wolf 虚拟终端)
  • Paclen 管理
  • 更方便的发送/接收接口,用于处理 UI 帧
  • 直接使用 kissattach 之外的 linux axports 接口

依赖项