BLE协议PHY,LL,L2CAP层介绍

低功耗蓝牙:降低功耗。

1、2.4GHz频段。2、IP许可。3、纽扣电池

自适应跳频:一种使用某个频率子集的技术,设备可以避免其他非自适应技术使用该频率。

Ble4.0协议:

CONTROLLER组成:PHY:基带物理层、LL:链路层、HCI:主机控制接口

HOST组成:L2CAP:逻辑链路控制和适配器、ATT:属性协议、GATT:属性协议配置规范、SM:安全管理、GAP:通用访问规范

物理层:2.4GHz,GFSK调制方式(髙斯频移键控),比特率1Mbps,信道宽度是2MHz

$射频信道:一共 40 个通道,37个自适应自动调频数据通道用于两个连接设备的通讯; 3 个固定广播通道分别是 37、 38、 39

链路层:定义两个设备如何利用无线电传输信息。链路层状态机:就绪态(Standby)、广播态(Advertising)、扫描态(Scanning)、发起态(Initiating)、连接态(Connection)

就绪态:默认的状态,在这个状态是不能进行数据收发的

广播态:广播事件共有4种(见报文类型)。广播数据报文依次从广播通道37、38、39中进行传输。

扫描态:扫描侦听广播通道

发起态:发起态进入连接后成为主机设备。它做的工作是在扫描态的事情之后发送连接请求。当接收到了扫描应答后,发送连接请求事件,从而跳出发起态并进入连接状态成为主机。

主机只能从发起态进入,必须向对端设备发起连接,并且主设备必须定期向从设备发送报文(即链接事件),从设备只能回复主机发送的报文时才能发送自己的数据。从机只能从广播状态进入,必须向对端设备进行广播(从设备没有主动发送数据的能力)。

数据包:前导码(1byte) + 访问地址(4byte) + 数据包单元(29byte) + CRC校验(3byte)

  1. 数据流:小端存储,低字节bit先发送,CRC先发高位。

  1. 数据白化:避免长0长1。

  1. 地址类别:①前导码(1B)0xAA(接入地址最低位0)和0x55(最低位1); ②接入地址(4B):广播(广播、扫描、发起连接时使用)包固定(0x8e89bed6),数据包变化(对于数据通道,接入地址是一个随机数?); ③芯片物理地址(6B)

当控制器试图接收一个报文时,它要事先知道待接收报文的接入地址(CONNECT_REQ中获得)。接收机开启并调谐到正确的频率,就可以收到数据。

广播通道PDU:

广播报文类型七种

非定向可连接广播事件(ADV_IND):链路层通过广播信道发送(ADV_IND PDU)通用广播报文。这个报文发送之后可以接收由扫描者发送的(SCAN_REQ PDU)扫描请求,或者由发起者发送的(CONNECT_REQ PDU)连接请求。而接收后链路层需要在同一个信道上进行扫描者或者发起者的应答。

非定向不可连接事件(ADV_NONCONN_IND):它只能根据主机的要求在广播态和就绪态之间切换,也是唯一可用于只有发射机而没有接收机设备的广播类型。

可发现不可连事件(ADV_DISCOVER_IND/ADV_SCAN_IND):应答也是SCAN_REQ PDU和SCAN_RSP PDU,这个广播和通用广播的区别是,它不能建立连接,只能处于广播态或者就绪态。适用于广播数据的广播形式。

广播地址(6B) + 广播数据(0-31B)

定向可连接广播事件(ADV_DIRECT_IND):为了快速建立连接。这种报文包含两个地址:广播者地址和发起者的地址。

主动扫描请求(SCAN_REQ)

主动扫描应答(SCAN_RSP)

连接请求(CONNECT_REQ)

连接事件:进入连接状态是广播状态下的CONNECT_REQ PDU的发送(主机)和接收(从机)。连接事件的时间由两个参数决定:connInterval(连接间隔)、connSlaveLatency(从机潜伏期)。

主机在锚点(anchorpoint,连接事件开始的点)开始连接事件,从机需要在锚点前进入侦听状态。

连接事件计数器(connEventCounter)、监管超时(connSupervisionTimeout)

CONNECT_REQ包:

AA:access address(4B)

WinSize(1B):*1.25ms = 传输窗口时间。范围:[1.25ms,MIN(10ms, connInterval - 1.25 ms)]

WinOffset(2B):*1.25ms = 传输窗口偏移时间。这个参数其实只在第一连接事件发生前或者连接参数更新时用一次,之后的时间主要就是连接间隔和扫描窗口控制。范围:[0, connInterval]

Interval(2B):*1.25ms = 连接间隔时间。范围:[7.5ms, 4.0s]

Latency(2B):从机潜伏次数(如果没有数发送,不用对每一个连接请求都回应)。范围:[0, MIN(((connSupervisionTimeout /connInterval) - 1),500)]

Timeout(2B):*1.25ms = 真正时间。范围:[MAX(100 ms, (1 + connSlaveLatency) * connInterval),32.0s]

连接间隔、从机时延以及超时时间这三者必须满足如下公式:

SupervisionTimeout > (1 +slaveLatency)* (connectionInterval)

chM:信道地图。共40个信道可用5Byte表示,每一个bit位表示一个信道,共37个信道,第0bit位表示第0信道,第36bit位表示第36信道。当某个bit位为0时表示这个信道不可用,当为1时表示这个信道是可用信道。

Hop(5bit!):自适应调频中使用的调频增量

SCA:主机的时钟精度

每一个连接事件中至少包含主机发送的一个包,从机可以不发送包。

连接状态--主机:当主机发送完CONNECT_REQ报文之后,接着发送第一个连接事件的报文,而从机接到CONNECT_REQ报文后,做好进入连接状态的准备工作后,根据CONNECT_REQ中的参数,决定开始侦听的时间。

