createRfcommSocketToServiceRecord和createRfcommSocket之间的区别

时间:2013-05-09 08:38:23

标签: android bluetooth

以下两种方式在连接蓝牙设备方面有何不同之处:

1)

UUID uuid = UUID.fromString(Values.SPP_UUID); //Standard SerialPortService ID
mmSocket = mmDevice.createRfcommSocketToServiceRecord(uuid); 

2)

Method m = mmDevice.getClass().getMethod("createRfcommSocket", new Class[] {int.class});
mmSocket = (BluetoothSocket) m.invoke(mmDevice, 1);

我发现第一种方式不能一直工作,有时它会起作用,但在关闭蓝牙设备后,它将无法再次工作。第二种方式总是运作良好。我知道它只是打开一个与蓝牙通信的通道,但我不知道如何在不使用uuid的情况下连接到蓝牙设备呢?

1 个答案:

答案 0 :(得分:52)

想想它有点像打开TCP连接到您按数字指定的端口,打开一个端口到您从/etc/services按名称查找的端口之间的区别。

createRfcommSocketToServiceRecord获取您传递的UUID并使用SDP来决定用于连接的无线电信道。它还会检查以确保服务器正在使用相同的UUID侦听远程端点。通过这种方式,它是获得连接的最可靠方式:它将始终使用正确的通道,如果打开连接成功,您知道另一端的某些东西可以理解您的协议。

相比之下,createRfcommSocket只是连接到您告诉它的频道。无法知道是否有任何东西在远程端点上侦听:您只知道设备在那里。此外,您选择的无线电频道可能完全不合适。这就是为什么这个函数没有在API中发布,而另一个函数是首选的。

createRfcommSocket最初可能看起来更可靠,但这是因为它没有检查另一个端点是否存在监听器:它忽略了一些错误情况。这对于实验来说可能没什么用,但它对生产系统没用,因为用户通常会忘记在另一个端点上启动服务器,并且您的应用程序会以混乱的方式失​​败。

当然,由于createRfcommSocket未在API中发布,因此您无法保证它将在以后的Android版本中继续发挥作用。