【BLE学习笔记】BLE协议中的16位UUID和128位UUID有啥区别?

【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华为云云享专家(嵌入式物联网架构设计师)等荣誉。坚信【知识改变命运,技术改变世界】!

猜你喜欢

转载自blog.csdn.net/szullc/article/details/129917859
今日推荐