BLE学习笔记
GATT:Generic Attribute Profile,通用属性配置文件
GAP:Generic Access Profile,通用访问配置文件
nRF52832 开发指南
一个BLE程序通常需要至少包含 4 个必要的部分:系统初始化、启动、空闲管理和事件处理。
BLE 协议栈初始化
使能 SoftDevice,配置 BLE 协议栈参数,使能 BLE 协议栈,注册 BLE 协议栈事件回调参数
配置 GAP 参数
模式(Mode)和规程(Procedure)
设置安全模式和名称
GATT 初始化
广播初始化
服务初始化
连接参数协商初始化
连接参数协商模块的作用是用于启动和执行连接参数协商规程
启动广播
服务的 UUID
加入服务 UUID 的步骤:
1 定义并初始化 UUID 数组
1 | static ble_uuid_t m_adv_uuids[] = /**< Universally unique service identifier. */ |
2 初始化广播数据(扫描响应)中 UUID 列表
1 | .uuid_cnt = sizeof(m_adv_uuids) / sizeof(m_adv_uuids[0]); |
3 初始化广播
1 | err_code = ble_advertising_init(&m_advertising, &init); |
服务数据
服务数据用来在广播中发送某个服务的数据,服务数据可以不需要连接就能解析出数据。
服务数据由 UUID 和数据两部分组成。
加入服务 UUID 的步骤:
1 定义服务数据结构体变量
1 | ble_advdata_service_data_t service_data; |
2 初始化服务数据
1 | service_data.service_uuid = BLE_UUID_BATTERY_SERVICE; |
3 配置广播数据中的服务数据
1 | init.davdata.service_data_count = 1; |
4 初始化广播
1 | err_code = ble_advertising_init(&m_advertising, &init); |
厂商自定义数据
1 定义厂商自定义数据结构体变量
1 | typedef struct |
2 初始化厂商自定义数据
1 | //制造商 ID,0x0059 是 Nordic 的 ID |
3 配置广播数据中包含厂商自定义数据
1 | init.advdata.p_manuf_specific_data = &manuf_specific_data; |
4 初始化广播
1 | err_code = ble_advertising_init(&m_advertising, &init); |
BLE常见的4中模式
蓝牙广播模式(broadcast)
比较有代表例子就是基于低功耗蓝牙的beacon设备。
beacon处于广播模式时,一般会被设置成了不可连接的状态,Beacon 会每隔一定的时间(SKYLAB的beacon为100毫秒)广播一个数据包到周围,作为独立的蓝牙主机在执行扫描动作时,会间隔地接收到 Beacon 广播出来的数据包。该数据包内容最多可以包含 31 个字节的内容。同时,在主机接收到广播包时,其中会指示该广播包来自于哪一个蓝牙从机 MAC 地址(每个 Beacon 拥有唯一的 MAC 地址)的从机设备和当前的接收发送信号强度指示值(RSSI)为多少。
蓝牙从机模式(peripheral)
代表例子是蓝牙心率带,蓝牙智能手环等
工作在从机模式的低功耗蓝牙模块也处于广播状态,等待被扫描。和广播模式不同的是,从机模式的蓝牙模块是可以被连接的,在数据传输过程中作从机; 下图是SKYLAB的蓝牙智能手环VG08,可以向蓝牙主机发送一些心率数据、记步数据、消耗的卡路里等等数据。
蓝牙主机模式(center)
代表例子:智能手机,数据传输中做主机的蓝牙模块。
Ble蓝牙模块处于主机模式时,无广播,可扫描周围广播设备,可以要求与广播设备的连接。在连接中做主机。主从一体蓝牙模块可以做主机、从机、主从一体三种模式。
观察者模式(observer)
代表的例子是蓝牙网关。
Ble蓝牙处于观察者模式,无广播,可扫描周围的广播设备,不能要求与广播设备的连接。