BLE蓝牙

简介

重点了解GAP、ATT、Link Layer,其它有个简单认识即可

1. 什么是蓝牙主从关系?

BLE蓝牙的角色有以下几种:广播者(duAdvertise)、扫描者(Scanner)、从设备zhi(daoSlave)、主设备(Master)、发起者(Initiator),其中主设备是由发起者、扫描者转化而来,从设备则是由广播者转化而来;蓝牙模块通信是指两个蓝牙模块或蓝牙设备之间进行通信,进行数据通信的双方一个是主机,一个是从机。

主设备模式:工作在主设备模式,可以与一个从设备进行连接。在此模式下可以对周围设备进行搜索并选择需要连接的从设备进行连接。理论上,一个蓝牙主端设备,可同时与7个蓝牙从端设备进行通讯。一个具备蓝牙通讯功能的设备, 可以在两个角色间切换,平时工作在从模式,等待其它主设备来连接,需要时,转换为主模式,向其它设备发起呼叫。一个蓝牙设备以主模式发起呼叫时,需要知道对方的蓝牙地址,配对密码等信息,配对完成后,可直接发起呼叫。

从设备模式:工作在从机模式下的蓝牙模块只能被主机搜索,不能主动搜索。从设备跟主机连接以后,也可以和主机设备进行发送和接收数据。

主模式与从模式的区别:主机是指能够搜索别人并主动建立连接的一方,从机则不能主动建立连接,只能等别人连接自己。

2. 广播包报头类型有那些

ADV_IND :可连接的非定向广播,表示当前设备可以接受任何设备的连接请求;

ADV_DIRECT_IND:可连接的定向广播,设备不能被主动扫描;

ADV_NONCONN_IND:不可连接的非定向广播,仅发送广播数据,而不被连接;

ADV_SCAN_IND:可扫描的非定向广播,设备可以被发现,既可以发送广播数据,也可以响应扫描发送扫描回应数据,但不能建立连接;

SCAN_REQ:主动扫描请求;

SCAN_RSP :主动扫描回复;

CONNECT_REQ :连接请求;

广播是在37、38、39三个信道依次发送,且广播间隔不超过10ms, 当在某个信道(例如:39)信道广播数据后,收到了SCAN_RSP。此时则停止广播。下次再进行广播的话,又从37信道开始.

3. BLE通信

3.1 连接过程

BLE连接上后,主机(客户端)就会去获取从机(服务端)的服务(service)和特征值(Characteristic),通过它们相应的UUID值就可以进行设备间通信了。

例如,有个UUID为0x180a的service,service下有个UUID为0x2a24的Characteristic(属性为可读可写),那么客户端就可以通过特征值UUID对设备进行读写操作了。

3.2连接参数

BLE连接涉及到三个重要的连接参数,通过修改这三个连接参数直接影响ble连接中的功耗和连接速度

Connection Interval(连接间隔):BLE设备间的连接是采用了调频方案的,在特定的频道中相互收发数据,两个信道切换的间隔就称为连接间隔,连接间隔以1.25ms为一个单元,范围是6 ~ 3200既7.5ms ~ 4s之间,就算两设备间没有数据被发送和接收,仍然会交换链路层数据(空包 )来维持连接。

Slave Latency(从设备延迟):从机可以在没有数据要发的情况下,跳过一定数目的连接事件,不需要回复主机的数据包,依次达到省电。该参数设置范围为0 ~ 499。

如下图所示,OFF表示值为0,ON表示值大于0。

Slave Latency = 0 时,对于每次连接事件从机必须要回复,不回复则认为是从机通讯故障;

Slave Latency = 3 时,如果从机没有要回复的数据包,则可以忽略3个事件,第四个事件到来再回复;如果从机有要回复的数据包,不管Slave Latency配置为多少都应立即回复。

在这里插入图片描述

Supervision Timeout(监控超时):如果BLE在Timeout时间内没有发生通信,就会自动断开。配置范围是10 ~ 3200(一个单位为 10ms),即时间范围是100ms ~ 32s。

概述:增大Connection Interval值,会降低数据包吞吐量,降低功耗;降低Slave Latency值,则功耗增高。

3.3 连接参数应用

连接参数由主机发起连接的时候提供给从机,如果从机对连接参数有自己的要求,可以在连接后发起连接参数更新请求,更改连接参数值。

4.通讯协议

4.1 ATT指令介绍

ATT(Attribute Protocol)配置属性协议:用于发现、读取和写入对端设备上的属性的规范;ATT也是软件开发中接触最多的。

它分为两个角色:Server和Client,通常从机为服务端,主机为客户端;服务端提供拥有关联值的属性集 ,客户端发现、读、写这些属性,服务端也可以主动通知客户端

属性类型:用UUID(16bit or 128 bit)的形式来表现;
属性句柄:用于标识一个属性,服务器上的所有属性都会分配一个唯一非零的属性句柄;
属性权限:使用许可、认证许可、授权许可;
属性值 :0-512 byte。
方法类型
– 请求(客户端到服务端)
– 应答(服务端到客户端,是对请求的回应)
– 命令(客户端到服务端,不需要应答)
– 通知(服务端到客户端,不要确认)
– 指示(服务端到客户端)
– 确认(客户端到服务端,是对指示的回应)。

4.2 Link Layer

Link layer链路层:链路管理,是整个协议栈的核心,定义了空中接口数据包格式、比特流处理程序(例如错误检查)、状态机以及用于无线通信和链路控制的协议;主要负责信道管理、广播和扫描、创建和保持连接、收发空中包和加密链路。

