我用当前已配对到手机的设备制作了ListView
,以便我可以选择其中一个并连接到它。为了确定选择了哪个设备,我将其MAC地址存储在一个数组中,以便可以通过其地址获取设备。当我选择设备时,该应用程序冻结了一段时间,然后恢复,但未成功连接。我在任何地方都找不到解决方案,而我陷入了困境。我仍然是一个初学者,不太了解。发生如下异常:
java.io.IOException: read failed, socket might be closed or timeout, read ret: -1
这是我的代码。
// If the UUID is incorrect then this one does not work as well
// 00001101-0000-1000-8000-00805f9b34fb
private static final UUID CONNECTION_UUID = UUID.fromString("0000110E-0000-1000-8000-00805F9B34FB");
public static boolean connectDevice(final int a) {
try {
BluetoothDevice mBluetoothDevice = btAdapter.getRemoteDevice(deviceAddress[a]);
BluetoothSocket mBluetoothSocket = mBluetoothDevice.createInsecureRfcommSocketToServiceRecord(CONNECTION_UUID);
btAdapter.cancelDiscovery();
mBluetoothSocket.connect();
mmOutputStream = new DataOutputStream(mBluetoothSocket.getOutputStream());
mmInputStream = new DataInputStream(mBluetoothSocket.getInputStream());
mBluetoothSocket.close();
} catch (NullPointerException e) {
e.printStackTrace();
return false;
} catch (Exception e) {
e.printStackTrace();
return false;
}
return true;
}
答案 0 :(得分:1)
根据您在代码中提供的CONNECTION_UUID
,假定您正在与Bluetooth串行板连接。我不确定这个问题,但是,我想写这个答案来提供可能解决您问题的解决方案。
我认为在配对设备的情况下,您需要使用安全通道启动连接。当前,您正在使用不安全的频道。
从documentation ...
通信通道将没有经过身份验证的链接密钥,即 它将受到中间人攻击。对于蓝牙2.1 设备,链接密钥将被加密,因为加密是强制性的。 对于旧设备(蓝牙2.1之前的设备),链接密钥为 不加密。如果出现以下情况,请使用createRfcommSocketToServiceRecord(UUID) 需要一个经过加密和身份验证的通信通道。
因此,您可以考虑在案件中使用createRfcommSocketToServiceRecord()
。
代替这个
BluetoothSocket mBluetoothSocket = mBluetoothDevice.createInsecureRfcommSocketToServiceRecord(CONNECTION_UUID);
使用此...
BluetoothSocket mBluetoothSocket = mBluetoothDevice.createRfcommSocketToServiceRecord(CONNECTION_UUID);
我希望能解决您的问题。
从下面的评论开始-在这里实际起作用的UUID是00001101-0000-1000-8000-00805f9b34fb