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除了充当数据传送功能,它还有如下两个非常重要的功能:

  1. 同步连接发起者和设备的时钟,也就是说,设备每收到连接发起者发来的一个包,都会把自己的时序原点重新设置,以跟连接发起者同步。
  2. 告诉设备你现在可以传数据给我了。连接成功后,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 连接失败原因

有如下几种典型的连接失败情况:

  1. 如上图所示,如果slave在transmit window期间没有收到master发过来的P1,那么连接将会失败。此时应该排查master那边的问题,看看master为什么没有在约定的时间把P1发出来。
  2. 如果master在transmit window期间把P1发出来了,也就是说master按照connect_req约定的时序把P1发出来了,但slave没有把P2回过去,那么连接也会失败。此时应该排查slave这边的问题,看一看slave为什么没有把P2回过去
  3. 如果master把P1发出来了,slave也把P2回过去了,此时主机还是报连接失败,这种情况有可能是master软件有问题,需要仔细排查master的软件。
  4. 还有一种比较常见的连接失败情况:空中射频干扰太大。此时应该找一个干净的环境,比如屏蔽室,排除干扰后再去测试连接是否正常。

蓝牙广播 连接资料整理 2相关推荐

  1. 蓝牙广播“嗅探”模式应用

    蓝牙广播"嗅探"模式应用 一:什么是蓝牙广播"嗅探"模式? 蓝牙BLE通信中分别配置为"蓝牙主设备"和"蓝牙从设备".通 ...

  2. IoT:BLE4.0教程一 蓝牙协议连接过程与广播分析

    IoT:BLE4.0教程一 蓝牙协议连接过程与广播分析 1.蓝牙简介 什么是蓝牙4.0 蓝牙无线技术是使用范围最广泛的全球短距离无线标准之一,蓝牙4.0版本涵盖了三种蓝牙技术,即传统蓝牙.高速蓝牙和低 ...

  3. android 蓝牙广播协议,Android蓝牙协议-蓝牙配对与连接

    蓝牙设备在连接前,会先检查设备是否已经配对过,如果没有则先配对,配对完成后,再开始连接. onPreferenceTreeClick 蓝牙连接开始于设备列表 DeviceListPreferenceF ...

  4. ble连接过程建立_BLE4.0教程一 蓝牙协议连接过程与广播分析

    1.蓝牙简介 什么是蓝牙4.0 蓝牙无线技术是使用范围最广泛的全球短距离无线标准之一,蓝牙4.0版本涵盖了三种蓝牙技术,即传统蓝牙.高速蓝牙和低功耗蓝牙技术,将三种规范合而为一.它继承了蓝牙技术在无线 ...

  5. BLE4.0教程一 蓝牙协议连接过程与广播分析

    1.蓝牙简介 什么是蓝牙4.0 蓝牙无线技术是使用范围最广泛的全球短距离无线标准之一,蓝牙4.0版本涵盖了三种蓝牙技术,即传统蓝牙.高速蓝牙和低功耗蓝牙技术,将三种规范合而为一.它继承了蓝牙技术在无线 ...

  6. 蓝牙广播数据包_蓝牙BLE数据包格式汇总

    以蓝牙4.0为例说明: BLE包格式有:广播包.扫描包.初始化连接包.链路层控制包(LL层数据包).逻辑链路控制和自适应协议数据包(即L2CAP数据包)等: 其中广播包又分为:定向广播包和非定向广播包 ...

  7. 【低功耗蓝牙】① 蓝牙广播数据格式分析

    摘要 本文章主要讲解了蓝牙的发展史,蓝牙信号,蓝牙广播数据的格式.最后使用ESP32芯片MicroPython固件给出了蓝牙广播的具体代码,是蓝牙初学者很好的参考资料. 也可以参考下我在B站的蓝牙视频 ...

  8. BLE广播流程介绍 蓝牙广播 低功耗蓝牙广播的实现流流程介绍 /BLE Advertising flow ----- 蓝牙低功耗协议栈

    零. 概述 主要介绍下蓝牙协议栈(bluetooth stack)低功耗蓝牙广播的流程以及协议栈的实现流程,BLE  Advertising flow btsnoop以及流程在资料中的......\S ...

  9. 2.4G芯片做蓝牙广播发送数据(伪蓝牙)

    伪蓝牙LE(Faking Bluetooth LE) Bluetooth LE是蓝牙4.0规范中引入的一项新技术. 除了名称外,它与蓝牙完全无关.它是为低功耗而设计的,设计表明了这一点.它不像真正的蓝 ...

最新文章

  1. 标星 6.1K!《Python 机器学习在线指南》分享
  2. oracle双机python连接_Python连接Oracle
  3. 使用 Caddy 自动化发布 Web 应用
  4. springboot整合mybatis增删改查(三):mybatis逆向工程
  5. linux 7 zip软件下载,linux安装使用7zip教程
  6. iOS:(接口适配器3)--iPhone适应不同型号 6/6plus 前
  7. 烂泥:更换ESXI5.0管理网卡及管理IP地址
  8. linux安装vmwareTools
  9. 微信原生支付 Native扫码支付( V3.3.7 版本)
  10. python的turtle库画苹果
  11. OpenGL第八版--初识OpenG
  12. 20172328 2018-2019《Java软件结构与数据结构》第六周学习总结
  13. AS179-92LF pHEMT GaAs FET单刀双掷(SPDT)开关SKYWORKS
  14. HiWork告诉你:拿什么来拯救你,我的时间
  15. windows中SyncToy(微软同步工具) v2.1汉化版
  16. 阻碍你成功的五个不良习惯
  17. 一、linux驱动开发-8.1-platform设备驱动
  18. 麦肯锡三部曲_《学会提问:麦肯锡工作法》—读书笔记导图分享
  19. unity 发布苹果商店_[Mac] Unity 导出 iOS 游戏并上架 App Store
  20. 单细胞测序分析及单细胞转录组

热门文章

  1. 弹出文件夹选择对话框
  2. 危险的外围设备:Windows和Linux系统的计算机内部安全隐患研究
  3. 内存数据库应用之NBA篮球图文直播室存储设计
  4. vs code 不能正确补全结构体成员变量的解决方法
  5. Linux-查看服务器配置
  6. Kotlin 编程核心基石—高阶函数
  7. 快速掌握的微信运营技巧
  8. 不用找 手机壁纸素材合集在这
  9. caffe学习笔记20-BatchNorm层分析
  10. yum 安装mysql 后 which is not functionally dependent on columns in GROUP BY clause; this is incompatibl