Android BLE应用开发的注意事项

1.在工厂中生产了很多设备一起堆放时应用会可能发生ANR,原因是设备很多时会不停的调用onLeScan()方法,在 BluetoothAdapter.startLeScan()的时候,在BluetoothAdapter.LeScanCallback.onLeScan()中不能做太多事情。

2.使用 BluetoothDevice.connectGatt()或者 BluetoothGatt.connect()等建立BluetoothGatt连接的时候,在任何时刻都只能最多一个设备在尝试建立连接。如果同时对多个蓝牙设备发起建立 Gatt 连接请求。如果前面的设备连接失败了,后面的设备请求会被永远阻塞住,不会有任何连接回调。最后采取入队出队的形式有序的连接设备,也就是上一次的连接成功、失败或者Timeout后才进行下一次连接,需要注意的是连接超时时要调用BluetoothGatt.disconnect()来释放建立连接请求,在Android BLE中以请求响应的思维去做开发会避免掉很多问题,这里说的入队出队形式后面还有几个地方涉及。

3.在连续频繁调用writeCharacteristic() /readCharacteristic()的情况下最好是要等到onCharacteristicWrite() / onCharactericRead()回调后在发送下一个读写指令,即队列形式的去发送write/read指令。

4.在工厂生产环境下,选择设备连接时找不到设备,开始是采取设备包装上打印设备码通过输入设备码或者扫描二维码来进行连接设备,但是后面发现这种方法效率太低;研究发现当设备靠手机最近时信号是最强的,因此在搜索列表按照信号强度来排序显示设备,因此这种情况往往拿在手上的设备排在搜索设备列表的第一位

5.开启搜索时要定时的主动停止搜索,不然久了之后会无法搜索到设备或者手机搜索设备很慢

6.在搜索中或者链接设备的过程中关闭手机蓝牙会导致app发生ANR,因此当监听到蓝牙关闭广播时要主动停止搜索设备,调用disconnect()取消链接

7.Android手机部分手机有个BUG对于bonded的设备discoverServier()时候会获取到之前绑定设备的server缓存导致获取不到设备的最新的服务列表,因此要用反射调用BluetoothGatt类的隐藏方法reflesh()去刷新cache。此方法见与Nordic的Android dfu升级模块有解释

8.华为手机做dfu升级时无法控制设备而且获取到的电量之类的数据都是乱码的,但是用其他手机连接该设备又可以正常获取,唯除用于进行DFU升级的手机不能控制不能正常获取设备信息,该问题待解决-----尝试了很多方法。。。




扫描二维码关注公众号,回复: 1893328 查看本文章


猜你喜欢

转载自blog.csdn.net/u010949962/article/details/52314475