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

Android Things Preview 6(树莓派3)无法连接HC-05蓝牙模块问题咨询

解决Android Things Preview 6连接HC-05经典蓝牙模块的问题

你遇到的核心问题其实是Android Things作为无UI嵌入式系统,不会像普通手机那样弹出配对密钥输入窗口——所有配对流程都需要你通过代码手动处理,这也是导致连接失败并抛出IO Exception的主要原因。下面是针对性的解决方案:

1. 先确认权限是否齐全

Android Things对蓝牙的权限要求和普通Android基本一致,但容易漏掉位置权限(经典蓝牙扫描必须依赖它)。请确保你的AndroidManifest.xml里添加了以下权限:

<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" />

2. 手动拦截并处理配对请求(关键步骤)

因为没有系统弹窗,你需要注册一个高优先级的广播接收器,拦截系统的配对请求,直接输入HC-05的默认PIN码(通常是1234或0000,可根据模块说明书调整):

注册广播接收器

在你的Activity或Service的onCreate方法中添加:

IntentFilter pairingFilter = new IntentFilter(BluetoothDevice.ACTION_PAIRING_REQUEST);
// 设置高优先级,确保我们先于系统处理配对请求
pairingFilter.setPriority(IntentFilter.SYSTEM_HIGH_PRIORITY);
registerReceiver(pairingRequestReceiver, pairingFilter);

实现配对处理逻辑

private BroadcastReceiver pairingRequestReceiver = new BroadcastReceiver() {
    @Override
    public void onReceive(Context context, Intent intent) {
        String action = intent.getAction();
        if (BluetoothDevice.ACTION_PAIRING_REQUEST.equals(action)) {
            BluetoothDevice hc05Device = intent.getParcelableExtra(BluetoothDevice.EXTRA_DEVICE);
            int pairingType = intent.getIntExtra(BluetoothDevice.EXTRA_PAIRING_VARIANT, BluetoothDevice.ERROR);

            // 处理PIN码配对请求
            if (pairingType == BluetoothDevice.PAIRING_VARIANT_PIN) {
                try {
                    // 设置HC-05的默认PIN码
                    boolean pinSetSuccess = hc05Device.setPin("1234".getBytes());
                    // 确认配对操作
                    hc05Device.setPairingConfirmation(true);
                    if (pinSetSuccess) {
                        Log.d("BluetoothPairing", "PIN码设置成功,配对确认完成");
                    }
                    // 阻止系统默认处理,避免冲突
                    abortBroadcast();
                } catch (Exception e) {
                    e.printStackTrace();
                }
            }
        }
    }
};

3. 先完成配对,再发起连接

不要直接尝试连接未配对的HC-05,先检查设备的绑定状态,确认配对完成后再建立RFCOMM连接:

// 假设你已经通过扫描获取到了HC-05的BluetoothDevice对象
if (hc05Device.getBondState() != BluetoothDevice.BOND_BONDED) {
    // 发起配对请求
    hc05Device.createBond();
    // 可以监听配对状态变化的广播,或加短暂延迟,确保配对完成后再执行连接
} else {
    // 已配对,直接发起RFCOMM连接
    connectToHC05(hc05Device);
}

连接HC-05的RFCOMM通道

HC-05默认使用的RFCOMM UUID是00001101-0000-1000-8000-00805F9B34FB,请确保用这个UUID获取套接字:

private void connectToHC05(BluetoothDevice device) {
    BluetoothSocket socket = null;
    try {
        UUID rfcommUuid = UUID.fromString("00001101-0000-1000-8000-00805F9B34FB");
        socket = device.createRfcommSocketToServiceRecord(rfcommUuid);
        // 注意:连接操作不能在主线程执行,需放在子线程中
        socket.connect();
        Log.d("BluetoothConnect", "HC-05连接成功");
        // 后续的读写逻辑在这里实现
    } catch (IOException e) {
        Log.e("BluetoothError", "ConnectThread run: IO Exception", e);
        // 连接失败时关闭套接字
        try {
            if (socket != null) socket.close();
        } catch (IOException ex) {
            ex.printStackTrace();
        }
    }
}

4. 额外排查点

  • Android Things Preview 6属于旧版本,可能存在蓝牙兼容性bug,若上述步骤无效,可尝试重启树莓派和HC-05模块
  • 确保HC-05处于可发现模式(指示灯快速闪烁)
  • 通过adb shell执行hciconfig命令,检查树莓派蓝牙是否正常运行

内容的提问来源于stack exchange,提问作者HDatta

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.20 07:04:52