ble广播基础

时间:2024-04-02 09:45:17

1.BLE工作流程
1.1 角色
主机:发起对从机的连接者(如手机)
从机:广播并等待连接(手环等设备)
观察者:监听空中广播事件,和主机唯一的区别是不能发起连接,只能持续扫描从机。
广播站:可以持续广播,和从机唯一区别是不能被连接,只能广播数据
BLE协议栈中没有角色限制,同一设备可以作为主从一体。

1.2 广播
指每一段时间发送一次广播数据,当从机处以广播状态时才能被主机发现,广播包会在37 38 39 三个信道上依次广播
广播间隔:发送一次广播数据包的间隔
广播事件:这个广播动作
广播时间间隔:20ms~2.24s,影响连接时间,间隔越大连接时间越长
BLE链路层会在两个广播事件之间添加一个0~10ms的随机延时,保证多个设备广播时,不会一直碰撞广播
ble广播基础

广播数据包:最多携带31字节数据,一般包含可读的设备名称,设备是否可连接等信息
广播扫描回应数据包:当主机收到从机广播数据包后,从机可以再发送获取更多数据包的请求,同样可携带31字节数据。

蓝牙4.x,广播有效载荷最多是31个字节。而在蓝牙5.0中,通过添加额外的广播信道和新的广播PDU,将有效载荷增加到了255个字节

1.3 扫描
是主机监听从机广播数据包和发送扫描请求的过程,主机通过扫描,可以获取从机广播数据包和广播扫描回应数据包主机可以对已扫描到的从机设备发起连接请求,从而连接从机设备并通信。
扫描窗口&扫描间隔:
ble广播基础
被动扫描:
主机监听广播信道的数据,当接收到广播包时,协议栈将向应用层(用户可编程)传递广播包。
主动扫描:
除完成被动扫描动作外,还将向从机发送一个扫描请求,从机收到该请求,会再发送扫描回应数据包

1.4连接
在BIE连接中,使用调频方案,主从机在特定的时间和频道上彼此发送和接收数据。稍后在约定的时间和新的通道上相遇(协议栈的链路层处理通道切换),这次用于收发数据的相遇称为连接事件,如果没有要发送或接收的应用数据,则交换链路层数据来维护连接。两个连接事件之间的时间跨度称为连接间隔,是以1.25 ms为单位,范围从最小值7.5 ms到最大值4.0 s
ble广播基础
1.4.1连接参数
l连接间隔Connection Interva:两次连接事件之间的时间间隔,1.25 ms为单位,范围从最小值7.5 ms到最大值4.0 s。
从机延迟Slave Latency:如果从机没有要发送的数据,则可跳过连接事件,继续保持睡眠节省电量。
监控超时Supervision Time-out:两次成功连接事件的最长时间间隔,如在此时间内没有成功的连接事件,设备将终止连接并返回到未连接状态。该参数值以10 ms为单位,监控超时值可以从最小值10(100 ms)到3200(32.0 s)。超时必须大于有效的连接间隔。

1.4.2连接参数更新请求
由主机发起连接的时候提供,如果从机对其有自己的要求,如更低的功耗、更高的速率,从机可以向主机发送请求连接参数更新。
从机可在连接后任意时间,发起请求,但最好连接5s后
连接参数更新可修改:连接间隔 从机延迟 监控超时。

1.4.3 有效连接间隔
Effective Connection Interval 等于两个连接事件的跨度,
假设从机跳过最大数量的连接事件,且允许从机延迟(如果从机延迟设置为0,则有效连接间隔等于实际连接间隔,)。从机延迟表示可以跳过的最大事件数。该数字的范围可以从最小值0(意味着不能跳过连接事件)到最大值499。最大值不能使有效连接间隔(见下列公式)大于16秒。间隔可以使用以下公式计算:
Effective Connection Interval = (Connection Interval) × (1 + [Slave Latency])

1.4.4 IOS对连接参数的要求
Interval Max * (Slave Latency + 1) <=2s
最大连接间隔 从机延迟
Interval Min >=20ms
最小连接间隔
Interval Min + 20 ms <= Interval Max

Slave Latency <= 4
SupervisionTimeout <= 6 s
监控超时
Interval Max * ( Slave Latency + 1) * 3 < SupervisionTimeout

1.4.4 连接参数的优化考量
在许多应用中,从机跳过最大连接事件数。选择正确的连接参数组在低功耗蓝牙设备的功率优化中起重要作用。以下列表给出了连接参数设置中权衡的总体概述。
减少连接间隔如下:
增加两个设备的功耗
增加双向吞吐量
减少任一方向发送数据的时间

