0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

RON-V #18 LTE cell_searchをL3/L4に分離してGoogle Driveへ非同期転送する ― rclone・INDEX・RTL-SDR障害対策

0
Last updated at Posted at 2026-10-20

[!NOTE]
2026-09-23 現行GitHub同期メモ

LTE L3/L4 Evidence、rclone非同期配送、Google Sheets INDEX、RTL-SDR USB消失時の1回限りの自動power-cycleは現行 main に存在します。現行のSDR precheckは hub-location=3 / hub-port=1 を使用し、RF/LTE両方のsystemd drop-inから実行します。

RON-V 連載リンク
← 前の記事:#17 — Google Sheetsへの非同期同期
→ 次の記事:#19 — スマホから操作するWeb UI

L0〜L4の定義追記(2026-10-25)

本文中のコード・試験結果は執筆当時の記録として残しています。画像AI・音声を関連付ける現在の定義は次のとおりです。

レベル 残す内容
L0 Meshtastic向けの23バイト短報。画像AIの候補通知は任意設定
L1 個別の観測・撮影/録音/認識の状態と、詳細への参照
L2 一定時間の観測件数・分類別候補などの集計
L3 画像AIの詳細、録音情報、文字起こし全文
L4 元画像JPEG、元音声WAV、LTEのraw logなど

L0の警報欄は1バイト=8ビットです。新しいversion=2の定義は、倒木 0x01、冠水 0x02、煙 0x04、道路上の障害物 0x08、路面の穴 0x10。残り3ビットは未割り当てです。0x03は倒木と冠水の組み合わせで、煙の番号ではありません。0x00はL0上では未判定で、安全を示しません。 候補ありでは元イベントの時刻・位置を使い、現在地と混同しません。

発信元はnode_uid、根拠は画像・音声などです。「処理成功」「災害の候補」「人の確認済み」を分けます。初期の確認状態はunreviewed。画像AIの検出0件を「危険なし」とせず、音声の否定も全文へ残します。人が補足・訂正する画面と、音声からの災害自動分類は今後の実装です。

10月25日にL1の関連付け・L2の集計・音声L3/L4の転送処理をコードへ追加しました。新連携の実機確認はこれからです。音声転送とL0候補通知は初期設定では無効で、個別に有効化します。従来のL0 version=1へ、この分類の意味を遡って付けません。

Looker Studioで使用中のSheets summaryはRF測定から直接出力する既存の10列で、L2とは別です。今回の追加で列名・順序・値の意味、既存Grafanaの参照項目は変えません。L1のMesh送信、写真・音声のMesh転送、自動公開は実装していません。

詳細と設定手順:データレベルの定義(リポジトリの閲覧権限が必要です)。

はじめに

RON-VではSQLiteへ保存した軽量な観測値だけでなく、後から再解析できるEvidenceも残します。

LTE cell_search では、

L1
  PCI / EARFCN / PSS powerなどの軽量Fact

L3
  解析済みStructured Evidence

L4
  cell_search raw log

に分けています。

ファイル本体はGoogle Driveへ、検索用のINDEXはGoogle Sheetsへ送ります。

LTE measurement
      ↓
SQLite
      ↓
Evidence Producer
  ┌───┴───┐
  ↓       ↓
 L3       L4
 JSON     LOG
  └───┬───┘
      ↓
sync_objects / sync_deliveries
      ↓
rclone worker
      ↓
Google Drive
      ↓
Google Sync Worker
      ↓
L3_INDEX / L4_INDEX

1. ローカルファースト

重要なのは、クラウドへ送る前に測定をローカルで完結させることです。

測定
 ↓
SQLite / raw log保存
 ↓
ここで測定としては完了
 ↓
Evidence生成
 ↓
クラウド配送

Google DriveやInternetに障害があってもLTE測定そのものは止めません。


2. L3 / L4保存先

現行実装では、

/var/lib/ronv/l3/lte
/var/lib/ronv/l4/lte

を使用します。

1回のLTE scanについて、

L3 : JSON
L4 : raw text log

を生成します。


3. 現行L3 payload

現行 app/integration/lte_evidence.py のL3 schemaは、

ronv.lte.evidence.v1

です。

概念例は、

{
  "schema": "ronv.lte.evidence.v1",
  "object_uid": "l3-lte-cell-search-00000001-00000002",
  "level": 3,
  "data_type": "lte_cell_search_evidence",
  "event_time_jst": "2026-09-08T10:00:00+09:00",
  "source": {
    "table": "lte_measurements",
    "row_ids": [1, 2]
  },
  "scan": {
    "band": 28,
    "pci_count": 2,
    "gps": {
      "latitude": null,
      "longitude": null,
      "gps_status": "no_fix"
    },
    "measurements": []
  },
  "l4": {
    "object_uid": "l4-lte-cell-search-00000001-00000002",
    "mime_type": "text/plain"
  }
}

です。

L3の data_type は、

lte_cell_search_evidence

L4は、

lte_cell_search_raw_log

です。


4. L4はraw log

L4は cell_search のraw logをそのままEvidence化します。

生成時に、

bytes
sha256
mime_type
file_path

を記録します。

将来解析ロジックが変わっても、L4があれば再解析できます。


5. sync_objects

L3/L4は生成後、

sync_objects

へ登録されます。

主な情報は、

object_uid
source_table
source_id
data_type
level
priority
event_time_jst
file_path
mime_type
bytes
sha256
state

です。

ファイル生成とSHA256確認まで終わったものを ready として扱います。


6. sync_deliveries

配送は sync_deliveries で別管理します。

rclone workerでは主に、

pending / retry
      ↓
inflight
      ↓
acked

と進みます。

失敗内容によっては、

retry
failed

になります。

