Mac上的蓝牙RSSI /查询扫描 - 无需连接即可在iPhone上进行接近检测?

时间:2011-11-03 16:22:11

标签: xcode macos cocoa bluetooth proximity

我必须经常离开电脑,我想触发一些命令,当我的iPhone离我的iMac足够近/足够远时(在它旁边2-3米远/另一侧)壁)。几分钟的延迟很好。


部分解决方案:接近度

我已经下载了reduxcomputing-proximity并且它可以正常工作,但这仅在设备进入/退出蓝牙范围时触发,但我想要的范围要小得多。

(邻近轮询[IOBluetoothDevice -remoteNameRequest]以查看设备是否处于蓝牙范围内。)

增强功能:rawRSSI

当我连接到iPhone时,我已经使用[IOBluetoothDevice -rawRSSI]来获取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 - 查询扫描?

This SO post引用在“查询扫描”期间获取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

超出范围:

tell application "Skype"
    send command "SET USERSTATUS AWAY" script name "X"
    do shell script "afplay '/System/Library/Sounds/Basso.aiff'"
end tell

虽然这些可能会变得更长!

2 个答案:

答案 0 :(得分:2)

你是正确的,建立连接将花费更多的能量。但是,我不知道mac OS上的API会让您从查询扫描数据包中访问RSSI。您可以使用Mac OS PacketLogger访问BT适配器的原始数据包。请参阅此帖子Bluetooth sniffer - preferably mac osx

您可以每隔几分钟以编程方式将设备置于发现状态,使用packetlogger捕获查询扫描数据包,然后解析出RSSI。您可以使用WireShark来帮助您了解如何解码数据包并找到RSSI。

您最简单的选择可能是定期创建连接,测量RSSI,然后拆除连接。

答案 1 :(得分:1)

就您的用例进行权衡而言,进行连续或定期查询将消耗与定期连接/读取RSSI和断开连接相同甚至更多的能量。根据使用情况,有时可能更有效地将连接保持在低功率模式(以2.56秒间隔嗅探)并且如果设备在范围内则保持连接。并使用RSSI来监控接近度(尽管由于物体的干扰导致干扰不准确,即使设备可能在附近也是如此)