APRS-IS 文档(中文)

官方文档的中文整理:怎么连上网络,登录行怎么写,UDP 和只发端口怎么用。过滤器、网关细则和 q 构造另开了三页。

连上 APRS-IS

用法就一件事:拿一个客户端,连到某台服务器的一个端口上。端口选哪个,决定你能收到多少、以及能不能发。

APRS-IS 是互联网那一侧的那张网。各地的服务器互相转发收到的包,连上其中一台,就等于站在整张网里:收得到别人的包,验证通过之后自己发的包也会被转发出去。每台服务器都有状态页,浏览器打开 http://服务器地址:14501,开了哪些端口一目了然。

  • 14501 HTTP 状态页。javAPRSSrvr 系的服务器在这上面还可能顺带开着 HTTP 只发端口与 WebSocket。
  • 10152 TCP 全量 feed:所有包都推给你。每秒几十个包,带宽很快顶满,多数客户端撑不住,别长期挂着;真要接,先想清楚拿来干什么。
  • 14580 自定义过滤 feed,日常最常用。默认只给你「发给你的消息」和「你的网关收上来的包」,其余靠 filter 命令一条条加,写法见APRS-IS 过滤器。这是双向端口:验证通过后你发的包也会进 APRS-IS(FireNet 的服务器除外)。
  • 23000 TCP 全量 feed,但客户端必须在登录行里声明自己收包的 UDP 端口。核心服务器都支持。
  • 8080 HTTP 和/或 UDP 只发端口,标准 HTTP 端口;javAPRSSrvr 系在这上面还支持 WebSocket。

双向客户端连 APRS-IS 时要关掉 Nagle(TCP_NODELAY),不然收发会明显延迟。只想先看看、不打算发射,也要用自己的呼号,passcode 填 -1 就表示只收。

本页根据官方的 Connecting to APRS-IS 整理。端口和参数跟着官方走,措辞按中文习惯重写。要填一遍,见先在手机上听那一节。

登录行怎么写

连上之后服务器先给一行 # 开头的声明,接着轮到你报名字。这一行写对了,服务器才认你,也才决定给不给你发包的权限。

登录行就是一行纯文本,关键字后面跟参数,方括号里的部分可以省,但顺序不能换。只有 user 和 pass 是必须的。

  • 格式 user 呼号[-SSID] pass passcode [vers 软件名 版本 [UDP 端口][服务器命令]] user 是你自己的呼号(连 SSID),pass 是算出来的 passcode;vers 后面跟软件名和版本号,各写一个词、不能有空格。
  • 一个只收的例子(连 14580) user AE5PL-TS pass -1 vers testsoftware 1.0_05 filter r/33.25/-96.5/50 pass -1 表示只收不发。末尾那段是服务器命令,这里让服务器把 33.25N 96.5W 五十公里内的台站包都推过来,写法见APRS-IS 过滤器。
  • user 呼号与 SSID。SSID 可以省,省掉就等于 0,别写成 -0。整个 APRS / AX.25 里,这个标记必须是唯一的。
  • pass 用呼号算出来的 passcode。-1 只收不发;要发数据就必须填有效 passcode,否则服务器只批你收。
  • vers 客户端软件名与版本号,各一个词、不能有空格。服务器靠它统计谁在连,也靠它找你。
  • UDP 想让服务器用 UDP 给你发包,这里写本机监听的端口号。
  • 服务器命令 给服务器看的指令,最常见的就是 filter。可以带空格。

呼号和 SSID 有几条硬规矩。只能用 ASCII 字母数字,中间最多一个连字符加一两位 SSID。呼号本体至少 3 位,连上 SSID 不超过 9 位。大小写都收,但服务器按大写算同一个台站。发消息、上射频、给 Yaesu 电台发消息,都要求大写,SSID 也要写成 AX.25 的 0–15,同样不用 -0。拿不准就一律大写。

passcode 的算法官方文档没有公布,各家开源客户端都在本地按同一套老算法算。填上自己的呼号,passcode 计算器也能算出来。这道门槛的作用,是让 APRS-IS 只留给业余无线电使用,别拿别人的呼号登服务器。

服务器回的注释行都以 # 开头,客户端直接忽略。登录成没成功也在里面,例如 #login AE5PL-TS unverified 就是只收。空闲一阵子,服务器还会定期发 # 开头的行探活。

最后一条:发进 APRS-IS 的包必须是 TNC2 格式、以回车换行结尾,一整行不超过 512 字节(含回车换行)。没有效 passcode 的客户端发什么都没人收。

UDP 收包、只发端口、HTTP 与 WebSocket

除了老老实实走 TCP 收发,还有几种接法:收包可以走 UDP,发包可以走只发端口,网页端和自建台站还能用 HTTP 或 WebSocket。

收包走 UDP:在登录行里写上 UDP 端口,服务器就把每个包单独装进一个 UDP 报文发给你(包尾不带回车换行),同时留着那条 TCP 连接判断你还在不在。这条通道是单向的:客户端从不通过 UDP 往服务器发东西。万一服务器不支持,它会忽略这个参数,照旧用 TCP 发给你。

只发端口是给气象站、信标机这类只往外报数的台站用的,HTTP POST/PUT、UDP、WebSocket 都有。它一个包也收不到,所以过滤器用不上;从这类端口进来的包会带 qAO 或 qAU 这两个构造。内容很简单:登录行(或者 Authorization 头)后面跟一行或多行 TNC2 格式的报文。

  • HTTP 只发的一个例子 user TEST-1 pass -1 vers TestSoftware 1.0 TEST-1>APRS,TCPIP*:>This is a test packet 官方文档里的例子。它演示的是反面:passcode 写 -1,包不会被 APRS-IS 接受;只发端口同样要有效 passcode。

认证有两种放法:登录行写在 HTTP 内容里,或者放进 Authorization 头。头里可以是 Base64 编码的登录行,也可以是 RFC 7617 的 Basic 认证,用户名写呼号-SSID,密码写 passcode。Base64 不是加密,要安全就配合 HTTPS 用。

  • 200 / 204 200 是状态页取到了;204 是登录与报文都通过,包已经进服务器,响应头 X-Packetsrcvd 会告诉你成功收下几条。
  • 401 / 403 401 是认证方式或数据不对,403 是 passcode 不对。
  • 409 这个呼号已经在这台服务器上登录了,先断开旧连接再来。
  • 411 / 413 / 415 / 417 内容长度缺失、超过 8192 字节、Content-type 不是 application/octet-stream、长度和实际收到的对不上。
  • 405 / 404 405 是方法不支持(只认 HEAD / GET / POST / PUT),404 是路径不存在。

WebSocket 只有 javAPRSSrvr 系的服务器支持,用起来和普通 TCP 端口一样。不写协议名就是 readwrite,等于 14580 那种自定义过滤;要退历史包就声明 history,并在登录行里带 filter。服务器只发二进制消息,包里可能出现非 UTF-8 内容。客户端发文本或二进制都行。从网页发起连接时,官方希望软件名填站点名、版本号填页面名或脚本名,服务器就能知道包从哪来。

本页由官方的 Client UDP、Send-only Ports 与 Connecting to APRS-IS 三篇整理而来。端口和返回码以原文为准。