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
2
3
4
static ble_uuid_t m_adv_uuids[] =   /**< Universally unique service identifier. */
{
{BLE_UUID_NUS_SERVICE, NUS_SERVICE_UUID_TYPE}
};

2 初始化广播数据(扫描响应)中 UUID 列表

1
2
.uuid_cnt = sizeof(m_adv_uuids) / sizeof(m_adv_uuids[0]);
.p_uuids = m_adv_uuids;

3 初始化广播

1
2
err_code = ble_advertising_init(&m_advertising, &init);
APP_ERROR_CHECK(err_code);

服务数据

服务数据用来在广播中发送某个服务的数据,服务数据可以不需要连接就能解析出数据。

服务数据由 UUID 和数据两部分组成。

加入服务 UUID 的步骤:

1 定义服务数据结构体变量

1
ble_advdata_service_data_t service_data;

2 初始化服务数据

1
2
3
service_data.service_uuid = BLE_UUID_BATTERY_SERVICE;
service_data.data.size = sizeof(battery_data);
service_data.data.p_data = &battery_data;

3 配置广播数据中的服务数据

1
2
init.davdata.service_data_count = 1;
init.advdata.p_service_data_array = &service_data;

4 初始化广播

1
2
err_code = ble_advertising_init(&m_advertising, &init);
APP_ERROR_CHECK(err_code);

厂商自定义数据

1 定义厂商自定义数据结构体变量

1
2
3
4
5
6
7
typedef struct
{
uint16_t company_identifier; //厂商ID
uint8_array_t data; //附件的自定义数据
}ble_advdata_manuf_data_t;

ble_advdata_manuf_data_t manuf_specific_data;

2 初始化厂商自定义数据

1
2
3
4
5
6
//制造商 ID,0x0059 是 Nordic 的 ID
manuf_specific_data.company_identifier = 0x0059;
//指向制造商自定义的数据
manuf_specific_data.data.p_data = my_adv_manuf_data;
//制造商自定义的数据大小(字节数)
manuf_specific_data.data.size = sizeof(my_adv_manuf_data);

3 配置广播数据中包含厂商自定义数据

1
init.advdata.p_manuf_specific_data = &manuf_specific_data;

4 初始化广播

1
2
err_code = ble_advertising_init(&m_advertising, &init);
APP_ERROR_CHECK(err_code);

BLE常见的4中模式

蓝牙广播模式(broadcast)

比较有代表例子就是基于低功耗蓝牙的beacon设备。

beacon处于广播模式时,一般会被设置成了不可连接的状态,Beacon 会每隔一定的时间(SKYLAB的beacon为100毫秒)广播一个数据包到周围,作为独立的蓝牙主机在执行扫描动作时,会间隔地接收到 Beacon 广播出来的数据包。该数据包内容最多可以包含 31 个字节的内容。同时,在主机接收到广播包时,其中会指示该广播包来自于哪一个蓝牙从机 MAC 地址(每个 Beacon 拥有唯一的 MAC 地址)的从机设备和当前的接收发送信号强度指示值(RSSI)为多少。

蓝牙从机模式(peripheral)

代表例子是蓝牙心率带,蓝牙智能手环等

工作在从机模式的低功耗蓝牙模块也处于广播状态,等待被扫描。和广播模式不同的是,从机模式的蓝牙模块是可以被连接的,在数据传输过程中作从机; 下图是SKYLAB的蓝牙智能手环VG08,可以向蓝牙主机发送一些心率数据、记步数据、消耗的卡路里等等数据。

蓝牙主机模式(center)

代表例子:智能手机,数据传输中做主机的蓝牙模块。

Ble蓝牙模块处于主机模式时,无广播,可扫描周围广播设备,可以要求与广播设备的连接。在连接中做主机。主从一体蓝牙模块可以做主机、从机、主从一体三种模式。

观察者模式(observer)

代表的例子是蓝牙网关。

Ble蓝牙处于观察者模式,无广播,可扫描周围的广播设备,不能要求与广播设备的连接。