4.2.1 PDU数据包格式分析

格式:前导序列 + 访问地址 + PDU报头 + PDU长度 + PDU数据 + CRC
在这里插入图片描述
1.前导序列:是一个01010101(0x55)或者10101010(0xAA)的8bit交替序列。如果接入地址的最高位是0,前导序列则是01010101,否则是10101010,这样的设计是为了保证报文的前9位都是交替的,用于频率同步、时序评估和自动增益控制训练。

2.访问地址:一个32位的地址,官方文档描述如下图所示,访问地址用来排除噪音和其它链路数据包的干扰。它可以分为

广播访问地址:是一个固定值(0x8E89BED6),扫描到数据包后验证确认是广播访问地址后才把它认定为广播包,否则认为是噪音或者无效包;

数据访问地址:是一个随机值,不同的连接对应不同的值;当主机扫描到广播后,发送连接请求,这个请求会包含一个连接访问地址(断开重连后此地址不同,随机生成),连接上后数据包都是用这个地址。

3.1 广播通道的 PDU 格式
在这里插入图片描述
报文类型(低 4 个 bit):
ADV_IND(0000) ——通用广播
ADV_DIRECT_IND(0001) ——定向连接广播
ADV_NONCONN_IND(0010) ——不可连接广播
ADV_SCAN_IND(0110) ——可扫描广播
SCAN_REQ( 0011) ——主动扫描请求
SCAN_RSP( 0100) ——主动扫描应答
CONNECT_REQ( 0101) ——连接请求

发送地址( TXADD)和接收地址( RXADD): 当此位为“1”时表示 Random Add
(随机地址),当此位为“0”时表示 Public Add(公共地址)。 这个地址指的是数
据净荷中最初的几个地址字节.

3.2数据通道的 PDU 格式
在这里插入图片描述

4.2.2蓝牙信道介绍

BLE蓝牙总共40个信道,每个信道对应一个频率,0-36为数据信道,37,38,39为广播信道。广播信道分别在不同差异大的频率,目的是避开连续的干扰,而数据通道则可以使用跳频(通过判断,选择合适的信道)的方式避开连续频率附近的干扰。
在这里插入图片描述

4.3 GAP

GAP(Generic Access Profile)通用访问协议:GAP 是所有的蓝牙设备均需实现的Profile,主要用于描述device discovery(设备发现)、connection(连接)、security requirement(安全要求)和authentication(认证) 的行为和方法。

4.3.1 GAP的四种设备角色

Master/Central:主机;扫描广播,发起对从机的连接;

Peripheral:从机;发送广播包,允许被主机连接;

Observer:观察者;不能发起连接,只能持续扫描广播包;

Broadcaster:广播者;不能被主机连接,只能广播数据。
在这里插入图片描述
在这里插入图片描述

5. 什么是MTU

MTU: 最大传输单元(MAXIMUM TRANSMISSION UNIT) , 指在一个PDU (Protocol Data Unit: 协议数据单元,在一个传输单元中的有效传输数据)能够传输的最大数据量(多少字节可以一次性传输到对方)。

  • MTU 交换是为了在主从双方设置一个PDU中最大能够交换的数据量,通过MTU的交换和双方确认(注意这个MTU是不可以协商的,只是通知对方,双方在知道对方的极限后会选择一个较小的值作为以后的MTU,比如说,主设备发出一个150个字节的MTU请求,但是从设备回应MTU是23字节,那么今后双方要以较小的值23字节作为以后的MTU),主从双方约定每次在做数据传输时不超过这个最大数据单元
  • MTU交换通常发生在主从双方建立连接关系后,一般MTU请求在连接后只会发一次
  • BLE MTU 比较小(不过新的BLE 标准MTU 已经大幅提升)

MTU使用动作

MTU请求
    请求是从客户端发送给服务端通知自己的最大接收长度,然后请求服务端回应本地的最大接收长度。客户端接收MTU需要大于或等于ATT_MTU大小。一般MTU请求在连接后只会发一次。
在这里插入图片描述
MTU响应
    当服务端接收到MTU请求后,需要回应给客户端MTU应答。应答的MTU代表服务端本地能够接收最大的数据长度,该值同样需要大于或等于ATT_MTU。
在这里插入图片描述

5.2 通过空中包来分析MTU交换

在这里插入图片描述
服务端MTU请求
在这里插入图片描述客户端MTU响应
在这里插入图片描述

5.3总结

在低功耗蓝牙连接中,ATT协议默认的MTU长度为23字节。按照一个字节的类型操作码(请求、响应、命令、指示、确认、通知)以及最少2个字节的操作句柄来算,数据传输字节最多不超过20个字节。在两个设备连接初期,谁也不知道对方能够支持的MTU是多少,因此数据交换按照默认的MTU来,即23个字节。
如果设备想要发送比默认MTU大的数据包,那么它就要协商一个更大的MTU。客户端的请求包含客户端接收的MTU长度;服务器响应则包含服务器接受的MTU长度。对于同时是是客户端服务器的设备而言,二者提供的接收MTU长度中较小的那个即是连接将会使用的MTU长度(一般两者会相等)。
低功耗蓝牙在功耗方面确实是想尽了心思,MTU越大功耗越大,最大传输速率越大,反之相反。
蓝牙协议文档里面提到只有客户端可以发起MTU请求。但是本人实践是服务端发起请求也是行,只要客户端收到请求后回应MTU响应就可以。

  • 2
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值