增加连接间隔如下:
降低两个设备的功耗
降低双向吞吐量
增加任一方向发送数据的时间

减少从机延迟(或将其设置为零)如下:
增加外围设备的功耗
减少外围设备接收从*设备发送的数据的时间

增加从机延迟如下:
在周边没有数据发送期间,可以降低外设的功耗到主机设备
增加外设设备接收从主机设备发送的数据的时间

2.5 通信
将从机具有的数据和属性特征称之为Profile (配置文件)
从机中添加Profile配置文件(定义和存储Profile),作为GATT的Server端,主机作为GATT的Client端。
Profile包含多个Service,每个Service又包含多个Characteristic(特征),主机可以发现和获取从机的Service和Characteristic,然后已之通信,Characteristic是主从通信的最小单元
主机可主动向从机Write(写入)或Read(读取数据)。
从机可主动向主机Notify(通知数据)。
ble广播基础
服务 Service 、 特征值 Characteristic 、属性 Property:
一个从机设备包含一个或者多个服务,一个服务又可以包含多个特征值,每个特征值都有自己的属性,取值有:可读 Read,可写 Write 以及 通知 Notify。

下图是一个典型的从机设备,该从机包含有一个Profile两个Service五个Characteristic。我们先来介绍这些特征值的作用,然后介绍如何通过特征值通信。
ble广播基础
服务0x180A

180A是蓝牙协议里标准的服务UUID,用来描述设备信息 Device Information,可以通过该服务,来提供从机设备的相关说明,例如硬件版本,软件版本,***等信息。这样,主机就可以获取从机的设备信息。上图中我们添加了三个提供具体设备信息的特征值,他们分别是:

特征值0x2A24,描述产品型号 Model Number String,例如某智能锁的产品型号为:“DSL-C07”。
特征值0x2A25,描述产品*** Serial Number String,例如某智能锁的产品***为:“lkjl0016190502500269”
特征值0x2A26,描述产品固件版本号 Firmaware Revision String,例如某智能锁的固件号为:“2.7.2.0”
上述特征值仅有Read属性,因此主机只能读,不能执行写操作。

服务0xFFF0

FFF0是我们自定义的服务UUID,它包含两个特征值,用来发送和接收数据。

特征值0xFFF1,自定义的数据发送通道,具有Read和Write属性,主机可以通过该特征值,向从机发送数据,至于发送的数据最大长度,可以在Profile中配置。
特征值0xFFF2,自定义的数据发送通道,具有Notify属性,从机可以通过该特征值,主动向主机发送数据。
假设主机写特征值的协议栈函数原型为 int GATT_WriteCharValue(uuid_t UUID, uint8 *pValue, uint8 len)

假设从机发送通知的协议栈函数原型为 int GATT_Notification(uuid_t UUID, uint8 *pValue, uint8 len)

那么主机向从机发送Hello,可以这样调用协议栈的函数:GATT_WriteCharValue(0xFFF1,“Hello”,5)

那么从机向主机发送1234,可以这样调用协议栈的函数:GATT_Notification(0xFFF2,“1234”,4)
(转自谷雨物联网)
1.6 断开
主从机都可以发起断开请求,对方会收到该请求,然后断开连接恢复连接前的状态。
1.7 工作流程
(1)上电初始化
主机:需要设置设备类型、用于扫描的相关参数、初始化GATT等协议相关的参数。
从机:需要设置广播名称广播相关参数从机Profile等。从机一般会立即开启广播,也可以等待一个事件来触发广播,例如按键触发。
(2)主机扫描从机,从机处于广播状态。
(3)发现从机设备
主机扫面到从机时,可以返回扫面到的相关信息,例如:从机设备名称、MAC地址、RSSI信号值等。
有些应用在广播包和扫描回应包中添加自定义字段,这样可以被主机通过扫描的方式拿到。
(4)发起连接请求
主机扫描到从机后,通过从机MAC地址,向从机发送连接请求,低功耗蓝牙连接非常快100ms,与广播间隔有关。
(5)成功连接从机
从机收到连接请求后,双方建立连接,双方状态为已连接态。
然后主机可以调用协议栈接口来获取从机服务
(6)获取从机服务
通常建立连接后立即执行,因为获取从机服务后,才能与之通信,响应服务获取请求是在底层自动完成,上层无需理会。
(7)成功获取服务
(8)主机向从机发送数据
主机通过特征值,主动向从机发送自定义数据。
(9)从机向主机发送数据
从机可以通过属性 Norify的方式主动向主机发送数据。
(10)发送断开请求和断开连接
双方均可发起断开请求,然后断开连接。