Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/xcode/7.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Xcode Mac上的蓝牙RSSI/查询扫描-无需连接即可检测到iPhone?_Xcode_Macos_Cocoa_Bluetooth_Proximity - Fatal编程技术网

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

Xcode Mac上的蓝牙RSSI/查询扫描-无需连接即可检测到iPhone?,xcode,macos,cocoa,bluetooth,proximity,Xcode,Macos,Cocoa,Bluetooth,Proximity,我必须经常冲出电脑,当我的iPhone离我的iMac足够近/足够远时(离它2-3米远/墙的另一边),我想触发一些命令来运行。几分钟的延迟就可以了 部分解决方案:邻近性 我已经下载了,它可以工作,但这只会在设备进入/超出蓝牙范围时触发,但我想要的范围要小得多 (近距离轮询以查看设备是否在蓝牙范围内。) 增强:罗尔斯西 我曾经在连接到iPhone时获得RSSI(断开连接时,这只返回+127),但为了节省iPhone的电池寿命,我宁愿避免建立完整的蓝牙连接 我认为保持连接比仅仅每隔几分钟轮询一次会消

我必须经常冲出电脑,当我的iPhone离我的iMac足够近/足够远时(离它2-3米远/墙的另一边),我想触发一些命令来运行。几分钟的延迟就可以了


部分解决方案:邻近性 我已经下载了,它可以工作,但这只会在设备进入/超出蓝牙范围时触发,但我想要的范围要小得多

(近距离轮询以查看设备是否在蓝牙范围内。)

增强:罗尔斯西 我曾经在连接到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