- 用CC2541做主机扫描从机的广播数据包会出现丢包,比如我从机广播间隔为200ms,然后主机这边的扫描间隔是100ms。并且把没有RF期间会降低主频的指令也是禁止了的。最终一分钟时间主机能扫描到从机的220包数据和理论的285包数据相差有点多。
- 用sniffer抓包却能抓到280包。
- 如果要达到CC2541用协议栈的主机程序实现扫描从机广播包,达到少量丢包。需要什么特殊的设置吗?有没有什么好的建议。谢谢!
This thread has been locked.
If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.
您好,
请问您使用的是哪个 SDK 版本和项目来执行此测试? 配置了哪些扫描参数? 是否已使用 host_test 对此进行了测试?
实际上,在这种情况下,出现一些损耗是在预期中的。 接收器在固定时间内以固定的间隔打开,然后在两者之间休眠。 由于接收器并非始终处于打开状态,因此我们增加了丢失某些广播的可能性。 一般来说,监听器仅用于监听,因此我们希望设备能够接收大部分数据包。
主机用的程序是1.4.0版本的角色分别用过central和observer 扫描参数是:被动扫描 默认最大扫描个数是8 扫描的周期=扫描间隔=扫描窗口时间=100ms 发现模式为:所有 白名单:未使用 然后还有HCI指令中有一个RF期间禁止MCU我也是diable了的 。
你当中提及到的损耗是不是意思为:周围蓝牙广播的相互碰撞。
现在的现象是用sniffer抓包的现象就很好能抓到285左右但是用程序来抓包就只能抓到200包左右。那sniffer是一直处于接收状态的吗?可以简单介绍一下sniffer抓包和用CC2541的区别吗?。
有没有办法将CC2541的接收状态提升到最优,比如可以让其处于一直接收的状态,不考虑功耗的问题。
另外host_test是什么没用过,可以讲一下吗?
好的,如果测试出来的结果是确实sniffer的抓包效果要优于用协议栈central和observer这两种角色做主机获取从机的广播数据包。那么有什么改进意见或者有没有其它更优的抓取广播数据包的模块方案呢?
您好,
监听器 FW 最好在大部分时间都具有 RX,而应用程序配置成仅在设定的间隔/窗口期间打开 RX 进行扫描。
作为参考,您可以查看Scanning/Advertising SLA (以下链接不是针对您的问题,而是更新的 CC2640R2。 但您可以参考 SLA 以了解扫描的基础知识):
https://dev.ti.com/tirex/explore/node?node=AD4sGbaamTCyn0DvZgBAsg__krol.2c__LATEST
建议您可以尝试扩大扫描窗口以查看在接收量方面是否有改进,并增加 DEFAULT_MAX_SCAN_RES。
另外host_test是什么没用过,可以讲一下吗?
SDK 的文档位于 BLE-CC254x-1.5.2.0>文档文件夹中,特别是 TI_BLE_Software_Developer's Guide。 其中不包括 HostTest 项目(位于 projects\ble\HostTest\CC2541中)。
HostTest 是一个基于网络处理器的项目。 用户应将项目刷写到 LaunchPad 中。 然后需要使用 BTOOL (BLE-CC254x-1.5.2.0\Accessories\BTool)通过 UART 连接到电路板。 您可以使用此 GUI 来扫描设备(以及更多:也就是连接)。
非常感谢你的解答,通过你的示例 我找到了扫描间隔和窗口参数设置单位是625us这一问题,我以为和扫描周期的单位一致为1ms,所以造成接收的状态不是最优。经过修改现在丢包的情况得到了极大的改善。
不好意思,在后续的调试过程中我又遇到了几个问题想要请教一下你们:
1、当我设置扫描参数DEFAULT_SCAN_DURATION为100时,统计1分钟只能扫描585次,相当于扫描一次需要102ms。与设定值100ms。有2ms的误差,这个误差我通过分析可能是由于时钟误差造成。因为用定时器定时1ms发现会有20us的误差。但是我在调试过程中发现设置DEFAULT_MAX_SCAN_RES为100时这个误差会增大。统计1分钟只能扫描572次,相当于扫描一次需要104ms。就想知道是不是因为DEFAULT_MAX_SCAN_RES这个值设置大了之后会增加单个扫描事件的时间消耗。
2、DEFAULT_MAX_SCAN_RES这个值设置的最大值是多少,协议栈有限制吗。
3、将当我设置扫描参数DEFAULT_SCAN_DURATION为5000时,从机广播间隔为200ms,广播数据数据内容改变周期为1000ms,即使用GAP_SetParamValue( TGAP_FILTER_ADV_REPORTS, FALSE )指令将过滤禁止,但是依然过滤了广播数据内容相同的数据包。有没有指令可以让广播数据内容相同的数据包不被过滤呢?
您好,
1)您说将DEFAULT_SCAN_DURATION设置为100,然后又说DEFAULT_MAX_SCAN_RES 中的更改。
如果两个测试之间的唯一增量为 DEFAULT_MAX_SCAN_RES,那么就可以合理地解释为器件会花费更多的时间来捕获额外的扫描结果。这种开销意味着接收每次扫描之间的处理时间更长,也就能解释您看到的内容。无线电级别的扫描窗口不应受此变量的影响。
2)应用程序负责分配用于扫描的内存。示例 simpleBLEObserver.c 显示了用于存储扫描结果的 simpelBLEDevList。此处的最大值是根据您的应用受到限制。
3)相关参数是 TGAP_FILTER_ADV_REPORTS,默认情况下为 true。您可以通过调用 GAP_SetParamValue (TGAP_FILTER_ADV_REPORTS、false)来禁用此功能。
好的,非常感谢!前面两个问题已经明白了。第三个问题我已经使用了你说的这个参数来禁止过滤功能。但是从扫描的结果来看在一次扫描事件中底层依然是过滤了广播数据内容相同的广播包。就想问一下有没有指令可以解除在一次扫描事件中不过滤同一个从机广播内容相同的广播包。
好的,非常感谢你的回复。那基于此我还想进一步请教一下您:
1、可不可以在不与协议栈产生冲突的前提下,通过配置底层寄存器来解除在一次扫描事件中过滤广播包数据内容相同的广播包的过滤策略。如果可行,烦请告知详细的操作步骤。
2、如果操作寄存器会引起冲突,那能不能获取从机端每次广播事件完成这一状态,以便于我可以在每次广播事件之后更新广播数据内容。从而避免从机发送数据内容相同的广播包。也就可以避免主机在一次扫描事件过程中因广播内容相同被过滤。
您好,
因为链路层是在寄存器级别来处理滤波(也就是无线电驱动器命令), 由于是从源头上考虑的,因此您提出的方案是不可能的。
将 TGAP_FILTER_ADV_REPORTS 设置为 false 后,您这边无法看到更多的 ADV 报告吗?您应该能在ADV报告中看到 uptick (包括 duplicates)。
好的,谢谢!
将 TGAP_FILTER_ADV_REPORTS 设置为 false 后,可以看到更多的ADV报告,但是在一次扫描事件中是无法看到 duplicates的,不过你既然说我的方案不可以,也没有关系。我也只是想确认一下。底层是不是在一次扫描过程中即使将 TGAP_FILTER_ADV_REPORTS 设置为 false 后,依然还是会过滤duplicates只上报一次,只有广播包的值发生变化时才会上报。(因为我做过测试是将从机的广播间隔设置成200ms,主机的扫描事件周期=扫描间隔 :10240ms,DEFAULT_MAX_SCAN_RES设置为:50 并且TGAP_FILTER_ADV_REPORTS 设置成:false 。在一次扫描中只能接收到该从机的一个广播包)