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

Posted

技术标签:

【中文标题】Mac 上的蓝牙 RSSI/查询扫描 - 无需连接即可检测到 iPhone?【英文标题】:Bluetooth RSSI/Inquiry scan on Mac - proximity detection to iPhone without connecting? 【发布时间】:2011-11-03 16:22:10 【问题描述】:

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


部分解决方案:接近度

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

(Proximity polls [IOBluetoothDevice -remoteNameRequest] 以查看设备是否在蓝牙范围内。)

增强:原始RSSI

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

我认为保持连接比每隔几分钟轮询一次会消耗更多的电池寿命是否正确?

我在这里重写了proximityisInRange 方法,为我提供了一个可行的解决方案,与之前的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 直通的 VM 来连接第二个蓝牙设备……但更简单的解决方案会更好!)

我看到有一个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

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

【问题讨论】:

【参考方案1】:

你说得对,建立连接会消耗更多的能量。但是,我不知道 mac OS 上的 API 可以让您从查询扫描数据包中访问 RSSI。您可以使用 Mac OS PacketLogger 从 BT 适配器访问原始数据包。看到这个帖子Bluetooth sniffer - preferably mac osx

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

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

【讨论】:

谢谢,TJD。听起来我目前的解决方案绝对是最简单的。我会运行它几天,看看电池消耗有多严重,如果还可以,我会坚持下去。 :) 当我有一个空闲的周末时,我可能会像你说的那样尝试 PacketLogger - 我以前用过很多 WireShark。【参考方案2】:

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

【讨论】:

因此,如果我调用上面的 isInRange 方法并在调用之间延迟 30-60 秒,那么这是一种相当有效的方法吗? (我不担心 iMac 的耗电,只担心 iPhone。)我已经运行它几天了,它似乎并没有更快地耗尽电池,但很难说。

以上是关于Mac 上的蓝牙 RSSI/查询扫描 - 无需连接即可检测到 iPhone?的主要内容,如果未能解决你的问题,请参考以下文章

在 Android Studio 中读取已连接蓝牙低功耗设备的 RSSI 值

iOS 蓝牙获取MAC地址

Cordova 使用 cordova-plugin-ble-central 蓝牙插件,实现蓝牙设备持续扫描,打印RSSI等信息 RSSI三点定位 demo

降低 Android 设备上的蓝牙信号强度

Cordova 使用 cordova-plugin-ble-central 蓝牙插件,实现蓝牙设备持续扫描,打印RSSI等信息demo

Android 4.4:低功耗蓝牙;无需扫描 BLE 设备即可连接