当前位置:   article > 正文

BLE 基础知识

ble

简介

蓝牙4.0:

   包含经典蓝牙和ble
  • 1

ble单模:

    ble
  • 1

ble双模:

    经典蓝牙和ble
  • 1

ble协议栈:

控制器层,host层,app

ble协议栈详解

1. 控制器

HCI

HCI层为接口层,向上为主机提供软件应用程序接口(API),对外为外部硬件控制接口,可以通过串口、SPI、USB来实现设备控制

Link Layer

L层为RF控制器,控制设备处于准备(standby)、广播、监听/扫描(scan)、初始化、连接,这五种状态中一种。五种状态切换描述为:未连接时,设备广播信息,另外一个设备一直监听或按需扫描,两个设备连接初始化,设备连接上了。发起聊天的设备为主设备,接受聊天的设备为从设备,同一次聊天只能有一个意见领袖,即主设备和从设备不能切换。

PHY

物理层: RF规格
2.4G ISM band
GFSK调制
40个频道,2M频间隔
3个广播(37,38,39),37数据通道

由于BLE属于无线通信,则其通信介质是一定频率范围下的频带资源(Frequency Band);BLE的市场定位是个体和民用,因此使用免费的ISM频段(频率范围是2.400-2.4835 GHz);为了同时支持多个设备,将整个频带分为40份,每份的带宽为2MHz,称作RF Channel 。

主设备管理多个连接从设备,从设备只能连接一个主设备

做为一个BLE设备,有六种可能的状态:
– 待机状态(Standby):设备没有传输和发送数据,并
且没有连接到任何设备
– 广播状态(Advertiser):周期性广播状态
– 扫描状态(Scanner):主动地寻找正在广播的设备
– 发起连接状态(Initiator):主动向某个设备发起连接
– 主设备(Master):作为主设备连接到其他设备
– 从设备(Slave):作为从设备连接到其主设备

2. host层

1.0 GAP:

连接参数设置,设备命令设置,安全模式设置
角色:广播者,观察者,主设备,从设备

BLE:广播事件

广播包的发送是单向的,不需要任何连接。
设备发送广播包进入广播状态
– 广播包可以包含特定的数据定义,最大31个字节
– 广播包可以直接指向某个特定的设备,也可以不指定
– 广播中可以声明是可被连接的设备,或者是不可连接的设备
在一个广播事件中,广播包会分别在三个广播通道中被发送一次 (37, 38, 39)

BLE:扫描事件

每次扫描设备打开Radio接收器去监听广播设备,称为一个扫描事件
扫描事件交替发生在三个特定的广播通道中: 37, 38, 39
扫描频宽比 (Duty-Cycle),关于扫描的两个
时间参数:
–扫描间隔:即扫描设备的扫描频度
–扫描窗口:每次扫描事件持续的时间

BLE发起连接
除了扫描,设备也可以主动发起连接,发起状态的设备和扫描状态的设备区别在于:当它监听到一个可连接的广播,发起设备就会发送一个连接请求,而扫描设备会发送一个扫描请求。
连接请求包括一套为从设备准备的连接参数,安排连接期间发生的通道和时间。如果广播设备接收了连接,两个设备会进入连接状态,发起方会称为 Master(主机) ,而广播方会称为 Slave(从机)。

BLE连接参数
通道映射,指示连接使用的频道。
调频增量,一个5~16 之间的随机,参与通道选择的算法。
连接间隔,1.25ms的倍数,在7.5ms~4s之间。
监督超时,10ms 的倍数,100ms~32s 之间, 必须大于 (1+slaveLatency)*ConnInterval
从机潜伏,0~499之间,不能超过(SupervisionTimeout/connInterval)-1

BLE连接事件

所有的通信都发生在两个设备的连接事件期间,连接事件周期的发生,按照连接参数指定的间隔联系,每个事件发生在某个数据通道(0~36),调频增量参数决定了下次连接时间发生的通道,在每个连接时间期间,Master 先发送,Slave会在 150us之后做出回应,即使一个连接事件发生(或两者),双方都没有数据发送(例外情况是从设备潜伏使能),这允许两个设备都承认对方仍然存在并保持活跃的连接。

Slave的潜伏

Slave如果没有数据发送,允许跳过连接时间。连接参数中的 Slave 的潜伏值,是允许设备跳过的最大连接次数,在连接事件中,如果 slave 没有对master 的包做出回应,master将会在后来的连接时间中重复发送,直到 slave 回应。两个有效的连接事件之间的最大时间跨度(假设 slave 跳过了最大数目的连接时间)称为“有效连接间隔”,从设备的潜伏范围是 0~499,但是有效的连接间隔必须小于 32s。

连接参数的设定
短间隔的连接事件:
-两设备都会以高能耗运行
-高数据吞吐量

  • 发送等待时间短

长间隔的连接事件:

  • 两设备都会以低能耗运行
  • 低数据吞吐量
  • 发送等待时间长

低或者 0潜伏值

  • 从设备以高能耗运行
  • 从设备可以快速的收到来自中心设备的数据

高潜伏值:

  • 外围设备在没有数据发送的情况下可以低能耗运行
  • 外围设备无法及时收到来自中心设备的数据
  • 中心设备能及时收到来自外围设备的数据
  1. 安卓设备作主设备时,连接参数满足的要求见本篇博文第二节“连接参数介绍”中提到的内容。另外实际开发过程中发现安卓设备作主设备时存在一个问题,就是部分安卓设备连接BLE设备之后,只能进行一次连接参数的修改。

  2. 苹果系统设备作主设备时,连接参数更新的要求比较苛刻,如下:
    Interval Max * (Slave Latency + 1) ≤ 2 seconds
    Interval Min ≥ 20 ms
    Interval Min + 20 ms ≤ Interval Max
    Slave Latency ≤ 4
    connSupervisionTimeout ≤ 6 seconds
    Interval Max * (Slave Latency + 1) * 3 < connSupervisionTimeout

