• 第10节-BLE协议链路层(LL)


    本篇博客的学些要结合书籍《低功耗蓝牙开发权威指南,Robin Heydon著》第7章,实际上这书只是对蓝牙原版协议的简化、摘要。

    回顾以前学过的《BLE协议各层的形象化理解》和《BLE协议各层数据格式概述》

     一  链路层的5种状态:

    就绪态(Stanby)、扫描态(Scanning)、广播态(Advertsing)、发起态(Initiating)、连接态(Connection)。

    扫描态有2种子状态:被动扫描(Passive Scanning)、主动扫描(Active Scanning)

    连接态有2种子状态:主(Master Role)、从(Slave Role)

    二、数据格式:

    LL层可以发出:广播包、数据包。Access Address等于0x8e89bed6时,是广播包;否则是数据包。

    广播包

    广播包有多种:

    ADC_IND(通用广播)

    ADV_DIRECT_IND(定向广播)

    ADV_NONCONN_IND(不可连接广播)

    ADV_SCAN_IND(可扫描广播)

    SCAN_REQ(扫描请求)

    SCAN_RSP(扫描响应)

    CONNECT_REQ(连接请求)

     2. 数据包

    主设备连接从设备时,主设备分配一个32位的随机数并发送给从设备,这就是access address

    access address被用来表示一个连接,在连接保持期间,access address不变。

    对于同一个从设备,断开连接后再重新连接,access address会重新生成

    数据包有2种:

    发给链路层的控制包(LLID=11b)

    空包,或发给上层L2CAP的数据包(LLID=01b,10b)

    L2CAP的数据包很大时,可以拆分来多次发送,有起始包(LLID=01b)、延续包(LLID=10b)

    这些包的数据格式,使用Wireshark很容易解析,只需要稍有了解即可。

    三、自适应跳频:

    对于广播包,会在37、38、39这3个广播信道循环发送;

    对于数据包,会使用自适应跳频算法,在0~36这37个数据信道中挑选可用的信道。

    主设备发出CONNECT_REQ时,会含有一个hop值,就是下面公式里的hopIncrement;还会含有一个Channel Map,它是一个37位的字段,每一位代表一个数据信道。某位为1,表示对应的信道可以使用;某位为0,表示对应的信道不可使用。

    举例说明跳频算法(参考《低功耗蓝牙开发权威指南,Robin Heydon著》第7章)。

    1. 在CONNECT_REQ中:

    hop为7,

    ChannelMap = 000111100000000011100000000001100000000 (bit 0对应Channel 0)

    所以:

    可用的信道Used = [9,10,21,22,23,33,34,35,36]

    可用的信道数numUsed=9

    2.跳频示例

    连接事件:

    主从设备之间可以发送数据,主设备可以从某个channel发送数据给从设备,从设备使用同一个channel向主设备回复数据。这一来一回就是一个连接事件。

    有时候,从设备为了省电,没有回复数据,这也是一个channel;

    主设备发送下一个包时,使用另一个channel,这是另一个连接事件。

    连接事件

    计数器

    fn+1=(fn+hop)mod37

    fn+1能用吗

    remappingIndex

    = fn+1 mod 9

    重映射的最终要用的信道

    Used[remappingIndex]

    0

    7

    7

    35

    1

    14

    5

    33

    2

    21

    21

    3

    28

    1

    10

    4

    35

    35

    5

    5

    5

    33

    连接事件计数器为0时(一个事件对应一个channel),fn =0, hop=7----->fn+1= 7,从数组used中可以看出,fn+1是不能用的。因为used 数组中元素的个数为9,所以remappingIndex =7 mod 9 =7------->used[7]=35

    连接事件计数器为1时,fn =7, hop=7----->fn+1=14,从数组used中可以看出,fn+1是不能用的。因为used 数组中元素的个数为9,所以remappingIndex =14 mod 9 =5------->used[5]=33

  • 相关阅读:
    肯德基也会出这档子事?
    全球华人大签名反对日本成为安理会常任理事国
    Google "invasion" into our desktop
    你真的认真考虑过周期性的构建工作的对于项目成功重要性吗?
    [Eclipse笔记]Give TestNG a try in Eclipse.
    .NET, 想说爱你不容易
    [Eclipse笔记]Just for fun – 在Eclipse下编译和运行C#的代码
    面试注意事项
    名字隐藏深入研究what's in class (什么“类”的“接口”/一部分)
    Catalan数——卡特兰数
  • 原文地址:https://www.cnblogs.com/-glb/p/11617678.html
Copyright © 2020-2023  润新知