簡單寫一些,以示鼓勵。
使用小型天線接收衛星的無線電愛好者,一定會經歷以下情況:一方面,他必須手持天線,並在「look4sat」上查看衛星的位置;另一方面,他需要注意調整多普勒頻率;同時,還要傾聽和記錄對方說的話,這使得操作變得非常困難,而且常常感到頭昏腦脹。如果使用線性放大器接收衛星訊號,情況會更加複雜:在沒有完善的 CAT 控制的情況下,由於多普勒頻偏,發送和接收的頻率方向相反,若不加以調整,很容易導致訊號丟失,甚至超出頻帶範圍。雖然手工操作可以展現無線電愛好者的技術,但使用電腦自動控制是否更為方便?
實際上,現代廣播電臺高度依賴電腦輔助收發,這是一個方便的地方。有了電腦參與,只需用滑鼠就能更換頻率、修改VFO,以及在與衛星通訊時自動補償多普勒效應。你也可以透過網路控制遠端台。因此,這些概念最終指向的術語就是CAT。
CAT(輔助式無線電收發),指透過串接埠或網路等方式,讓電腦參與無線電收發控制的技術。但這是一個非常廣泛的概念,並非單一標準協定,甚至是鏈路層/物理層也是各家自行開發。例如,ICOM 使用的是 CI-V 協議(半雙工總線),其他廠商則使用串接埠。雖然 Yaesu (Yaesu) 是第一個在 80 年代將 CAT 商品化、品牌化的,但其每個型號的命令格式差異很大,例如 ft817、ft857、ft991 無法互相相容。Yaesu 使用的是二進位(或十六進位)信號,而 Kenwood 則採用文字命令 (Elecraft 也似乎是類似的 ASCII 命令)。總而言之,生態系統高度碎片化,一款 HAM 軟體如果要支援所有無線電,必須為每個廠商甚至每個型號獨立實現驅動。
以近年來非常流行的開源無線電 uSDX 為例,它採用了 Kenwood TS-480 無線電的 CAT 協定(雖然只實現了一部分,也就是子集)。簡單來說,它是文字指令,以分號結尾,波特率為 115200,8N1 (8 個資料位、無)。奇偶校验 (parity)、停止位(第1位)DTR 和 RTS這些行為(DTR 和 RTS 是 RS-232 串列通訊規範中的兩個腳位,透過它們來檢測或決定要切換到接收或發送狀態——雖然這樣的說法可能不夠精確;大家可以去 WSJT-X 或 FT8CN 的設定介面中尋找它們的身影)。
以下列出使用 uSDX 實現的 CAT 命令範例:
| 指令 | 功能 |
FA; / FA00014195000; | 取得/設定頻率 (Hz) |
MD; / MDn; | 取得/設定模式 (1=LSB, 2=USB, 3=CW, 4=FM, 5=AM),但 uSDX 不支援 FM 和 AM 廣播。 |
如果; | 取得廣播電台的狀態(頻率、模式等) |
TX0; | 進入發射狀態 |
TX2; | 進入調諧狀態 |
RX; | 進入接收狀態 |
編號; | 返回電台 ID (固定回傳) 020,也就是 TS-480。 |
實際上還有一些擴展指令,例如「CAT」音頻流,是在同一個串口同時傳輸控制命令和音頻數據,這樣就不需要再插兩根3.5mm的音頻線了。許多現代廣播電台也有類似設計,例如透過USB線同時執行音頻和「CAT」控制,像是`/dev/ttyACM0`這種。
Omnirig 和 Hamlib
因此,各家電台的 CAT 協定五花八門,導致相容性工作量龐大。那麼,軟體開發者該怎麼辦?根據解耦和抽象的概念,很容易想到將與電台設備通訊的這些複雜問題抽象成一個中間層,並找一位專業的翻譯來處理相容性。這就是所謂的「中間件」。根據我的觀察,目前主要的兩個生態系統是 Omnirig 和 Hamlib。
這兩者實際上都在做的事情幾乎相同:連接廣播電台的串行埠(有些串行埠可能就是透過 USB 或 Wi-Fi 虛擬出來的),並且在廠商的私有 CAT 協定和通用的「標準介面語言」之間進行轉換。
除了處理 CAT 協議,Omnirig 和 hamlib 還可以控制 RTS/DTR 這種串列電平。 hamlib 也能支援 VOX,也就是語音控制發射。
OmniRig https://github.com/VE3NEA/OmniRig )是由 VE3NEA 開發的,其設計目標是「讓 Windows 上的業餘無線電軟體,只需編寫一次廣播站控制程式,就能支援所有廣播站」。說起來這個 VE3NEA 的呼號是不是很熟悉,就是 DX Atlas 工具集的作者,例如 morse runner、CW skimmer 以及喜歡使用衛星接收遙測會用的多功能整合軟體 skyroof 也是這位的作品。
不過 Omnirig 目前只有 Windows 版本,大概是開發較早(21世紀前幾年),不小心使用了 Microsoft 的 ActiveX/COM 技術架構。幸好發展不錯,成為了僅支援 Windows 的哪些 HAM 軟體的傳統標準。例如 N1MM、Logger32 都使用 Omnirig。
Omnirig 本身沒有主界面,它是系統層級的 COM 服務。 配置方式也與 Windows 相似,它的核心引擎會讀取 INI 檔案,每個 INI 檔案都是某個型號廣播電台的行為描述清單。 如果使用者新增設備,只需要自行撰寫對應的 INI 設定即可,這就不需要不斷地向使用者發送新的版本更新驅動程式(尤其是在軟體分發不方便的早期網路時代!)
提供一個設定檔的範例(請注意,INI檔案的註解以英文分號開始,而不是雙斜線)。
;Icom IC-7300
[無線電]
名稱=IC-7300
;波特率
波特率=115200
資料位數=8
奇偶檢查=無
停止位數=1
;命令逾時
逾時=200
;輪詢間隔
輪詢速率=200
[指令]
;設定頻率
設定頻率=FE FE 94 E0 05 <FreqBCD5> FD
;取得頻率
GetFreq=FE FE 94 E0 03 FD
;設定模式
SetMode=FE FE 94 E0 06 <Mode> FD
;PTT 控制
SetPtt=FE FE 94 E0 1C 00 <Ptt> FD
或許最後的部分有些抽象,尤其是在設定指令的地方,都是十六進位數字。幸運的是,廠商的高級手冊也會說明,方便後續開發。我個人更喜歡使用人類可以理解的文字指令…
現在必須提及開源真神 · Hamlib:
Hamlib https://hamlib.github.io/ ) 相較於omnirig的優點在於跨平台性。如果使用Linux或macOS上的火腿工具,或是要為嵌入式系統進行適配(例如,使用Raspberry Pi搭配螢幕來處理FT891等傳統無線電收發器的中頻訊號,進行頻譜瀏覽和控制),幾乎是唯一的選擇。
Hamlib 可以分為三個層面:後端、C API 和命令列工具。後端包含許多廣播電台型號的驅動程式庫,C API 用於二次開發,而一般使用者更常使用的是其命令列工具 — rigctl。d、rotctld、ampctld「ctld」這個名稱,其後綴「control daemon」(控制デーモン)一目了然地表明,它分別負責控制廣播電台、控制旋轉器和控制放大器。之所以稱為「control daemon」,是因為它實際上能夠開啟一個 TCP 監聽端口(預設為 4532),等待不同的軟體發送指令(無論是狀態長連接或短連接均可),因此是一種代理/守护程式。
例如,假設我們在一台同時運行軟體的電腦上,透過 USB 連接一台 IC-7300(在 hamlib 庫中,IC-7300 的型號代碼為 373,這個對應關係可以透過 `rigctl -l | grep -i "型號"` 查詢,以下不再說明)。
rigctld -m 373 -r /dev/ttyUSB0 -s 115200 & # 在 Linux 下 USB 設備的路徑寫法
rigctld -m 373 -r COM3 -s 115200 & #在 Windows 下使用 USB 串口的方法
因此,這個裝置現在有一個 4532 型號的模組正在等待接收控制信號。
然後,我家樓下的同一個區域網路裡有一台 FT991,假設其公開使用的埠為 8888,為了避免與上述埠衝突,我們需要更改監聽埠,例如 4531。
rigctld -m 135 -r 192.168.1.100:8888 -t 4531 &
因此,在此時就可以分別查看兩台電台的頻率(以及進行其他控制操作),而且您不需要擔心不同廠商原本的指令格式,只需使用 hamlib 的標準指令即可。
# 連接時指定端口
echo "f" | nc localhost 4532 # 查詢 IC-7300 的頻率
echo "f" | nc localhost 4531 # 查詢 FT-991 的頻率
這就非常方便了,想像一下你用一台IC-705來在RS-44這種線性衛星上進行FT4通訊,那就不需要同時使用WSJT-X(FT4編解碼)、gpredict(星曆預測和軌道追蹤、多普勒調整)等軟體。這些軟體都可以透過獨立的TCP連接和rigctld通訊,rigctld會將所有收到的資訊整合到佇列中,然後統一地發送給無線電的串口,就能讓音訊流雙向流通、頻率也能雙向調節。
另外,針對第二個「rotctld」,它是負責天線旋轉器的網路管理代理,預設端口為4533。這個我非常熟悉,因為最近我在開發天線旋轉器的開源韌體,並且與它頻繁互動……說到天線旋轉器的控制協定,確實種類繁多(雜亂無章),其中較為知名的是AMSAT(業餘無線電衛星公司)推出的easycomm I/II,以及Yaesu的GS-232A/B、Pstrotator(有同名的控制軟體)、以及基於二進位的SPID Rot2Prog,還有與天文望遠鏡赤道/尋星相關的Celestron NexStar……喔,另外國內也有使用監控雲台來控制旋轉器的(尤其是301雲台、亞安3040雲台),因此沿用了原本雲台廠家的控制信號。許多資深HAM會使用BG6LQV開發的「業餘衛星軟體」來控制旋轉器,它同時支援easycomm I/II和Yaesu的GS232-B協定。你甚至可以在電台連接功能上直接看到omnirig組件的整合:

