• 6.BLE---数据传输


    1. 概述

    Ble 数据传输分为两种:

    • 连接态数据传输
    • 非连接态数据传输

    连接态下的 BLE 终端分为 Master Slave,它们之间的数据传输与非连接态时十分类似:

    • Connect Interval Master Slave 可做多次数据交互(上图中只画了一次)。
    • Master 先发, Slave 在收到数据 T_IFS 时间后进行响应。
    • Master 发送数据包的起始时刻必须在 Connect Interval 的起始位置。
    • Connect Interval 的长度 connInterval Master 决定,必须为 1.25ms 的整数倍,范围分别在 7.5ms~4000ms
    • 基 于 降 低 功 耗 的 考 虑 , Master Slave 可 适 当 降 低 数 据 交 互 的 频 率 , 即 在
      connSlaveLatency Connect Interval 中选择特定一个做数据交互。参数 connSlaveLatency
      Master发送个SlaveconnSlaveLatency取值范围0~((connSupervisionTimeout / (connInterval*2))
      - 1)*1
      ,并且小于 500,以保证不触发 Master Slave 长期没有收到对方来包而判断 connect
      中断。(参数介绍在第1章与第2章)

    T_IFS概念:

    数据交互过程中, BLE 终端总是交替发送数据包,数据包之间的时间间隔(本文中记
    T_IFS),其基准值是 150us,考虑到数据包在空口上的传输时延以及 BLE 终端的处理时
    间,协议允许该时间间隔有最大
    2us 16us 的抖动。需要特别注意的是, BLE 协议不固定
    一个数据包的传输时间,即任何
    BLE 终端传输一个数据包的时间是可变的。

    2.进入链接

    2.1 情况1---Slave 收到 Master 发送的第一个 Packet

    进入 connect 状态后第一个 Connect Interval 的起始时刻由 Master 发送 CONNECT_REQ
    后的第一个 Packet 确定,如下图所示,其使用基于 Transmit Window 的机制。

    • CONNECT_REQ后的第一个 Packet,必须在第一个 Transmit Window 内。
    • Transmit Window 的长度transmitWindowSize 不 允 许 大 于 10ms 和 ( connInterval-1.25ms )。
    • 其 起 始 位 置 距 离CONNECT_REQ 结束位置的距离为(1.25ms+transmitWindowOffset), transmitWindowOffset
      是由 Master 确定的参数,取值必须为 1.25ms 的整数倍,范围 0~connInterval
    • Slave 收到该 Pakcet 之后,其默认该 Packet 的起始位置为首个 Connect Interval 的起
      始位置,并以该时间点为基准计算其后的 Connect Interval Connect Event 时间段

    2.2 情况2---Slave 没有收到 Master 发送的第一个 Packet

    Slave 没有收到 Master 发送的第一个 Packet,则其默认第一个 Connect Interval 的起
    始位置为第一个
    Transmit Window 的起始位置,并且在由此计算得到的第二个 Transmit
    Window
    ,并在其中接收 Master 发送的数据,如下图所示,

    • 此时Master可以通过没有收到Slave反馈的数据包推断出 Slave 没有收到第一个 Packet。
    • 然后预先配置的 transmitWindowSize 和 connInterval 等参数会保证 Master 发送的第二个Packet 时落在第二个 Transmit Window 中。

    2.3 误差考虑

    考虑到 Master 和 Slave 的时钟精度不同,以及无线信号在空口的传输时延, Slave 在计算 Transmit Window 时需要对其做适量的展宽, 如下式所示,

    windowWidening = timeSinceLastAnchor*(masterSCA+slaveSCA)/10^6

    • windowWidening 表示展宽的时间宽度。
    • timeSinceLastAnchor 表示 Transmit Window起始时刻与上一次Slave收到的MasterPacket结束时刻的时间间隔。
    • masterSCAslaveSCA分别表示 Master Slave 的时钟精度,单位为 ppm
    • windowWidening 必须小于((connInterval/2)-T_IFS),若 Slave 计算得到的windowWidening 不满足该条件,则判定该 connect 失效,即刻退出

    实际上 Slave 需要在(2* windowWidening+transmitWindowSize)的时间间隔内监听 Master 发送的 Packet

    3.维护链接

    3.1 时钟同步

    • Master Slave 的时间同步基于 Master 发送的 Packet 中的 Preamble 进行。
    • 连接存续期间, Slave 已经根据接收到的 Master Packet 中的 Preamble 调整自身时钟以保证 Master 同步。
    • 即使 Packet CRC 错误,只要 Preamble 被检测到, Slave 也需要进行该调整。而对于频率同步

    3.2 参数更新

     该流程用于 connect 的参数更新,由 Connection Parameter Request Procedure 触发,Master Slave 发送 LL_CONNECTION_UPDATE_REQ PDUSlave 收到后根据其要求在特定时刻更新相应的 connect 参数。如下图所示:

    • 若 接 收 方 不 能 正 确 解 析 LL_CONNECTION_PARAM_REQ PDU , 则 回 复LL_UNKNOWN_RSP PDU
    • 若接收方不能支持 LL_CONNECTION_PARAM_REQ PDU 中的参数要求,则回复 LL_REJECT_IND_EXT PDUError Code 填写为 0x20 0x1E,分别对应不能支持和参数非法两种情况)。
    • Master 在触发 Connection Parameter Request Procedure Connection Update Procedure 时收到了 Slave 发送的 LL_CONNECTION_PARAM_REQ PDU,则回复 Error Code0x23 LL_REJECT_IND_EXT PDU
    • Master 在触发 Channel Map Update Procedure 时收到了 Slave 发送的 LL_CONNECTION_PARAM_REQ PDU,则回复 Error Code 0x2A LL_REJECT_IND_EXT PDU。否则,若接收方为 Slave,其回复 LL_CONECTION_PARAM_RSP PDU(其内容需要和LL_CONECTION_PARAM_REQ PDU 保 持 一 致 ), 然 后 等 待 MASTER LL_CONNECTION_UPDATE_REQ PDU 触发新的 CONNECTION 参数生效;若接收方为MASTER,则其直接发送 LL_CONNECTION_UPDATE_REQ PDU 触发新CONNECTIO参数生效。
    • 需 要 特 别 强 调 的 是 , 该 过 程 中 MASTER SLAVE 都 可 以 发 送LL_CONNECTION_PARAM_REQ PDU 触发 CONNECTION 参数更新,但只有 MASTER
      能发送 LL_CONNECTION_UPDATE_REQ PDU 触发新的 CONNECTION 参数生效。
    • 新的 CONNECTION 参数生效时间由 LL_CONNECTION_UPDATE_REQ PDU 中的
      Instant 字段确定,该字段指示了新参数生效的 connEventCount,如下图所示,
    • connEventCount的含义:对于每个链路层连接,主设备和从设备都应具有16位连接事件计数器(connEventCounter),其中包含值connEventCount。 它应在连接主机发送的第一个连接事件上设置为零。 对于主设备发送的每个新连接事件,它应加1; connEventCounter将从0xFFFF溢出到0x0000。 此计数器用于同步链路层控制过程。(BLUETOOTH SPECIFICATION Version 4.2 [Vol 6, Part B])

    • 若在接收到 LL_CONNECTION_UPDATE_REQ PDU Connect Interval 里, SLAVE 发现 Instant<(connEventCount-6) (Instant-connEventCount)mod65536>32766 , 则 判 断 当 前CONNECTION 中断,需立即进入 STANDBY 状态。在新参数生效的第 connEventCount Connect Interval 里, SLAVE 需要使用 Transmit Window 机制重新确定 Connect Interval 的起始时刻

               

    若参数在connect下更新了, Master Slave 需要像初始建立连接一样,使用Transmit Window 的机制重新确定 connect interval 的起始时间点,如下图所示:

    • connIntervalOLDconnIntervalNEW分别表示更新前后的 connInterval
    • 为进一步降低 Slave 的功耗,协议在 Connection Parameter Request Procedure 中引入了Offset0~5 ReferenceConnEventCount 等字段指示新的 Connect Interval 的起始位置

    3.3重传机制

    处于连接态的两个 BLE 终端使用简单的"停等"机制进行通信,如下图所示,

    • 每个 BLE 终端都维护两个 1 bit 参数: transmitSeqNum nextExpectedSeqNum,分别指示当前传输的数据包序号和下一个期待接收的数据包序号,它们与 Packet 中的 SN NESN字段一起维护 Master Slave 之间的重传机制。 transmitSeqNum nextExpectedSeqNum connect 建立时都初始化为 0
    • 发送数据包时,对于 SN 字段,若数据包为新传,则设置为自身 transmitSeqNum 取值,否者与上一次传输一致;对于 NESN 字段,始终设置为自身 nextExpectedSeqNum 取值。
      接收数据包时, transmitSeqNum nextExpectedSeqNum 按照如下原则进行更新,若 SN 字 段 与 自 身 nextExpectedSeqNum 一 致 , 则 表 明 该 数 据 包 为 重 传 ,nextExpectedSeqNum 不变;否者为新传,并且需要将自身 nextExpectedSeqNum 取反。若 NESN 字段与自身 transmitSeqNum 一致,则表明接收到 NACK,即上一次自己
      发送的数据包失败,需要重发;否者表明收到 ACK,需要发送新的数据包,并且
      将将自身 transmitSeqNum 取反。若接收到的数据包 CRC 错误,则不更新 transmitSeqNum nextExpectedSeqNum,并重发上一次自己发送的数据包(判定收到了 NACK

    简单总结:

    • Master只更新SN
    • Slave只更新NESN
    • 当Slave收到一包,NESN == SN时,认为是新包;
    • 当Master收到一包, NESN和SN不同,认为是新包;
    • 当Slave收到一包,NESN != SN时,认为是重发包;
    • 当Master收到一包, NESN和SN相同时,Master重传上一包;

       

    4.退出链接

    4.1无数据关闭

             

    • MD 字段置 1,表示发送方还有数据需要传输,否者表示没有数据传输。
    • 在一个 Connect Interval 内,若 Master 和 Slave 都将 MD 字段置 0,则当前 Connect Interval 为最后一个 Connect Interval,它们将关闭此 Connect;否者 Master 和 Slave 在下一个 Connect Interval 继续数据传输。

    4.2 Termination Procedure 关闭

    • Master(或 Slave)发送 LL_TERMINATE_IND PDU 到 Slave(或 Master),同时启动定 时器(Tterminate);
    • Slave(或 Master)收到后回复 ACK,同时关闭 connect;
    • 收到 ACK 的 Master (或 Slave)则判定 connect 关闭。
    • 若 Master(或 Slave)没有收到 ACK,其在 Tterminate 超时后仍然判定 connect 关闭,不在 发送数据包。
    • 若 Slave(或 Master)一直没有收到 LL_TERMINATE_IND PDU,则可由于SUPERVISION TIMER 超时而关闭 connect。

    4.3 SUPERVISION TIMER 超时关闭

    具体介绍在第1章第5小节。

    4.4 异常关闭

    主要是信令流程中 Master 和 Slave 的信令交互出现了异常,它们都默认退出 connect。 除此之外,本章中提到的计算 windowWidening 超出范围也会导致退出 connect。

     

     

     

     

     

     

     

     

     

     

     

  • 相关阅读:
    LINUX重启MYSQL的命令
    如何在linux下实现mysql数据库每天自动备份
    mysql 2013错误解决
    mysql按年度、季度、月度、周、日统计查询的sql语句
    MySQL 时间戳(Timestamp)函数
    jQuery 选择器大全总结
    使用Git的Push出现rejected
    js实现分页的几个源码,看完基本就懂了
    Get,Post请求中文乱码问题有效解决方法
    web应用中文乱码问题的原因分析
  • 原文地址:https://www.cnblogs.com/yuqilihualuo/p/9554312.html
Copyright © 2020-2023  润新知