プログラミング
Findphone: 信号強度で近くのBluetoothデバイスを見つける
Findphone: Locate a nearby Bluetooth device by signal strength (github.com)
要約
Findphoneは、コマンドラインから近くのBluetoothデバイスを信号強度に基づいて見つけるためのツールです。MDMによって「探す」機能が無効化されている場合でも、デバイスがBluetooth範囲内にあれば、その位置を特定するのに役立ちます。このツールはmacOS 13以降で動作し、信号強度をRSSI値で表示し、オプションで音によるガイダンスも提供しますが、デバイスを鳴らしたり、方向を示したりすることはできません。
全文翻訳
Findphone 信号強度で近くのBluetoothデバイスを、コマンドラインから見つけます。
「探す」機能が利用できない場合、例えばMDMによってデバイスが無効化されているものの、デバイスがまだBluetooth範囲内にあり、部屋のどこにあるかを知る必要がある場合に構築されました。
インストール
Releasesからユニバーサルバイナリを入手してください:
tar -xzf findphone-macos-universal.tar.gz
xattr -dr com.apple.quarantine findphone
./findphone --help
これは署名されていないため、macOSはダウンロード時にそれを隔離します。xattr行でそれをクリアします。
macOS 13以降が必要です。
ビルド
swift build -c release
cp .build/release/findphone ~/bin/findphone
Xcode Command Line ToolsのSwiftツールチェーンが必要です。
依存関係はありません。
ユニバーサル arm64 + x86_64バイナリ(CIが出荷するもの)の場合:
./scripts/build-universal.sh dist
findphoneの使用法
# サーベイモード: 信号強度で近くのAppleデバイスをすべて表示
findphone iphone
# ハントモード: 名前(大文字小文字を区別しない)で1つのデバイスを追跡
findphone --list # ペアリング済みのデバイスとそのアドレス
ハントモードで --sound を追加すると、駐車センサーのように近づくにつれて速くなるクリック音が鳴ります。部屋の反対側では約1秒に1回、信号強度が約 -50 dBm(電話の上にラップトップが置かれているような状態)に達するとブザー音に変わります。これにより、画面を見ずに耳で部屋をスキャンできます。信号が途絶えるとクリック音は止まるため、無音はデバイスがないことを意味します。
これは、少し似ていますが、ガイガーカウンターではありません。カウンターは検出された粒子ごとに1回クリックし、そのレートが測定値となります。ここではレートは平滑化された信号から計算されます。パケットは固定の0.3秒のポーリングタイマーで到着するため、その到着レートは距離についてほとんど何も語りません。
画面を録画している場合は --redact を追加してください。これはBluetoothアドレスをマスクし、サーベイモードでは検出されたデバイス名をデバイスの種類に置き換えます。なぜなら、それらの名前は必ずしもあなたのものではないからです。パブリックアドレスは安定したハードウェア識別子であり、BLEアドバタイジングアドレスとは異なりローテーションしないため、ビデオに残す価値があります。
意図的に表示されたままになるものが2つあります。ハントモードで入力した名前と、--list の名前です。なぜなら、ターゲットを選択するにはそれらを読み取る必要があるからです。--redact を使用しても、--list は撮影に安全ではありません。
ゆっくり歩いてバーを見てください。
表示されるのはdBm単位の信号強度です。これは負の値で、ゼロに近いほど近くにあります。
dBm おおよその意味
-45 腕の届く範囲
-60 同じテーブル
-72 同じ部屋
-85 遠い、またはカバーの後ろ
以下 とても遠い、またはシールドされている
信号強度は距離の粗い代理です。金属、壁、人体はそれを大きく減衰させるため、2メートル離れたファイルキャビネット内のデバイスは、開けた場所で15メートル離れたデバイスと同じ読み値になることがあります。単一の数値ではなく、移動中のトレンドを信頼してください。
仕組み
3つのソースが1つの読み値に供給され、品質の高い順に並んでいます。
1. GATTリンク — BLE経由でデバイスに接続した後、readRSSI() は約3秒に1回、新しい測定値を返します。これが良い方です。
2. BLEアドバタイズメント — 受動的に観測されます。Appleデバイスは約15分ごとにアドバタイジングアドレスをローテーションし、 occasional packets にのみデバイス名を含めるため、このソースはまばらです。
3. クラシックリンク RSSI — system_profiler SPBluetoothDataType から読み取られ、ペアリング済みデバイスの安定したパブリックアドレスでキー付けされます。
ソース3には知っておくべき落とし穴があります。macOSは、その値を3秒から12秒ごとにしかリフレッシュせず、その間はキャッシュされた数値をサービスします。より速くポーリングしても、より多くの情報は得られません。0.4秒間隔で112回のポーリングで測定したところ、すべてのポーリングで値が返されましたが、同じ値が8から31回のポーリングで繰り返されました。したがって、ツールは値が実際に変化したときにのみ測定値をカウントします。これが、報告される測定値のカウントがポーリングレートよりもはるかに低く、正直である理由です。
権限
実行するターミナルでBluetoothアクセスが必要です。System Settings > Privacy & Security > Bluetooth で設定します。不足している場合はその旨が表示されます。
制限事項
デバイスを鳴らすことはできません。「探す」機能なしではそのパスはありません。
方位を与えることはできません。1つの無線は距離のみを提供し、方向は提供しません。
Bluetoothがオンになっており、範囲内にあるデバイスのみを見つけることができます。屋内では約10〜20メートル、壁を透過する場合はそれよりずっと少なくなります。