我尝试创建一个连接到两个蓝牙 HC-05 模块(连接到 Arduino)的 Android 应用程序。
我能够连接到它们两个,如果我只向其中一个发送数据,一切正常,如果我向两者发送数据,但它可能会工作一段时间,但它会停止发送到一个设备。
在一部手机上,这会导致应用程序崩溃,而在另一部手机上则什么都没有发生(没有异常或连接被中止的通知)。
所以我检查了互联网,大多数情况下它说你可以一次连接到两个蓝牙设备(例如这里)。
我无法弄清楚这个错误的原因是什么。但我有一些想法。也许有人可以确认,或者知道真正的问题或更好的解决方案:)
由于我使用两个 HC-05 蓝牙模块,它们具有相同的 UUID,我认为这可能是有问题的,因为这个 UUID 对一个设备不是唯一的。但我不确定这是否是问题所在。也许有人知道如何更改 HC-05 的 UUID?
请注意,我正在以随机间隔向两台机器发送数据。所以我认为这可能会导致问题。在某些时候,应用程序会尝试同时发送到两个设备,这会导致麻烦。所以我正在考虑为此做一些解决方法。但我不确定如何。也许是一些堆栈,我将数据和它需要发送到的设备放入其中,然后我逐项发送它们,中间可能会有一些延迟。所以数据的发送有点“同步”。但是我不知道这是否是一个好的解决方案,我感谢我能得到的任何建议。
所以现在我像这样连接到设备:
public void connect(String mac){
Set<BluetoothDevice> bondedDevices = BluetoothAdapter.getDefaultAdapter().getBondedDevices();
for (BluetoothDevice devices : bondedDevices)
if (devices.getAddress().equals(mac)) {
this.device = devices;
break;
}
if (this.device == null) {
//some error handling
} else {
UUID id= UUID.fromString("00001101-0000-1000-8000-00805F9B34FB");
try {
this.socket = this.device.createRfcommSocketToServiceRecord(id);
this.socket.connect();
this.outputStream = this.socket.getOutputStream();
final InputStream st = this.socket.getInputStream();
//some more init stuff
} catch (Exception e) {
e.printStackTrace();
this.disconnect();
}
}
}
我正在发送这样的数据(没有多余的代码):
byte[] send = new byte[9];
//fill Data
try {
this.outputStream.write(send);
this.outputStream.flush();
} catch (Exception e) {
//Displaying Toast with Error message
Toast.makeText(DirtyCode.appcont, e.getMessage(), Toast.LENGTH_LONG).show();
Log.e("SEND EXCEPTION:" + device.getName(), e.getMessage());
e.printStackTrace();
return false;
}
所以我也在想,我可能需要以某种方式使用 BluetoothServerSocket。但我不确定。
该连接在仅连接一个设备或连接两个设备但仅发送到一个设备的情况下完美地工作(向第二个设备发送非常偶尔的数据通常在引起麻烦之前很长时间才能工作)。
我尝试解决这个问题很长时间,但我无法让它工作,所以任何帮助都是非常有用的。