Android:蓝牙UUID如何工作?

我不明白什么是蓝牙UUID表示。 UUID是否表示协议(例如RFCOMM )? 如果是这样,为什么createRfcommSocketToServiceRecord()方法需要UUID,当他们的名字中指定rfcomm? 为什么BluetoothChat示例代码有一个看似任意的硬编码的UUID?

我的问题出现是因为,根据这个问题 ,当运行4.0.4的设备尝试使用reflection连接(到外部的非Android设备)时,我得到空指针exception。 但是,这个问题的解决scheme不适合我。 UUID muuid = device.getUuids()[0].getUuid(); 引发了一个例外。

编辑 :我解决了这个问题,硬编码的串口服务的UUID按照这个答案 (使用UUID.fromString("00001101-0000-1000-8000-00805f9b34fb"); )。

为什么我需要提供一个UUID来使用createInsecureRfcommSocketToServiceRecord(),创build一个不安全的rfcomm套接字createInsecureRfcommSocketToServiceRecord(),但是却没有使用reflection方法createInsecureRfcommSocketToServiceRecord(),我感到更加困惑。

任何人都可以理顺我吗?

它通常代表蓝牙设备支持的一些常见服务(协议)。

当创build你自己的rfcomm服务器时(使用listenUsingRfcommWithServiceRecord ),你应该指定你自己的UUID,以便连接到它的客户端可以识别它; 这是createRfcommSocketToServiceRecord需要UUID参数的原因之一。

否则,一些常见的服务具有相同的UUID,只需find一个你需要的并使用它。

看到这里

UUID用于唯一标识信息。 它识别由蓝牙设备提供的特定服务。 该标准定义了一个基本的BASE_UUID: 00000000-0000-1000-8000-00805F9B34FB

诸如医疗传感器之类的设备可以提供服务,用前面的代码代替前八位数字。 例如,提供RFCOMM连接的设备使用短代码:0x0003

所以,Android手机可以连接到一个设备,然后使用服务发现协议(SDP)来找出它提供的服务(UUID)。

在许多情况下,您不需要使用这些固定的UUID。 例如,在创build聊天应用程序的情况下,例如,一个Android手机与另一个使用相同应用程序并因此具有相同UUID的Android手机进行交互。

因此,您可以使用例如Web上的许多随机UUID生成器之一( 例如 )为应用程序设置任意UUID。

UUID在概念上类似于Internet中的端口号。 然而,蓝牙与互联网的区别在于,在蓝牙中,端口号是在运行时由SDP(服务发现协议)服务器dynamic分配的,其中每个UUID被赋予一个端口号。 其他设备会询问注册在保留端口号下的SDP服务器有关设备上的可用服务,并且将通过在不同的UUID下注册而以不同的服务进行区分。

UUID只是一个数字。 除了您在Android应用程序的服务器端创build外,没有任何意义。 然后客户端使用相同的UUID进行连接。

例如,在服务器端,您可以先运行uuid = UUID.randomUUID()来生成一个随机数,如fb36491d-7c21-40ef-9f67-a63237b5bbea。 然后保存,然后硬编码到你的监听程序中,如下所示:

  UUID uuid = UUID.fromString("fb36491d-7c21-40ef-9f67-a63237b5bbea"); 

你的Android服务器程序将使用这个UUID监听传入的请求:

  BluetoothServerSocket server = mBluetoothAdapter.listenUsingRfcommWithServiceRecord("anyName", uuid); 

BluetoothSocket socket = server.accept();

综上所述: UUid用于唯一标识应用程序。 每个应用程序都有一个唯一的UUid

所以,每个设备使用相同的UUid