これによりEvidence生成と外部配送を分離できます。


7. rclone設定

公開用設定は、

[rclone]
enabled = false
binary = "/usr/bin/rclone"
remote_name = "<RCLONE_REMOTE>"
remote_root = "RONV_RCLONE"
timeout_sec = 120
retry_sec = 60

です。

実環境では enabled=true とし、実際のremote名を設定します。

OAuth tokenや rclone.conf はGitHub/Qiitaへ載せません。

Drive上は概ね、

RONV_RCLONE/
├── L3/
│   └── lte/
└── L4/
    └── lte/

となります。


8. rclone worker

実装は、

app/integration/rclone_delivery_worker.py

です。

現在はL3/L4の pending / retry を取得し、ローカルファイルのSHA256を確認してから送信します。

成功すると、

state = acked
remote_id = <remote file>

となります。

失敗した場合は retry_sec に従って再試行します。


9. Google Sheets INDEX

Google SheetsにはEvidence本体を入れません。

L3_INDEX
L4_INDEX

へ、

object_uid
level
event_time_jst
data_type
local_path
mime_type
local_bytes
sha256
upload_transport
upload_representation
upload_state
upload_bytes
remote_id
received_at_jst

などを出します。

これにより、

Google Sheets = 検索・状態確認
Google Drive  = ファイル本体

と役割を分けられます。


10. systemd timer

LTE Evidenceは、

[Timer]
OnBootSec=2min
OnUnitInactiveSec=5min
AccuracySec=5s
Unit=ronv-lte-evidence.service

です。

rclone配送は、

[Timer]
OnBootSec=3min
OnUnitInactiveSec=1min
AccuracySec=5s
Unit=ronv-rclone-delivery.service

です。

Google Sheets同期は5分周期です。

それぞれ独立しているため、

測定
Evidence
Drive配送
Sheets同期

のどこかが一時停止しても、前段を止めない構成になっています。


11. RTL-SDR共有

RON-VではRF測定とLTE測定が同じRTL-SDR Blog V4を使います。

同時openを避けるため、

/tmp/ronv-sdr.lock

を app/common/sdr_lock.py で排他利用します。

またRF測定終了後はsystemd drop-inでLTE測定を起動します。

RF
 ↓
OnSuccess / OnFailure
 ↓
LTE

RFが成功しても失敗しても、LTE測定へ進む設計です。


12. RTL-SDRがUSBから消える問題

実機運用では、RTL-SDRがLinuxのUSB一覧から完全に消える事象を経験しました。

lsusb -d 0bda:2838

でも見つからない場合、単なる usbreset 対象そのものが存在しません。

そこでRON-Vでは、

app/common/sdr_health.py

でsysfs上のVID/PID、

0bda:2838

を確認します。


13. systemd ExecStartPreでprecheck

RFとLTEの両方に、

systemd/ronv-rf-measure.service.d/sdr-precheck.conf
systemd/ronv-lte-measure.service.d/sdr-precheck.conf

があります。

現行設定は、

--attempts 3
--interval 1
--recover
--hub-location 3
--hub-port 1
--off-seconds 3
--recovery-attempts 10
--recovery-interval 1

です。

つまり測定前に、

RTL-SDRあり
 ↓
そのまま測定

RTL-SDRなし
 ↓
対象USB portをOFF
 ↓
3秒待機
 ↓
ON
 ↓
再enumeration確認

を行います。


14. uhubctl権限

ronv ユーザーへ任意のsudo権限は渡しません。

現行GitHubでは、

deploy/sudoers/ronv-uhubctl

に、対象ポートだけを操作できるルールを置いています。

現在の対象は、

hub location 3
port 1

です。

USB topologyは環境で変わるため、別機体へそのままコピーせず lsusb -t と uhubctl で確認する必要があります。


15. 1障害につきpower-cycleは1回

物理故障や配線不良で復旧できない場合に、測定周期ごとに無限power-cycleするのは危険です。

そこで、

/run/ronv/sdr-recovery.failed

をfailure latchとして使います。

最初のMISSING
 ↓
power-cycleを1回
 ↓
失敗
 ↓
latch保持
 ↓
次回はSKIPPED

です。

RTL-SDRが自然復帰した場合はlatchを解除します。

さらに、

/run/ronv/sdr-recovery.lock

を flock して、RF/LTEから二重に復旧処理が走ることを防ぎます。


16. DVB driverの競合対策

現行repoには、

deploy/etc/modprobe.d/blacklist-rtl.conf

も含めています。

RTL-SDRをSDR用途で使う環境では、DVB用kernel driverとの競合を避けるための構成です。


17. 確認コマンド

Evidence:

systemctl status \
  ronv-lte-evidence.timer \
  --no-pager

journalctl \
  -u ronv-lte-evidence.service \
  -n 100 \
  --no-pager

rclone:

systemctl status \
  ronv-rclone-delivery.timer \
  --no-pager

journalctl \
  -u ronv-rclone-delivery.service \
  -n 100 \
  --no-pager

SDR:

lsusb -d 0bda:2838

/home/ronv/.venvs/ronv/bin/python \
  -m app.common.sdr_health \
  --attempts 3 \
  --interval 1

まとめ

#18では、

LTE
 ↓
L3 JSON
L4 raw log
 ↓
SQLiteでEvidence/Delivery管理
 ↓
rclone
 ↓
Google Drive
 ↓
Google Sheets INDEX

を構築しました。

さらに、RTL-SDRのUSB完全消失に対して、

precheck
 ↓
1回限りのUSB power-cycle
 ↓
failure latch
 ↓
RF/LTE間の排他

を追加しています。

大切なのは、クラウドやSDR障害が起きても「測定結果をローカルへ残す」設計を中心に置くことです。

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?