我必须经常离开计算机,并且我想触发一些命令,以在iPhone离iMac足够近/足够远(与之相邻时,距离2-3米/墙的另一侧)足够远。几分钟的延迟就可以了。

部分解决方案:接近度

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

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

增强功能:rawRSSI

当我连接到iPhone时,我已经使用 [IOBluetoothDevice -rawRSSI] 来获取RSSI(断开连接时,它会返回+127),但是为了节省iPhone的电池生命周期,我宁愿避免建立完整的蓝牙连接

我是否正确地认为维护连接会消耗更多的电池生命周期,而不是每隔几分钟轮询一次?

我在这里重写了isInRangeproximity方法,为我提供了一个工作解决方案,与以前的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);
}

(邻近使用同步调用-如果且当我适合我的需要时,我会将其编辑为异步,但是现在这并不重要。)

在Linux下:l2ping-查询扫描?

This SO post引用在“查询扫描”期间获取RSSI,这听起来像我想要的,但是它谈到在Linux上使用Linux Bluez库,而我在Mac上-我希望这样做而不必走得太远! (我曾考虑过使用带有USB直通的VM来连接第二个蓝牙设备。但是,更简单的解决方案将是可取的!)

我看到有一个IOBluetoothDeviceInquiry类,但是我不确定这是否对我有用。我不想仅仅为了这个简单的问题而学习蓝牙协议(protocol)!

命令

出于兴趣,但与解决方案并不特别相关,以下是我当前在以下情况下触发的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

虽然这些可能会更长!

最佳答案

在您的用例权衡方面,与进行定期连接/读取RSSI和断开连接相比,进行连续或定期查询将消耗相同甚至更多的能量。根据使用情况,有时将连接保持在低功耗模式(间隔为2.56秒的嗅探)并保持连接(如果设备在范围内)可能会更有效。并使用RSSI监视接近度(尽管由于物体引起的干扰会导致rssi急剧变化(即使设备可能接近),但这种方法还是不准确的)

关于xcode - 在Mac上进行蓝牙RSSI/查询扫描-无需连接即可检测到iPhone的距离?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/7998335/

10-12 00:23
查看更多