← На главную

findphone ищет Bluetooth-устройства по dBm в macOS

05.08.2026 11:54 · hackernews

Утилита findphone ищет рядом Bluetooth-устройство по силе сигнала прямо из командной строки. Она рассчитана на случай, когда Find My недоступен — например, из-за MDM, который его отключает, — но гаджет всё ещё в радиусе Bluetooth, и нужно понять, в каком углу комнаты он лежит.

Скачиваете универсальный бинарник из Releases, распаковываете и снимаете карантин macOS: xattr -dr com.apple.quarantine findphone. Бинарник не подписан, поэтому система помечает его при загрузке. Нужен macOS 13 или новее. Можно собрать и самому: swift build -c release, затем скопировать findphone в ~/bin. Для этого нужен Swift toolchain из Xcode Command Line Tools, других зависимостей нет. CI собирает универсальный бинарник под arm64 и x86_64 через ./scripts/build-universal.sh dist.

Работает так: findphone iphone — survey mode, видит все nearby-устройства Apple по сигналу. findphone --list показывает сопряжённые устройства и их адреса. findphone <имя> — hunt mode, следит за конкретным устройством по имени без учёта регистра.

В hunt mode есть --sound: клики ускоряются при приближении, как парктроник. Примерно один клик в секунду через комнату, затем сплошной гул, когда сигнал достигает примерно -50 dBm — это уровень, когда ноутбук лежит на телефоне. Можно искать на слух, не глядя в экран. Когда сигнал пропадает, клики замолкают: тишина значит «нет сигнала», а не «устройство молчит».

Это не счётчик Гейгера, хотя звучит похоже. Там частота кликов зависит от сглаженного RSSI, а не от прихода пакетов: опрос идёт фиксированно каждые 0.3 секунды, так что скорость прибытия пакетов о расстоянии ничего не говорит.

Если записываете экран, включайте --redact: он маскирует Bluetooth-адреса, а в survey mode заменяет имена найденных устройств на их тип. Публичный адрес — стабильный аппаратный идентификатор, он не ротируется в отличие от BLE-advertising-адреса, так что его лучше в видео не светить. Но имя, которое вы ввели в hunt mode, и список из --list остаются видимыми намеренно: без них не выберешь цель. --list снимать нельзя даже с --redact.

Уровень сигнала показывается в dBm, это отрицательные значения: чем ближе к нулю, тем ближе устройство. От -45 и выше — рукой подать, -60 — один стол, -72 — одна комната, -85 — далеко или за преградой, ниже — очень далеко или экранировано. Но сила сигнала — грубый показатель: металл, стены и тела его сильно ослабляют. Телефон в шкафу в двух метрах может читаться так же, как открытый через пятнадцать. Доверяйте тренду при движении, а не одиночному числу.

Показания собираются из трёх источников в порядке убывания качества. Лучший — GATT-соединение: после подключения по BLE readRSSI() возвращает свежее значение примерно три раза в секунду. Второй — BLE-реклама: Apple ротирует advertising-адреса каждые пятнадцать минут и имя устройства шлёт только иногда, так что источник бедный. Третий — RSSI классической связи через system_profiler SPBluetoothDataType по стабильному публичному адресу сопряжённого устройства. Тут есть ловушка: macOS обновляет значение раз в 3–12 секунд, а между этим отдаёт кэш. Частый опрос не помогает: при замере 112 попыток по 0.4 секунды каждое возвращало значение, но одно и то же повторялось сериями от 8 до 31. Поэтому findphone считает измерение только когда число реально поменялось — отчёт честный, пусть и с меньшим количеством замеров, чем частота опроса.

Для работы терминалу нужен доступ к Bluetooth в System Settings > Privacy & Security > Bluetooth. Утилита сама об этом скажет. Она не умеет звонить на устройство — без Find My туда пути нет. Не умеет показывать направление: одна радиоантенна даёт только дистанцию. И находит только устройства с включённым Bluetooth в радиусе примерно 10–20 метров в помещении, через стены — заметно меньше.

Читать оригинал →