Ben*_*jie 6 macos xcode cocoa bluetooth proximity
我不得不频繁地离开电脑,我想触发一些命令,当我的iPhone离我的iMac足够远时(靠近它与2-3米远/墙的另一侧).几分钟的延迟很好.
我已经下载了reduxcomputing-proximity并且它可以工作,但这仅在设备进入/退出蓝牙范围时触发,但我想要的范围要小得多.
(接近轮询[IOBluetoothDevice -remoteNameRequest]以查看设备是否处于蓝牙范围内.)
[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);
}
Run Code Online (Sandbox Code Playgroud)
(Proximity使用同步调用 - 如果我符合我的需要,我会将其编辑为异步,但现在这并不重要.)
这个SO帖子引用了在'查询扫描'期间获得RSSI,听起来像我想要的,但它谈到使用Linux Bluez库,而我在Mac上 - 我宁愿这样做而不必偏离太远,如果可能!(我考虑过使用带有USB pass-thru的虚拟机连接第二个蓝牙设备......但更简单的解决方案更可取!)
我看到有一IOBluetoothDeviceInquiry堂课,但我不确定这对我有用.我不打算只为这个简单的问题学习蓝牙协议!
对于兴趣,并没有特别相关的解决方案,这里是我目前触发的Apple脚本
在范围内:
tell application "Skype"
send command "SET USERSTATUS ONLINE" script name "X"
do shell script "afplay '/System/Library/Sounds/Blow.aiff'"
end tell
Run Code Online (Sandbox Code Playgroud)
超出范围:
tell application "Skype"
send command "SET USERSTATUS AWAY" script name "X"
do shell script "afplay '/System/Library/Sounds/Basso.aiff'"
end tell
Run Code Online (Sandbox Code Playgroud)
虽然这些可能会变得更长!
就您的用例的权衡而言,进行连续或定期查询将消耗与定期连接/读取 RSSI 和断开连接相同甚至更多的能量。根据使用情况,有时在低功耗模式下维持连接(以 2.56 秒间隔进行嗅探)并在设备处于范围内时保持连接可能会更有效。并使用 RSSI 来监控接近度(尽管它并不准确,因为即使设备可能很接近,由于物体的干扰也会极大地改变 RSSI)