我不明白蓝牙UUID是什么意思。 UUID是否表示协议(例如RFCOMM)?如果是这样,为什么createRfcommSocketToServiceRecord()
方法需要UUID,当他们在名字中指定rfcomm时?为什么BluetoothChat示例代码有一个看似随意的,硬编码的UUID?
我的问题出现了,因为,根据this question,当运行4.0.4的设备尝试使用反射连接(到外部的非Android设备)时,我得到一个空指针异常。但是,该问题的解决方案对我不起作用。 UUID muuid = device.getUuids()[0].getUuid();
引发了异常。
修改:我已根据this answer(使用UUID.fromString("00001101-0000-1000-8000-00805f9b34fb");
)对串口服务的UUID进行硬编码解决了该问题。
为什么我需要提供一个UUID以使用createInsecureRfcommSocketToServiceRecord(),
创建一个不安全的rfcomm套接字而不使用反射方法,我更加困惑。
有人可以理顺我吗?
答案 0 :(得分:24)
UUID用于唯一标识信息。它标识蓝牙设备提供的特定服务。该标准定义了基本BASE_UUID: 00000000-0000-1000-8000-00805F9B34FB
。
医疗保健传感器等设备可以提供服务,用预定义的代码替换前八位数字。例如,提供RFCOMM连接的设备使用short code: 0x0003
因此,Android手机可以连接到设备,然后使用服务发现协议(SDP)找出它提供的服务(UUID)。
在许多情况下,您不需要使用这些固定的UUID。例如,在您创建聊天应用程序的情况下,一部Android手机会与另一部使用相同应用程序且因此使用相同UUID的Android手机进行交互。
因此,您可以使用Web上的许多随机UUID生成器之一(for example)为您的应用程序设置任意UUID。
答案 1 :(得分:20)
它通常代表蓝牙设备支持的一些常用服务(协议)。
创建自己的rfcomm服务器(使用listenUsingRfcommWithServiceRecord
)时,应指定自己的UUID,以便连接到它的客户端可以识别它;
这是createRfcommSocketToServiceRecord
需要UUID参数的原因之一。
否则,一些常见服务具有相同的UUID,只需找到您需要的并使用它。
请参阅here
答案 2 :(得分:5)
UUID与Internet中的端口号概念类似。然而,蓝牙和因特网之间的区别在于,在蓝牙中,端口号由SDP(服务发现协议)服务器在运行时期间动态分配,其中每个UUID被给予端口号。其他设备将询问在保留端口号下注册的SDP服务器有关设备上的可用服务,并且它将通过在不同的UUID下注册而以不同的服务进行回复。
答案 3 :(得分:4)
UUID只是一个数字。除了您在Android应用程序的服务器端创建之外,它没有任何意义。然后客户端使用相同的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();
答案 4 :(得分:2)
在蓝牙中,所有对象均由UUID标识。这些包括服务,特性和许多其他东西。蓝牙维护为标准对象分配的编号的数据库,并为供应商(已经为预订支付了足够的费用)分配子范围。您可以在此处查看此列表:
https://www.bluetooth.com/specifications/assigned-numbers/
如果您要实现标准服务(例如,串行端口,键盘,耳机等),则应使用该服务的标准UUID-这将使您可以与未开发的设备进行互操作。
如果要实现自定义服务,则应生成唯一的UUID,以确保不兼容的第三方设备不要尝试使用您的服务,而认为这是另一回事。最简单的方法是生成随机结果,然后将结果硬编码到您的应用程序中(当然,并在将要连接到您的服务的设备中使用相同的UUID)。
答案 5 :(得分:1)
总结:UUid
用于唯一标识应用程序。每个应用程序都有一个唯一的UUid
因此,对每个设备使用相同的UUid
答案 6 :(得分:0)
UUID代表通用唯一标识符。 UUID是一个简单的128位数字,在全球范围内唯一分布。
蓝牙通过空中发送数据,所有附近的设备均可接收。让我们假设,有时您必须通过蓝牙发送一些重要文件,并且附近的所有设备都可以在范围内访问它。因此,当您与其他设备配对时,它们只是共享UUID号并在共享文件之前进行匹配。发送任何文件时,设备将使用适当的设备UUID对该文件进行加密,并通过网络共享。现在,该范围内的所有蓝牙设备都可以访问加密文件,但是它们需要正确的UUID号。因此,只有正确的UUID设备才可以访问该文件,其他设备将拒绝错误的UUID原因。
简而言之,您可以将UUID用作秘密密码,以便在任意两个蓝牙设备之间共享文件。