Bluetooth RSSI / Сканирование запросов на Mac - обнаружение приближения к iPhone без подключения?

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


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

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

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

Улучшение: rawRSSI

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

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

Я переопределил метод isInRange приближения здесь чтобы дать мне рабочее решение, которое, вероятно, относительно интенсивно расходует заряд батареи по сравнению с предыдущим методом 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

Хотя они, вероятно, будут дольше!

6
задан Community 23 May 2017 в 11:47
поделиться