android 过滤重复数据,获取BLE扫描,不使用filter重复的UUID

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

我正在处理类似的问题,即随着时间的推移可靠地跟踪多个广告设备的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;

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值