我必须经常远离计算机,并且当我的 iPhone 离 iMac 足够近/足够远时(在它旁边与 2-3 米远/墙的另一侧),我想触发一些命令运行。几分钟的延迟就可以了。
部分解决方案:接近度
我已经下载了 reduxcomputing-proximity并且它可以工作,但这只会在设备进入/超出蓝牙范围时触发,但我想要的范围要小得多。
(接近轮询[IOBluetoothDevice -remoteNameRequest]
以查看设备是否在蓝牙范围内。)
增强:rawRSSI
我曾经[IOBluetoothDevice -rawRSSI]
在连接到 iPhone 时获取 RSSI(断开连接时返回+127
),但为了节省 iPhone 的电池寿命,我宁愿避免建立完整的蓝牙连接。
我认为保持连接比每隔几分钟轮询一次会消耗更多的电池寿命,这是否正确?
我已经覆盖了这里的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 直通的 VM 来连接第二个蓝牙设备……但更简单的解决方案会更好!)
我看到有一IOBluetoothDeviceInquiry
堂课,但我不确定这对我是否有用。我不打算仅仅为了这个简单的问题而学习蓝牙协议!
命令
出于兴趣,与解决方案无关,这里是我目前触发的 Apple Scripts
在范围内:
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
虽然这些可能会变得更长!