提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档
BLE Host UUID
0. 前言
在BLE Host协议中离不开UUID这个专有名词,若不能准确理解它,则影响对Host协议的理解深度。
1. UUID是什么?
UUID是Universally Unique Identifier的缩写。它是基于特定算法生成的128位长的数字,其目的是确保特定范围内这个数字的唯一性。
这个128位的数字通常以36个字符,以“-”为分隔符,以5段的形式表示(这样分段的原因后文说明),例如:
01234567-89AB-CDEF-0123-456789ABCDEF
UUID的定义标准为"ITU-T Rec. X.667"或“ISO/IEC 9834-8”。
前面说的“特定范围”,在标准中主要有以下三种:
- Time-Based
- Name Based
- Random-number-Based
1.1 格式
128位的UUID的格式定义如下:
对应到5段式表示方式来看:
- 第1段的32bit和第2段的16bit及第3段的低12bit一起组成60bit的UUID“Time”
- 第5段的48bit为UUID的“Node”
- 第4段16bit由Variant和ClockSeq组成
- 第3段的Version表示是Time-Based,Name-Based,Random-number-Based
2、BLE中的UUID
在BLE Host协议中定义了各种服务,数据类型等,那么交互的蓝牙设备通过什么来识别对方表示的是哪种服务或数据类型呢?UUID是一个好的选择,因为在蓝牙协议中各种服务或数据类型都是唯一的,用UUID建立一一映射即可。
需要注意的是,在蓝牙协议中,各种类型的UUID是统一编码的,而不是嵌套编码,即表示服务类型的UUID和表示数据类型的UUID等所有的UUID都是不一样的128位数值。打个比方:中国所有的小区和楼栋及房号统一编码到128位数值,即任意一个128位数值要么表示小区,要么表示楼栋,要么表示房间,不再存在A小区的01栋楼1102号房,B小区也有01栋1102号房。这种定义方式避免类型的重复定义。
2.1 16 bit UUID
128位表示的数值范围太大了,在蓝牙协议中用16位就已经足够表示各种数据类型的,再加上再无线网络上传输16位比传输128位的效率更高,因此蓝牙协议中建议使用16位数值来映射128位的UUID。
怎么建立一一映射呢?容易想到基地址-偏移地址的方式来表示:
0000XXXX-0000-1000-8000-00805F9B34FB
其中“000-1000-8000-00805F9B34FB”为基础UUID,“0000XXXX”为偏移UUID,即16 bit UUID值。
2.2 UUID类型
前文中的“000-1000-8000-00805F9B34FB”为SIG定义的基地址,16 bit UUID是在SIG的基础UUID之上再细分定义的,详情见SIG文档《16-bit UUID Numbers Document》。当然也可以自己申请128位UUID。
在《16-bit UUID Numbers Document》中主要分以下9类:
2.3 UUID申请
这些都是向SIG申请(需要费用)。
2.3.1 基于SIG Based UUID
参考2.2节的表,主要申请3类,如下:
- SDO
- Member
- Charateristics
2.3.1 基于Sustom UUID
3. 总结
至此,我们知道UUID的来处(128bit,16bit),在BLE的作用(表示9大类数据类型),以及怎么申请自定义UUID。