新闻  |   论坛  |   博客  |   在线研讨会
低功耗蓝牙BLE之广播
电子禅石 | 2021-05-27 11:15:42    阅读:9306   发布文章

广播



低功耗蓝牙设备通过广播信道发现其他设备,一个设备进行广播,而另一个设备进行扫描。


广播相关的参数大致有以下几种:



1.Advertising interval


2.Advertising_Type


3.Own_Address_Type


4.Direct_Address_Type


5.Direct_Address


6.Advertising_Channel_Map


7.Advertising_Filter_Policy


8.Advertising Data


9.ScanReponse Data







Advertising interval  (广播间隔)



设备每次广播时,会在3个广播信道上发送相同的报文。这些报文被称为一个广播事件。除了定向报文以外,其他广播事件均可以选择“20ms ~ 10.28s”不等的间隔。通常,一个广播中的设备会每一秒广播一次。两个相邻广播事件之间的时间称为广播间隔。




但是,设备周期性的发送广播会有一个问题:由于设备间的时钟会不同程度的漂移,两个设备可能在很长一段时间同时广播而造成干扰。为防止这一情况的发生,除定向广播之外的其他广播类型,发送时间均会被扰动。实现该扰动的方式为,在上一次广播事件后加入“0 ~ 10ms”的随机延时。这意味着,即使两个设备广播间隔相同,并在相同信道及时间点上发送造成了冲突,但它们发送下一个广播事件时也会有很大可能不再冲突。


所以,两个相邻的广播事件的之间的时间间隔(T_advEvent)为:




T_AdvEvent = advInterval + advDelay




其中,advInterval 必须是“0.625ms”的整数倍,范围是“20ms ~ 10.24s”之间。对于可扫描非定向广播和不可连接非定向广播这两种广播类型,该值最好不小于100ms,即(160个0.625ms)。advDelay是Link Layer(链接层)分配的一个伪随机数,它的范围为“0 ~ 10ms”。


广播包的截图如下:





当然,实际设置过程中没有广播间隔参数,而是设置Advertising_Interval_Min(最小广播间隔)和Advertising_Interval_Max(最大广播间隔)这两个参数来调整广播间隔,它们都是以“0.625ms”为单位,如果要固定广播间隔为某一个值,只需要将这两个参数设置为同一个有效数值即可。






设置广播间隔的方法如下:



//普通可发现模式下修改广播间隔的方法

GAP_SetParamValue(TGAP_GEN_DISC_ADV_INT_MIN, advInt );//单位是0.625ms

GAP_SetParamValue(TGAP_GEN_DISC_ADV_INT_MAX, advInt );//单位是0.625ms

//有限可发现模式下修改广播间隔的方法

GAP_SetParamValue( TGAP_LIM_DISC_ADV_INT_MIN, advInt );//单位是0.625ms

GAP_SetParamValue( TGAP_LIM_DISC_ADV_INT_MAX, advInt );//单位是0.625ms


下一篇博文会重点介绍广播发现模式的有关内容。






Advertising_Type  (广播类型)



广播的类型一般分为四种,分别是:






1.可连接的非定向广播(Connectable Undirected Event Type)。这是一种用途最广的广播类型,包括广播数据和扫描响应数据,它表示当前设备可以接受其他任何设备的连接请求。




鉴于此种广播类型用的最多,下面我们来讨论一下此类型下广播事件中广播包的发送情况,另外要注意在一个广播事件中,前一个“ADV_IND PDUs”的开始到相邻的下一个“ADV_IND PDUs”的开始处的时间要小于等于 10ms :


第一种情况:仅仅有广播 PDUs 。截图显示如下:






第二种情况:在广播事件的中间有“SCAN_REQ”和“SCAN_RSP PDUs”。截图显示如下:






第三种情况:在广播事件的结尾有“SCAN_REQ”和“SCAN_RSP PDUs”。截图显示如下:






第四种情况:在广播事件的中间接收到“CONNECT_REQ PDU”的情况。截图显示如下:




此情况下,广播事件会关闭,不会继续在下一个信道上广播。




2.可连接的定向广播(Connectable Directed Event Type)。定向广播类型是为了尽可能快的建立连接。这种报文包含两个地址:广播者的地址和发起者的地址。发起者收到发给自己的定向广播报文之后,可以立即发送连接请求作为回应。




定向广播类型有特殊的时序要求。完整的广播事件必须每3.75ms重复一次。这一要求使得扫描设备只需扫描3.75ms便可以收到定向广播设备的消息。




当然,如此快的发送会让报文充斥着广播信道,进而导致该区域内的其他设备无法进行广播。因此,定向广播不可以持续1.28s以上的时间。如果主机没有主动要求停止,或者连接没有建立,控制器都会自动停止广播。一旦到了1.28s,主机便只能使用间隔长得多的可连接非定向广播让其他设备来连接。




