createRfcommSocketToServiceRecord和createRfcommSocket之间的区别

连接到蓝牙设备下面这两种方式有什么区别:

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); 

我发现第一种方法不能一直工作,有时会起作用,但在closures蓝牙设备之后,它不会再工作。 第二种方式总是很好。 我知道这只是打开通道之一与蓝牙通信,但我不知道如何才能连接到蓝牙设备而不使用uuid?

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

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

相反, createRfcommSocket只是连接到你告诉它的通道。 没有办法知道是否有任何东西在远程端点上侦听:您只知道该设备在那里。 另外,您select的广播频道可能完全不合适。 这就是为什么这个函数没有在API中发布,而另一个函数是首选。

createRfcommSocket可能会更可靠,但这是因为它没有检查另一个端点上是否存在侦听器:它忽略了一些错误情况。 这对于试验可能没有问题,但是对于生产系统来说是没有用的,因为用户往往忘记在另一个terminal上启动服务器,而且你的应用程序会以混乱的方式失​​败。

当然,由于createRfcommSocket并未在API中发布,因此您不能保证在未来的Android版本中它将继续工作。