Мне часто приходится отрываться от компьютера, и я хочу запускать некоторые команды, которые будут запускаться, когда мой iPhone находится близко достаточно / достаточно далеко от моего iMac (рядом с ним, а не в 2-3 метрах / по другую сторону стены). Задержка в пару минут - это нормально.
Я загрузил reduxcomputing-близость , и он работает, но срабатывает только тогда, когда устройство входит в / из диапазона Bluetooth, но мой желаемый диапазон намного больше меньше.
(Опросы на близком расстоянии [IOBluetoothDevice -remoteNameRequest]
, чтобы узнать, находится ли устройство в зоне действия Bluetooth или нет.)
Я использовал [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 использует синхронные вызовы - если и когда я подгоню его под свои нужды, я отредактирую его так, чтобы он был асинхронным но пока это не важно.)
В этом сообщении 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
Хотя они, вероятно, будут дольше!