首页 > 代码库 > 蓝牙4.0技术分析1-广播者角色
蓝牙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 );