在讨论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中做了解析和标注。

 

 

 

 

 

发表评论

电子邮件地址不会被公开。 必填项已用*标注