连接状态--从机:第一个包接收时,无论CRC是否正确,只需要接入地址正确,在连接状态下锚点由从机接收的第一个连接事件报文决定,并决定了将来的锚点。

MD位用于关闭连接事件。

数据通道PDU:

分为两大类:链路层数据报文(LL Data PDU)和链路层控制报文。

LL Data PDU

链路层的数据通道是用来发送L2CAP的数据,也就是说只要是数据一定是从HOST层发送到下层的。而数据PDU的标示就是LLID为01b(数据分解成多包发送的连续包,或者是一个空包)或者10b(L2CAP层信息的起始包)。

LL Control PDU

LLID=11b

第一个字节为操作码,对于BLE共有14个控制操作

LL_CONNECTION_UPDATE_REQ:参数更新报文

LL_CHANNEL_MAP_REQ:通道图更新报文

LL_TERMINATE_IND:空中终止连接报文

LL_ENC_REQ:空中开始加密请求报文

LL_ENC_RSP:空中开始加密应答报文

LL_START_ENC_REQ:空中开始加密请求报文(无数据)

LL_START_ENC_RSP:空中开始加密应答报文(无数据)

LL_UNKNOWN_RSP:应答刚刚接收的包,告诉对方这个包不能识别的命令

LL_FEATURE_REQ:特征请求是由主机发送给从机的

LL_FEATURE_RSP:特征应答是从机发送给主机的应答包

LL_PAUSE_ENC_REQ:暂停加密请求

LL_PAUSE_ENC_RSP:暂停加密应答

LL_VERSION_IND:版本交换命令

LL_REJECT_IND:空中命令拒绝报文

数据通道PDU报头:

序列号(SN):值是在0和1之间进行切换。连接建立后,第一个数据包的序列号为0;每次发送新的数据包时,其序列号与上个数据包的序列号不同。如果序列号与之前的一样,则为重传报文;如果序列号和之前的不同则为新的报文。

预期序列号(NESN):接收方希望接到的下一包的序列号,及逾期序列号,也是数据包的确认标志。(相当于ack)

更多数据(MD):0表示没有更多数据发送,1标志有更多数据准备发送。

HCI(主机和控制接口)

L2CAP层(逻辑链路控制和适配层):目的是将上层的数据进行简单包装。

L2CAP共有3个固定的信道。

0x0004为它的上层属性协议(ATT)使用;0x0006为安全管理协议(SMP)使用;0x0005它是低功耗信令信道的固定信道,这个信道上传输的是命令包,为通用访问规范GenericAccess Profile(GAP)使用。

L2CAP数据包格式:

BLE的MTU为23字节。Channel ID:通道ID。0x0004、0x0005、0x0006三个可选。Information payload信息放的就是L2CAP上层ATT的数据包。

低功耗信令信道包格式:

连接参数更新请求和响应:从机只能给主机提出自己的想法,如果主机同意更新,那么需要主机发送“LL_CONNECTION_UPDATE_REQ”这个命令详细连接参数给从机,然后从机等到“瞬时”到后进行参数更新。

属性(ATTRIBUTE)是一条公开的带有标签的,可以被寻址的数据。属性构成就是规定数据怎么组成。

属性组成图

属性句柄(Attribute Handle) + 属性类型(Attribute Type) + 属性长度(Attribute Value) + 属性许可(Attribute Permissions)

通过属性句柄操作多个同样的属性类型。

属性类型其实就是对某个东西取一个别名,让机器可以理解,对于机器理解东西就是数字了,所以属性类型采用了2bytes或者是16bytes的长度的数字表示某个东西。

通用唯一识别码UUID。

属性值(Attribute Value)是给应用用的。

属性许可(Attribute Permissions)是仅仅是对属性值的一种保护。

服务声明:就是告诉其他蓝牙设备,我可以为你提供什么服务,对于心率计,就是告诉对方我可以提供心率的服务。

UUID

1)通用服务类通过唯一的UUID(0x1800~0x26ff)来标识一种明确的服务。好比,0x180f代表电池电量服务。

2)计量单位类通过唯一的UUID来标识一种单位

3)区分属性类型类通过唯一的UUID来标识该属性是首要服务定义、次要服务、包含服务还是特性定义(见GATT)等。其好比程序中的变量的类型,是整型、字节型、还是确定的结构体。(主要使用:服务和特性定义)

4)特性描述类除了描述特性的名称、作用之外,还有一个非常重要的配置作用。例如如果提供的特性服务需要主动告知对方,那么对方就必须在连接时进行订阅配置。这样在该特性的数据值发生变更时能够主动地进行notify或者indicate。

5)区分特性类型用于用户定义不同的特性,用于区分该设备里面所有的特性。

心率计通常用«Heart Rate service »(属性类型)表示数值为0x180D的UUID(属性值)

对属性协议重要的理解原则:

1)无论是服务还是特性,它们都是一条条属性;特性的各个要素也是一条条属性。只不过,不同的服务是独立的;而一个服务如果有多个特性,那么不同的特性也是独立的;一个特性包含的多条属性则是关联的。

2)对于蓝牙通信来说,其都是通过一个个不同的UUID来标识区分不同的服务,区分不同的特性,甚至服务/特性之间的类别。

3)对于各个蓝牙单芯片SDK平台,其上层应用对于属性协议的支持并不一致,它们只需要保证底层的蓝牙数据格式一致即可。

GATT(通用属性规范)

ATT(属性传输协议):规定用什么样的方法去访问GATT服务,并将访问的到的数据传输给L2CAP

SMP(安全管理)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值