即:
最大连接间隔时间 *(从机延迟 + 1) ≤ 2s
最小连接间隔时间 ≥ 20 ms
最小连接间隔时间 + 20 ms ≤ 最大连接间隔时间
从机延迟 ≤ 4
超时时间 ≤ 6s
最大连接间隔时间 (从机延迟 + 1) 3 < 超时时间

这样算
ios最小20ms
最大400ms
从机延迟 4
超时时间6s

所以如果你的BLE从设备需要被IOS主设备连接,那你的BLE从设备的默认申请的连接参数一定要满足上述要求,并且连接过程中修改连接参数的时候也要满足上述要求。

####################################################################

2. ATT

**ATT(Attribute protocol)**协议是为了允许设备读写保存在Server上的数据值。每个存储值就是一个属性。

ATT定义了属性的内容,规定了访问属性的方法和权限。平时我们的BLE设备就是通过属性进行数据收发的。

ATT定义了两种角色:Client和Server。

Server:存储属性,接收Client的ATT请求,命令和确认。
Client:接收Server的应答,指示和通知。

4. GATT

GATT(Generic Attribute Profile) 是建立在ATT之上的。为传输数据建立通用操作和框架。

GATT也定义了两种角色: Server和Client。GATT Client也是一个ATT Client,GATT Server也是一个ATT Server,所以GATT角色不需要去专门绑定ATT角色。

Server:一般就是进行广播,被连接的设备。
Client:一般就是进行扫描,然后主动去连接的设备。

GATT还指定了GATT Server上包含的数据格式。由属性协议传输的属性被格式化为服务和特征。来看看下图:
在这里插入图片描述
上图定义了一些概念及它们之间的包含关系,这些概念还是很重要的,接下来我们来一一解释。

  1. Service — 服务
    简单理解就是提供某项服务或功能。比如心率,电池监测等都可以定义为一个服务。
    系统可以有两种service:主要(primary)和次要(secondary)
    primary: 提供设备的主要功能
    secondary:提供设备的附加功能

  2. Included services — 包含服务
    类似于包含头文件,就是将其他共用的服务包含进来。

  3. Characteristic — 特征
    可以理解为服务中的某个特性,比如心率服务,就会有个心率值,心率值就可以定义为一个Characteristic 。

  4. Properties — 属性
    这里的属性和上面的Attribute不一样。这里的属性定义的是Read / Write / Notify / Indicate等,用于声明Characteristic是否可读可写等属性。

  5. Value — 值
    用来保存数值的。

  6. Descriptor — 描述符
    用于描述Characteristic,让用户更能理解该Characteristic的作用和如何使用。

通过上图,我们可以看出Service的数据结构定义。

UUID

UUID就是通用唯一标识符。上一篇我们提到的Service (服务),Characteristic (特征),Descriptor (描述符) 等都有自己的UUID。因为一个设备肯定会有很多个服务,一个服务中也会包含多个特征,一个特征也可以包含多个描述符。那怎么来区分它们呢? 所以就需要UUID来进行标识区分了。

蓝牙对UUID 格式定义都有三种: 16bit UUID、32bit UUID、128bit UUID。

16bit 和 32bit 的 UUID 与 128bit 的值之间转换关系:

128_bit_UUID = 16_bit_UUID * 2^96 + Bluetooth_Base_UUID
128_bit_UUID = 32_bit_UUID * 2^96 + Bluetooth_Base_UUID

其中 Bluetooth_Base_UUID 定义为 00000000-0000-1000-8000-00805F9B34FB
上面的计算公式太复杂,我们用下面的方式记比较简单。
若 16 bit UUID为xxxx,那么 128 bit UUID 为 0000xxxx-0000-1000-8000-00805F9B34FB
若 32 bit UUID为xxxxxxxx,那么 128 bit UUID 为 xxxxxxxx-0000-1000-8000-00805F9B34FB
蓝牙联盟已经将某些UUID分配给一些公司或服务使用了。可以参考下面官方链接。
当然了,即使被分配了,我们也可以使用,只是如果做成市场产品就要小心,可能会跟别人的冲突,出现不兼容等情况。

空口数据包

空口数据包就是在空中传输的数据包。它是最完整的数据包,一般只有抓包分析问题才会需要了解这些知识。

空口数据包有两种格式:
LE Uncoded PHY (1M和2M)
LE Coded PHY
一种有编码,一种没有编码的。

我们先只看看未编码的格式:
在这里插入图片描述
无论是广播数据包还是普通数据包,它们的空口数据包格式是一样的。区别在于Access-Address和PDU的内容不同。

  1. Preamble
    前导码用来同步接收端和发送端的,1M PHY使用1个字节, 2M PHY使用2个字节。前导码是0和1交替的固定顺序,前导码的第一个bit要和接入地址的最低位(小端)一样,所以前导码第一个bit是由接入地址决定的。

  2. Access-Address
    4个字节,用来标示接收者ID或者空中包身份。它和设备地址(48bit)是不一样的,不要混淆。
    根据接入地址的不同,可以区分两种Packet类型:广播包和数据包:
    广播包接入地址固定为0x8E89BED6
    数据包接入地址为一个32bit的随机值,由Initiator生成。

  3. PDU
    2~258个字节,真正的数据内容。

  4. CRC
    3个字节的CRC校验

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/花生_TL007/article/detail/573713
推荐阅读
相关标签
  

闽ICP备14008679号