【BLE学习笔记】BLE协议中的16位UUID和128位UUID有啥区别?
BLE的UUID有16位和128位之分,你了解过吗?你知道它们的转换吗?
1 写在前面
熟悉BLE开发的技术朋友可能都一定知道UUID这个东西,它表示的一种身份标识;可能用于标识某一个服务厂商,也可能用于标识某一个具体的属性服务。
本文通过一个简短的介绍,带你了解下UUID的那些事儿,顺带给大家如何将16位的UUID与128位的UUID互相转换。
2 UUID的简要介绍
蓝牙核心规范制定了两种不同的UUID,一种是基本的128位UUID,一种是代替基本UUID的16位UUID。 所有的蓝牙技术联盟定义UUID共用了一个基本的UUID:
0x0000xxxx-0000-1000-8000-00805F9B34FB
为了进一步简化基本UUID,每一个蓝牙技术联盟定义的属性有一个唯一的16位UUID,以代替上面的基本UUID的‘x’部分。例如,心率测量特性使用0X2A37作为它的16位UUID,因此它完整的128位UUID为:
0x00002A37-0000-1000-8000-00805F9B34FB
虽然蓝牙技术联盟使用相同的基本UUID,但是16位的UUID足够唯一地识别蓝牙技术联盟所定义的各种属性。蓝牙技术联盟所用的基本UUID不能用于任何定制的属性、服务和特性。对于定制的属性,必须使用另外完整的128位UUID。
SoftDevice 根据蓝牙技术联盟定义UUID类似的方式定义UUID:先增加一个特定的基本UUID,再定义一个16位的UUID(类似于一个别名),再加载在基本UUID之上。这种采用为所有的定制属性定义一个共用的基本UUID的方式使得应用变为更加简单,至少在同一服务中更是如此。
3 UUID位数的转换
在实战编程中,我们常常会遇到16位UUID与128位UUID的互相转换,下面将为大家以源码的形式呈现。
注意,下面的代码中,默认代码运行的主机的存储结构是 小端存储。
1)16位UUID转128位UUID
#define ATT_UUID_128_LEN 16
void ble_uuid_128_to_16(uint8_t *uuid128, uint16_t *uuid16)
{
uint8_t cursor = 12;
/* get the UUID on 12th to 13th location of UUID */
*uuid16 = uuid128_base[cursor + 1] << 8 | uuid128_base[cursor];
}
很简单,其实就是从UUID128的第12-13字节中抽出UUID16,然后再通过出参返回。
2)128位UUID转16位UUID
#define ATT_UUID_128_LEN 16
void ble_uuid_16_to_128(uint8_t *uuid128_base, uint8_t *uuid128, uint16_t uuid16)
{
uint8_t cursor = 12;
/* place the UUID on 12th to 13th location of UUID */
uuid128_base[cursor] = (uint8_t)(uuid16 & 0xFF);
uuid128_base[cursor + 1] = (uint8_t)((uuid16 >> 8) & 0xFF);
/* update value */
memcpy(&uuid128[0], &uuid128_base[0], ATT_UUID_128_LEN);
}
很简单,其实就是将UUID16填充到BASE_UUID128的第12-13字节中,然后再通过出参uuid12返回。
4 知识点总结
UUID这个知识点还是比较重要的,我们主要掌握以下几点:
- UUID的基本含义
- 128位UUID与16位UUID的转换
- BLE规范定义的base UUID
- UUID的表示方法(大、小端存储格式)
[注]:本文部分描述来源于博客:https://www.cnblogs.com/yanye0xff/p/15872646.html
5 更多分享
架构师李肯(全网同名),一个专注于嵌入式IoT领域的架构师。有着近10年的嵌入式一线开发经验,深耕IoT领域多年,熟知IoT领域的业务发展,深度掌握IoT领域的相关技术栈,包括但不限于主流RTOS内核的实现及其移植、硬件驱动移植开发、网络通讯协议开发、编译构建原理及其实现、底层汇编及编译原理、编译优化及代码重构、主流IoT云平台的对接、嵌入式IoT系统的架构设计等等。拥有多项IoT领域的发明专利,热衷于技术分享,有多年撰写技术博客的经验积累,连续多月获得RT-Thread官方技术社区原创技术博文优秀奖,荣获CSDN博客专家、CSDN物联网领域优质创作者、2021年度CSDN&RT-Thread技术社区之星、2022年RT-Thread全球技术大会讲师、RT-Thread官方嵌入式开源社区认证专家、RT-Thread 2021年度论坛之星TOP4、华为云云享专家(嵌入式物联网架构设计师)等荣誉。坚信【知识改变命运,技术改变世界】!