Android BLE设置连接PHY时onPhyUpdate返回状态6(GATT_REQUEST_NOT_SUPPORTED)
Android BLE设置PHY失败,返回GATT_REQUEST_NOT_SUPPORTED状态码
我正在开发一款通过BLE与外部模块通信的Android应用,尝试调用gatt.setPreferredPhy(txPhy, rxPhy, phyOptions)方法设置BLE连接PHY。我已经试过用所有不同的PHY类型整数值作为txPhy和rxPhy参数,请求编码PHY时也添加了对应的phyOptions整数值,但每次onPhyUpdate回调都返回状态码6(GATT_REQUEST_NOT_SUPPORTED)。其他所有GATT回调均返回状态码0(GATT_SUCCESS)。
我的应用权限如下:
<uses-permission android:name="android.permission.BLUETOOTH"/> <uses-permission android:name="android.permission.BLUETOOTH_ADMIN"/> <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION"/> <uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION"/> <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" /> <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
Android设备规格参考nrf connect截图:
所通信的蓝牙模块为瑞萨DA14531,其数据手册显示该模块支持BLE PHY相关配置。
排查方向与解决方案
1. 模块与设备的PHY支持不匹配
从DA14531数据手册可知:
- 模块支持LE 1M PHY的发射与接收
- 仅支持LE 2M PHY的接收,不支持2M发射
- 支持LE Coded PHY(S=8/S=2)的发射与接收
如果你的请求中txPhy设为PHY_LE_2M,会因模块不支持而失败,需确保txPhy仅使用模块支持的类型。
2. 确认API级别与系统版本兼容性
setPreferredPhy方法要求Android API 26及以上,需检查:
- 应用的
minSdkVersion是否≥26 - 测试设备的系统版本是否满足API 26+要求,低于该版本的设备本身不支持此方法。
3. 规范调用时机
必须在BLE连接完全建立后(onConnectionStateChange回调返回连接成功状态),再调用setPreferredPhy,连接过程中或断开状态下调用会直接触发不支持错误。
4. 修正参数组合
- 确保使用正确的PHY常量值:
PHY_LE_1M= 1PHY_LE_2M= 2PHY_LE_CODED= 3
- 请求LE Coded PHY时,phyOptions需对应设为
PHY_OPTION_S2(1)或PHY_OPTION_S8(2),不可与其他PHY类型混用。 - 避免用位或操作同时设置多个PHY类型,部分设备/模块不支持混合请求。
5. 补充高版本权限
针对Android 12及以上版本,需额外添加BLUETOOTH_CONNECT权限:
<uses-permission android:name="android.permission.BLUETOOTH_CONNECT" android:maxSdkVersion="33" />
同时确认Manifest中声明了BLE特性:
<uses-feature android:name="android.hardware.bluetooth_le" android:required="true" />
内容的提问来源于stack exchange,提问作者rksilvergreen
相关产品推荐
相关产品推荐

