#amateur-radio #modem #ham #api-bindings #ardop

ardop_interface

业余无线电数字开放协议(ARDOP)接口

5个版本 (3个破坏性更新)

0.4.0 2020年1月5日
0.3.0-alpha.12019年9月27日
0.2.1-alpha.12019年7月19日
0.2.0-alpha.12019年7月18日
0.1.0-alpha.12019年6月29日

#1187 in 异步

MIT/Apache

215KB
3.5K SLoC

ardop_interface

ARDOP TNC的异步Rust接口

文档 | | Git

简介

ardop_interface与业余无线电数字开放协议(ARDOP)声卡调制解调器软件集成。ARDOP调制解调器旨在在短波(HF)无线电链路上提供可靠、低速的连接。

此包不是ARDOP。 此包仅是一个接口。通过此接口和独立的ARDOP调制解调器软件,您可以构建具有完整功能的Rust应用程序,并通过无线电进行通信。

最小示例

use std::net::SocketAddr;
use async_std::task;
use futures::prelude::*;

use ardop_interface::tnc::*;

fn main() {
   task::block_on(async {
        let addr = "127.0.0.1:8515".parse().unwrap();
        let mut tnc = ArdopTnc::new(&addr, "MYC4LL")
            .await
            .unwrap();
        let mut conn = tnc.connect("T4GET", 500, false, 3)
            .await
            .expect("TNC failure")
            .expect("Connection failed");
        conn.write_all(b"Hello, world!\n").await.unwrap();
        conn.close().await;
   })
}

请参阅源代码仓库中的examples/目录中的完整客户端和服务器。示例还演示了async_std包、参数解析和日志记录。

ARDOP调制解调器

像大多数业余无线电调制解调器一样,ARDOP设计用于通过声卡接口与模拟单边带(SSB)收发器接口。计算机(可能是一块简单的单板计算机)将数据转换为声音,反之亦然。

ARDOP设计用于

  • 自动重试失败的传输。这种操作模式称为自动重传请求 (ARQ),并有助于确保数据达到最终目的地。

  • 使用最快可用的模式,根据信号与噪声比和频段条件

  • 支持无人值守、自动站操作

  • 在短波(HF)频段上表现良好

最好的是,ARDOP有一个开放的开发模型。完整的协议规范可用,并且存在调制解调器的开源实现。

ARDOP旨在由获照的无线电爱好者使用。如果您想开始这项爱好,您应该找到您附近的俱乐部、“hamfest”或“hamvention”!

Rust接口

ARDOP软件为客户端提供了一个标准化的“终端节点控制器”(TNC)接口。为了使用TNC,客户端必须建立两个同时的TCP连接,并执行大量的序列化和反序列化操作。这个库为您处理了许多这些细节。

此库提供了一个许多Rust程序员熟悉的async API:套接字编程。设计ArqStream对象是为了模拟异步的TcpStream。一旦建立连接,数据通过从ArqStream对象异步读取和写入来交换。

async API允许ARDOP与原生TCP套接字、GUI和其他I/O过程共存,同时保持较小的系统资源占用。

开发状态

此库处于实验阶段。其API将不会稳定,直到ardop_interface可以在不使用async_stdunstable特性的情况下构建。

先决条件

需要Rust 1.40或更高版本。

获取ARDOP的兼容实现。您必须使用实现协议版本一的ARDOP软件。ARDOP v2规范已被其作者撤回,而版本三目前正在开发中。这个库所依赖的TNC接口可能会在主要版本发布期间发生变化。

以下说明假设使用John Wiseman的ardopc版本1。其他实现可能也能工作,但这个库尚未针对它们进行测试。您可能可以从http://www.cantab.net/users/john.wiseman/Downloads/Beta/TeensyProjects.zip或从ARDOP 论坛获得此软件。

您需要系统上的C/C++编译器来构建ardopc。基于Debian的发行版可以使用以下命令安装这些工具:

sudo apt-get install build-essential

解压缩存档,进入ARDOPC子目录,然后运行make来构建软件。对于Windows用户,还有一个Visual Studio项目。或者,您可以在http://www.cantab.net/users/john.wiseman/Downloads/Beta/找到二进制构建版本。

现在您可以调用ARDOP了

./ardopc PORT INDEV OUTDEV

其中

  • PORT是所需的TCP控制端口(通常是8515
  • INDEV是您的"线入"声卡端口的ALSA设备名称。如果您系统有pulseaudio,您可以使用pulse设备。
  • OUTDEV是您的"线路输出"声卡端口的ALSA设备名称。如果您系统有pulseaudio,您可以使用pulse设备。

运行示例

示例未发布到crates.io.您需要克隆我们的源代码库

git clone https://github.com/cbs228/ardop_interface.git

为了对ARDOP进行本地测试,您必须运行两个ARDOP调制解调器实例。为了在这两个调制解调器之间建立声学通道,请将麦克风靠近您的扬声器放置。或者,在Linux上,您也可以使用PulseAudio的null sink

pacmd load-module module-null-sink sink_name=Virtual1
pacmd set-default-sink Virtual1
pacmd set-default-source Virtual1.monitor

ardopc是为ALSA声API设计的。当与pulseaudio一起运行时,性能可能会降低。在某些系统上,在ardopc运行时保持pulseaudio音量控制程序(pavucontrol)打开可能有所帮助。

启动两个ardopc实例

./ardopc 8515 pulse pulse &
./ardopc 8520 pulse pulse &

使用以下命令构建和运行echoserver

cargo run --package echoserver -- localhost:8515 MYCALL-S 200

MYCALL 替换为您的呼号。-S 是一个服务集标识符 (SSID),它是对您的呼号的任意单个字符扩展。

现在使用以下命令运行 echoclient

cargo run --package echoclient -- localhost:8520 MYCALL-C MYCALL-S 200

echoclient 将发送一些预编程的文本段落到 echoserver,该服务器将回显它们。客户端和服务器都会将它们的进度打印到标准错误。如果客户端打印以下内容,则演示成功:

Echo server echoed all stanzas correctly.

您还可以通过行定向的聊天程序,如 ARIM,交互式地使用 echoserver

完成操作后,如果您使用过它,请删除空汇。

pacmd unload-module module-null-sink

不支持的 ARDOP 功能

目前,这个包只支持 ARDOP 的连接协议 ARQ,类似于 TCP。ARDOP 还有一个无连接的 FEC 协议,类似于 UDP。《ardop_interface》目前不支持 FEC 模式。

以下其他功能目前没有实现。

  • 设备控制:目前没有集成任何类型的设备控制。这个包目前无法提供以下功能。

    • 调谐ardop_interface 对您的设备一无所知,无法调整其频率或模式。

    • 键控:这个包不会键控您的无线电的 PTT。ARDOP TNC 可能能够为您完成这项工作。《ardopc》可以通过串行连接键控发射器。

    • 扫描:在 LISTEN 模式下,ARDOP 频率敏捷性/扫描功能不受支持

下一步

您希望在空中看到哪些类型的协议?有了可靠的、类似 TCP 的站点间链接,电离层就是极限!

进一步阅读

  • tnc:通过 ArdopTnc 主要 TNC 命令和控制
  • arq:通过 ArqStream 可靠的 ARQ 连接

许可:MIT OR Apache-2.0

依赖关系

~10–20MB
~299K SLoC