ホットスポットで、同じ声が38回くり返された話 〜 PiLoopGuard 開発記

ある日、ループが起きた
2026年8月3日の昼前のことです。仲間から「TG168系で音声のループが起きていたよ」と連絡がありました。
ログを調べてみると、確かに起きていました。ある局(ここでは A局 とします)のまったく同じ約10秒の音声が、0.7秒の間隔をあけて、38回連続で流れ続けていたのです。時間にして約7分間。その間、こちらのホットスポットは受け取った音声を律儀に電波で送出し続け、さらにRFブリッジを経由して隣のネットワークにまで転送し続けていました。
原因を追いかけると、A局側の設備内で「受信した音声がそのまま送信に折り返る」ような状態になっていたのではないか、と思われます。再生の機能を持つ機材が、自分の再生した音声をまた拾って再生する——鏡を向かい合わせにしたような無限ループです。
このときは A局の回線が不調になったことで偶然ループは止まりました。誰も止めていません。運が良かっただけです。今回は昼間だったので発覚も早かったものの、もしこれが深夜に起きて、朝まで誰も気づかなかったら? ネットワークの向こうの大勢の局に、同じ音声が何時間も垂れ流されていたことになります。
人間は起きていられない。なら機械に見張らせよう
こうして作ったのが PiLoopGuard です。Pi-Star ホットスポットに常駐して、MMDVMHost のログを24時間見張り、ループを見つけたら自動で対処する小さな番人です。
「ループかどうか」の判断はシンプルに2つのルールで行います。
ルール1: 機械のリズム
同じ局から「4秒以上の音声が、ほぼ同じ長さで、息継ぎ2.5秒以内に、4回連続」で届いたら異常。人間は同じ長さの送信を休みなく4連発できません。これができるのは録音再生の機械だけです。実際の8月3日のループなら、開始から約30秒でこのルールに引っかかります。
ルール2: 異常なくり返し
同じ局の音声が「間に誰も挟まらず、15秒以内の間隔で、10回連続」で届いたら異常。長さは問いません。普通の交信(QSO)なら必ず相手局の声が間に入るので、このルールには絶対に当たりません。CQの連呼も、呼ぶ合間に15秒以上は聞く時間を取るので当たりません。「誰にも遮られずに同じ局だけが10回続く」のは、会話ではなく機械の暴走だけです。
見つけたらどうするか
異常を検出すると、PiLoopGuard は この Pi-Star と接続先ネットワーク(XLX / TGIF 等)との接続そのものを一時的に遮断します。
正直にお伝えしておくと、遮断するのは「問題の局だけ」ではなく「接続先ネットワークとのリンク全体」です。技術的に、特定の局の音声だけを選んで止めることは Pi-Star 側ではできないためです。そのため遮断中(既定5分間)は、異常局以外の局の音声も含めて、XLX / TGIF との送受信がすべて止まります。この Pi-Star を経由して通信している他のユーザーも、その間は接続先との交信ができません。
ただし、失うものは実はほとんどありません。ループの間、そのタイムスロットはどうせループに占拠されていて、まともな交信はできないからです。5分間の遮断は「壊れた蛇口を一旦閉める」ようなもの。RF(自局側の電波の送受信)・ダッシュボード・その他の機能はそのまま動き続け、遮断時間が過ぎると自動で再接続します。もし復帰後もループが続いていれば、また数十秒で検出して再遮断します。ループが終息するまで、これを黙々とくり返してくれます。
誤動作しないの?
一番気を使ったのはここです。「ループを止める」より「正常な運用を絶対に止めない」ほうが大事だからです。8月3日の実際のログ(ループ部分と、その前後の丸一日ぶんの通常運用)を使って検証しました。
| ケース | 判定 |
|---|---|
| 実際に起きたループ(10.3秒×38回) | 検出・遮断(開始約30秒) |
| 短い音声の高速ループ(変種) | 検出・遮断(ルール2) |
| 通常のQSO・速いテンポの応酬 | 素通り |
| CQの連続呼び出し | 素通り |
| カーチャンクの連打テスト | 素通り |
| 定時アナウンス | 素通り |
インストールは1行
GitHub で公開しています。Pi-Star に SSH して1行実行するだけです。
curl -fsSL https://raw.githubusercontent.com/ji2tab/PiLoopGuard/main/install.sh | sudo bash
初回は「dry-run モード」(検出ログだけ出して遮断はしない)で数日様子を見て、誤検出がないことを確認してから本稼働に切り替える運用をおすすめしています。詳しい使い方はリポジトリの README をご覧ください。
→ https://github.com/ji2tab/PiLoopGuard
おわりに
デジタル無線のネットワークは、便利になるほど「一箇所の不具合が全体に広がる」怖さも持っています。今回のループも、悪意ではなく、たった一つの設定ミスから起きたものでした。誰の設備でも明日起こり得ます。
だからこそ、責める仕組みではなく、静かに見張って、静かに守って、静かに元に戻す仕組みを置いておく。PiLoopGuard がそういう番人として、皆さんのホットスポットの片隅で役に立てば幸いです。
動作環境: Pi-Star v4.x / Python 3.7 以上(標準搭載)。XLX・TGIF・BrandMeister など接続先を問わず動作します。
🏛 JJ2YYK あいちデジタルコミュニケーションハムクラブ