39

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

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 的情况下连接蓝牙设备?

4

1 回答 1

60

可以把它想象成打开一个 TCP 连接到您通过数字指定的端口和打开一个到您通过名称查找的端口之间的区别/etc/services

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

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

createRfcommSocket一开始可能看起来更可靠,但这是因为它没有检查另一个端点是否存在侦听器:它忽略了一些错误情况。这对于实验来说可能没问题,但对于生产系统来说没有用,因为用户经常忘记在另一个端点上启动服务器,并且您的应用程序会以令人困惑的方式失败。

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

于 2013-09-02T23:29:46.357 回答