第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 );