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


image.png

引用自 https://www.jianshu.com/p/d991f0fdec63


  • android 6.0以上需要获取到定位权限。否则会报如下运行时异常:

蓝牙配网失败的可能原因 - 图2

  • android 7.0后不能在30秒内扫描+停止超过5次。(官网没特意说明,可自行测试,设置扫描时长为3秒,连续扫描10次,稳定复现5次后不能扫描到任何设备。Android 蓝牙模块会打印当前应用扫描太频繁的log日志,并在android 5.0ScanCallback回调中触发onScanFailed(int),返回错误码:ScanCallback.SCAN_FAILED_APPLICATION_REGISTRATION_FAILED,表示APP无法注册,无法开始扫描。

蓝牙配网失败的可能原因 - 图3

  • 一般蓝牙设备对象都是通过onScanResult(int,ScanResult)返回,而不会在onBatchScanResults(List)方法中返回,除非手机支持批量扫描模式并且开启了批量扫描模式。批处理的开启请查看ScanSettings

  • Android 10进行BLE扫描时需要打开GPS

  • Android 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