5个版本 (3个破坏性更新)
0.4.0 | 2020年1月5日 |
---|---|
0.3.0-alpha.1 | 2019年9月27日 |
0.2.1-alpha.1 | 2019年7月19日 |
0.2.0-alpha.1 | 2019年7月18日 |
0.1.0-alpha.1 | 2019年6月29日 |
#1187 in 异步
215KB
3.5K SLoC
ardop_interface
ARDOP TNC的异步Rust接口
简介
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_std
的unstable
特性的情况下构建。
先决条件
需要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 的站点间链接,电离层就是极限!
进一步阅读
许可:MIT OR Apache-2.0
依赖关系
~10–20MB
~299K SLoC