簡單來說,天線旋轉器的控制實際上就是:方位角(航向角,AZ)的幾度,以及俯仰角。(EL)幾個指令,以及讓轉子報告其目前的角度(以便確認狀態)。例如,easycomm的核心命令集包含這些指令。 (如果 easycomm II 在使用 AZ 或 EL 指令後沒有提供參數,則會詢問轉子:「您現在是什麼姿勢?」)
| 指令 | 說明 | 範例 |
AZ<角度> | 設定方位 | AZ123.5 |
EL<角度> | 設定仰角 | EL45.0 |
UP | 逆時針方向旋轉 | |
DN | 逆時針方向旋轉 | |
ML | 向左轉 | |
MR | 向右轉 | |
SA | 停止方位旋轉 | |
SE | 停止傾斜角度旋轉 | |
上下左右轉以及停、啟動是給手動控制用的(假如不依賴自動計算和迴路控制)。迴路控制不需要手動停、啟動,當誤差小於一定範圍時,電機就會自動停止運作。因此,只需要前兩個指令就夠了。這種簡潔且易實施的協定經常被用於自製旋轉器的韌體,例如在 Arduino 或 ESP32 上執行計算和電機驅動。
我感覺說了太多。這裡需要澄清一下,omnirig 和 hamlib 並不是那麼顯著的存在。這種中間件可能整合在軟體內部,例如 WSJT-X 會讓你選擇無線電台型號(或控制指令集),基本上就是呼叫 hamlib;有些也會讓你設定串列埠。如果軟體不支援遠端無線電台,你也可以啟動一個監聽進出 (這相當於在軟體的前面有一層透明代理)。甚至你可以讓 hamlib 透過十六進位方式發送自訂指令(例如與天線馬達的溫度感測器互動),並取得回饋。這就是 hamlib 的靈活性所在。
希望這篇文章能幫助廣大ハム愛好者更深入地了解 ham 設備與電腦(以及一些手機應用程式,例如 FT8CN、TX-5DR、IC705 控制器、Look4Sat 等)之間的通訊互動機制。