问题现象
蓝牙BLE扫描无法获取设备,如何定位是扫描端还是广播端的问题?
问题定位
假设当前是手机扫描与车钥匙广播的场景,可以通过以下方式排查:
在车钥匙旁边放一个其他的BLE设备,比如手表、手环或者BLE模组,在蓝牙设置界面能否扫到这个BLE设备和车钥匙。
1.如果设置能扫描到BLE设备,扫描不到车钥匙,可判断为车钥匙广播端问题,需排查是否由于硬件原因未发出广播。
2.如果设置能扫描到,应用扫描不到,可判断为应用的问题,参考以下步骤排查:
- 是否正确设置ScanFilter的过滤条件,例如:参考BLE扫描流程,为什么无法扫描到附近的BLE设备?
- 是否正确设置广播端参数,例如:ble.on('BLEDeviceFind')订阅扫描结果,返回蓝牙名称deviceName为什么是空的?
- 广播端携带的字段与扫描端过滤的字段是否一致,例如:蓝牙扫描ScanFilter过滤参数serviceUuid,无法扫描到目标设备,为什么过滤参数serviceSolicitationUuid就可以扫描到目标设备?
分析结论
- 可能原因1: 硬件原因。
如果是硬件原因,需要联系硬件提供方分析具体原因。
- 可能原因2: 应用侧代码设置问题。
应用侧问题分析结论:
- 示例中设置了ScanFilter过滤条件,所以扫描不到目标设备,过滤条件需要根据实际情况调整。
- 对端设备发广播时没有把参数AdvertiseData中includeDeviceName设置为true,携带设备名称。由于广播报文数据内容中没有设备名称,扫描到的设备上报就不会有设备名称。
- serviceUuid一般是外围设备在广播包里携带,表明自己支持哪些服务。serviceSolicitationUuid一般是中央设备在广播包里携带,表明自己希望搜索到哪些服务,但也有设备厂商在外围设备广播包里携带,表明外围设备希望搜索到哪些服务。
总结
蓝牙BLE扫描涉及两端交互,对于扫描端与广播端都需要进行排查,可以通过上述方法进行排查,初步确认问题所在。