连接Micro:bit后仅获1个服务0个特征,无法获取UART特征通知
解决Micro:bit蓝牙GATT连接仅发现1个服务、无法获取UART通知的问题
嘿,我之前折腾Micro:bit蓝牙GATT的时候也踩过类似的坑,给你梳理几个大概率遗漏的关键点,帮你定位问题:
1. 确认蓝牙权限与扫描/连接的时机
不管是Android还是iOS平台,蓝牙权限一定要配全:
- Android 12+ 需要申请
BLUETOOTH_SCAN、BLUETOOTH_CONNECT权限,还要确保在代码中动态申请(不能只在Manifest里写)。 - 扫描的时候别盲目过滤服务UUID,先尝试全量扫描,确认Micro:bit的UART服务是否能被检测到;如果一开始就过滤特定UUID,可能因为UUID格式错误(比如大小写、连字符位置)导致漏扫。
- 核心:必须在
onConnectionStateChange()回调确认连接状态为STATE_CONNECTED之后,再调用discoverServices(),提前调用会导致服务发现不完整。
2. 核对UART服务与特征的UUID
Micro:bit的UART服务和特征UUID是固定的,别搞混了:
- UART服务UUID:
6E400001-B5A3-F393-E0A9-E50E24DCCA9E - TX特征(Micro:bit发数据给手机)UUID:
6E400002-B5A3-F393-E0A9-E50E24DCCA9E - RX特征(手机发数据给Micro:bit)UUID:
6E400003-B5A3-F393-E0A9-E50E24DCCA9E
如果你的UUID是从其他地方抄的,大概率是这里错了——比如把设备信息服务(180A)当成了UART服务,这就是你只发现1个服务的原因。
3. 给服务和特征添加Null校验(解决空指针异常)
你提到的空指针异常,90%是因为直接操作未找到的服务/特征导致的。比如在onServicesDiscovered()里,一定要先判断服务、特征是否为null:
@Override public void onServicesDiscovered(BluetoothGatt gatt, int status) { if (status == BluetoothGatt.GATT_SUCCESS) { // 获取UART服务 BluetoothGattService uartService = gatt.getService(UUID.fromString("6E400001-B5A3-F393-E0A9-E50E24DCCA9E")); if (uartService == null) { Log.e(TAG, "UART服务未找到!"); return; } // 获取TX特征 BluetoothGattCharacteristic txChar = uartService.getCharacteristic(UUID.fromString("6E400002-B5A3-F393-E0A9-E50E24DCCA9E")); if (txChar == null) { Log.e(TAG, "TX特征未找到!"); return; } // 后续注册通知操作... } }
4. 正确注册TX特征的通知
就算找到了TX特征,也不能直接接收通知,必须完成两步操作:
// 第一步:启用特征的通知开关 gatt.setCharacteristicNotification(txChar, true); // 第二步:写入客户端特征配置描述符(CCCD) BluetoothGattDescriptor cccd = txChar.getDescriptor(UUID.fromString("00002902-0000-1000-8000-00805f9b34fb")); if (cccd != null) { cccd.setValue(BluetoothGattDescriptor.ENABLE_NOTIFICATION_VALUE); gatt.writeDescriptor(cccd); }
这一步必须在服务发现成功后执行,而且要确保writeDescriptor()的回调返回成功(可以在onDescriptorWrite()里确认)。
5. 检查Micro:bit的固件配置
如果上面的步骤都没问题,那可能是Micro:bit的固件没开启UART服务:
- 如果你用的是MakeCode固件,要确保添加了「蓝牙」扩展,并且在代码里启用了UART功能(比如拖拽「蓝牙 UART 开始接收」积木)。
- 自定义固件的话,要确认代码中已经注册了UART服务,比如用MicroPython的话,需要调用
bluetooth.uart.init()。
按这个顺序排查,应该能解决你遇到的问题!
内容的提问来源于stack exchange,提问作者Lechucico
相关产品推荐
相关产品推荐

