zl程序教程

您现在的位置是:首页 >  工具

当前栏目

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

笔记学习协议 区别 16 UUID 128 BLE
2023-06-13 09:18:12 时间

【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