6

我必须经常远离计算机,并且当我的 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

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

4

2 回答 2

2

你是对的,建立连接会消耗更多的能量。但是,我不知道 mac OS 上的 API 可以让您从查询扫描数据包中访问 RSSI。您可以使用 Mac OS PacketLogger 从 BT 适配器访问原始数据包。看到这篇文章蓝牙嗅探器 - 最好是mac osx

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

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

于 2011-11-03T17:23:20.427 回答
1

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

于 2011-11-07T17:45:27.677 回答