Windows のモバイルブロードバンド (WWAN) モデム向けの LTE 信号監視ツール (TUI) です。
Windows の PowerShell 7.4 以降で動作します。
実機で確認しているのは Fibocom L860-GL だけです。Quectel や Fibocom FM350 などは仕様上の対応です (docs/modem-support.md 参照)。
- リアルタイム監視: RSRP, RSRQ, SNR, 送受信レート, モデム温度の履歴グラフ表示
- 詳細情報の取得: CA (キャリアアグリゲーション) 情報、利用可能な LTE バンド、RAT 情報の取得
- 2G/3G ダウングレード検知: 偽基地局対策として、国内では利用されない 2G/3G へのダウングレードを検知して警告 (詳細は
docs/downgrade-detection.md参照) - 近隣セル情報の表示: モデムの AT コマンド (L860-GL は MBIM の Intel AT Tunnel 経由の
AT+XMCI) で近隣セル (Neighbor cells) の情報を取得・表示。AT で取れない場合は WinRT が報告する近隣セルを使用 (詳細はdocs/neighbor-cells.md参照) - 複数ベンダーの AT コマンド: 起動時に AT の経路 (Intel / Fibocom / Compal / Quectel の MBIM サービス、または COM ポート) とコマンドセット (Intel
+X、Quectel+Q、Fibocom+GT) を自動判定 (詳細はdocs/modem-support.md参照) - ハンドオーバー履歴: LTE 主セルの変更を検出し、時刻と切り替え先の Cell ID・バンド・PCI などを表示
- GPS / GNSS 表示:
-Gpsで衛星測位の緯度・経度・高度・精度・速度・方位・HDOP / PDOP / VDOP・測位時刻を表示。未測位や取得不能も表示。-Nmeaで捕捉衛星の一覧 (衛星系ごとに色分け、仰角・方位角・SNR・測位への使用) と、受信機の測位状態 (2D / 3D・測位品質・測位モード・使用衛星数・海抜高度とジオイド高) も表示 (詳細はdocs/gps.md参照) - CSV ログ出力: 取得した情報を CSV ファイルに記録可能
- OS: Windows 10 / 11
- PowerShell: バージョン 7.4 以降 (Windows PowerShell 5.1 では動作しません)
- 対象モデム: Windows が認識する MBIM モデム。温度・SINR・CA・近隣セルなどは AT コマンドに対応したモデムのみ
- 実機確認済み: Fibocom L860-GL (Intel XMM 7560)
- 仕様上の対応 (未確認): Intel XMM 系、Quectel (RM5xx など
AT+QENG対応機)、Fibocom FM350-GL などAT+GTCCINFO対応機 - AT が使えないモデムでも、WinRT で取れるサービングセルの情報・履歴・CSV は表示・記録できます
PowerShell 7.4+ がインストールされている環境で、初回のみ WinRT プロジェクション (CsWinRT) の DLL をダウンロード・展開する必要があります。
.\setup.ps1これにより、.\lib ディレクトリに実行に必要な DLL (WinRT.Runtime.dll, Microsoft.Windows.SDK.NET.dll) が配置されます。
以下のスクリプトを実行して TUI モニターを起動します。
.\lte_monitor.ps1 [-Interval <秒>] [-Count <回数>] [-CsvPath "log.csv"] [-AtPort COM7] [-Gps] [-Nmea]オプション名は大文字・小文字を区別しません。存在しないオプション (綴りの誤りを含む) を指定するとエラーで終了します。
-Interval: 測定間隔 (秒)。デフォルトは0で、バックトゥバックサンプリング (カウンターの関係で約1秒間隔) を行います。-Count: 測定回数。デフォルトは0で無限ループします。-CsvPath: 指定すると、結果を CSV ファイルにログ出力します。-AtPort: AT コマンドを MBIM ではなく指定の COM ポート (例:COM7) で送ります。ベンダードライバが AT ポートを公開しているモデム向けです。省略時は MBIM の AT サービスを自動で探します。-Gps: Windows の GNSS ドライバー経路で衛星測位を取得します。GPS 以外 (Wi-Fi・基地局・IP 等) の座標は表示・記録しません。Windows の位置情報サービスとデスクトップアプリの位置情報アクセスを有効にしてください。API の制約により特定のモデムは選択できません。省略時は GPS を取得しません。-Nmea:-Gpsに加えて、GNSS ドライバーの NMEA から捕捉衛星の一覧を取得します。-Nemaとも書けます。ドライバーが管理者権限を要求するため、起動時に UAC で受信用のヘルパープロセスだけを昇格します (管理者ターミナルでは確認なし)。UAC を拒否しても LTE と GPS 欄の監視は続きます。衛星一覧は CSV には記録しません。
GPS を表示し、LTE 測定と一緒に CSV へ記録する例:
.\lte_monitor.ps1 -Gps -CsvPath "log.csv"TUI (Text User Interface) 画面起動中は以下のキー操作が可能です。
q/Esc/Ctrl+C: 終了p: 一時停止 / 再開r: すぐに更新 (リフレッシュ)R(Shift+r) : すべての統計情報をリセット (ヒストリーグラフと min/avg/max、ハンドオーバー履歴と累計件数、2G/3G の検知履歴)。Caps Lock 中はrでもリセットになります1〜6: 各ヒストリーグラフの表示・非表示 (1:RSRP, 2:RSRQ, 3:SNR, 4:RX, 5:TX, 6:Temp)g: 全グラフの一括表示切り替えh: ハンドオーバー履歴の詳細一覧 / 通常画面を切り替え。詳細一覧では↑/↓で新しい / 古い履歴へ移動s: 衛星一覧 / 通常画面を切り替え (-Nmea指定時)。一覧では↑/↓でスクロール。hの一覧とは排他↑/↓: ヒストリーグラフの高さ (行数) を増減 (1〜10 行、既定 2 行。1 行あたり 8 段階。Temp は常にその 1/2 (切り捨て、最低 1 行))
LTE bands: の各バンドは、最新の接続中セルと近隣セルの合計に応じて明るく表示します。0 個は従来の暗いグレー、1 個以上は表示対象バンドの最多セル数を白として RGB グラデーションで表示します。例えば B1 が 1 個、B18 が 2 個なら B1 は中間グレー (#909090)、B18 は白 (#FFFFFF) になります。最多が 1 個なら観測されたバンドはすべて白です。同じ EARFCN・PCI のセルは重複して数えません。物理的な基地局の台数ではなく、現在観測できるセル数を表し、測定ごとに明度を更新します。
測定はバックグラウンドで行うため、モデムの応答待ちや通信量の取得中もキー操作できます。
一時停止時に取得中の測定は完了後に反映され、次の自動測定から停止します。取得中の r はその測定の完了を待ちます。
R はすぐにリセットし、取得中の測定は完了後にリセット後の統計に含めます。
リセットしても、画面上の測定回数 (-Count の進捗)、最新の測定値、CSV ログはそのままです。
ハンドオーバー履歴は通常画面に直近3件、h の詳細一覧に最大100件を新しい順で表示します。
各履歴は「その時刻にどのセルへ切り替わったか」を表示します。詳細には検出時刻、切り替え先の PLMN・Cell ID・バンド・PCI・EARFCN・TAC・RSRP を表示します。
履歴と累計件数は起動中のみ保持し、R で 0 件に戻せます。リセット直前のセルは比較基準として残すため、リセットをまたいだ切り替えも検出します。標準出力への逐次出力にも直近3件が含まれます。
判定対象はモデムが返す先頭の LTE 接続セル(本ツールでの主セル)の PLMN と Cell ID の変更です。 CA の副セルの追加・削除、信号強度や TAC だけの変化は数えません。初回取得、取得失敗・圏外・識別情報不明の後は比較基準を設定し直します。 測定間のセル変更を観測するため、セル再選択と通信中のハンドオーバーは区別できず、測定間隔内の切り替えをすべて捕捉できるものではありません。
主セルの信号値が取得できない場合も、セルの識別情報は保持します。画面・信号履歴・CSV・ハンドオーバー判定は同じ主セルを使い、CA の副セルを代用しません。
取得不能な測定値は画面では n/a、CSV では空欄、履歴グラフでは欠測として扱います。通信量の実測ゼロは 0 B/s と表示し、カウンター取得失敗は画面と CSV の Error 列に理由を記録します。
LTE セルを取得できない回も履歴の位置を残し、取得できた温度などのモデム全体の測定値は保持します。
(標準入出力がリダイレクトされている場合は、プレーンテキストによる逐次出力にフォールバックします)
lte_monitor.ps1 エントリーポイント (TUI / プレーン出力)
setup.ps1 WinRT プロジェクションの DLL を lib/ に展開 (初回のみ)
tool.ps1 リント・整形・テスト (開発用)
src/ 本体 (下記)
tests/ ハードウェア不要のテスト (*.Tests.ps1) と共通ヘルパー (TestHelpers.ps1)
diagnostics/ GNSS ドライバーの診断スクリプト (本体とは独立)
docs/ 技術資料
tools/csharp/ C# ソースの検査専用プロジェクト (実行時には使わない)
lib/ setup.ps1 が展開する DLL (Git 管理外)
本ツールは Domain-Driven Design (DDD) 風のレイヤードアーキテクチャを採用しており、src/ 以下がそれぞれの責務に分割されています。
domain は他のレイヤーに依存せず、application が infrastructure の取得結果にドメインルールを適用します。presentation はその結果を表示します。
domain/: 信号の評価・統計、ダウングレード判定、セル同一性とハンドオーバー履歴 (Signal.ps1,Downgrade.ps1,Handover.ps1など)infrastructure/: ハードウェア・OS・CSV との入出力 (WinRt.ps1,PerfCounter.ps1,CsvFile.ps1)modem/: モデムの WinRT 情報と AT 経路の検出・送受信 (Modem.ps1,ModemObservation.ps1)、ベンダー別のコマンドセットと応答パーサー (AtProfile.ps1,AtResponse.ps1,IntelStatus.ps1,QuectelStatus.ps1,FibocomStatus.ps1など)、WinRT 値の正規化 (SignalConversion.ps1)gnss/: GPS (Gps.ps1)、NMEA の解析と昇格ヘルパー (Nmea.ps1,NmeaReceiver.ps1,NmeaHelper.ps1)、GNSS ドライバー (GnssDevice.ps1)。Add-Typeでコンパイルする.csは、読み込む.ps1と同じフォルダーに置きます
application/: 主セル・副セルを明示した snapshot の作成、セッション更新、履歴・CSV の連携と測定の実行管理 (MonitorSession.ps1,Snapshot.ps1,MonitorSampler.ps1など)presentation/: ユーザーインターフェース。画面の組み立て (Frame.ps1) と各セクション (HistoryChart.ps1,HandoverSection.ps1,GnssSection.ps1)、描画とループ (ConsoleRenderer.ps1,TuiMonitor.ps1,PlainMonitor.ps1)、ゲージ (Gauge.ps1)
src/Load.ps1 が共通のロード構成を管理します。エントリーポイントは全体を、測定 runspace は -Components Core で表示以外の共通部分を読み込みます。
RAT の許可設定は AllowedRats (GSM / UMTS / LTE / NR) と表示文言を分け、2G/3G 許可の判定結果を application から画面に渡します。
tool.ps1 で PowerShell (リポジトリ内のすべての .ps1) と C# (Add-Type で実行時にコンパイルする src/・diagnostics/ の .cs) のリント・整形と、テストを行います。
.\tool.ps1 lint # PSScriptAnalyzer と Roslyn Analyzers
.\tool.ps1 format # Invoke-Formatter と dotnet format (whitespace / style) で整形
.\tool.ps1 format -Check # 整形が必要なファイルの報告のみ (変更しない)
.\tool.ps1 test # tests\*.Tests.ps1 を実行 (モデム不要)- 必要なもの (
lint/format): PSScriptAnalyzer モジュール、.NET 10 SDK、.\setup.ps1で展開したlib\の DLL。testはどれも不要です testは各テストファイルを別のpwshプロセスで並列に実行します (テストは本体の関数をスタブで置き換えるため、ファイル間で共有しません)。1 ファイルだけならpwsh -NoProfile -File tests\Domain.Tests.ps1のように直接実行できます- テストファイルは先頭で
tests\TestHelpers.ps1を読み込みます (src/Load.ps1とAssert-True/Assert-Equal)。スタブはその後に定義します tests/では位置指定パラメーター (PSAvoidUsingPositionalParameters) と ShouldProcess (PSUseShouldProcessForStateChangingFunctions) の指摘を、各テストファイル先頭のSuppressMessageAttributeで抑制しています- PSScriptAnalyzer によるリント・整形の実行中は
PATHとPSModulePathを$PSHOMEに絞っています (速度のため)。$PSHOME以外のモジュールのコマンドは、コマンドを調べるルールの対象外になります global.jsonで SDK を 10.0.x (インストール済みの最新の 10.0 系) に固定しています。tool.ps1はリポジトリ直下でdotnetを実行するので、どのディレクトリから呼んでもこの指定が効きます- C# は検査専用のプロジェクト
tools/csharp/WwanProbe.csproj経由で検査します。実行時には使いません。検査対象は PowerShell 7.4 (.NET 8) のAdd-Typeに合わせて net8.0 (C# 12)、implicit usings と nullable は無効です - Roslyn Analyzers は .NET 10 SDK 同梱のもの (
AnalysisLevel=latest-recommended) を使い、警告もエラーとして扱います。書式やコードスタイルの設定は.editorconfigにあります formatはアナライザーのコード修正 (dotnet format analyzers) を適用しません。動作が変わる修正もあるため、lintで報告して手で直します
より詳細な技術情報については docs/ 以下の Markdown ファイルを参照してください。