当使用定向广播时,设备不能被主动扫描。此外,定向广播报文的净荷中也不能带有其他附加数据。该净荷只能包含两个必须的地址。




3.不可连接的非定向广播(Non-connectable Undirected Event Type)。仅仅发送广播数据。




4.可扫描的非定向广播(Scannable Undirected Event Type)。这种广播不能用于发起连接,但允许其他设备扫描该广播设备。这意味着该设备可以被发现,既可以发送广播数据,也可以响应扫描发送扫描回应数据,但不能建立连接。这是一种适用于广播数据的广播形式,动态数据可以包含于广播数据之中,而静态数据可以包含于扫描响应数据之中。




注意:所谓的定向和非定向针对的是广播的对象,如果是针对特定的对象进行广播(在广播包PDU中会包含目标对象的MAC)就是定向广播,反之就是非定向。可连接和不可连接是指是否接受连接请求,如果是不可连接的广播类型,它将不回应连接请求。可扫描广播类型是指回应扫描请求。




不同的广播类型对扫描请求和连接请求的不同结果如下图:





TI的CC2540和CC2541中广播类型的具体定义在“components/ble/include”目录下的“Gap.h”文件中,如下:


/** @defgroup GAP_ADVERTISEMENT_TYPE_DEFINES GAP Advertising Event Types

 * for eventType field in gapAdvertisingParams_t

 * @{

 */

#define GAP_ADTYPE_ADV_IND                0x00  //!< Connectable undirected advertisement

#define GAP_ADTYPE_ADV_HDC_DIRECT_IND     0x01  //!< Connectable high duty cycle directed advertisement

#define GAP_ADTYPE_ADV_SCAN_IND           0x02  //!< Scannable undirected advertisement

#define GAP_ADTYPE_ADV_NONCONN_IND        0x03  //!< Non-Connectable undirected advertisement

#define GAP_ADTYPE_ADV_LDC_DIRECT_IND     0x04  //!< Connectable low duty cycle directed advertisement

/** @} End GAP_ADVERTISEMENT_TYPE_DEFINES */



其中“GAP_ADTYPE_ADV_HDC_DIRECT_IND”和“GAP_ADTYPE_ADV_LDC_DIRECT_IND”属于定向可连接广播类型的两种形式。


设置广播类型的方法:



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





Own_Address_Type  (自身地址类型)






Public Device Addrss:公有设备地址是设备所特有的并且是不可改变的。类似网络设备的MAC地址,它的长度为48位。由两部分组成:







Ramdom Device Address:随机设备地址(私有设备地址),它也是48位。组成如下所示:








Direct_Address_Type  (定向地址类型)



地址类型同Own_Address_Type,具体内容如上。








Direct_Address  (定向地址)



定向设备地址如下所示:








Advertising_Channel_Map  (广播信道)



广播信道如下所示:






在一个广播事件中,一个广播包会在每个信道上进行传输。显示如下:








Advertising_Filter_Policy  (广播过滤策略)



广播过滤策略,对发来请求包的设备采用的过滤策略。如下所示:




 




对应上图的内容解释如下:


1.接受任何设备的扫描请求或连接请求。(Value:0x00)


2.仅仅接受白名单中的特定设备的扫描请求,但是接受任何设备的连接请求。(Value:0x01)


3.接受任何设备的扫描请求,但仅仅接受白名单中的特定设备的连接请求。(Value:0x02)


4.仅仅接受白名单中的特定设备的扫描请求和连接请求。(Value:0x03)


5.保留





Advertising And ScanReponse Data  (广播和扫描回应数据)



广播数据和扫描回应数据,它们的长度都不能超过31个字节(0 ~ 31),数据的格式必须满足下图的要求,可以包含多个AD数据段,但是每个AD数据段必须由“Length:Data”组成,其中Length占用1个octet,Data部分占用Length个字节,所以一个AD段的长度为:Length+1。格式图如下所示:






设置广播数据和扫描回应数据的方法如下:


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

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



广播使能----打开的方法:


uint8 adv_enable = TRUE;

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



广播使能----关闭的方法:


uint8 adv_enable = FALSE;

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




附加知识点:Octet



在传统的二进制概念中,1 byte(字节)= 8 bit(位)。大多数因特网标准使用八位组(octet)这个术语而不是使用字节来表示8位的量。该术语起源于“TCP/IP”发展的时期,当时许多早期的工作是在诸如“DEC-10”这样的系统上进行的,然而这些系统的结构采用的字节(byte)长度不是8位(bit),因此出现了octet的单位,即准确定义了




1 octet = 8 bit




原文链接:https://blog.csdn.net/zzfenglin/article/details/51165543


*博客内容为网友个人发布,仅代表博主个人观点,如有侵权请联系工作人员删除。

参与讨论
登录后参与讨论
属于自己的技术积累分享,成为嵌入式系统研发高手。
推荐文章
最近访客