Xcode Mac上的蓝牙RSSI/查询扫描-无需连接即可检测到iPhone?
我必须经常冲出电脑,当我的iPhone离我的iMac足够近/足够远时(离它2-3米远/墙的另一边),我想触发一些命令来运行。几分钟的延迟就可以了Xcode Mac上的蓝牙RSSI/查询扫描-无需连接即可检测到iPhone?,xcode,macos,cocoa,bluetooth,proximity,Xcode,Macos,Cocoa,Bluetooth,Proximity,我必须经常冲出电脑,当我的iPhone离我的iMac足够近/足够远时(离它2-3米远/墙的另一边),我想触发一些命令来运行。几分钟的延迟就可以了 部分解决方案:邻近性 我已经下载了,它可以工作,但这只会在设备进入/超出蓝牙范围时触发,但我想要的范围要小得多 (近距离轮询以查看设备是否在蓝牙范围内。) 增强:罗尔斯西 我曾经在连接到iPhone时获得RSSI(断开连接时,这只返回+127),但为了节省iPhone的电池寿命,我宁愿避免建立完整的蓝牙连接 我认为保持连接比仅仅每隔几分钟轮询一次会消
部分解决方案:邻近性 我已经下载了,它可以工作,但这只会在设备进入/超出蓝牙范围时触发,但我想要的范围要小得多 (近距离轮询以查看设备是否在蓝牙范围内。) 增强:罗尔斯西 我曾经在连接到iPhone时获得RSSI(断开连接时,这只返回
+127
),但为了节省iPhone的电池寿命,我宁愿避免建立完整的蓝牙连接
我认为保持连接比仅仅每隔几分钟轮询一次会消耗更多的电池寿命,这是正确的吗
我已经在这里覆盖了isInRange
的approxity
方法,为我提供了一个工作解决方案,与以前的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);
}
超出范围:
tell application "Skype"
send command "SET USERSTATUS AWAY" script name "X"
do shell script "afplay '/System/Library/Sounds/Basso.aiff'"
end tell
虽然这些可能会变得更长 建立连接会消耗更多的能量,这是正确的。但是,我不知道mac OS上的API会允许您从查询扫描数据包访问RSSI。您可以使用Mac OS PacketLogger从BT适配器访问原始数据包。看到这个帖子了吗 您可以通过编程每隔几分钟将设备放入discovery,使用packetlogger捕获查询扫描数据包,并解析出RSSI。您可以使用WireShark帮助您了解如何解码数据包并找到RSSI
您最简单的选择可能是定期创建连接,测量RSSI,然后断开连接。就您的用例而言,进行连续或定期查询将消耗与定期连接/读取RSSI和断开连接相同甚至更多的能量。根据使用情况,有时在低功率模式下(以2.56秒的间隔嗅探)保持连接并在设备处于范围内时保持连接可能更有效。并使用RSSI来监测邻近性(尽管这并不准确,因为即使设备可能在附近,由于物体引起的干扰也会大幅改变RSSI)谢谢,TJD。听起来我目前的解决方案绝对是最简单的。我会运行几天,看看电池的耗电情况有多糟,如果可以的话,我会坚持下去。:)当我有一个空闲的周末时,我可能会像你说的那样尝试使用PacketLogger——我以前经常使用WireShark。因此,如果我调用上面的
isInRange
方法,调用之间的延迟为30-60秒,那么这是一种相当有效的方法吗?(我不担心iMac的耗电,只担心iPhone。)我已经运行了几天了,它的耗电速度似乎没有快多少,但很难说。
tell application "Skype"
send command "SET USERSTATUS AWAY" script name "X"
do shell script "afplay '/System/Library/Sounds/Basso.aiff'"
end tell