蓝牙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中實現(xiàn):
廣播類型定位在(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)
參數(shù)設置的API為:
??? GAPRole_SetParameter(GAPROLE_ADV_EVENT_TYPE, sizeof( uint8 ), &advType );
1.1.1?? Connectable Undirected Event Type
可連接非定向廣播包為(ADV_IND PDU)。在可連接的無定向廣播類型下,一個“掃描者”或“發(fā)起者”可以用掃描請求或連接請求來回應這個廣播包。“掃描者”可發(fā)送一個掃描請求(SCAN_REQ PDU)來獲取廣播的額外信息(SCAN_RSP);“發(fā)起者”可發(fā)送一個連接請求(CONNECT_REQ PDU)來要求Link Layer(鏈接層)進入鏈接狀態(tài)。
Link Layer(鏈接層)需在同一個廣播信道上監(jiān)聽來自“掃描者”或“發(fā)起者”的請求。
如果“廣播者”收到一個掃描請求包(SCAN_REQ PDU),該請求包含有它的設備地址,并且該“掃描者”為廣播過濾策略所允許,那么“廣播者”就會在同一信道上回應一個數(shù)據(jù)包(SCAN_RSP PDU)。當(SCAN_RSP PDU)發(fā)送完成后,或由于廣播過濾策略阻止了該請求包,“廣播者”就會移到下一個廣播信道來發(fā)送另一個廣播包(ADV_IND PUD),或關閉廣播事件。
如果“廣播者”收到一個連接請求包(CONNECT_REQ PDU), 該請求包含有它的設備地址,并且該“發(fā)起者”為廣播策略所允許,Link Layer(鏈接層)就會退出廣播狀態(tài)并轉移到連接狀態(tài),并且角色轉化為“從設備”。如果廣播過濾策略阻止了該連接請求包,“廣播者”就會移到下一個廣播信道來發(fā)送另一個廣播包(ADV_IND PUD),或關閉廣播事件。
在一個廣播事件中的兩個相鄰廣播包(ADV_IND PDU)的時間間距小于等于10ms,廣播狀態(tài)將在advertising interval內(nèi)完成狀態(tài)的關閉。
一個沒有掃描請求和連接請求的廣播事件(使用所有廣播信道37、38、39)如下圖所示:
(示意圖)
注意:廣播的間隔時間一般不會是嚴格的10ms,系統(tǒng)會產(chǎn)生一個隨機的時間值,加上10ms,防止沖突。
一個包含掃描請求的廣播事件(使用所有廣播信道37、38、39),掃描請求在廣播事件的中間,如下圖所示:
(示意圖)
一個包含掃描請求的廣播事件(使用所有廣播信道37、38、39),掃描請求在廣播事件的末尾,如下圖所示:
(示意圖)
一個包含連接請求的廣播事件,如下圖所示:(示意圖)
1.1.2?? Connectable Directed Event Type
可連接的定向廣播包為(ADV_DIRECT_IND PDU)。該類型允許一個“發(fā)起者”以連接請求包來回應(CONNECT_REQ PDU)該廣播包,“發(fā)起者”發(fā)送一個連接請求包要求LinkLayer(鏈接層)進入連接狀態(tài)。
可連接的定向廣播包(ADV_DIRECT_IND PDU)同時包含“發(fā)起者”設備地址和“廣播者”設備地址。只有符合該地址的“發(fā)起者”才可向“廣播者”發(fā)起一個連接請求(CONNECT_REQ PDU),也就是說當“發(fā)起者”收到該廣播包時,它會檢測是否和自己的地址一致,如果不一致就丟棄該包不做任何回應,如果是自己的地址,它會將它提交到Host層,由Host層來決定是否發(fā)起一個連接請求。
當“廣播者”發(fā)送一個廣播包(ADV_DIRECT_IND PDU)后,它將在同一信道上監(jiān)聽連接請求包(CONNECT_REQPDU)。任何掃描包將被忽略,也就是說不接受掃描請求。
如果“廣播者”收到一個包含它設備地址的連接請求包,并且該“發(fā)起者”就是廣播包的指定目標,那么Link Layer(鏈接層)將退出廣播狀態(tài)并轉移到連接狀態(tài),并且角色將由“廣播者”轉化為“從設備”。否則,“廣播者”將切換到下一個廣播信道發(fā)送下一個廣播包,或者關閉這個廣播事件。
在同一個廣播信道上的兩個相鄰廣播包的時間間隔小于等于3.75ms,可見該類型的廣播速度比可連接非定向廣播包(<=30ms)要快很多。
當進入廣播狀態(tài)后,Link Layer(鏈接層)會在1.28s內(nèi)退出廣播狀態(tài)。
一個沒有連接請求(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(鏈接層)將在同一個信道上監(jiān)控來自掃描者的請求。
如果“廣播者”收到一個包含它的地址的掃描請求包(SCAN_REQ PDU),并且該“掃描者”的地址符合過濾策略(說白了就是該設備合法,不被“廣播者”的地址過濾策略過濾),那么“廣播者”將在同一廣播信道上回應一個數(shù)據(jù)包(SCAN_RSP PDU)。當SCAN_RSP PDU數(shù)據(jù)包發(fā)送完成后或SCAN_REQ被過濾策略阻止,那么“廣播者”將切換到下一個廣播信道發(fā)送下一個廣播包或關閉該廣播事件。
在一個廣播事件中的兩個相鄰廣播包(ADV_IND PDU)的時間間距小于等于10ms,廣播狀態(tài)將在advertising interval內(nèi)完成狀態(tài)的關閉。
沒有掃描請求的包序列示意如下:(示意圖)
有掃描請求的包序列示意如下,其中一個掃描請求在中間,另一個掃描請求在末尾:(示意圖)
(示意圖)
1.1.4?? Non-connectable Undirected Event Type
不可連接非定向廣播包(ADV_NONCONNN_IND PDU),該廣播類型不接受任何請求包(包含:掃描請求和連接請求),“掃描者”可接收來自“廣播者”的廣播包。
在一個廣播事件中的兩個相鄰廣播包(ADV_IND PDU)的時間間距小于等于10ms,廣播狀態(tài)將在advertising interval內(nèi)完成狀態(tài)的關閉。
廣播事件如下圖所示:(示意圖)
1.2??? 廣播相關參數(shù)說明
與廣播相關可設置的參數(shù)有:
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的整數(shù)倍,并且范圍在20ms-10.24s之間,對于“可掃描非定向廣播”和“不可連接非定向廣播”這兩種類型,該值應不小于100ms(即至少要160個0.625ms),對于“可連接的非定向廣播”該值可設置的范圍為20ms-10.24s。
advDelay是Link Layer(鏈接層)分配的一個偽隨機數(shù),它的范圍為0-10ms。
廣播包的時間間隔示意圖如下:(示意圖)
參數(shù)Advertising_Interval_Min和Advertising_Interval_Max就是用于調整advertisinginterval的,它們通常是以0.625ms為單位的,這里設置一個上限值和下限值,目的是希望讓控制器根據(jù)其工作情況來動態(tài)調整合適的廣播包發(fā)送頻率,當然你也可以設置為同一個值。
Advertising_Interval_Min???? ???? ??????????????????????????????????????????????????????????????????????????? Size:2 Bytes
| 值 | 參數(shù)描述 |
| N = 0xXXXX | 非定向廣播包的最小廣播間隔。 范圍:0x0020-0x4000 默認值:N = 0x0800(1.28秒) Time = N * 0.625ms 時間范圍:20ms-10.24s |
?
Advertising_Interval_Max??? ???? ??????????????????????????????????????????????????????????????????????????? Size:2 Bytes
| 值 | 參數(shù)描述 |
| 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
| 值 | 參數(shù)描述 |
| 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
| 值 | 參數(shù)描述 |
| 0x00 | Public Device Address (default) |
| 0x01 | Random Device Address |
| 0x02 – 0xFF | Reserved for future use |
“廣播者”自身使用的設備地址類型。
設備地址類型:
Public Device Address:公有設備地址是設備所特有的并且是不可改變的,類似網(wǎng)絡設備的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,
定向對象的設備地址(根據(jù)類型設置,可以是公有設備地址或私有設備地址)
1.2.6?? Advertising_Channel_Map
廣播信道的選擇
Advertising_Channel_Map?? ???? ??????????????????????????????????????????????????????????????????????????? Size:1 Bytes
| 值 | 參數(shù)描述 |
| 00000000b | 保留 |
| xxxxxxx1b | 允許使用37信道 |
| xxxxxx1xb | 允許使用38信道 |
| xxxxx1xxb | 允許使用39信道 |
| 00000111b | Default (允許所有廣播信道) |
1.2.7?? Advertising_Filter_Policy
“廣播者”過濾策略,對發(fā)來請求包設備采用的過濾策略設置:
Advertising_Filter_Policy?? ?????? ???????????????????????????????????????????????????????????????????????????????? Size:1 Bytes
| 值 | 參數(shù)描述 |
| 0x00 | 允許任何掃描請求,允許任何連接請求(default) |
| 0x01 | 只允許來自白名單的掃描請求,允許任何連接請求 |
| 0x02 | 允許任何掃描請求,只允許來自白名單的連接請求 |
| 0x03 | 只允許來自白名單的掃描和連接請求 |
| 0x04 – 0xFF | 保留 |
1.2.8?? Advertising Data
廣播包中攜帶的廣播數(shù)據(jù),它的長度最多不超過31個字節(jié)(0-31),數(shù)據(jù)必須符合下面的格式要求:(可以有多個AD數(shù)據(jù)段,每個AD數(shù)據(jù)段由Length:Data組成,其中Length為1個字節(jié),Data的長度為Lenth,所有一個AD段的長度為Length+1)。廣播數(shù)據(jù)可以根據(jù)實際需要進行適時改變。(示意圖)
1.2.9?? Reponse Data
掃描請求回應的附加數(shù)據(jù),它的長度最多不超過31個字節(jié)(0-31),數(shù)據(jù)包的格式同Advertising Data。
1.3??? 廣播流程(Undirected Advertising)
1.3.1?? 無定向廣播流程(Undirected Advertising)
一個藍牙設備進入廣播狀態(tài),通常流程如下:(示意圖)
1.3.2?? 定向廣播
(示意圖)
1.4??? TI CC254X下的實現(xiàn)
參數(shù)設置:
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 );
總結
以上是生活随笔為你收集整理的蓝牙4.0技术分析1-广播者角色的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 蓝牙BLE LINK LAYER剖析(二
- 下一篇: AB1601 PWM模块