我遇到蓝牙套接字连接问题,所以尝试了各种替代连接。
就像第一次失败然后第二次,如果第二次也失败则第三次,因此主UI在此过程中阻塞。
例外情况如 -
"Service discovery failed"
或"Host is down"
我的三个选择 -
1) 使用connect()函数连接
m = bdDevice.getClass().getMethod("createRfcommSocket", new Class[] {int.class});
socket = (BluetoothSocket) m.invoke(bdDevice, Integer.valueOf(i));
mBluetoothAdapter.cancelDiscovery();
socket.connect();
2)使用accept()函数连接
m = bdDevice.getClass().getMethod ("listenUsingRfcommOn", new Class [] {int.class});
BluetoothServerSocket returnValue =
(BluetoothServerSocket) m.invoke(bdDevice, new Object [] {29});
socket = returnValue.accept();
3)使用众所周知的SPP UUID
进行连接 private final UUID my_UUID = UUID.fromString("00001101-0000-1000-8000-00805F9B34FB");
socket = bdDevice.createInsecureRfcommSocketToServiceRecord(my_UUID);
mBluetoothAdapter.cancelDiscovery();
socket.connect();
最近添加了第二种替代方案,所以我不确定它与第一种和第三种方法有什么不同。所有人都会阻止UI直到连接,所有都可以通过IOException。
答案 0 :(得分:0)
1)您作为客户端连接到SPP设备。因此,在实际连接之前,您的设备必须预期连接。
2)您接受连接作为服务器。您的蓝牙设备将负责触发连接请求。
3)您正在连接到使用特定UUID作为其串行端口配置文件(SPP)的设备。可以认为这类似于http协议中的端口。 00001101-0000-1000-8000-00805F9B34FB是最常见的一种。更多信息:https://developer.bluetooth.org/TechnologyOverview/Pages/SPP.aspx
另外,如果您正在考虑支持多个OS /手机版本。在最初的通信中断后,您可能会看到这些错误消息。 Android的蓝牙堆栈(bluez)在4.2上完全被替换,但您可能仍需要处理以前已知的错误。
在这种情况下的反思是一件好事(蓝牙API的某些部分在旧版本中并不公开)。但是,根据我的经验,API级别< 17;使用 createInsecureRfcommSocket 代替 createRfcommSocket 更加可靠。
希望这会有所帮助。但是,如果您正在为自己的自定义蓝牙spp设备构建应用程序,解释这些设备如何处理通信可以帮助指出问题的确切根源。虽然,Android上的蓝牙绝不是直截了当的。