蓝牙小知识:UUID 是什么
在讨论BLE的时候离不开“UUID” 这个词,它是什么呢?下面是摘自BLE核心规范中对UUID的解释:
关键部分用红色标出,如果有英文不好的读者,可以使用谷歌翻译,或参考下面的转述:
- UUID是一串十六进制数字。它是唯一识别码,跟身份证号码一样,只不过在BLE中它是代表服务、特征的号码。
- UUID是128bit的。
- 因为128bit太长了不方便使用,SIG将常用的UUID进行了预设。预设的UUID都拥有共同的部分,我们称它为蓝牙的Base UUID,即 00000000-0000-1000-8000-00805F9B34FB。被预设的UUID使用16bit或32bit的别名来代表,通常称为16bit和32bit UUID。但它们代表的是128bit的UUID。32bit UUID 是LE 4.1规格中加入的,日常使用、涉及非常少。
- 16bit和32bit UUID转换128bit UUID的计算公式是:
128bit UUID = 蓝牙Base UUID + 它们各自左移96bit。如果公式看起来比较晕,就举个例子就明白了。
16bit UUID = 0x180A,则128bit UUID为: 0000180A-0000-1000-8000-00805F9B34FB。
- 两个长度不相等的UUID进行比较,需要先转换为128bit之后再进行。
预设的UUID可以在蓝牙官网中查询:https://www.bluetooth.com/specifications/assigned-numbers/ 。 预设的UUID基本都是日上使用非常多的,例如名称、时间、版本、心率、高度、电池电量、速度、气压、血压、温度、HID设备等等他们的服务和特征都使用了预设的UUID。
使用预设UUID的好处是客户端可以快速准确的识别服务端是什么设备,可以提供什么服务。手机系统很多都把使用预设UUID的服务和相关代码添加进去了,这样可以在不安装另外App的情况下,正确的解析出从服务端(从设备,如血压计、心率计、温度计等)上传的信息(前提是该设备不只UUID遵循了标准,数据结构也要遵循协议标准)。
使用非预设UUID的服务,由于不是标准协议,各个手机厂家都不会提前添加相关的代码,所以需要安装App才能使用对应的产品。
例如nRF Connect 连接ble_app_uart例程,我们可以看到如下的设备服务情况:
服务和特征中的UUID中,有16bit的也有128bit的。通过上文我们知道UUID都是128bit的,显示为16bit是因为剩下的部分是蓝牙联盟统一预设的Base。
例如Device Name如果还原成128bit UUID就是:00002A00-0000-1000-8000-00805F9B34FB 。
CCCD(Client characteristics configuration description)如果还原成128bit UUID就是:00002902-0000-1000-8000-00805F9B34FB 。
需要说明的是,“Nordic UART Service”、“RX characteristics”、“TX characteristics” 他们不是蓝牙联盟预设的。之所以会显示出名字是因为nRF Connect是Nordic开发的,而这几个UUID是其例程中使用的,所以在App中做了解析和标注。