获取BLE扫描,不使用过滤器复制UUID

时间:2015-06-11 13:01:48

标签: android bluetooth-lowenergy network-scan

我正在写一个BLE应用程序,需要跟踪外围设备是广告还是停止。

我关注了getting peripherals without duplications这个和BLE Filtering behaviour of startLeScan(),我完全赞同这里。

为了使其可行,我保留了定时器,在一定时间(3秒)后重新扫描外围设备。但随着市场上推出的新设备(5.0更新),有时需要重新扫描一段时间才能找到外围设备。

有任何建议或是否有人达成过此目的?

3 个答案:

答案 0 :(得分:4)

听起来您对扫描广告感兴趣而不是连接到设备。这是观察者"蓝牙Low Evergy中的角色,对应于"播音机"角色更常被称为灯塔。 (蓝牙核心4.1第1卷A部分第6.2节)

通常,您启用被动扫描,查找信标广播的ADV_IND数据包。这些可能包含也可能不包含UUID。或者,您可以通过发送可能收到SCAN_RSP的SCAN_REQ来进行主动扫描。许多设备在ADV_IND和SCAN_RSP中使用不同的广告内容来增加可以广播的信息量 - 例如,您可以将UUID128放入ADV_IND,然后是SCAN_RSP中的设备名称。 (蓝牙核心4.1第2卷第E部分第7.8.10节)

现在你需要定义"离开" - 你期望广告停止或消失吗?您将获得接收信号强度指示" RSSI"每个广告(蓝牙核心4.1第2卷第E部分第7.7.65.2节) - 这就是iBeacon定位的工作方式,并且对Android中的信标接收器提供了大量支持。

或者,您等待 N 秒,以便每隔 T 秒发送广告,其中 N> 2T 。定时方法的缺点是可能没有收到信标与确定接收弱信标相同;确保您需要 N ,这会影响广播公司关闭或超出范围与您的应用检测到它之间的延迟。

还有一件事 - 请注意,如果某些内容连接到外围设备(如果您确实在扫描外围设备),广告就会停止,这是监控RSSI的另一个好理由。

答案 1 :(得分:3)

第一种情况:保税设备

我们知道如果制作了bond,那么大多数商用设备会在重新连接期间发送directed advertisements。在这种情况下,根据BLE 4.0规范,您无法在任何BLE嗅探器上扫描这些设备。

第二种情况:可连接设备

外围设备最初处于复位阶段时通常处于此模式。中心发送connect发起者以响应advertisement数据包。此方案为您提供了很大的灵活性,因为您可以使用两个主要配置选项来更改连接时间。它们是:外围设备slavelatency和中心设备conninterval。现在,我不知道要在Android平台上运行需要多少努力,但如果您使用Bluez BLE堆栈和可配置的外围设备(如TI传感器标签),那么您可以使用这些值。

第三种情况:信标设备

由于这是你的问题所围绕的,根据BLE架构,没有参数可供使用。在这种情况下,当一个外围设备选择发送它的信标信号时,中央只是一个愚蠢的设备。

参考:

http://www.amazon.com/Inside-Bluetooth-Communications-Sensing-Library/dp/1608075796/ref=pd_bxgy_14_img_z

http://www.amazon.com/Bluetooth-Low-Energy-Developers-Handbook/dp/013288836X/ref=pd_bxgy_14_img_y

答案 2 :(得分:3)

编辑:我忘记了,您是否尝试将广告客户设置为不可连接?这样你就可以获得重复的扫描结果

我正在处理类似的问题,即可以随时跟踪多个广告设备的RSSI值。

很遗憾,我找到的最可靠的方法并不好,相当脏和耗电量。似乎由于处理BLE的Android设备的数量不同而且最可靠。

我开始LE扫描,一旦得到回调,我就设置一个标志停止并再次开始扫描。这样就解决了 DUPLICATE_PACKET过滤器问题,因为无论何时开始全新扫描都会重置

我将ScanResults转储到sqlite数据库中,每x秒缩小并评估一次。

应该很容易使缩小适应您的用例,即删除早于X的条目,然后查询设备是否存在,以确定您是否在过去的X秒内收到了ScanResult。然而,不要把X值太低,因为你必须考虑到你在LE LE扫描上丢失了很多广告包,相比之下,即蓝色的BLE扫描..

编辑: 我可以添加一些我已经找到的信息,以加快广告发现的性能。它涉及修改和编译bluedroid源以及对设备的root访问权限。最简单的是自己建立一个完整的机器人,即Cyanogenmod。

当LE扫描正在运行时,蓝牙模块通过HCI将扫描响应发送到bluedroid堆栈。有各种检查,直到它最终交给通过JNI访问的Java onScanResult(...)

通过比较蓝牙模块发送的hci数据的日志(可以在/etc/bluetooth/bt_stack.conf中启用)和bluedroid堆栈中的调试输出以及Java端,我注意到很多广告包都是丢弃,特别是在一些检查中。 我真的不明白,除此之外它与bluedroid查询数据库有关 从ScanResult的文档中我们看到ScanRecord包含广告数据和扫描响应数据。所以它可能是android阻止报告,直到它获得扫描响应数据/直到很明显没有扫描响应数据。我无法验证这种可能性。

由于我只对这些数据包的RSSI的快速更新感兴趣,我只是评论说检查。似乎我通过hci从蓝牙模式获得的每个数据包都被传递到Java端。

功能BOOLEAN btm_ble_update_inq_result(tINQ_DB_ENT *p_i, UINT8 addr_type, UINT8 evt_type, UINT8 *p)中的文件btm_ble_gap.c 在第2265行开始的以下检查中注释掉to_report = FALSE;

/* active scan, always wait until get scan_rsp to report the result */
if ((btm_cb.ble_ctr_cb.inq_var.scan_type == BTM_BLE_SCAN_MODE_ACTI &&
     (evt_type == BTM_BLE_CONNECT_EVT || evt_type == BTM_BLE_DISCOVER_EVT)))
{
    BTM_TRACE_DEBUG("btm_ble_update_inq_result scan_rsp=false, to_report=false,\
                          scan_type_active=%d", btm_cb.ble_ctr_cb.inq_var.scan_type);
    p_i->scan_rsp = FALSE;
    // to_report = FALSE; // to_report is initialized as TRUE, so we basically leave it to report it anyways.
}
else
    p_i->scan_rsp = TRUE;