Мне часто приходится уклоняться от компьютера, и я хочу, чтобы некоторые команды запускались, когда мой 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
Хотя они могут быть длиннее!