【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
相关文章
- Spring学习笔记(二十八)——springboot单元测试&JUnit5
- LeetCode笔记:Weekly Contest 312
- 深度学习笔记三:反向传播(backpropagation)算法[通俗易懂]
- 在windows10机器上安装部署人脸识别/安全帽识别项目笔记
- es7学习笔记 cpu负载不均衡、超长fullGC、大量400报错[通俗易懂]
- zkw线段树 学习笔记
- JavaScript笔记(9)
- Qt5学习笔记——QRadioButton与QButtonGroup[通俗易懂]
- Linux内核基础学习笔记.md
- Flask基础入门学习笔记-1
- C语言基础概念相关知识总结【C语言学习笔记】
- RTSP协议学习笔记
- lambda表达式pythonlist_Python学习笔记之lambda表达式用法详解
- Python量化交易学习笔记(50)——程序化交易1
- hitcon 2018受虐笔记一:one-line-php-challenge 学习
- 干货 | 密码学入门学习笔记小结
- Matlab学习笔记
- react-native学习笔记
- Git命令——学习笔记1
- React Hooks 学习笔记 | React.memo 介绍(三 )
- PicoCTF-web类做题笔记-IK&N Hong_zhong
- Java学习笔记(Volatile关键字以及原子性)
- Python连接redis笔记详解数据库
- Linux防火墙iptables学习笔记(二)参数指令
- 学习笔记:Linux汇编语法入门(linux汇编语法)
- prototypeElement学习笔记(篇一)
- 又一篇正则表达式学习笔记
- Ruby中的String对象学习笔记
- Python入门及进阶笔记Python内置函数小结