Combo模组端
Android
说明:Android这一部分以下内容都是从网络搬运汇总,本人没有亲自做测试验证。
由于Android的蓝牙协议栈bluedroid 在低版本存在一些bug,如当连接的时候,callback 返回 status=133 的情况. 出现这种情况的原因应该手机APP频繁的操作连接以及断开。解决的方式可以参考以下几种:
1、当断开连接时,调用mBluetoothGatt.disconnect(); 该方式只是断开连接,并没有真正释放资源,可以在 disconnect 的回调里调用 mBluetoothGatt.close()
2、当连接同一台设备时,可通过判断地址是否一样,使用mBluetoothGatt.connect(); 但这方式似乎会导致连接放慢.
3、出现这种情况,delay 一会儿,然后再重连. 只能通过多次重连方式。
4、从google 回来的一些资料显示,当手机断开连接 mBluetoothGatt.disconnect(); 甚至是mBluetoothGatt.close()。 app蓝牙只是给蓝牙服务发送了一个断开连接,蓝牙服务是以队列的形式去处理它. 要彻底断开该连接,可以通过让对方设备(从设备)也主动断开。我尝试过这种方式,确实解决了我当前的问题.
connection fail 资料:
https://issuetracker.google.com/issues/37127889
https://issuetracker.google.com/issues/36995652
status=133, 对于状态的错误:GATT_ERROR
https://android.googlesource.com/platform/external/bluetooth/bluedroid/+/android-4.4.4_r2.0.1/stack/include/gatt_api.h
引用自 https://www.cnblogs.com/xiaoxiaoqingyi/p/9293206.html
引用自 https://www.jianshu.com/p/d991f0fdec63
android 6.0
以上需要获取到定位权限。否则会报如下运行时异常:
android 7.0
后不能在30秒内扫描+停止超过5次。(官网没特意说明,可自行测试,设置扫描时长为3秒,连续扫描10次,稳定复现5次后不能扫描到任何设备。Android 蓝牙模块会打印当前应用扫描太频繁的log日志,并在android 5.0
的ScanCallback
回调中触发onScanFailed(int)
,返回错误码:ScanCallback.SCAN_FAILED_APPLICATION_REGISTRATION_FAILED
,表示APP无法注册,无法开始扫描。
一般蓝牙设备对象都是通过
onScanResult(int,ScanResult)
返回,而不会在onBatchScanResults(List)
方法中返回,除非手机支持批量扫描模式并且开启了批量扫描模式。批处理的开启请查看ScanSettings
。Android 10
进行BLE扫描时需要打开GPSAndroid 8
更新了一个扫描API,系统层为你提供后台持续扫描的能力。(即便APP已被杀死,扫描仍会继续。但如果用户重启或关闭蓝牙后,该扫描停止)。 具体可查看官网: BluetoothLeScanner#startScan。
引用自 https://www.jianshu.com/p/2dba7f067372
发现服务时,会存在发现不了特定服务的情况。或者说,整个
BluetoothGatt
对象中的服务列表为空。BluetoothGatt
类中存在一个隐藏的方法refresh()
,用于刷新Gatt的服务列表。当发现不了服务时,可以通过反射去调用该方法,再发现一遍服务。当和外设进行ble通信时,如出现任何意外情况,马上调用断开连接操作。
引用自 https://www.jianshu.com/p/d273e46f47b1
iOS
微信小程序
https://developers.weixin.qq.com/community/develop/doc/012db50433250e3254c233ca8721ee2e