嵌入式应用角度学习BLE栈
BLE入门总结
经典蓝牙与低功耗蓝牙对比
BLE的特点
低成本、低功耗
- 低功耗设计:蓝牙4.0版本强化了蓝牙在数据传输上的低功耗性能,功耗较传统蓝牙降低了90%。
- 传统蓝牙设备的待机耗电量一直是其缺陷之一,这与传统蓝牙技术采用16——32个频道进行广播有很大关系,而低功耗蓝牙仅适用3个广播通道,且每次广播时射频的开启时间也有传统的22.5ms减少到0.6~1.2ms,这两个协议规范的改变,大幅降低了因为广播数据导致的待机功耗。
快速启动、瞬间连接
- 此前蓝牙版本的启动速度非常缓慢,2.1版本的蓝牙启动连接需要6s时间,而蓝牙4.0版本仅需要3ms即可完成,几乎是瞬间连接。
传输距离极大提供
协议栈结构
概念
PHY层(Physical layer物理层)。PHY层用来指定BLE所用的无线频段,调制解调方式和方法等。
LL层(Link Layer链路层)。LL层是整个BLE协议栈的核心,也是BLE协议栈的难点和重点。LL层要做的事情非常多,比如具体选择哪个射频通道进行通信,怎么识别空中数据包,具体在哪个时间点把数据包发送出去,怎么保证数据的完整性,ACK如何接收,如何进行重传,以及如何对链路进行管理和控制等等。LL层只负责把数据发出去或者收回来,对数据进行怎样的解析则交给上面的GAP或者GATT。
HCI(Host controller interface)。HCI是可选的(具体请参考文章: 三种蓝牙架构实现方案(蓝牙协议栈方案)),HCI主要用于2颗芯片实现BLE协议栈的场合,用来规范两者之间的通信协议和通信命令等。
L2CAP层(Logic link control and adaptation protocol)。L2CAP对LL进行了一次简单封装,LL只关心传输的数据本身,L2CAP就要区分是加密通道还是普通通道,同时还要对连接间隔进行管理。
ATT(Attribute protocol)。ATT层用来定义用户命令及命令操作的数据。
GATT(Generic attribute profile )。GATT用来规范attribute中的数据内容,并运用group(分组)的概念对attribute进行分类管理。
SMP(Secure manager protocol)。SMP用来管理BLE连接的加密和安全的。
GAP层(Generic access profile)。GAP是对LL层payload(有效数据包)如何进行解析的两种方式中的一种,而且是最简单的那一种。GAP简单的对LL payload进行一些规范和定义。GAP目前主要用来进行广播,扫描和发起连接等。
- 以下开始从嵌入式上层应用的的角度进入,分享BLE协议栈。
ble交互过程
GAP层
- generic access profile(通用访问协议)
概念:
- Broadcaster,广播者
发出广播信号,可以没有无线接收器。- Observer,观察者
接收广播信号,可以没有无线发送器。
- Peripheral,外围设备
广播者,被动建立连接
既含有无线发送器,也含有无线接收器。- Central,中央设备
扫描/观察者,主动建立连接。
既含有无线发送器,也含有无线接收器。
- 主机
主动建立连接。- 从机
被动建立连接
广播包数据组成
ble广播包格式详解文章
广播包格式
- Preamable(前导):1字节,固定序列。
- 接入地址第一个bit为0:01010101
- 接入地址第一个bit为1:10101010
- Access Address(接入地址):
- 接入地址有两种类型:广播接入地址和数据接入地址。
- 广播接入地址:固定为 Ox8E89BED6, 在广播、扫描、发起连接时使用。
- 数据接入地址:随机值,不同的连接有不同的值。在连接建立之后的两个设
备间俠用。
- 接入地址有两种类型:广播接入地址和数据接入地址。
- PDU(协议数据单元)
- CRC(校验):24位crc校验
PDU
- 包括header,playload
header
- 4bit 广播报文类型
- 2bit 保留位
- 1bit 发送地址类型
- 1bit 接收地址类型
- 6bit playload长度
- 2bit 保留位
报文类型
BLE广播信道中的空中包分为有以下几种类型:
- 可连接非定向广播 (ADV_IND):所有收到该广播的设备,都可与之建立链路层连接。
- 可连接定向广播 (ADV_DIRECT_IND):指明了对方设备地址的,为之提供了连接功能的广播
- 不可连接广播 (ADV_NONCONN_IND):广播一些特定的信息,任何设备都可接收,但不可建立连接。
- 扫描请求 (SCAN_REQ):扫描者向指定的广播者发出的空中包,广播者收到扫描请求后,要立即回复扫描响应。
- 扫描响应 (SCAN_RSP):作为对扫描请求的响应,其中会携带一些与广播者相关的数据,并返回给扫描者。
- 连接请求 (CONNECT_REQ):如名。
- 可扫描通知 (ADV_SCAN_IND):作为对扫描请求的响应,其中会携带一些与广播者相关的数据,并返回给扫描者。不可连接。
注意:扫描分为主动扫描和被动扫描。
- 处于扫描态的设备可以接收广播信道的报文,通过扫描可以侦听哪些设备正在广播。主动扫描发送扫描请求给处于广播态的设备,并通过处于广播态的设备返回的扫描响应获取额外的数据。
- 被动扫描仅仅接收广播报文,不会发送扫描请求。)
playload
ble广播包playload详解文章
- 每个类型的广播包playload都不一样。下面举一个例子。
可连接非定向广播 (ADV_IND)
可连接非定向广播,是使用最为频繁的广播包,几乎所有提供了连接功能的BLE设备都使用这种空中包。
接下来看一下这种广播包帧格式中的payload部分,如下图所示:
- 由上图可知,payload部分包含2个字段:AdvA和AdvData
- AdvA: Adv Address,它表示广播者的设备地址
- Header部分有一个字段TxAdd,占位1个bite。如果该比特为0,则表示AdvA是公共设备地址;如果该比特为1,则表示AdvA是私有设备地址
- AdvData:广播数据,包括service data,service uuid以及manufacture data等等。
AdvData
- 采用tlv格式
- 广播数据字段
- advdata例子:
uint8_t adv_data[] ={//service UUID//mac 0x07,// length of this dataGAP_ADVTYPE_MANUFACTURER_SPECIFIC,//厂商字段scmac_addr.addr[5],scmac_addr.addr[4],scmac_addr.addr[3],scmac_addr.addr[2],scmac_addr.addr[1],scmac_addr.addr[0],};
- 广播包内放一些服务的UUID
- GAP_ADVTYPE_MANUFACTURER_SPECIFIC(厂商字段)
- 供开发者放自定内容的字段
注意:ADV_IND类型数据playload最大31字节。
注意:主机收到广播包,同时也会获取数据包的接收信号强度(RSSI)。
连接参数
- 主设备和从设备建立连接之后,所有的数据通信都是在连接事件(Connection Events)中进行的。而连接事件的参数,即连接参数 (Connection Parameters)。
连接参数
- 连接参数指以下三个参数
- Connection Interval(连接间隔)
- Slave Latency(从设备延迟或者从设备时延)
- Supervision Timeout(超时时间或者监控超时)
Connection Interval
- 指一个连接事件(Connection events)的开始到下一个连接事件(Connection events)的开始的时间间隔。连接间隔以1.25ms为单元,连接间隔的范围是6 - 3200既7.5ms - 4s之间。
Slave Latency
- 指允许Slave(从设备)在没有数据要发的情况下,跳过一定数目的连接事件(Connection events),在这些连接事件(Connection events)中不必回复Master(主设备)的包,这样就能更加省电。
- 范围可以是0 ~ 499
Supervision Timeout
- 这个参数设定了一个超时时间,如果BLE在这个时间内没有发生通信的话,就会自动断开。
- 单位是 10ms,该变量的范围是10 - 3200,折算成时间范围是100ms - 32s 。
连接参数影响
这三个连接参数不同情况下对通信速率和功耗的影响:
- 连接间隔缩短,Master和Slave通信更加频繁,提高数据吞吐速度,缩短了数据发送的时间,当然也增加了功耗。
- 连接间隔增长,通信频率降低,数据吞吐速度降低,增加了数据发送的时间,当然,这种设置降低了功耗。
- 从设备延迟减少或者设置为 0,每次Connection Events中都需要回复Master的包,功耗会上升,数据发送速度会提高。
- 从设备延迟加长,功耗下降,数据发送速度降低。
TIPS
- 连接间隔、从机时延以及超时时间这三者必须满足如下公式:
Supervision Timeout > (1 +slaveLatency)* (connectionInterval)
上述公式必须满足,否则连接就会不正常断开。- 使用到rssi report时,调整链接参数影响rssi上报。
例:使用到rssi测距,调整链接参数的设置,提高rssi测距检测灵敏度。
rssi值由每个通讯包提供,链接参数中链接间隔与链接时延降低,链接事件发生频繁,rssi上报频率也增加,检测自然灵敏度提高。缺点:功耗增加,按具体项目可进行调优取舍。
广播应用知识
- 厂商字段放MAC
- app需要通过MAC来进行连接操作,比如app换手机重新连接需要根据广播包内的MAC确认连接对象。安卓可以通过MAC字段获取MAC,但ios有隐私屏蔽,app则需要通过厂商自定字段获取MAC。
- 厂商字段放数据内容
- app不建立连接,就可以获取指定设备的数据内容。
- 广播白名单
- 指定广播给某设备。
- 指定广播可以使用在以下两种场景:
- 从未建立连接,指定对端MAC广播给某设备。(一般不用作广播给手机app,ios设备MAC有隐私保护)
- 已建立连接后,从此只开放给此设备继续连接。(ios 安卓皆可实现)
- 百瑞互联 和 富芮坤 实现的白名单效果都是,白名单只支持2个设备(暂未试验间隔轮询发送实现更多设备的白名单),且白名单效果都是白名单外的手机只有部分安卓机型能被屏蔽广播。大部分的手机包括iphone都能收到广播,但是点击链接不上。还是能基本实现需求。
- 广播黑名单
- 禁止广播给某设备
- 直连广播
- 在安卓机型适配性很差,一般不采用。
- 手机上考虑到蓝牙功能可以间接进行定位,安卓 6.0 及以上版本,无定位权限或定位开关未打开时,无法进行设备蓝牙搜索。
- 广播包内playload不存放数据,ios系统页就会过滤这个设备,安卓的表现一般是展示该蓝牙,但当用户点击连接会提示此蓝牙需要一个应用程序,不允许连接。playload存放服务uuid,ios系统列表就会展示该设备。
SMP层
- Security Manager Protocol(安全机制数据加密)
- LE secure connections。又称SC,蓝牙4.2引入的一种新的密钥生成方式和验证方式,SC通过基于椭圆曲线的Diffie-Hellman密钥交换算法来生成设备A和B的共享密钥,此密钥生成过程中需要用到公私钥对,以及其他的密码算法库。
- Legacy paring。在LESC引入之前的密钥生成方式。
*以下只分享LESC配对加密方式。
概念
- Pairing(配对):配对包括io能力交换,设备认证,密钥生成,连接加密以及机密信息分发等过程,配对的目的有三个:加密连接,认证设备,以及生成密钥。
- Bonding(绑定):配对过程中会生成一个长期密钥(LTK,long-term Key),如果配对双方把这个LTK存储起来放在Flash中,那么这两个设备再次重连的时候,就可以跳过配对流程,而直接使用LTK对蓝牙连接进行加密,设备的这种状态称为bonding。
IO能力
- 一个设备具有的输入输出能力分为以下几种情况:
输入能力 | 描述 |
---|---|
No input | 无输入 |
Yes/No | 仅能输入是或否 |
Keyboard | 输入数字以及确认 |
输出能力 | 描述 |
---|---|
No ouput | 无输出 |
Numeric output | 能显示数字 |
- 不同的输入输出能力,将组合出不同的IO能力,如下:
No output | Numeric output | |
---|---|---|
No input | NoInputNoOutput | DisplayOnly |
Yes/No | NoInputNoOutput | DisplayYesNo |
Keyboard | KeyboardOnly | KeyboardDisplay |
配对模式
- 不同的io能力组合的配对模式,如下:
Numeric Comparison: 配对双方都显示一个6位的数字,由用户来核对数字是否一致,一致即可配对。例如手机之间的配对。
Just Works: 用于配对没有显示没有输入的设备,主动发起连接即可配对,用户看不到配对过程。例如连接蓝牙耳机。
Passkey Entry: 要求配对目标输入一个在本地设备上显示的6位数字,输入正确即可配对。展示的PIN可以每次都不同。
- 手机配对输入密码使用此模式,但是一般设备不会把密码展示在屏幕(没有屏幕),此时会约定一个默认PIN码。缺点:PIN码不变。
- 手机配对输入密码使用此模式,但是一般设备不会把密码展示在屏幕(没有屏幕),此时会约定一个默认PIN码。缺点:PIN码不变。
Out of Band: 两设备的通过别的途径交换配对信息,例如NFC等。例如一些NFC蓝牙音箱。
- 例子:小米手环与手机配对。通过nfc带外配对。
配对过程
子概念
- 临时密钥(TK)
- 配对过程需要TK,即PIN。
- 短期密钥(STK)
- 两个首次配对的设备可以使用短期密钥(STK)加密其连接。
TIPS:
- 传统配对加密(Legacy paring)才存在STK。
- 长期密钥(LTK)
- 一旦初始配对过程完成了连接加密,设备将会分配长期密钥(LTK)。LTK 可以是存储
在安全数据库中的一个随机数。在从设备上也能生成 LTK。
- 一旦初始配对过程完成了连接加密,设备将会分配长期密钥(LTK)。LTK 可以是存储
TIPS:
在设计上,从设备的资源通常较为有限,所以要让其维护一个安全数据库可能只是一种
奢望。为了解决这个问题,从设备向主设备分配两个值:EDIV 和Rand。 这两个值存储在主
设备上,当与从设备重新连接时再发回给对方。从设备随后可以计算要使用的 LTK,或者
更准确地说,计算它先前给过主设备的LTK 值。
在重新连接到之前配对并绑定过的设备时,用LTK 加密连接。这意味着不需要为每次
的设备连接执行完整的配对。
LESC流程
- 配对特性交换
- 支不支持SC,支不支持MITM,支不支持OOB,以及它的输入输出能力等。
- 生成密钥
- 执行选定的配对模式
- 将TK使用MAC(椭圆加密算法)加密,交换认证。
- 保存密钥
smp概念详解文章
配对详解流程图文章
配对安全性详解文章
注意:
- 以上配对都发生在蓝牙连接后。
- PIN码6位字符,范围0-999999。也有协议栈只支持100000-999999.
安全性
Just Work
- Just Works配对模式不能够防护窃听和MITM威胁1。如果设备的配对过程不被窃听,配对结束后连接被加密并且保证安全。
- Just Works通常用于一端设备完全没有输入输出能力的场景,所以它将临时密钥TK设置为固定值0,这样两端设备可以根据这个TK值进行后续的加密操作。
Passkey Entry
- Passkey Entry配对模式可以防护MITM威胁,有限的防护窃听。如果设备的配对过程不被窃听,配对结束后连接被加密并且保证安全。
OOB
- OOB(Out of Band)配对模式使用非BLE协议传输TK。用户通过键盘输入Passkey Entry,也属于一种OOB传输TK。
- OOB传输通道的安全性决定了配对过程的安全性。
Numeric Comparison
- 能够防护MITM和窃听威胁。
应用知识
- 安卓可以实现app内代输PIN码进行配对方式,并且可以实现帮助用户取消手机系统页配对信息。ios暂时没有遇到能实现的这两个动作的案例。
- 手机在和设备进行配对连接后,设备端清除了配对信息,安卓在拿着旧的配对信息尝试一次连接后,就会断开连接。苹果会一直重试连接。在富芮坤、telink、retelk平台都是如此。
- 配对请求可以从设备端发起,开始设备设置为不加密连接,待app连接成功后,设备再重新配置连接属性,由设备发
ATT&GATT层
概念
ATT
- Attribute Protocol
- 该协议将设备数据以“Attribute(属性)”的形式抽象出来,并提供一些方法,供远端设备(remote device)读取、修改这些属性的值(Attribute value)。
属性组成
- Handle :属性在列表中的地址(相当于该属性的句柄)
- Type :说明代表什么数据类型,可使用BluetoothSIG定义的通用UUID,也可为用户指定UUID。
- Permissions :权限,定义了client是否可以访问属性的值,以及特定的访问方式。
- Value:属性内容。
GATT
- Generic attribute profile
- GATT用来规范attribute中的数据内容,并运用group(分组)的概念对attribute进行分类管理。即,在ATT层定义的概念(即设备信息都以“属性”的方式进行读写等管理)下,再用profile(文件)、service(服务)、characteristic(特征)等概念再包装一层,去管理使用各种“被属性化”的设备信息。
子概念
profile(数据配置文件)
- 一个profile文件可以包含一个或者多个服务,一个profile文件包含需要的服务的信息或者为对等设备如何交互的配置文件的选项信息。
Service(服务)
- 一个服务包含一个或多个特征,这些特征是逻辑上相关的集合体。
Characteristic(特征)
- Characteristic 特征值,BLE 主从机的通信均是通过 Characteristic 来实现,可以理解为一个接口,通过这个接口可以获取或者写入想要的内容。
关系图
- profile(文件)、service(服务)、characteristic(特征)
Characteristic组成结构
- 一个Characteristic 特征值,需要被定义在一个特征声明结构中。
- Characteristic Declaration(声明): 声明一个特征
- Characteristic Value(值):特征数据操作接口
- Characteristic Configuration(配置):使能特征值通知或指示接口
- Characteristic Description(描述):可包含一个ASCCI字符串,是对相关的特征的描述。
Characteristic例子
在Handle为39的一行中,0x2800表示新服务的起始
在Handle为40的一行中,这个是特征声明;它的特征值的属性值包含5个字节的内容:
0x10、0x29、0x00、0xE1、0xFF
0xFFE1,表明特征值的uuid(0xFFE1:客户自定义特征值的UUID)
0x0029,是这个值所保存的位置handle(0x0029=41)
0x10,表明这个特征值的操作权限0x10:notify(权限字段为下图)
Characteristic特征操作权限
- 服务端:向外界开放服务功能的一端。
- 客户端:获取服务的一端。
read
- 客户端向服务端读取,需要服务端应答数据。
- 以上操作为,客户端获取服务端信息的方式。
write request
- 客户端向服务端主动写入,需要服务端回应。
write with no responce
- 客户端向服务端主动写入,不需要服务端回应。
- 以上操作为,客户端向服务端写入信息的方式。
indication / indicate
- 服务端向客户端主动通知,不需要客户端发出请求但要求回应。
nofication / notify
- 服务端向客户端主动通知,且不需要客户端发出请求和回应。
- 以上操作为,服务端向客户端上报信息的方式。
tips:
- notify 与 write with no responce 都是不要求应答的,很利于提高数据的吞吐与降低功耗,但有数据丢失的风险。
- indicate 与 write request 都是要求应答的,确保通信可靠。
HID
- 一个特殊的服务(service)标准UUID:0x1812。
- 布置此服务,可达到效果:
- 蓝牙绑定后断开,下次主机遇到设备发送的广播会主动链接上从机,不需要再次操作选择链接。
HID介绍
HID服务结构
HID服务报告描述
应用知识
- 使用hid功能,app内操作蓝牙连接成功后,杀死app,手机系统层仍然支持设备hid的自动连接,可实现。
- hid功能并不是所有ble设备都会实现,取决于产品芯片内的协议栈支不支持。
- hid自动连接,rssi判距,可以实现无感解锁、防丢器等方案。
- 使用了hid功能后,在app端输入密码时,手机系统的密码键盘不弹起。例如小米安全键盘,华为安全键盘等。原因是设备hid的report map是有键盘类型给手机识别为输入,就会不弹起。
- 手机在大多数服务中只能做主机,不支持从机。
- 安卓上,部分机型获取设备服务时会多出 00001800 和 00001801 UUID 的服务,这是系统行为,注意不要使用这两个服务。
- 一般hid的产品方案会拿鼠标的的hid report map的基础上改过来,因为用键盘的一般会影响输入。此时蓝牙图标会显示鼠标,设备的appearance可以尝试不设置,一般能成功不显示鼠标图标。
持续更新。。。
中间人攻击(Man-in-the-MiddleAttack,简称“MITM攻击”)是一种“间接”的入侵攻击,这种攻击模式是通过各种技术手段将受入侵者控制的一台计算机虚拟放置在网络连接中的两台通信计算机之间,这台计算机就称为“中间人”。 ↩︎
嵌入式应用角度学习BLE栈相关推荐
- DDos攻击,使用深度学习中 栈式自编码的算法
转自:http://www.airghc.top/2016/11/10/Dection-DDos/ 最近研究了一篇论文,关于检测DDos攻击,使用了深度学习中 栈式自编码的算法,现在简要介绍一下内容 ...
- 数据结构学习之栈求解n皇后问题
数据结构学习之栈求解n皇后问题 0x1 目的 深入掌握栈应用的算法和设计 0x2 内容 编写一个程序exp3-8.cpp求解n皇后问题. 0x3 问题描述 即在n×n的方格棋盘上,放置n个皇后 ...
- 从生活角度学习应用程序、虚拟目录、应用程序池(解惑篇)
转自:http://blog.csdn.net/zwk626542417/article/details/9819343 概要 应用程序.虚拟目录.应用程序池这三个概念在上一篇中<一看就会之-利 ...
- Python数据结构学习笔记——栈
目录 一.栈的定义和特性 (一)栈的定义 (二)栈的反转特性 二.实现分析步骤 三.栈的Python实现代码 四.栈的应用 (一)匹配圆括号 (二)匹配符号 (三)模2除法(十进制转二进制) (四)进 ...
- 学习全栈在线教育实战项目(尚硅谷) 第一天
学习全栈在线教育实战项目(尚硅谷) 第一天 1.建立数据库,表,创建springboot工程 (SpringBoot大大简化了我们的编码,我们不用一个个导入依赖,直接引入一个依赖即可,就会上网下载依赖 ...
- 丁晓钟怎么样_六级答案_丁晓钟:如何从各个角度学习四六级阅读理解?_沪江英语...
丁晓钟:全国著名四六级辅导专家,恩波特聘优秀核心教师,六级辅导实力派领军人物,"阅读超精读"和"词汇超链接"学习理念的创始人.全国唯一在同一城市招生超过两千人的 ...
- 松勤软件测试0基础到项目实战系统学习全栈班完整分享
学习编程的一个很好的方法就是和其他的程序员交谈.不必谈论任何特定的内容.可以是你正在学习的东西,也可以是你认为很酷的东西,更可以是你正在工作的东西,皆可.你会发现很多程序员并不喜欢只是聊编程.这样做可 ...
- 从shiro源码角度学习工厂方法设计模式
绪论 shiro是一个简单易用,功能强大的Java安全框架,学习其源码设计思想对我们的编码水平的提高大有裨益.现在,就从源码角度带大家学习一下shiro里面的工厂方法模式. 这里的前提是读者有过使用s ...
- jtag引脚定义_从逆向分析的角度学习硬件调试技巧JTAG,SSD和固件提取
我想从逆向的角度做了深入了解JTAG,JTAG是许多嵌入式CPU使用的硬件级别调试机制,我希望通过这篇文章从逆向工程师的角度解释如何使用JTAG,并在此过程中提供一些实际示例. 0x01 研究目标 通 ...
最新文章
- GitHub标星3w+的项目,全面了解算法和数据结构知识
- 详解X-shell7的安装与配置
- [深度学习]知识蒸馏技术
- Nacos安装详细过程
- JS处理Cookie
- 201671030126 词频统计软件项目报告
- it书籍分享免费下载
- C++:无法打开包括文件:“xxxx.h“
- 鹏业云计价i20清单与定额录入
- 计算机系统时间显示不准确的原因,电脑时间总是不对原因 电脑时间总是不对三种解决方案...
- 麦德龙的商品供应链管理
- supermap java,SuperMap iObjects Java 10i 产品介绍
- c++ IP地址离线查询
- JL-03-Q9 自动气象站 常见气象9参数 空气温湿度 风速风向 雨量光照 大气压力 土壤温湿度
- 第十一章 文件操作_C语言fscanf和fprintf函数的用法详解(格式化读写文件)
- SpringBoot - 配置 Filter 的几种方式
- 1 Java语言概述
- Cron 表达式详解及最新版本使用
- IMAX探索VR产业,欲再造电影业传奇!
- 2022年全球与中国无人机软件行业发展趋势及投资战略分析报告