赞
踩
总体流程大致为:发现设备->配对/绑定设备->建立连接->数据通信
具体过程:
主设备(连接过程中实际是一个client)通过扫描到从设备(连接过程中实际是一个server)广播的的数据信息,其中的address作为目标目标蓝牙设备的MAC地址,通过调用连接方法获取设备连接。
图中AdvInterval是0.625ms的倍数,在20ms – 10.24s 之间。如果广播类型是非定向扫描事件或者非定向不可连接广播事件,这个值不能100ms。如果广播时间类型是非定向可连接事件,这个值只需大于20ms即可;
AdvDelay是一个随机数,在0ms – 10ms 之间,在每个广播事件中都有,由于设备的时钟会有不同程度的漂移,所以这个随机延时的作用不但能消除设备之间时钟漂移,还能避免相同信道及时间点上的冲突。
广播间隔时序:
除广播事件之间有时间间隔,广播本身里面有3个信道进行数据传输,在蓝牙协议中规定,两个连续的通用广播之间的时间必须小于等于10ms。
如果广播者接收到Scan_Req,广播者需要在通一信道发送Scan_Rsp, 应答报文的时间一定是150±2us完成。
根据蓝牙spec规定,advertiser发送完一个广播包之后150us(T_IFS),advertiser必须开启一段时间的射频Rx窗口,以接收来自observer的数据包。Observer就可以在这段时间里给advertiser发送连接请求。如下图所示,主机在扫到了从机后,并发出了连接请求CONNECT_REQ。
事件开始的点叫做锚点(The start of a connection event iscalled an anchor point)。在连接状态下锚点由从机接收的第一个连接事件报文决定,并决定了将来的锚点。
主要结构如下。
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超时时间一定要大于此表达式才行
如上图所示,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除了充当数据传送功能,它还有如下两个非常重要的功能:
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才上报,直接像正常情况进行传输即可,这样既节省了功耗,又提高了数据传输的实时性。
有如下几种典型的连接失败情况:
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。