概述
3 BLE连接过程
总体流程大致为:发现设备->配对/绑定设备->建立连接->数据通信
具体过程:
主设备(连接过程中实际是一个client)通过扫描到从设备(连接过程中实际是一个server)广播的的数据信息,其中的address作为目标目标蓝牙设备的MAC地址,通过调用连接方法获取设备连接。
3.1 广播间隔:
图中AdvInterval是0.625ms的倍数,在20ms – 10.24s 之间。如果广播类型是非定向扫描事件或者非定向不可连接广播事件,这个值不能100ms。如果广播时间类型是非定向可连接事件,这个值只需大于20ms即可;
AdvDelay是一个随机数,在0ms – 10ms 之间,在每个广播事件中都有,由于设备的时钟会有不同程度的漂移,所以这个随机延时的作用不但能消除设备之间时钟漂移,还能避免相同信道及时间点上的冲突。
广播间隔时序:
3.2 三信道切换时间间隔:
除广播事件之间有时间间隔,广播本身里面有3个信道进行数据传输,在蓝牙协议中规定,两个连续的通用广播之间的时间必须小于等于10ms。
3.3 扫描与应答
如果广播者接收到Scan_Req,广播者需要在通一信道发送Scan_Rsp, 应答报文的时间一定是150±2us完成。
3.4 建立连接
根据蓝牙spec规定,advertiser发送完一个广播包之后150us(T_IFS),advertiser必须开启一段时间的射频Rx窗口,以接收来自observer的数据包。Observer就可以在这段时间里给advertiser发送连接请求。如下图所示,主机在扫到了从机后,并发出了连接请求CONNECT_REQ。
3.4.1 概念补充
3.4.1.1 锚点
事件开始的点叫做锚点(The start of a connection event iscalled an anchor point)。在连接状态下锚点由从机接收的第一个连接事件报文决定,并决定了将来的锚点。
3.4.1.2 CONNECT_REQ 数据包
主要结构如下。
Access Address + Packet Header + Initator Address(主设备) + Advertising Address(从设备) + Link Layer Data
Link Layer Data 主要结构如下:
Access Address + CRC Init + Window Size + Window Offset + Interval(数据间隔时间) + Latency(时延) + Timeout(中断连接最大时延) + Channel Map(跳频通道图) + HOP及CLOCK + CRC
(1)Transmit window offset 传输窗口偏移的时间,范围:[0, connInterval]
transmitWindowOffset = WinOffset * 1.25 ms
(2)Transmit window size它为传输窗口的时间,范围:[1.25ms,MIN(10ms, connInterval - 1.25 ms)]
transmitWindowSize = WinSize * 1.25 ms
(3)connect_Interval 这个就是传说中的连接间隔时间,范围:[7.5ms,4.0S]
connInterval = Interval * 1.25 ms
(4)Latency 从机潜伏次数
范围:[0, MIN(((connSupervisionTimeout / connInterval) - 1),500)]
(5)timeout 连接超时,范围[100ms – 30s]
如果连接状态下,很长时间都没有连接事件发生,或者连接事件发送总是得不到从机的应答,称为连接超时,
Timeout > (1 + connSlaveLatency) *connInterval超时时间一定要大于此表达式才行
3.4.2具体连接过程
如上图所示,Observer在收到Advertiser的ADV_IND(A1)后,以此为初始锚点(这个锚点不是连接的锚点),T_IFS后给Advertiser发送一个CONNECT_REQ命令(A2),CONNECT_REQ其实是告诉Advertiser,主机将在Transmit window 期间发送第一个同步包(P1)给你,从机需在这段时间内,奖射频接收窗口打开,从机收到P1后,T_IFS后将给主机回复数据包P2,一旦主机接收到了数据包P2,即认为建立连接成功,后续将以P1为连接锚点,以Connection_Interval周期,周期性给从机发送Packet.
Packet除了充当数据传送功能,它还有如下两个非常重要的功能:
- 同步连接发起者和设备的时钟,也就是说,设备每收到连接发起者发来的一个包,都会把自己的时序原点重新设置,以跟连接发起者同步。
- 告诉设备你现在可以传数据给我了。连接成功后,BLE通信将变成主从模式,因此把连接发起者(手机或网关)称为Master或者Central,把被连接者(之前的Advertiser)称为Slave或者Peripheral。BLE通信之所以为主从模式,是因为Slave不能“随性”给Master发信息,它只有等到Master给它发了一个packet后,然后才能把自己的数据回传给Master。
3.4.3 连接后数据交互时序
Connection events
连接成功后,master和slave在每一个connection interval开始的时候,都必须交互一次,即master给slave发一个包,slave再给master发一个包,整个交互过程称为一个connection event。蓝牙芯片只有在connection event期间才把射频模块打开,此时功耗比较高,其余时间蓝牙芯片都是处于idle状态的,因此蓝牙芯片平均功耗就非常低。Master不可能时时刻刻都有数据发给slave,所以master大部分时候都是发的空包(empty packet)给slave。同样slave也不是时时刻刻都有数据给master,因此slave回复给master的包大部分时候也是空包。另外在一个connection event期间,master也可以发多个包给slave,以提高吞吐率。
连接成功后的通信时序图(每个connection event只发一个包)
连接成功后的通信时序图(每个connection event可能发多个包)
Connection event 细节图
Slave latency
在每一个connection interval开始的时候,Master和Slave必须交互一次,哪怕两者之间交互的是empty packet(空包),但如果slave定义了slave latency,比如slave latency = 9,此时slave可以每9个connection interval才回复一次master,也就是说slave可以在前面8个connection interval期间一直睡眠,直到第9个connection interval到来之后,才回复一个packet给master,这样将大大节省slave的功耗,提高电池续航时间。当然如果slave有数据需要上报给master,它也可以不等到第9个connection interval才上报,直接像正常情况进行传输即可,这样既节省了功耗,又提高了数据传输的实时性。
3.4.4 连接失败原因
有如下几种典型的连接失败情况:
- 如上图所示,如果slave在transmit window期间没有收到master发过来的P1,那么连接将会失败。此时应该排查master那边的问题,看看master为什么没有在约定的时间把P1发出来。
- 如果master在transmit window期间把P1发出来了,也就是说master按照connect_req约定的时序把P1发出来了,但slave没有把P2回过去,那么连接也会失败。此时应该排查slave这边的问题,看一看slave为什么没有把P2回过去
- 如果master把P1发出来了,slave也把P2回过去了,此时主机还是报连接失败,这种情况有可能是master软件有问题,需要仔细排查master的软件。
- 还有一种比较常见的连接失败情况:空中射频干扰太大。此时应该找一个干净的环境,比如屏蔽室,排除干扰后再去测试连接是否正常。
最后
以上就是坦率春天为你收集整理的蓝牙广播 连接资料整理 23 BLE连接过程的全部内容,希望文章能够帮你解决蓝牙广播 连接资料整理 23 BLE连接过程所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复