编辑:我忘记了,您是否尝试将广告客户设置为不可连接? 这样你就可以获得重复的扫描结果
我正在处理类似的问题,即随着时间的推移可靠地跟踪多个广告设备的RSSI值。
很遗憾,我find的最可靠的方法是不好,相当脏和耗电量。 似乎由于处理BLE的Android设备数量不同而且最可靠。
我开始LE扫描,一旦我得到一个回调,我设置一个标志停止并再次开始扫描。 这样您就可以解决DUPLICATE_PACKETfilter问题,因为每当您开始全新扫描时它都会重置 。
ScanResults我转储到一个sqlite数据库,我每x秒收缩和评估一次。
应该很容易使收缩适应您的用例,即删除早于X的条目,然后查询设备是否存在以确定您是否在过去的X秒内收到了ScanResult。 然而,不要把X值太低,因为你必须考虑到你在LE LE扫描上仍然丢失了很多广告包,相比之下,即蓝色的BLE扫描。
编辑:我可以添加一些我已经find的信息,以加快广告发现的性能。 它涉及修改和编译bluedroid源以及对设备的root访问权限。 最简单的是自己构建一个完整的机器人,即Cyanogenmod。
当LE扫描正在运行时,蓝牙模块通过HCI将扫描响应发送到bluedroid堆栈。 进行各种检查,直到它最终传递给通过JNI访问的Java onScanResult(...) 。
通过比较蓝牙模块发送的hci数据的日志(可以在/etc/bluetooth/bt_stack.conf中启用)与bluedroid堆栈中的调试输出以及Java端,我注意到很多广告包被丢弃,尤其是在一些检查。 我真的不明白,除此之外它与bluedroid查询数据库有关从ScanResult的文档中我们看到ScanRecord包含广告数据和扫描响应数据。 所以它可能是android阻止报告,直到它获得扫描响应数据/直到很清楚没有扫描响应数据。 我无法validation这种可能性。
由于我只对这些数据包的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中BOOLEAN btm_ble_update_inq_result(tINQ_DB_ENT *p_i, UINT8 addr_type, UINT8 evt_type, UINT8 *p)注释掉to_report = FALSE; 在以下检查中从2265行开始。
/* 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;