• 蓝牙4.0技术分析1-广播者角色


    第1章  BlueTooth Roles-Broadcaster

    1.1    广播类型

    广播可设置下面几种类型:

    1)   Connectable Undirected Event Type(可连接无定向广播)

    2)   Connectable Directed Event Type(可连接定向广播)

    3)   Scannable Undirected Event Type(可扫描无定向广播)

    4)   Non-connectable Undirected Event Type(不可连接无定向广播)

    所谓定向和无定向是针对广播的对象而言的,假设是针对特定对象的广播(在广播包PDU中会包括目标对象的BD_ADDR)就是定向广播。反之就是无定向。

    可连接和不可连接是指是否接受连接请求。假设是不可连接的广播类型。它将不回应连接请求。可扫描类型是指回应扫描请求。

    在TICC2540中实现:

    广播类型定位在(include/gap.h),详细定义的类型例如以下:

    GAP_ADTYPE_ADV_IND                     //!< Connectable undirected advertisement

    GAP_ADTYPE_ADV_HDC_DIRECT_IND      //!< Connectable high duty cycledirected advertisement

    GAP_ADTYPE_ADV_SCAN_IND            //!<Scannable undirected advertisement

    GAP_ADTYPE_ADV_NONCONN_IND         //!<Non-Connectable undirected advertisement

    GAP_ADTYPE_ADV_LDC_DIRECT_IND           //!<Connectable low duty cycle directed advertisement

    当中定向可连接广播类型分成两种方式(High duty cycle和Low duty cycle)

    參数设置的API为:

        GAPRole_SetParameter(GAPROLE_ADV_EVENT_TYPE, sizeof( uint8 ), &advType );

    1.1.1   Connectable Undirected Event Type

    可连接非定向广播包为(ADV_IND PDU)。在可连接的无定向广播类型下,一个“扫描者”或“发起者”能够用扫描请求或连接请求来回应这个广播包。

    “扫描者”可发送一个扫描请求(SCAN_REQ PDU)来获取广播的额外信息(SCAN_RSP);“发起者”可发送一个连接请求(CONNECT_REQ PDU)来要求Link Layer(链接层)进入链接状态。

    Link Layer(链接层)需在同一个广播信道上监听来自“扫描者”或“发起者”的请求。

    假设“广播者”收到一个扫描请求包(SCAN_REQ PDU)。该请求包括有它的设备地址,而且该“扫描者”为广播过滤策略所同意,那么“广播者”就会在同一信道上回应一个数据包(SCAN_RSP PDU)。

    当(SCAN_RSP PDU)发送完毕后,或因为广播过滤策略阻止了该请求包,“广播者”就会移到下一个广播信道来发送还有一个广播包(ADV_IND PUD),或关闭广播事件。

    假设“广播者”收到一个连接请求包(CONNECT_REQ PDU), 该请求包括有它的设备地址,而且该“发起者”为广播策略所同意,Link Layer(链接层)就会退出广播状态并转移到连接状态,而且角色转化为“从设备”。假设广播过滤策略阻止了该连接请求包,“广播者”就会移到下一个广播信道来发送还有一个广播包(ADV_IND PUD),或关闭广播事件。

    在一个广播事件中的两个相邻广播包(ADV_IND PDU)的时间间距小于等于10ms。广播状态将在advertising interval内完毕状态的关闭。

    一个没有扫描请求和连接请求的广播事件(使用全部广播信道37、38、39)例如以下图所看到的:

    (示意图)


    一个包括扫描请求的广播事件(使用全部广播信道37、38、39)。扫描请求在广播事件的中间。例如以下图所看到的:

    (示意图)


    一个包括扫描请求的广播事件(使用全部广播信道37、38、39)。扫描请求在广播事件的末尾,例如以下图所看到的:

    (示意图)


    一个包括连接请求的广播事件,例如以下图所看到的:(示意图)


    1.1.2   Connectable Directed Event Type

    可连接的定向广播包为(ADV_DIRECT_IND PDU)。

    该类型同意一个“发起者”以连接请求包来回应(CONNECT_REQ PDU)该广播包,“发起者”发送一个连接请求包要求LinkLayer(链接层)进入连接状态。

    可连接的定向广播包(ADV_DIRECT_IND PDU)同一时候包括“发起者”设备地址和“广播者”设备地址。仅仅有符合该地址的“发起者”才可向“广播者”发起一个连接请求(CONNECT_REQ PDU),也就是说当“发起者”收到该广播包时。它会检測是否和自己的地址一致,假设不一致就丢弃该包不做不论什么回应,假设是自己的地址,它会将它提交到Host层,由Host层来决定是否发起一个连接请求。

    当“广播者”发送一个广播包(ADV_DIRECT_IND PDU)后,它将在同一信道上监听连接请求包(CONNECT_REQPDU)。不论什么扫描包将被忽略,也就是说不接受扫描请求。

    假设“广播者”收到一个包括它设备地址的连接请求包。而且该“发起者”就是广播包的指定目标,那么Link Layer(链接层)将退出广播状态并转移到连接状态,而且角色将由“广播者”转化为“从设备”。否则,“广播者”将切换到下一个广播信道发送下一个广播包,或者关闭这个广播事件。

    在同一个广播信道上的两个相邻广播包的时间间隔小于等于3.75ms,可见该类型的广播速度比可连接非定向广播包(<=30ms)要快非常多。

    当进入广播状态后,Link Layer(链接层)会在1.28s内退出广播状态。

    一个没有连接请求(CONNECT_REQ PDU),含有5个广播包(ADV_DIRECT_IND PDU)的两个广播事件序列图,例如以下所看到的:

    (示意图)


    应用场合:可连接的定向广播类型用于期望高速建立连接的场合(如:重连)。

    1.1.3   Scannable Undirected Event Type

    可扫描非定向广播包(ADV_SCAN_IND PDU),同意一个“扫描者”回应一个扫描请求包(SAN_REQ PDU)来向“广播者”获取附加信息(SCAN_RSP)。

    Link Layer(链接层)将在同一个信道上监控来自扫描者的请求。

    假设“广播者”收到一个包括它的地址的扫描请求包(SCAN_REQ PDU),而且该“扫描者”的地址符合过滤策略(说白了就是该设备合法,不被“广播者”的地址过滤策略过滤),那么“广播者”将在同一广播信道上回应一个数据包(SCAN_RSP PDU)。当SCAN_RSP PDU数据包发送完毕后或SCAN_REQ被过滤策略阻止,那么“广播者”将切换到下一个广播信道发送下一个广播包或关闭该广播事件。

    在一个广播事件中的两个相邻广播包(ADV_IND PDU)的时间间距小于等于10ms,广播状态将在advertising interval内完毕状态的关闭。

    没有扫描请求的包序列示意例如以下:(示意图)


    有扫描请求的包序列示意例如以下,当中一个扫描请求在中间。还有一个扫描请求在末尾:(示意图)


    (示意图)

    1.1.4   Non-connectable Undirected Event Type

    不可连接非定向广播包(ADV_NONCONNN_IND PDU),该广播类型不接受不论什么请求包(包括:扫描请求和连接请求),“扫描者”可接收来自“广播者”的广播包。

    在一个广播事件中的两个相邻广播包(ADV_IND PDU)的时间间距小于等于10ms,广播状态将在advertising interval内完毕状态的关闭。

    广播事件例如以下图所看到的:(示意图)

    1.2    广播相关參数说明

    与广播相关可设置的參数有:

    1)      Advertising_Interval_Min

    2)      Advertising_Interval_Max,

    3)      Advertising_Type,

    4)      Own_Address_Type,

    5)      Direct_Address_Type,

    6)      Direct_Address,

    7)      Advertising_Channel_Map,

    8)   Advertising_Filter_Policy

    9)   AdvertisingData

    10)  ScanReponse Data

    1.2.1   Advertising interval

    首先介绍一下Advertising interval(广播时间间隔):在全部的非定向广播事件中,两个相邻的广播事件的时间间隔(T_advEvent)为:

    T_AdvEvent = advInterval + advDelay

    advInterval必须是0.625ms的整数倍。而且范围在20ms-10.24s之间,对于“可扫描非定向广播”和“不可连接非定向广播”这两种类型。该值应不小于100ms(即至少要160个0.625ms),对于“可连接的非定向广播”该值可设置的范围为20ms-10.24s。

    advDelay是Link Layer(链接层)分配的一个伪随机数。它的范围为0-10ms。

    广播包的时间间隔示意图例如以下:(示意图)

    參数Advertising_Interval_Min和Advertising_Interval_Max就是用于调整advertisinginterval的。它们一般是以0.625ms为单位的,这里设置一个上限值和下限值。目的是希望让控制器依据其工作情况来动态调整合适的广播包发送频率。当然你也能够设置为同一个值。

    Advertising_Interval_Min                                                                                      Size:2 Bytes

    參数描写叙述

    N = 0xXXXX

    非定向广播包的最小广播间隔。

    范围:0x0020-0x4000

    默认值:N = 0x0800(1.28秒)

    Time = N * 0.625ms

    时间范围:20ms-10.24s

    Advertising_Interval_Max                                                                                     Size:2 Bytes

    參数描写叙述

    N = 0xXXXX

    非定向广播包的最大广播间隔。

    范围:0x0020-0x4000

    默认值:N = 0x0800(1.28秒)

    Time = N * 0.625ms

    时间范围:20ms-10.24s

    1.2.2   Advertising_Type

    就是本章介绍的各种广播类型。

    Advertising_Type                                                                                             Size:1 Bytes

    參数描写叙述

    0x00

    Connectable undirected advertising (ADV_IND)(default)

    0x01

    Connectable directed advertising (ADV_DIRECT_IND)

    0x02

    Scannable undirected advertising (ADV_SCAN_IND)

    0x03

    Non connectable undirected advertising (ADV_NONCONN_IND)

    0x04 – 0xFF

    Reserved for future use

    广播类型决定了回应包类型,下表列出各种类型下的扫描请求和连接请求的对比关系:

    广播类型

    广播包(PDU)

    回应包(PDU)

     

     

    扫描请求(SCNA_REQ)

    连接请求(CONNECT_REQ)

    可连接非定向广播

    ADV_IND

    YES

    YES

    可连接定向广播

    ADV_DIRECT_IND

    NO

    YES

    不可连接非定向广播

    ADV_NOCONN_IND

    NO

    NO

    可扫描非定向广播

    ADV_SCAN_IND

    YES

    NO

    1.2.3   Own_Address_Type

    Own_Address_Type                                                                                         Size:1 Bytes

    參数描写叙述

    0x00

    Public Device Address (default)

    0x01

    Random Device Address

    0x02 – 0xFF

    Reserved for future use

    “广播者”自身使用的设备地址类型。

    设备地址类型:

    Public Device Address:公有设备地址是设备所特有的而且是不可改变的,类似网络设备的MAC地址,它的长度为48位。这个地址是从IEEE注冊当局获取的,由2个部分组成:

    Company_id部分:高地址部分由24位组成。

    Company_assigned部分:低地址部分由24位组成。

    LSB                                                                                                                MSB

    Company_assigned (24位)

    Company_id (24位)

    Ramdom Device Address:随机设备地址(私有设备地址)。它也是48位

    LSB                                                                                                                MSB

    hash (24位)

    random (24位)

    1.2.4   Direct_Address_Type,

    定向目标的地址类型,同上。

    1.2.5   Direct_Address,

    定向对象的设备地址(依据类型设置,能够是公有设备地址或私有设备地址)

    1.2.6   Advertising_Channel_Map

    广播信道的选择

    Advertising_Channel_Map                                                                                    Size:1 Bytes

    參数描写叙述

    00000000b

    保留

    xxxxxxx1b

    同意使用37信道

    xxxxxx1xb

    同意使用38信道

    xxxxx1xxb

    同意使用39信道

    00000111b

    Default (同意全部广播信道)

    1.2.7   Advertising_Filter_Policy

    “广播者”过滤策略。对发来请求包设备採用的过滤策略设置:

    Advertising_Filter_Policy                                                                                           Size:1 Bytes

    參数描写叙述

    0x00

    同意不论什么扫描请求。同意不论什么连接请求(default)

    0x01

    仅仅同意来自白名单的扫描请求,同意不论什么连接请求

    0x02

    同意不论什么扫描请求,仅仅同意来自白名单的连接请求

    0x03

    仅仅同意来自白名单的扫描和连接请求

    0x04 – 0xFF

    保留

    1.2.8   Advertising Data

    广播包中携带的广播数据。它的长度最多不超过31个字节(0-31)。数据必须符合以下的格式要求:(能够有多个AD数据段,每一个AD数据段由Length:Data组成,当中Length为1个字节,Data的长度为Lenth,全部一个AD段的长度为Length+1)。

    广播数据能够依据实际须要进行适时改变。(示意图)

    1.2.9   Reponse Data

    扫描请求回应的附加数据,它的长度最多不超过31个字节(0-31),数据包的格式同Advertising Data。

    1.3    广播流程(Undirected Advertising

    1.3.1   无定向广播流程(Undirected Advertising

    一个蓝牙设备进入广播状态,通常流程例如以下:(示意图)

    1.3.2   定向广播

    (示意图)

    1.4    TI CC254X下的实现

    參数设置:

    GAPRole_SetParameter( GAPROLE_SCAN_RSP_DATA,sizeof ( scanRspData ), scanRspData );

    GAPRole_SetParameter( GAPROLE_ADVERT_DATA,sizeof( advertData ), advertData );

    GAPRole_SetParameter(GAPROLE_ADV_EVENT_TYPE, sizeof( uint8 ), &advType );

    GAP_SetParamValue(TGAP_LIM_DISC_ADV_INT_MIN, advInt );

    GAP_SetParamValue(TGAP_LIM_DISC_ADV_INT_MAX, advInt );

    GAP_SetParamValue(TGAP_GEN_DISC_ADV_INT_MIN, advInt );

    GAP_SetParamValue(TGAP_GEN_DISC_ADV_INT_MAX, advInt );

    广播使能(关闭):

    GAPRole_SetParameter(GAPROLE_ADVERT_ENABLED, sizeof( uint8 ), &initial_advertising_enable );


  • 相关阅读:
    关于网购心态
    c++ In STL maps, is it better to use map::insert than []? Stack Overflow
    小工具:sshcopyid_老王的技术手册 ( 我的新博客:http://huoding.com )_百度空间
    djangoqbe
    C++ STL map的使用
    容器find_if函数定义和其第三个参数重载的疑问
    ArchLinux的安装与配置
    使用Grub进行Linux的硬盘安装与修复
    MySQL数据类型简介
    ArchLinux下Alsa的简单配置
  • 原文地址:https://www.cnblogs.com/yangykaifa/p/6855268.html
Copyright © 2020-2023  润新知