轉載自:http://blog.51cto.com/6902621/1969746
藍牙4.0:
包含經典藍牙和ble
ble單模:
ble
ble雙模:
經典藍牙和ble
ble協定棧:
控制器層,host層,app
控制器
HCI
HCI層為接口層,向上為主機提供軟體應用程式接口(API),對外為外部硬體控制接口,可以通過序列槽、SPI、USB來實作裝置控制
Link Layer
L層為RF控制器,控制裝置處于準備(standby)、廣播、監聽/掃描(scan)、初始化、連接配接,這五種狀态中一種。五種狀态切換描述為:未連接配接時,裝置廣播資訊,另外一個裝置一直監聽或按需掃描,兩個裝置連接配接初始化,裝置連接配接上了。發起聊天的裝置為主裝置,接受聊天的裝置為從裝置,同一次聊天隻能有一個意見領袖,即主裝置和從裝置不能切換。
PHY
實體層: RF規格
2.4G ISM band
GFSK調制
40個頻道,2M頻間隔
3個廣播(37,38,39),37資料通道
由于BLE屬于無線通信,則其通信媒體是一定頻率範圍下的頻帶資源(Frequency Band);BLE的市場定位是個體和民用,是以使用免費的ISM頻段(頻率範圍是2.400-2.4835 GHz);為了同時支援多個裝置,将整個頻帶分為40份,每份的帶寬為2MHz,稱作RF Channel 。
主裝置管理多個連接配接從裝置,從裝置隻能連接配接一個主裝置
做為一個BLE裝置,有六種可能的狀态:
– 待機狀态(Standby):裝置沒有傳輸和發送資料,并
且沒有連接配接到任何裝置
– 廣播狀态(Advertiser):周期性廣播狀态
– 掃描狀态(Scanner):主動地尋找正在廣播的裝置
– 發起連接配接狀态(Initiator):主動向某個裝置發起連接配接
– 主裝置(Master):作為主裝置連接配接到其他裝置
– 從裝置(Slave):作為從裝置連接配接到其主裝置
host層
GAP:
連接配接參數設定,裝置指令設定,安全模式設定
角色:廣播者,觀察者,主裝置,從裝置
BLE:廣播事件
廣播包的發送是單向的,不需要任何連接配接。
裝置發送廣播包進入廣播狀态
– 廣播包可以包含特定的資料定義,最大31個位元組
– 廣播包可以直接指向某個特定的裝置,也可以不指定
– 廣播中可以聲明是可被連接配接的裝置,或者是不可連接配接的裝置
在一個廣播事件中,廣播包會分别在三個廣播通道中被發送一次 (37, 38, 39)
BLE廣播間隔
廣播間隔,是兩次廣播事件之間的最小時間間隔,一般取值範圍在 20ms~10.24s 之間。鍊路層會在每次廣播時間期間産生一個随機廣播延時時間(0ms~10ms),這個延時被加在廣播時間中,這樣來避免多裝置之間的資料碰撞。
機關時間是0.625ms
廣播
低功耗藍牙裝置通過廣播信道發現其他裝置,一個裝置進行廣播,而另一個裝置進行掃描。
廣播相關的參數大緻有以下幾種:
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”檔案中,如下:
#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
其中“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的機關,即準确定義了
BLE:掃描事件
每次掃描裝置打開Radio接收器去監聽廣播裝置,稱為一個掃描事件
掃描事件交替發生在三個特定的廣播通道中: 37, 38, 39
掃描頻寬比 (Duty-Cycle),關于掃描的兩個時間參數:
–掃描間隔:即掃描裝置的掃描頻度
–掃描視窗:每次掃描事件持續的時間
BLE發起連接配接
除了掃描,裝置也可以主動發起連接配接,發起狀态的裝置和掃描狀态的裝置差別在于:當它監聽到一個可連接配接的廣播,發起裝置就會發送一個連接配接請求,而掃描裝置會發送一個掃描請求。
連接配接請求包括一套為從裝置準備的連接配接參數,安排連接配接期間發生的通道和時間。
如果廣播裝置接收了連接配接,兩個裝置會進入連接配接狀态,發起方會稱為 Master(主機) ,而廣播方會稱為 Slave(從機)。
BLE連接配接參數
通道映射,訓示連接配接使用的頻道。
調頻增量,一個5~16 之間的随機,參與通道選擇的算法。
連接配接間隔,1.25ms的倍數,在7.5ms~4s之間。
監督逾時,10ms 的倍數,100ms~32s 之間, 必須大于 (1+slaveLatency)*ConnInterval
從機潛伏,0~499之間,不能超過(SupervisionTimeout/connInterval)-1
BLE連接配接事件
所有的通信都發生在兩個裝置的連接配接事件期間,連接配接事件周期的發生,按照連接配接參數指定的間隔聯系,每個事件發生在某個資料通道(0~36),調頻增量參數決定了下次連接配接時間發生的通道,在每個連接配接時間期間,Master 先發送,Slave會在 150us之後做出回應,即使一個連接配接事件發生(或兩者),雙方都沒有資料發送(例外情況是從裝置潛伏使能),這允許兩個裝置都承認對方仍然存在并保持活躍的連接配接。
Slave的潛伏
Slave如果沒有資料發送,允許跳過連接配接時間。連接配接參數中的 Slave 的潛伏值,是允許裝置跳過的最大連接配接次數,在連接配接事件中,如果 slave 沒有對master 的包做出回應,master将會在後來的連接配接時間中重複發送,直到 slave 回應。
兩個有效的連接配接事件之間的最大時間跨度(假設 slave 跳過了最大數目的連接配接時間)稱為“有效連接配接間隔”,從裝置的潛伏範圍是 0~499,但是有效的連接配接間隔必須小于 32s。
連接配接參數的設定
短間隔的連接配接事件:
-兩裝置都會以高能耗運作
-高資料吞吐量
- 發送等待時間短
長間隔的連接配接事件:
- 兩裝置都會以低能耗運作
- 低資料吞吐量
- 發送等待時間長
低或者 0潛伏值:
- 從裝置以高能耗運作
- 從裝置可以快速的收到來自中心裝置的資料
高潛伏值:
- 外圍裝置在沒有資料發送的情況下可以低能耗運作
- 外圍裝置無法及時收到來自中心裝置的資料
- 中心裝置能及時收到來自外圍裝置的資料
1.安卓裝置作主裝置時,連接配接參數滿足的要求見本篇博文第二節“連接配接參數介紹”中提到的内容。另外實際開發過程中發現安卓裝置作主裝置時存在一個問題,就是部分安卓裝置連接配接BLE裝置之後,隻能進行一次連接配接參數的修改。
2. 蘋果系統裝置作主裝置時,連接配接參數更新的要求比較苛刻,如下:
Interval Max * (Slave Latency + 1) ≤ 2 seconds
Interval Min ≥ 20 ms
Interval Min + 20 ms ≤ Interval Max
Slave Latency ≤ 4
connSupervisionTimeout ≤ 6 seconds
Interval Max * (Slave Latency + 1) * 3 < connSupervisionTimeout
即:
最大連接配接間隔時間 *(從機延遲 + 1) ≤ 2s
最小連接配接間隔時間 ≥ 20 ms
最小連接配接間隔時間 + 20 ms ≤ 最大連接配接間隔時間
從機延遲 ≤ 4
逾時時間 ≤ 6s
最大連接配接間隔時間 *(從機延遲 + 1)* 3 < 逾時時間
這樣算
ios最小20ms
最大400ms
從機延遲 4
逾時時間6s
是以如果你的BLE從裝置需要被IOS主裝置連接配接,那你的BLE從裝置的預設申請的連接配接參數一定要滿足上述要求,并且連接配接過程中修改連接配接參數的時候也要滿足上述要求。