博客專欄

EEPW首頁(yè) > 博客 > 低功耗藍(lán)牙BLE之廣播

低功耗藍(lán)牙BLE之廣播

發(fā)布人:電子禪石 時(shí)間:2021-05-27 來源:工程師 發(fā)布文章

廣播



低功耗藍(lán)牙設(shè)備通過廣播信道發(fā)現(xiàn)其他設(shè)備,一個(gè)設(shè)備進(jìn)行廣播,而另一個(gè)設(shè)備進(jìn)行掃描。


廣播相關(guān)的參數(shù)大致有以下幾種:



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  (廣播間隔)



設(shè)備每次廣播時(shí),會(huì)在3個(gè)廣播信道上發(fā)送相同的報(bào)文。這些報(bào)文被稱為一個(gè)廣播事件。除了定向報(bào)文以外,其他廣播事件均可以選擇“20ms ~ 10.28s”不等的間隔。通常,一個(gè)廣播中的設(shè)備會(huì)每一秒廣播一次。兩個(gè)相鄰廣播事件之間的時(shí)間稱為廣播間隔。




但是,設(shè)備周期性的發(fā)送廣播會(huì)有一個(gè)問題:由于設(shè)備間的時(shí)鐘會(huì)不同程度的漂移,兩個(gè)設(shè)備可能在很長(zhǎng)一段時(shí)間同時(shí)廣播而造成干擾。為防止這一情況的發(fā)生,除定向廣播之外的其他廣播類型,發(fā)送時(shí)間均會(huì)被擾動(dòng)。實(shí)現(xiàn)該擾動(dòng)的方式為,在上一次廣播事件后加入“0 ~ 10ms”的隨機(jī)延時(shí)。這意味著,即使兩個(gè)設(shè)備廣播間隔相同,并在相同信道及時(shí)間點(diǎn)上發(fā)送造成了沖突,但它們發(fā)送下一個(gè)廣播事件時(shí)也會(huì)有很大可能不再?zèng)_突。


所以,兩個(gè)相鄰的廣播事件的之間的時(shí)間間隔(T_advEvent)為:




T_AdvEvent = advInterval + advDelay




其中,advInterval 必須是“0.625ms”的整數(shù)倍,范圍是“20ms ~ 10.24s”之間。對(duì)于可掃描非定向廣播和不可連接非定向廣播這兩種廣播類型,該值最好不小于100ms,即(160個(gè)0.625ms)。advDelay是Link Layer(鏈接層)分配的一個(gè)偽隨機(jī)數(shù),它的范圍為“0 ~ 10ms”。


廣播包的截圖如下:





當(dāng)然,實(shí)際設(shè)置過程中沒有廣播間隔參數(shù),而是設(shè)置Advertising_Interval_Min(最小廣播間隔)和Advertising_Interval_Max(最大廣播間隔)這兩個(gè)參數(shù)來調(diào)整廣播間隔,它們都是以“0.625ms”為單位,如果要固定廣播間隔為某一個(gè)值,只需要將這兩個(gè)參數(shù)設(shè)置為同一個(gè)有效數(shù)值即可。






設(shè)置廣播間隔的方法如下:



//普通可發(fā)現(xiàn)模式下修改廣播間隔的方法

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

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

//有限可發(fā)現(xiàn)模式下修改廣播間隔的方法

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

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


下一篇博文會(huì)重點(diǎn)介紹廣播發(fā)現(xiàn)模式的有關(guān)內(nèi)容。






Advertising_Type  (廣播類型)



廣播的類型一般分為四種,分別是:






1.可連接的非定向廣播(Connectable Undirected Event Type)。這是一種用途最廣的廣播類型,包括廣播數(shù)據(jù)和掃描響應(yīng)數(shù)據(jù),它表示當(dāng)前設(shè)備可以接受其他任何設(shè)備的連接請(qǐng)求。




鑒于此種廣播類型用的最多,下面我們來討論一下此類型下廣播事件中廣播包的發(fā)送情況,另外要注意在一個(gè)廣播事件中,前一個(gè)“ADV_IND PDUs”的開始到相鄰的下一個(gè)“ADV_IND PDUs”的開始處的時(shí)間要小于等于 10ms :


第一種情況:僅僅有廣播 PDUs 。截圖顯示如下:






第二種情況:在廣播事件的中間有“SCAN_REQ”和“SCAN_RSP PDUs”。截圖顯示如下:






第三種情況:在廣播事件的結(jié)尾有“SCAN_REQ”和“SCAN_RSP PDUs”。截圖顯示如下:






第四種情況:在廣播事件的中間接收到“CONNECT_REQ PDU”的情況。截圖顯示如下:




此情況下,廣播事件會(huì)關(guān)閉,不會(huì)繼續(xù)在下一個(gè)信道上廣播。




2.可連接的定向廣播(Connectable Directed Event Type)。定向廣播類型是為了盡可能快的建立連接。這種報(bào)文包含兩個(gè)地址:廣播者的地址和發(fā)起者的地址。發(fā)起者收到發(fā)給自己的定向廣播報(bào)文之后,可以立即發(fā)送連接請(qǐng)求作為回應(yīng)。




定向廣播類型有特殊的時(shí)序要求。完整的廣播事件必須每3.75ms重復(fù)一次。這一要求使得掃描設(shè)備只需掃描3.75ms便可以收到定向廣播設(shè)備的消息。




當(dāng)然,如此快的發(fā)送會(huì)讓報(bào)文充斥著廣播信道,進(jìn)而導(dǎo)致該區(qū)域內(nèi)的其他設(shè)備無法進(jìn)行廣播。因此,定向廣播不可以持續(xù)1.28s以上的時(shí)間。如果主機(jī)沒有主動(dòng)要求停止,或者連接沒有建立,控制器都會(huì)自動(dòng)停止廣播。一旦到了1.28s,主機(jī)便只能使用間隔長(zhǎng)得多的可連接非定向廣播讓其他設(shè)備來連接。




