低功耗藍牙BLE之廣播
廣播
低功耗藍牙設備通過(guò)廣播信道發(fā)現其他設備,一個(gè)設備進(jìn)行廣播,而另一個(gè)設備進(jìn)行掃描。
廣播相關(guān)的參數大致有以下幾種:
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í),會(huì )在3個(gè)廣播信道上發(fā)送相同的報文。這些報文被稱(chēng)為一個(gè)廣播事件。除了定向報文以外,其他廣播事件均可以選擇“20ms ~ 10.28s”不等的間隔。通常,一個(gè)廣播中的設備會(huì )每一秒廣播一次。兩個(gè)相鄰廣播事件之間的時(shí)間稱(chēng)為廣播間隔。
但是,設備周期性的發(fā)送廣播會(huì )有一個(gè)問(wèn)題:由于設備間的時(shí)鐘會(huì )不同程度的漂移,兩個(gè)設備可能在很長(cháng)一段時(shí)間同時(shí)廣播而造成干擾。為防止這一情況的發(fā)生,除定向廣播之外的其他廣播類(lèi)型,發(fā)送時(shí)間均會(huì )被擾動(dòng)。實(shí)現該擾動(dòng)的方式為,在上一次廣播事件后加入“0 ~ 10ms”的隨機延時(shí)。這意味著(zhù),即使兩個(gè)設備廣播間隔相同,并在相同信道及時(shí)間點(diǎn)上發(fā)送造成了沖突,但它們發(fā)送下一個(gè)廣播事件時(shí)也會(huì )有很大可能不再沖突。
所以,兩個(gè)相鄰的廣播事件的之間的時(shí)間間隔(T_advEvent)為:
T_AdvEvent = advInterval + advDelay
其中,advInterval 必須是“0.625ms”的整數倍,范圍是“20ms ~ 10.24s”之間。對于可掃描非定向廣播和不可連接非定向廣播這兩種廣播類(lèi)型,該值最好不小于100ms,即(160個(gè)0.625ms)。advDelay是Link Layer(鏈接層)分配的一個(gè)偽隨機數,它的范圍為“0 ~ 10ms”。
廣播包的截圖如下:
當然,實(shí)際設置過(guò)程中沒(méi)有廣播間隔參數,而是設置Advertising_Interval_Min(最小廣播間隔)和Advertising_Interval_Max(最大廣播間隔)這兩個(gè)參數來(lái)調整廣播間隔,它們都是以“0.625ms”為單位,如果要固定廣播間隔為某一個(gè)值,只需要將這兩個(gè)參數設置為同一個(gè)有效數值即可。
設置廣播間隔的方法如下:
//普通可發(fā)現模式下修改廣播間隔的方法
GAP_SetParamValue(TGAP_GEN_DISC_ADV_INT_MIN, advInt );//單位是0.625ms
GAP_SetParamValue(TGAP_GEN_DISC_ADV_INT_MAX, advInt );//單位是0.625ms
//有限可發(fā)現模式下修改廣播間隔的方法
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ā)現模式的有關(guān)內容。
Advertising_Type (廣播類(lèi)型)
廣播的類(lèi)型一般分為四種,分別是:
1.可連接的非定向廣播(Connectable Undirected Event Type)。這是一種用途最廣的廣播類(lèi)型,包括廣播數據和掃描響應數據,它表示當前設備可以接受其他任何設備的連接請求。
鑒于此種廣播類(lèi)型用的最多,下面我們來(lái)討論一下此類(lèi)型下廣播事件中廣播包的發(fā)送情況,另外要注意在一個(gè)廣播事件中,前一個(gè)“ADV_IND PDUs”的開(kāi)始到相鄰的下一個(gè)“ADV_IND PDUs”的開(kāi)始處的時(shí)間要小于等于 10ms :
第一種情況:僅僅有廣播 PDUs 。截圖顯示如下:
第二種情況:在廣播事件的中間有“SCAN_REQ”和“SCAN_RSP PDUs”。截圖顯示如下:
第三種情況:在廣播事件的結尾有“SCAN_REQ”和“SCAN_RSP PDUs”。截圖顯示如下:
第四種情況:在廣播事件的中間接收到“CONNECT_REQ PDU”的情況。截圖顯示如下:
此情況下,廣播事件會(huì )關(guān)閉,不會(huì )繼續在下一個(gè)信道上廣播。
2.可連接的定向廣播(Connectable Directed Event Type)。定向廣播類(lèi)型是為了盡可能快的建立連接。這種報文包含兩個(gè)地址:廣播者的地址和發(fā)起者的地址。發(fā)起者收到發(fā)給自己的定向廣播報文之后,可以立即發(fā)送連接請求作為回應。
定向廣播類(lèi)型有特殊的時(shí)序要求。完整的廣播事件必須每3.75ms重復一次。這一要求使得掃描設備只需掃描3.75ms便可以收到定向廣播設備的消息。
當然,如此快的發(fā)送會(huì )讓報文充斥著(zhù)廣播信道,進(jìn)而導致該區域內的其他設備無(wú)法進(jìn)行廣播。因此,定向廣播不可以持續1.28s以上的時(shí)間。如果主機沒(méi)有主動(dòng)要求停止,或者連接沒(méi)有建立,控制器都會(huì )自動(dòng)停止廣播。一旦到了1.28s,主機便只能使用間隔長(cháng)得多的可連接非定向廣播讓其他設備來(lái)連接。
當使用定向廣播時(shí),設備不能被主動(dòng)掃描。此外,定向廣播報文的凈荷中也不能帶有其他附加數據。該凈荷只能包含兩個(gè)必須的地址。
3.不可連接的非定向廣播(Non-connectable Undirected Event Type)。僅僅發(fā)送廣播數據。
4.可掃描的非定向廣播(Scannable Undirected Event Type)。這種廣播不能用于發(fā)起連接,但允許其他設備掃描該廣播設備。這意味著(zhù)該設備可以被發(fā)現,既可以發(fā)送廣播數據,也可以響應掃描發(fā)送掃描回應數據,但不能建立連接。這是一種適用于廣播數據的廣播形式,動(dòng)態(tài)數據可以包含于廣播數據之中,而靜態(tài)數據可以包含于掃描響應數據之中。
注意:所謂的定向和非定向針對的是廣播的對象,如果是針對特定的對象進(jìn)行廣播(在廣播包PDU中會(huì )包含目標對象的MAC)就是定向廣播,反之就是非定向??蛇B接和不可連接是指是否接受連接請求,如果是不可連接的廣播類(lèi)型,它將不回應連接請求??蓲呙鑿V播類(lèi)型是指回應掃描請求。
不同的廣播類(lèi)型對掃描請求和連接請求的不同結果如下圖:
TI的CC2540和CC2541中廣播類(lèi)型的具體定義在“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”屬于定向可連接廣播類(lèi)型的兩種形式。
設置廣播類(lèi)型的方法:
GAPRole_SetParameter(GAPROLE_ADV_EVENT_TYPE, sizeof( uint8 ), &advType );
Own_Address_Type (自身地址類(lèi)型)
Public Device Addrss:公有設備地址是設備所特有的并且是不可改變的。類(lèi)似網(wǎng)絡(luò )設備的MAC地址,它的長(cháng)度為48位。由兩部分組成:
Ramdom Device Address:隨機設備地址(私有設備地址),它也是48位。組成如下所示:
Direct_Address_Type (定向地址類(lèi)型)
地址類(lèi)型同Own_Address_Type,具體內容如上。
Direct_Address (定向地址)
定向設備地址如下所示:
Advertising_Channel_Map (廣播信道)
廣播信道如下所示:
在一個(gè)廣播事件中,一個(gè)廣播包會(huì )在每個(gè)信道上進(jìn)行傳輸。顯示如下:
Advertising_Filter_Policy (廣播過(guò)濾策略)
廣播過(guò)濾策略,對發(fā)來(lái)請求包的設備采用的過(guò)濾策略。如下所示:
對應上圖的內容解釋如下:
1.接受任何設備的掃描請求或連接請求。(Value:0x00)
2.僅僅接受白名單中的特定設備的掃描請求,但是接受任何設備的連接請求。(Value:0x01)
3.接受任何設備的掃描請求,但僅僅接受白名單中的特定設備的連接請求。(Value:0x02)
4.僅僅接受白名單中的特定設備的掃描請求和連接請求。(Value:0x03)
5.保留
Advertising And ScanReponse Data (廣播和掃描回應數據)
廣播數據和掃描回應數據,它們的長(cháng)度都不能超過(guò)31個(gè)字節(0 ~ 31),數據的格式必須滿(mǎn)足下圖的要求,可以包含多個(gè)AD數據段,但是每個(gè)AD數據段必須由“Length:Data”組成,其中Length占用1個(gè)octet,Data部分占用Length個(gè)字節,所以一個(gè)AD段的長(cháng)度為:Length+1。格式圖如下所示:
設置廣播數據和掃描回應數據的方法如下:
GAPRole_SetParameter( GAPROLE_ADVERT_DATA,sizeof( advertData ), advertData );
GAPRole_SetParameter( GAPROLE_SCAN_RSP_DATA,sizeof ( scanRspData ), scanRspData );
廣播使能----打開(kāi)的方法:
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 );
附加知識點(diǎn):Octet
在傳統的二進(jìn)制概念中,1 byte(字節)= 8 bit(位)。大多數因特網(wǎng)標準使用八位組(octet)這個(gè)術(shù)語(yǔ)而不是使用字節來(lái)表示8位的量。該術(shù)語(yǔ)起源于“TCP/IP”發(fā)展的時(shí)期,當時(shí)許多早期的工作是在諸如“DEC-10”這樣的系統上進(jìn)行的,然而這些系統的結構采用的字節(byte)長(cháng)度不是8位(bit),因此出現了octet的單位,即準確定義了
1 octet = 8 bit
原文鏈接:https://blog.csdn.net/zzfenglin/article/details/51165543
*博客內容為網(wǎng)友個(gè)人發(fā)布,僅代表博主個(gè)人觀(guān)點(diǎn),如有侵權請聯(lián)系工作人員刪除。