手上的蓝牙项目收尾了,这里做一下总结。
BLE 部分
1. Android 5.0 及以上可以请求MTU,有的手机请大了会失败,onMtuChange 回调方法中 会给出请到的MTU值。
2.Android 7.0 及以上 底层对搜索做了限制,30秒内最多搜索5次,频繁搜索底层不响应并报Error Log。
3.Android 6.0及以上 蓝牙搜索需要定位权限。
4.Android 8.0 开始 blueDroid开始支持蓝牙5.0,可以更新2M带宽,感觉连接速度变慢了。
5.Android 5.0 开始BLE搜索部分给出了新的API ,新API 对广播包做了解析,可以直接通过API 来拿广播中的字段值
5.0以下需要自己手撸解析。
6.API中有很多对象锁,有的操作需要异步调用。
7.连接和断开的动作需要放在主线程中执行,断开后 newState == BluetoothProfile.STATE_DISCONNECT 再执行close()释放资源,不然下次连接会耗时很久,当资源耗尽会连接不上。遇到 133 257 等协议栈报的错误close 重连即可。
8.数传部分,发送数据时 api 如果返回false 代表数据没有进入底层的缓存,需要重发. 如果要达到最高的速度需要每包数据的字节数为(MTU-3),这里可以用一个二级缓存来处理,使用生产者-消费者设计模式,使数传速度达到最大.
9.之前OTA升级速度慢,且不稳定,容易重传。发送数据后使线程wait(1000) 并在收到响应后notify 替换掉之前的sleep。
SPP 部分
1. SPP 部分的搜索使用的是老的API ,bluetoothAdapter.startDiscovery()。通过这个搜索到的设备既有BLE又有经典蓝牙,
需要加一个设备类型过滤,只拿 经典蓝牙或者双模蓝牙
2. SPP 连接前一定要执行一次停止搜索,无论有没有执行过开始搜索。可以在连接的地方加一个重连机制,增加连接的成功率
3. SPP 断开连接后acl disconnect 这个广播耗时很不稳定,这里需要特殊处理,不能通过这个来判断连接是否断开
4. SPP 的连接耗时取决于acl链路建立时间。
android 的蓝牙问题还是挺多的,尤其是BLE 的兼容性。下一份源码 根据日志去底层找找。看看蓝牙模块那边的日志,nordic 会在连接成功后定时执行5次请求MTU的操作,这时候如果在发送数据会出问题。不同的芯片厂家可能会有不同的操作。
一个android 蓝牙apk 了解以下?
York......