蓝牙套接字中的accept()和connect()方法

时间:2014-10-15 09:53:04

标签: android sockets android-bluetooth

我遇到蓝牙套接字连接问题,所以尝试了各种替代连接。

就像第一次失败然后第二次,如果第二次也失败则第三次,因此主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。

1 个答案:

答案 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上的蓝牙绝不是直截了当的。