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
相关产品推荐
相关产品推荐