當(dāng)使用定向廣播時(shí),設(shè)備不能被主動(dòng)掃描。此外,定向廣播報(bào)文的凈荷中也不能帶有其他附加數(shù)據(jù)。該凈荷只能包含兩個(gè)必須的地址。




3.不可連接的非定向廣播(Non-connectable Undirected Event Type)。僅僅發(fā)送廣播數(shù)據(jù)。




4.可掃描的非定向廣播(Scannable Undirected Event Type)。這種廣播不能用于發(fā)起連接,但允許其他設(shè)備掃描該廣播設(shè)備。這意味著該設(shè)備可以被發(fā)現(xiàn),既可以發(fā)送廣播數(shù)據(jù),也可以響應(yīng)掃描發(fā)送掃描回應(yīng)數(shù)據(jù),但不能建立連接。這是一種適用于廣播數(shù)據(jù)的廣播形式,動(dòng)態(tài)數(shù)據(jù)可以包含于廣播數(shù)據(jù)之中,而靜態(tài)數(shù)據(jù)可以包含于掃描響應(yīng)數(shù)據(jù)之中。




注意:所謂的定向和非定向針對(duì)的是廣播的對(duì)象,如果是針對(duì)特定的對(duì)象進(jìn)行廣播(在廣播包PDU中會(huì)包含目標(biāo)對(duì)象的MAC)就是定向廣播,反之就是非定向??蛇B接和不可連接是指是否接受連接請(qǐng)求,如果是不可連接的廣播類型,它將不回應(yīng)連接請(qǐng)求。可掃描廣播類型是指回應(yīng)掃描請(qǐng)求。




不同的廣播類型對(duì)掃描請(qǐng)求和連接請(qǐng)求的不同結(jié)果如下圖:





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”屬于定向可連接廣播類型的兩種形式。


設(shè)置廣播類型的方法:



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





Own_Address_Type  (自身地址類型)






Public Device Addrss:公有設(shè)備地址是設(shè)備所特有的并且是不可改變的。類似網(wǎng)絡(luò)設(shè)備的MAC地址,它的長(zhǎng)度為48位。由兩部分組成:







Ramdom Device Address:隨機(jī)設(shè)備地址(私有設(shè)備地址),它也是48位。組成如下所示:








Direct_Address_Type  (定向地址類型)



地址類型同Own_Address_Type,具體內(nèi)容如上。








Direct_Address  (定向地址)



定向設(shè)備地址如下所示:








Advertising_Channel_Map  (廣播信道)



廣播信道如下所示:






在一個(gè)廣播事件中,一個(gè)廣播包會(huì)在每個(gè)信道上進(jìn)行傳輸。顯示如下:








Advertising_Filter_Policy  (廣播過濾策略)



廣播過濾策略,對(duì)發(fā)來請(qǐng)求包的設(shè)備采用的過濾策略。如下所示:




 




對(duì)應(yīng)上圖的內(nèi)容解釋如下:


1.接受任何設(shè)備的掃描請(qǐng)求或連接請(qǐng)求。(Value:0x00)


2.僅僅接受白名單中的特定設(shè)備的掃描請(qǐng)求,但是接受任何設(shè)備的連接請(qǐng)求。(Value:0x01)


3.接受任何設(shè)備的掃描請(qǐng)求,但僅僅接受白名單中的特定設(shè)備的連接請(qǐng)求。(Value:0x02)


4.僅僅接受白名單中的特定設(shè)備的掃描請(qǐng)求和連接請(qǐng)求。(Value:0x03)


5.保留





Advertising And ScanReponse Data  (廣播和掃描回應(yīng)數(shù)據(jù))



廣播數(shù)據(jù)和掃描回應(yīng)數(shù)據(jù),它們的長(zhǎng)度都不能超過31個(gè)字節(jié)(0 ~ 31),數(shù)據(jù)的格式必須滿足下圖的要求,可以包含多個(gè)AD數(shù)據(jù)段,但是每個(gè)AD數(shù)據(jù)段必須由“Length:Data”組成,其中Length占用1個(gè)octet,Data部分占用Length個(gè)字節(jié),所以一個(gè)AD段的長(zhǎng)度為:Length+1。格式圖如下所示:






設(shè)置廣播數(shù)據(jù)和掃描回應(yīng)數(shù)據(jù)的方法如下:


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



廣播使能----關(guān)閉的方法:


uint8 adv_enable = FALSE;

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




附加知識(shí)點(diǎn):Octet



在傳統(tǒng)的二進(jìn)制概念中,1 byte(字節(jié))= 8 bit(位)。大多數(shù)因特網(wǎng)標(biāo)準(zhǔn)使用八位組(octet)這個(gè)術(shù)語(yǔ)而不是使用字節(jié)來表示8位的量。該術(shù)語(yǔ)起源于“TCP/IP”發(fā)展的時(shí)期,當(dāng)時(shí)許多早期的工作是在諸如“DEC-10”這樣的系統(tǒng)上進(jìn)行的,然而這些系統(tǒng)的結(jié)構(gòu)采用的字節(jié)(byte)長(zhǎng)度不是8位(bit),因此出現(xiàn)了octet的單位,即準(zhǔn)確定義了




1 octet = 8 bit




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


*博客內(nèi)容為網(wǎng)友個(gè)人發(fā)布,僅代表博主個(gè)人觀點(diǎn),如有侵權(quán)請(qǐng)聯(lián)系工作人員刪除。



關(guān)鍵詞: ble

相關(guān)推薦

技術(shù)專區(qū)

關(guān)閉