官方库 BLE-CC254x-1.4.2.2
例程 SimpleBLEPeripheral
手机 华为荣耀7x
手机系统 升级到Android 8.0
现象:
1、在Android未升级前,打开nRF Connect可扫描到CC2541,Android升级后,nRF Connect不能扫描到CC2541,但在IOS上使用nRF Connect可以扫描到。
2、将升级后的Android手机打开nRF Connect,并等待很长时间后,偶尔也有发现CC2541的现象,但需要等待的时间较长。
3、使用IOS的nRF Connect模拟发出广播报文,升级后的Android手机可以正常接收到报文。
已经排查:
1、已经排查广播包PDU长度不对,导致的Android 8.0不能发现的问题,确认应该不是该问题导致。
2、程序中所有参数和设置均为例程中给出,未修改。
Viki Shi:
参考下这边的类似问题,扫描应答数据的长度问题: e2e.ti.com/…/687468
user3880898:
回复 Viki Shi:
Hi , Viki Shi我检查了扫描应答数据的长度,是符合要求的。我也尝试修改应答数据到更小的长度,仍然不能被手机发现。
Viki Shi:
回复 user3880898:
查一下安卓8.0升级的release note,看看对蓝牙这块的参数是否有改动
user3880898:
回复 Viki Shi:
Hi, Viki Shi
我查看的安卓8.0的release note,其中蓝牙最初接收扫描数据时,将不再有长度限制,描述如下:
———————————————————————————安卓8.0行为变更—————————————————————————————-
Android 8.0 对 ScanRecord.getBytes()函数检索的数据长度做出以下变更:
getBytes() 函数对于所接收的字节数不作任何假定。因此,应用不应受所返回的任何最小或最大字节数的影响。相反,应用应当计算所返回数组的长度。
兼容蓝牙 5 的设备返回的数据长度可能会超出之前最大约 60 个字节的限制。
如果远程设备未提供扫描响应,则也可能返回少于 60 个字节的数据。————————————————————————————————————————————————————————————————-
因而我猜测CC2541实际发出的数据除了程序中设置的GAPROLE_ADVERT_DATA外,还有其他数据,导致Android后期处理数据时引发异常。
我通过Packet Sniffer抓包发现,CC2541发出ADV数据后,安卓并没有返回对应的Request包,所以有上面的猜测