藍芽低功耗BLE廣播

2021-09-05 12:40:22 字數 4560 閱讀 1402

廣播

低功耗藍芽裝置通過廣播通道發現其他裝置,乙個裝置進行廣播,而另乙個裝置進行掃瞄。

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 + a***elay

其中,advinterval 必須是「0.625ms」的整數倍,範圍是「20ms ~ 10.24s」之間。對於可掃瞄非定向廣播和不可連線非定向廣播這兩種廣播型別,該值最好不小於100ms,即(160個0.625ms)。a***elay是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」的情況。截圖顯示如下:

此情況下,廣播事件會關閉,不會繼續在下乙個通道上廣播。

定向廣播型別有特殊的時序要求。完整的廣播事件必須每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

* @ 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  (自身位址型別)

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

低功耗藍芽開發(BLE)

藍芽 藍芽是乙個標準的無線通訊協議,他是通過無線電介質傳輸資料的 無線電 是指在自由空間 包括空氣和真空 傳播的電磁波 電磁波 是由同向且相互垂直的電場與磁場在空間中衍生發射的 粒子波,根據頻率的由低到高依次可分為 無線電波,微波,紅外線,可見光,紫外線,x射線,y射線 電磁波傳遞資訊 首先把傳輸的...

低功耗藍芽BLE之連線建立

應付比廣播更為複雜的資料傳輸,或者要在裝置之間實現可靠的資料交付,這些都要依賴於連線。連線使用資料通道在兩個裝置之間可靠地傳送資訊。它採取了自適應跳頻增強魯棒性,同時使用了非常低的占空比,盡可能地降低功率消耗。裝置建立連線的過程如下圖所示。簡言之,裝置首先廣播可連線廣播事件,其他裝置收到之後即可發起...

BLE 低功耗藍芽 中ATT協議簡介

ble屬性協議,它是處於l2cap協議層與gatt之間的一層屬性操作協議。att協議在ble協議框架 ble協議資料交換框架 對於gatt本身,可以簡單的理解為一種根據一定格式規範組織的資料表,例如 我們可以看到他主要由3部分組成 handle attribute type attribute va...