本文同步发表在 HamCQ 论坛:https://forum.hamcq.cn/d/4271
由于笔者比较社恐且不习惯直接喊话,因此在考 B 之前并未进行太多通联。在考取 B 证后笔者成为了社畜,加上住处电磁环境复杂导致购买了设备之后也没怎么使用过,直到前几天才在学弟的鼓励下开始尝试 FT8 通联,遇到了以下情况:
笔者苦于协谷 X6100 原生固件的不足,也没钱没空间买新的设备,因此希望寻找改进协谷 X6100 固件的方法,在一番搜索过后,笔者找到了协谷 X6100 的替代固件并兴致勃勃地摸索它的功能。笔者希望能趁着这股新鲜劲对业余无线电的一些基础知识和设备使用进行学习,本文则尝试简单介绍一下该替代固件和它的使用方法。
- 由于笔者并未充分掌握 X6100 原生固件的各种功能,在介绍替代固件时可能会重复介绍与原生固件一致的功能。
- 这是一篇使用方法兼吐槽性质的文章,如有不适,请关闭此页面。
介绍
协谷 X6100 替代固件最开始由 R1CBU 开发,根据介绍,该固件“旨在为协谷X6100 构建 Linux 内核和操作系统,而无需从供应商的内核中复制文件”。在更新 v0.20.0 版本的固件后,作者厌倦了继续开发:
我对这款收发器的质量不再满意。我不满意基于封闭代码的设备开发。我不想再浪费时间了。我决定暂停协谷 X6100 的固件开发,开发我自己的收发器,以消除这些缺陷。如果协谷突然有兴趣继续我的工作,我愿意与之沟通。
在那之后,R2RFE 进行了后续的开发工作,并继续 release 新的版本。
使用
使用方式很简单,下载作者提供的 sdcard.img,用 rufus 烧录至 MicroSD 卡中,插入到机器再开机即可进入替代固件。
功能
除了物理按键之外,对于使用者来说,有两个功能是最常用的,它们分别是 X6100 替代固件的图形界面和网页服务器功能,接下来会分别进行介绍。
如果您想看功能演示的视频教程,我会计划投稿一份演示视频。
物理按键
X6100 替代固件对正面左侧的按钮进行了一些自定义。尽管 R1CBU 的手册中已经有了部分描述,但已经较为过时了。下文将在他的手册基础上修改并添加描述:
VOL-SQL-RFG 旋钮
- 点按按钮可以锁定或解锁当前功能;
- 在锁定当前功能时旋转,可以切换当前功能的值;
- 在解锁当前功能时旋转,可以切换不同的功能:
- Volume:音量
- RF Gain:射频增益(0-100)
- Filter Low:控制解调数字滤波器的较低频率
- Filter High:控制解调数字滤波器的上限频率
- Power:发射功率
- H-MIC gain:手持麦克风增益
- 回到 Volume;
- 旋转按钮可以对上文所述的功能进行调整;
MFK 旋钮
- 点按按钮可以锁定或解锁当前功能;
- 在锁定当前功能时旋转,可以切换当前功能的值;
- 在解锁当前功能时旋转,可以切换不同的功能:
- Spectrum zoom:控制频谱的频率宽度和瀑布显示
- Spectrum beta:没搞懂
- Peak Hold:控制频谱峰值显示的时间
- Peak Speed:峰值速度
- 回到 Spectrum zoom;
GEN 按钮
- 包含若干个菜单
- 长按按钮将截屏并保存到 SD 卡中
- 点按按钮将在以下菜单切换:
- VOL 菜单:使用 VOL-SQL-RFG 旋钮修改选中的功能
- VOL 1/4
- Volume:音量
- Squelch:静噪级别
- RF Gain:射频增益(0-100)
- TX Power:发射功率
- VOL 2/4
- Filter low:控制解调数字滤波器的较低频率
- Filter high:控制解调数字滤波器的较低频率
- Filter BW
- SP mode:Speaker mode,没搞懂是什么
- VOL 3/4
- MIC Sel:Mic Select,可以选中手持麦克风或使用内置麦克风
- H-Mic gain:手持麦克风增益
- I-MIC gain:内置麦克风增益
- Moni lebel:没搞懂是什么
- VOL 4/4:这个级别菜单似乎是电台语音合成输出,与 RHVoice 有关,但笔者还未搞懂它的用法
- Voice:选择音色
- Voice Rate:声音速率
- Voice Pitch:没搞懂
- Voice Volume:声音音量
- VOL 1/4
- MFK 菜单:使用 MFK 旋钮修改选中的功能
- MFK 1/4
- Min Level:频谱和瀑布图显示的最小级别
- Max Level:频谱和瀑布图显示的最大级别
- Spectrum Zoom:控制频谱的频率宽度和瀑布显示
- Spectrum Beta:没搞懂
- MFK 2/4
- Spectrum Fill:频谱填充颜色
- Spectrum Peak:设置频谱峰值
- Peak Hold:控制频谱峰值显示的时间
- Peak Speed:峰值速度
- MFK 3/4
- Charger:控制电池充电器的状态,如果我没有猜错的话,它的值分别对应于:
- On:为电池充电
- Off:直接使用充电器,不为电池充电
- Shadow:没有搞懂,但根据这篇文章,猜测是仅在电池未充满时才会充电
- Antenna:没搞懂是控制什么的,调整范围为 1 到 5;
- RIT:receiver incremental tuning,接收机增量调谐
- XIT:transmitter incremental tuning,发射机增量调谐
- Charger:控制电池充电器的状态,如果我没有猜错的话,它的值分别对应于:
- MFK 4/4
- AGC hang:AGC 在更改之前等待的时间
- AGC knee:AGC 增益斜率变化的值
- AGC slope:AGC 的斜率值
- MFK 1/4
- MEM 菜单
- 共有两页共 8 个存储位置,可以用于存储频率和模式;
- 短按按键可以快速加载保存的频率,长按按键将保存当前的频率设置。
APP 按钮
- 包含三级菜单
- APP 1/3
- RTTY:启动 RTTY 模式
- FT8:启动 FT8 模式
- SWR Scan:对频段进行 VSWR 扫描
- GPS:通过外置 GPS 设备更新时间和地区等信息
- App 2/3
- Recorder:录音机
- QTH:设置 FT8 模式使用的地理位置信息
- Callsign:设置 FT8 模式使用的呼号
- Settings:机器设置界面
- App 3/3
- WiFi:设置 WiFi 信息
KEY 按钮
似乎是 CW 模式专用的,笔者短期内没有 CW 的想法,故该按钮的介绍跳过。
MSG 按钮
可以将录制的报文在当前频率上进行发送,不过多介绍。
DFN 按钮
- DFN,Digital Noise Filtering,数字噪声过滤
- 包含三级菜单
- DFN 1/3
- DNF:是否开启 DNF
- DNF freq:DNF 控制中心频率
- DNF width:DNF 控制滤波器宽度
- DFN 2/3
- NB:noise blanker,是否开启噪声抑制器
- NB level:噪声抑制器级别
- NB width:噪声抑制器宽度
- DFN 3/3
- NR:noise reduction,是否开启降噪
- NR level:设置降噪级别
图形界面
这里会简单介绍笔者常用的图形界面大致的功能。由于笔者目前只使用了其中的 FT8 功能,因此接下来会主要介绍 FT8 功能的图形界面。
在启动电台后,默认的界面(0.28.0 版本)如下图所示:
上方状态栏分为三个部分:
- 左侧的状态栏从左到右,从上到下分别为:
- VFO 记忆
- 通信模式
- AGC 模式
- 预 amp 升压器状态
- 自动天线调谐器状态
- WiFi 状态
- 中间的状态栏表示信号强度,在发射时会显示发射功率和天线驻波比;
- 右侧状态栏会显示时间和电量/电池电压。
屏幕中最大的就是频谱和瀑布图了,可以通过右侧最大的旋钮控制频率。
下方的功能设置就是由上文描述的物理按键控制的,非常简单易懂。
如果我们需要使用 FT8 功能,则先将时间调整为与现实时间误差不超过 1s 的状态,点击两次 APP 按钮,分别设置 QTH 和 Callsign,再次点击 APP 按钮进入 FT8 即可开始追台。
这里以与 BD4JN 济南黄河业余无线电集体台通联为例展示使用 X6100 替代固件进行 FT8 的流程。如下图所示,左侧信息为固件解析出的 FT8 信息,中间信息为设置 QTH 之后双方的距离,右侧信息为信号强度,发起 CQ 的呼叫被标注成了绿色。
我们在屏幕上看到 BD4JN 发起了 CQ,此时我们旋转 MFK 按钮到 CQ BD4JN OM86 这条信息上,按下 MFK 按钮,固件将在下个周期发起呼叫:
在屏幕上我们可以看到此时发射的天线和驻波比。在结束呼叫后,我们的呼叫信息会被标成蓝色,固件会等待下一轮周期对面的回复,如果存在对面的呼叫信息,则会将该呼叫信息标注成红色:
之后就可以继续通联,直到对面发送 RR73:
此时固件就会保存本次通联,并发送 73 结束:
在通联完毕后,该呼号会被记录进已通联电台的数据库中,在下次遇到该电台呼叫时,会在该电台上标记横线以避免重复呼叫:
网页服务器
在连接到 WiFi 后,可以在同网段的其他机器上输入 X6100 的 IP 地址进入网页服务器。目前网页服务器有以下几种主要功能:
接下来会一一介绍。
Bands
该功能是非数字模式下的波段编辑器,包含一些默认值:
在使用替代固件时,如果在默认的波段模式下使用机器上方切换波段的左右按键,则机器会在上面的波段中自动切换。在不同模式下作者还细心地设置了对应的频谱宽度,更方便使用。
如果有需要的话,可以添加对应的波段,保存之后就可以像上一段中所述的那样自动切换了。
Digital modes
该功能是数字模式下的频率编辑器,主要包含 FT8 和 FT4 两种模式,同样支持添加新的频率。
在使用替代固件时,如果在数字模式下使用机器上方切换波段的左右按键,则机器会在上面的频率中自动切换。
如果有需要的话,可以添加对应的频率和对应的模式,保存之后就可以像上一段中所述的那样自动切换了。
File browser
文件管理器,下载保存通联日志、通联数据、截图等文件。
ft_log.adi
:ft8/ft4 通联日志,可以上传到 LoTW 或 qrz.com 中;params.db
:一些参数信息,在跨版本更新 x6100_gui 时不推荐覆盖,可能出现奇怪的问题;qso_log.db
:保存了通联过的呼号,在下次 ft8/ft4 时可以不呼叫。
Time Editor
有时可能会遇到电台时间和实际时间不一致的问题,这种情况很容易触发:
- 有可能是手欠点了一下 FT8 菜单中的时间同步;
- 有可能是在没有互联网的情况下启动机器并开始 FT8;
- 有可能 NTP 服务器连接不上。
在这种情况下,系统中的 ntpd 不能为我们及时同步时间,进入设置调时间又实在是不利于视力保护。我在 issues 区中看到了有人也希望可以在 webserver 上进行时间同步,因此我实现了这一功能。
目前支持若干种时间同步方式:
同步本地时间
加载该页面时会自动获取当前电台的时间/时区和访问电台设备的时间,我们可以将本地时间同步到服务器上,这种同步方式会比正常时间慢几十到上百毫秒。
手动更新时间
这种方式和在电台设置中更新时间差不多,由于我比较懒所以只提供了直接输入字符串更新的方式。在比正常时间快 1 秒的时候点击更新时间会比较准确地与正常时间进行对齐。
通过 NTP 服务器更新时间
尽管在连接 WiFi 后设备会自动通过 NTP 同步一次时间,但 NTP 服务器可能无法连接,我们也可能希望手动设置 NTP 服务器,这里提供了几种常见的 NTP 服务器,也支持我们手动输入 NTP 服务器的地址。
更新时区
默认系统时间为 UTC,可以改成符合要求的时区。
其他功能
在连接 WiFi 后,可以 ssh 到目标机器上,默认用户名/密码为 root/123。(X6100 原生系统也可以这样进去,不过没有 DHCP 的话通过按钮设置 IP 实在是太痛苦了)
编译与自定义
笔者并没有 buildroot 的使用经验,因此该文章可能并不适合熟练或精通 buildroot 的老手。本文旨在尽可能快速地上手协谷 X6100 替代固件的各个功能,编译目标模块。
刷机可能造成数据丢失,或对机器造成不可逆转的损害。本文中的代码示例仅供参考,如在执行之后对机器造成损害,笔者概不负责。
编译整个固件
如需编译整个固件,在 AetherX6100Buildroot
下执行:
编译成功后,会在 build/images
目录下生成 sdcard.img。
自定义应用程序
在编译后,X6100 替代固件的目录结构中,我们关心的项目包括:
$ tree -L 2 ./
./
├── ...
├── br2_external
│ ├── ...
│ ├── board # 板子信息
│ ├── ...
│ └── package # 应用程序
├── br_config.sh
├── build
│ ├── ...
│ ├── images # 包含镜像文件
│ ├── ...
│ └── target # 目标
└── ...
如果我们希望自定义自定义已有的功能,可以先将目标功能 clone 到本地,然后修改 br2_external/package/<package name>/
下对应的 .mk
文件中的内容:
在修改代码后只需要在 build
目录下执行:
其中 <package name>
为目标应用程序的名称,即可在 build/target/
下找到新的代码。
例如 x6100_gui 位于 ./target/usr/sbin/x6100_gui
,x6100_webserver 位于 ./target/usr/lib/python3.11/site-packages/x6100_webserver/
。
理论上不必重新刷机,只需要 ssh 到机器上,做完整的替代之后重启服务或机器即可。
为固件添加功能
在开发一些小功能的过程中,笔者渐渐了解了 buildroot 的原理,尽管笔者有一些功能希望实现,但由于种种原因未能成功(也有的是只写了一半不想写了),在此进行记录。
在翻阅简单写了一个基于 losehu 固件的 UV-K5/K6 远程控制器这篇文章后,我尝试为网页服务器也添加一个基于 Websocket 的图形界面查看与管理,尝试使用 pillow 和 websockets 进行图形图像处理和前后端通信。为了添加这两个包,需要在 AetherX6100Buildroot/br2_external/configs/X6100_defconfig
中添加参数:
BR2_PACKAGE_PYTHON3_SSL=y
BR2_PACKAGE_PYTHON3_ZLIB=y
BR2_PACKAGE_PYTHON_WEBSOCKETS=y
BR2_PACKAGE_PYTHON3_PYEXPAT=y
BR2_PACKAGE_PYTHON_PILLOW=y
后才能在固件中使用。
为了实现远程界面查看和功能控制,需要每隔一段时间截图并发送到前端。X6100 的屏幕分辨率为 800x480,如果直接传输 png 的话一个图形文件大概有 500KB,感觉会比较庞大,因此笔者考虑将截图压缩成 jpg 或 webp 进行传输,这里遇到了两个问题:
如果压缩成 jpg,则会出现 pillow 版本需求和机器 libjpeg 版本不匹配的问题,因为 pillow 需要 libjpeg9+,而固件使用的 libjpeg-turbo 生成的则是 libjpeg8。
如果压缩成 webp,则需要在固件编译时添加 webp 库:
BR2_PACKAGE_WEBP=y
但就算这样,在真实运行时仍然无法让 pillow 找到已经安装好的 webp 库,原因未知。
如果说前面两个问题都比较好解决,实在不行我们可以降低帧率传输图像的话,最后一个问题笔者确实有些束手无策了。众所周知,在 Linux 上我们可以通过读 framebuffer 来获取当前屏幕的信息,因此笔者只是简单地实现了一个阅读 buffer 的逻辑:
而这样读到的截图长这个样子:
也就是说,这里读到的截图并不包含瀑布图。这实在是让笔者有些为难,因此笔者首先去查找了固件中自带的截图实现,位于 x6100_gui/src/screenshot.c
:
简单来说 LVGL 自己就实现了一个截图的 API,在开发基于 LVGL 的固件时只需要调用该 API 即可。虽然知道了固件的解决方案,但这并不能解决笔者遇到的问题。笔者并没有太多时间仔细阅读其中的 API 实现原理,因此只能将实现该功能的想法暂时搁置了,如果有哪位 HAM 感兴趣的话可以提示一下我接下来该怎么做。
简单总结
对于原生固件,在 FT8 上会遇到各种问题,包括但不限于
- 与 JTDX、WSJT-X 的连接问题
- 也有人提出了一些其它系统上使用的问题
- 无 DHCP,只能手动设置静态 IP 的问题
对于替代固件,可以使用内置的 FT8 进行通联,不过也有一些额外的问题:
- 内置 FT8 相比于 WSJT-X 能解析的报文数量更少,且解码结果可能不一致
- 不过替代固件在理论上也可以连接 WSJT-X
- Setting up WSJT-X with the X6100 (CAT and USB Audio)
- 如果有尝试成功的友台,欢迎补充这一部分
- 内置 FT8 功能逻辑实现有一些问题
- 在某些情况下不会记录对方的位置信息,暂时还未追查到具体原因
对于这台机器,它是一部价格相对友好,比较适合新 B 入门的电台。一个小包就能装得下电台、NanoVNA、充电宝和 12V 诱骗线,几乎可以做到想架台就架台了。作为 SDR 电台,它带有较为丰富的接口,不过固件仍有相当多不成熟的地方,只能说勉强可用吧。
有关 X6100,在 HamCQ 和国外论坛上都有很多讨论,感兴趣的读者可以看一看论坛中的文章。
在更换固件前,笔者用 FT8CN 控制 X6100,遇到了很多难以忍受的问题,最终只成功通联了 3 个电台,且只有两次通联是有效的(双方在 LoTW/QRZ 上确认);而在更换固件并使用内置 FT8 功能后,一小时内就成功完成了 20 次左右的通联,大大减少了挫败感。
未来展望
目前 X6100 替代固件并不成熟,还有很多可以添加的功能:
- WfView 功能似乎还未成熟:
- 有了 webserver 之后其实可以添加很多功能了,但目前缺少 x6100_gui 和 webserver 通信的接口和协议,无法在 webserver 上实时获取 gui 的状态;
- 最好能像 NanoVNA 或 UV-K5 的 Web 页面那样,能够在线控制电台;
- 自动上传到 LoTW
- 难点可能是怎样在网页上用密钥给 adi 文件签名,可能需要移植一下 tqsllib
其他资料
参考资料
- R1CBU X6100 User manual
- 重庆协谷科技X6100短波收发器用户手册
- XIEGU X6100 Change SSH Password (default - 123)
- FT8操作指南
PS:由于家里电磁环境过于恶劣+笔者在最近的周末已经超额完成了活动量,因此在写完这篇文章之后进入了业余无线电倦怠期,是时候找点新玩法了 XD