Bluetooth RSSI / сканирование запросов на Mac - обнаружение близости к iPhone без подключения? - PullRequest
6 голосов
/ 03 ноября 2011

Мне часто приходится уклоняться от компьютера, и я хочу, чтобы некоторые команды запускались, когда мой iPhone находится достаточно близко / достаточно далеко от моего iMac (рядом с ним на расстоянии 2-3 метра от другой стороныстены).Задержка на пару минут в порядке.


Частичное решение: близость

Я скачал reduxcomputing-близости и это работает, но это срабатывает только тогда, когдаУстройство входит в / вне диапазона Bluetooth, но мой желаемый диапазон намного меньше.

(опросы на близость [IOBluetoothDevice -remoteNameRequest], чтобы узнать, находится ли устройство в диапазоне Bluetooth или нет.)

Улучшение: rawRSSI

Я использовал[IOBluetoothDevice -rawRSSI] для получения RSSI, когда я подключен к iPhone (при отключении это просто возвращает +127), но для экономии заряда батареи моего iPhone я бы предпочел избегатьустановление полного соединения Bluetooth .

Правильно ли я считаю, что поддержание соединения потребляет больше времени автономной работы, чем просто опрос каждые пару минут?

Я переопределил isInRange метод proximity здесь, чтобы датьмне это рабочее решение, которое, вероятно, относительно энергоемко по сравнению с предыдущим методом remoteNameRequest::

- (BOOL)isInRange {
    BluetoothHCIRSSIValue RSSI = 127; /* Valid Range: -127 to +20 */
    if (device) {
        if (![device isConnected]) {
            [device openConnection];
        }
        if ([device isConnected]) {
            RSSI = [device rawRSSI];
            [device closeConnection];
        }
    }
    return (RSSI >= -60 && RSSI <= 20);
}

(Proximity использует синхронные вызовы - если и когда я приспособлю его к своим потребностям, я отредактирую его как асинхронный, нона данный момент это не важно.)


Под Linux: l2ping - сканирование запроса?

Этот пост SO ссылается на получение RSSI во время «сканирования запроса», котороезвучит как то, что я хочу, но в нем говорится об использовании библиотеки Linux Bluez, пока я нахожусь на Mac - я бы предпочел сделать это без необходимости заходить слишком далеко, если это возможно!(Я подумал об использовании виртуальной машины с USB-портом для подключения второго устройства Bluetooth ... Но было бы предпочтительнее более простое решение!)

Я вижу, что есть класс IOBluetoothDeviceInquiry, но яне уверен, если это полезно для меня.Я не собираюсь изучать протокол Bluetooth только для этой простой проблемы!


Команды

Для интереса, и не особенно важны для решения, вот сценарии Apple, которые я в настоящее времясрабатывает, когда

в диапазоне:

tell application "Skype"
    send command "SET USERSTATUS ONLINE" script name "X"
    do shell script "afplay '/System/Library/Sounds/Blow.aiff'"
end tell

вне диапазона:

tell application "Skype"
    send command "SET USERSTATUS AWAY" script name "X"
    do shell script "afplay '/System/Library/Sounds/Basso.aiff'"
end tell

Хотя они могут быть длиннее!

Ответы [ 2 ]

2 голосов
/ 03 ноября 2011

Вы правы, что установление соединения будет стоить больше энергии. Однако я не знаю API-интерфейсов в Mac OS, которые дадут вам доступ к RSSI из пакетов сканирования запросов. Вы можете получить доступ к необработанным пакетам с вашего адаптера BT, используя Mac OS PacketLogger. Смотрите этот пост Bluetooth сниффер - предпочтительно Mac OSX

Вы можете программно ставить свое устройство на обнаружение каждые пару минут, захватывать пакеты сканирования запроса с помощью пакетного логгера и анализировать RSSI. Вы можете использовать WireShark, чтобы помочь вам понять, как декодировать пакеты и найти RSSI.

Ваш самый простой вариант - просто периодически создавать соединение, измерять RSSI, а затем разрывать соединение.

1 голос
/ 07 ноября 2011

С точки зрения компромиссов для вашего варианта использования выполнение непрерывного или периодического запроса будет потреблять столько же или даже чуть больше энергии, как при периодическом подключении / чтении RSSI и отключении.В зависимости от варианта использования иногда может быть более эффективным поддерживать соединение в режиме пониженного энергопотребления (нюхать с интервалом 2,56 с) и оставаться подключенным, если устройство находится в зоне действия.И использовать RSSI для мониторинга близости (хотя это не точно, так как помехи, вызванные объектами, радикально меняются, даже если устройство может находиться в непосредственной близости)

...