藍牙低功耗BLE廣播

廣播

低功耗藍牙設備通過廣播信道發現其他設備,一個設備進行廣播,而另一個設備進行掃描。

廣播相關的參數大致有以下幾種:


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


--------------------- 
作者:楓之星雨 
來源:CSDN 
原文:https://blog.csdn.net/zzfenglin/article/details/51165543 
版權聲明:本文爲博主原創文章,轉載請附上博文鏈接!

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章