BLE
说明
蓝牙低能耗(Bluetooth Low Energy,或称Bluetooth LE、BLE,旧商标Bluetooth Smart)也称低功耗蓝牙,是蓝牙技术联盟设计和销售的一种个人局域网技术,旨在用于医疗保健、运动健身、信标、安防、家庭娱乐等领域的新兴应用。相较经典蓝牙,低功耗蓝牙旨在保持同等通信范围的同时显著降低功耗和成本。
UUID
UUID为通用唯一识别码,用于标识资源。
UUID通常为128位,其组成为32位无符号整数+16位无符号整数+16位无符号整数+8位无符号整数+8位无符号整数+6字节(共48位)数据,其字符串格式为32位无符号整数-16位无符号整数-16位无符号整数-16位无符号整数(8位无符号整数+8位无符号整数)-6字节(共48位)数据
,如6ba7b811-9dad-11d1-80b4-00c04fd430c8
其组成为32位无符号整数0x6ba7b811
、16位无符号整数0x9dad
、16位无符号整数0x11d1
、8位无符号整数0x80
,8位无符号整数 0xb4
,6字节(共48位)数据 0x00, 0xc0, 0x4f, 0xd4, 0x30, 0xc8
。
但128位的UUID空间占用比较大,一般采用16位的短UUID(也称蓝牙UUID)。16位短UUID与128位UUID可相互转化。一般情况下,16位短UUID是128位UUID的一部分。对于蓝牙而言,16位短UUID可填充至00000000-0000-1000-8000-00805f9b34fb
的第一个32位整数部分,如短UUID0x180f
对应的长UUID为0000180f-0000-1000-8000-00805f9b34fb
。
对于同一种类型的资源而言,UUID值类似C语言枚举值,均是通过数字标识具体的资源。
蓝牙相关的数字分配可见:https://www.bluetooth.com/specifications/assigned-numbers/
若处于Linux环境或者WSL环境,可使用uuidgen
生成128位UUID。当使用128位UUID作为标识时,推荐使用随机数或者时间生成一个基础UUID,再以此为基础改动其中某一部分(根据需求确定改动的位数,一般8位足够)定义一些UUID,这样可方便判断与识别。
广播包与扫描响应包
对于基于BLE的设备而言,最简单的应用就是使用广播包发送信息,实际应用的例子如某某TAG使用蓝牙进行追踪。
扫描响应包(有时也称广播响应包),在另外的设备进行主动扫描时响应,用于扩展广播数据的大小(如未特殊说明,后文所指广播数据也包括扫描响应包中的数据)。通常固定的数据由扫描响应包传输,变化的数据用广播包传输(广播包可一直发送)。
无论是广播包还是扫描响应包,所携带的广播数据长度最长为31字节。
广播数据由一个或者多个广播结构体组成,所有广播结构体的长度之和不能超过广播包与扫描响应包可携带数据的最大长度。
广播结构体由一字节长度+一字节广播类型+多字节广播结构体数据,其中长度指广播类型+广播结构体数据的长度,广播结构体数据由广播类型决定。
通常情况下,广播包的广播数据的第一个广播结构体为广播标志(广播类型为0x01),占3个字节。
用户可使用厂商自定义数据类型的广播结构体发送自定义数据(对于上位机而言,比较容易获取广播数据中的厂商自定义数据),其余类型的广播结构体主要用于向外发送BLE相关配置。
设备名称
对于上位机而言,设备名称是区分不同自定义设备类型的方式之一(标准设备(如音频设备、HID设备)的区分类型的方式由BLE标准规定)。
对于BLE而言,设备名称主要可在以下场景中使用:
- 广播数据:广播数据中可携带设备名称信息。一般情况下,设备名称通常放在扫描响应包且在上位机扫描时显示。
- GAP服务(0x1800)的设备名称特征(0x2A00):此处的设备名称可与广播数据不同(也可以相同)。
profile
BLE规定了一系列规范(在BLE标准中称profile),用户遵循这些标准即可实现对相应蓝牙功能的开发,而无需再对上位机进行二次开发(标准服务的驱动一般无需用户开发,操作系统或者蓝牙栈会自动实现对标准服务的访问)。
一个profile可包含一个或多个服务,最终上位机与BLE设备之间的交互都是通过对服务的访问实现的。
一个服务可包含一个或多个特征,这些特征就是一个个数据点,上位机可通过访问特征获取具体的数据。
注意:此处只描述常用的profile/服务。
GAP服务
GAP服务的UUID为0x1800。
GAP服务是BLE必须实现的服务,主要用于管理广播和连接事件的有关参数。
GATT服务
GATT服务的UUID为0x1801。
GATT服务是BLE必须实现的服务。
设备信息服务
设备信息服务的UUID为 0x180A。
设备信息服务的实现是可选的,用户可通过设备信息服务提供以下信息:
- SYSTEM_ID
- MODEL_NUMBER
- SERIAL_NUMBER:序列号可用于区分同一型号的不同设备,通常情况下,序列号是唯一的。
- FIRMWARE_REV
- HARDWARE_REV
- SOFTWARE_REV
- MANUFACTURER_NAME
- 11073_CERT_DATA
- PNP_ID
电池服务
电池服务的UUID为 0x180F。
电池服务的实现是可选的,用户可通过此服务提供电池信息(如电量)。
SimpleProfile服务
设备信息服务的UUID为 0xFFF0。
SimpleProfile服务的实现是可选的。SimpleProfile服务通常用于自定义服务,通常情况下,其特征(自定义数据)的UUID从0xFFF1起。
与其它的profile不同,此服务通常不会被操作系统/蓝牙栈使用,因此用户需要手动编写上位机程序。
除了用户自行分配服务UUID(通常是长UUID,用于避免重复)创建非标准设备外,用户还可使用此服务创建非标准设备。
软件
上位机库
蓝牙通常可以使用各个操作系统的原生API开发,也可以使用第三方开发库:
simpleble
跨平台BLE库。
本人开发了SimpleBLETool用于测试此库。