You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

连接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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.19 09:11:24