2 BLE介紹
本章將介紹BLE協議不同的層,包括各個層的部件和它們的概念。
2.1 通用訪問規范(Generic Access Profile,GAP)
GAP是應用層能夠直接訪問BLE協議棧的最底層,它包括管理廣播和連接事件的有關參數。
注意:GAP的更多詳細介紹見《Bluetooth Core Specification》(藍牙核心規范)的第3卷C部分。
2.1.1 角色
為了創建和維持一個BLE連接,引入了“角色”這一概念。一個BLE設備不是集中器角色就是外圍設備角色,這是根據是誰發起這個連接來確定的。集中器設備總是連接的發起者,而外圍設備總是被連接者。集中器和外圍設備的關系就像鏈路層中的主機和從機的概念。
在LED Button應用例程中,使用S110 SoftDevice燒錄到nRF51822作為外圍設備,計算機或者手機作為集中器。 |
除了集中器角色和外圍設備角色,藍牙核心規范還定義了觀察者角色和廣播者角色,觀察者角色監聽空中的事件,廣播者角色只是廣播信息而不接收信息。觀察者角色和廣播者角色都只廣播而並不建立連接。它們在我們的這個應用中並不適用。
注意:在一個連接的另一端的設備被稱為對等設備,不管它是集中器還是外圍設備。
2.1.2 廣播
集中器能夠與外圍設備建立連接,外圍設備必須處於廣播狀態,它每經過一個時間間隔發送一次廣播數據包,這個時間間隔稱為廣播間隔,它的范圍是20ms到10.24s。廣播間隔影響建立連接的時間。
集中器發送一個連接請求來發起連接之前,必須接收到一個廣播數據包,外圍設備發送一個廣播數據包之后一小段時間內只監聽連接請求。
一個廣播數據包最多能攜帶31字節的數據,它通常包含用戶可讀的名字、關於設備發送數據包的有關信息、用於表示此設備是否可被發現的標志等類似的標志。
當集中器接收到廣播數據包后,它可能發送請求更多數據包的請求,稱為掃描回應,如果它被設置成主動掃描,外圍設備將會發送一個掃描回應做為對集中器請求的回應,掃描回應最多可以攜帶31字節的數據。
廣播,包括掃描請求和掃描回應,出現在遠離WLAN使用的2.4G頻段之外的3個頻率上,以防止被WiFi干擾。
2.1.3 掃描
掃描是集中器監聽廣播數據包和發送掃描請求的過程,它有2個定時參數需要特別注意:掃描窗口和掃描間隔。
對於每一個掃描間隔,集中器掃描的時間等於一個掃描窗口,這就意味着如果掃描窗口等於掃描間隔,那么集中器將處於連續掃描之中。掃描窗口和掃描間隔之比為掃描占空比。
2.1.4 發起
如果集中器想建立一個連接,當掃描監聽到廣播數據包后它將采用相同的過程:當要發起連接時,集中器接收到一個廣播數據包之后將會發送一個連接請求。
2.1.5 連接
集中器和外圍設備第一次交換數據定義為連接狀態。在一個連接狀態中,集中器將會在一個特定定義的間隔從外圍設備請求數據,這個間隔稱為連接間隔,它由集中器決定並應用於連接,但是外圍設備可以發送連接參數更新請求給集中器。根據藍牙核心規范,連接間隔必須在7.5ms到4s之間。
如果外圍設備在一個時間幀內沒有回應集中器的數據包,稱為連接監管超時,連接被認為丟失。
可以通過在每一個連接間隔中傳輸多個數據包以獲得更高的數據吞吐量,每一個傳輸數據包最多可以攜帶20個字節的應用數據。但是如果電流消耗是重點,同時外圍設備也沒有數據要發送,它可以選擇忽略一定數量的連接間隔,這個忽略連接間隔的數目稱為從機延時(slave latency)。
在一個連接中,除了廣播信道,設備間在頻帶的所有信道中進行通信。當然對於應用層,這是完全透明的。
2.2 通用屬性配置文件(Generic Attribute profile,GATT)
GATT層是傳輸真正數據所在的層。
2.2
2.2.1角色
除了GAP定義了角色之外,BLE還定義了另外2種角色:GATT服務器和GATT客戶端,它們完全獨立於GAP的角色。提供數據的設備稱為GATT服務器,訪問GATT服務器而獲得數據的設備稱為GATT客戶端。
以LED Button應用為例,外圍設備(帶有LED和按鍵)作為服務器,集中器作為客戶端。 |
注意:一個設備可以同時作為服務器和客戶端。
2.2.2 GATT層
一個GATT服務器通過一個稱為屬性表的表格組織數據,這些數據就是用於真正發送的數據。
2.2.2.1 屬性
一個屬性包含句柄、UUID、值,句柄是屬性在GATT表中的索引,在一個設備中每一個屬性的句柄都是唯一的。UUID包含屬性表中數據類型的信息,它是理解屬性表中的值的每一個字節的意義的關鍵信息。在一個GATT表中可能有許多屬性,這些屬性能可能有相同的UUID。
2.2.2.2 特性
一個特性至少包含2個屬性:一個屬性用於聲明,一個屬性用於存放特性的值。
所有通過GATT服務傳輸的數據必須映射成一系列的特性,可以把特性中的這些數據看成是一個個捆綁起來的數據,每個特性就是一個自我包容而獨立的數據點。例如,如果幾塊數據總是一起變化,那么我們可以把它們集中在一個特性里。
以LED Button應用為例,外圍設備(帶有LED和按鍵)作為服務器,集中器作為客戶端。
在LED Button服務中,LED和按鍵之間沒有任何聯系,而且它們可以各自獨立地改變, 因此,可以讓它們成為獨立的特性,所以我們用一個特性表示當前按鍵的狀態,用另一個特性用來表示當前LED的狀態。 |
2.2.2.3描述符
任何在特性中的屬性不是定義為屬性值就是為描述符。描述符是一個額外的屬性以提供更多特性的信息,它提供一個人類可識別的特性描述的實例。
然而,有一個特別的描述符值得特別地提起:客戶端特性配置描述符(Client Characteristic Configuration Descriptor,CCCD),這個描述符是給任何支持通知或指示功能的特性額外增加的,參見第15頁第2.2.5節“空中操作和性質”。
在CCCD中寫入“1”使能通知功能,寫入“2”使能指示功能,寫入“0”同時禁止通知和指示功能。
在S110 SoftDevice協議棧中,對任何使能了通知功能或是指示功能的特性,協議棧將自動加入這個類型的描述符。
2.2.2.4服務
一個服務包含一個或多個特性,這些特性是邏輯上相關的集合體。
GATT服務一般包含幾塊具有相關的功能,比如特定傳感器的讀取和設置,人機接口的輸入輸出。組織具有相關的特性到服務中既實用又有效,因為它使得邏輯上和用戶數據上的邊界變得更加清晰,同時它也有助於不同應用程序間代碼的重用。GATT基於藍牙技術聯盟(SIG)官方而設計,SIG建議根據它們的規范設計自己的profile。
對於LED Button應用例程,因為不關心它們的重用,所以把LED特性和按鍵特性放到了一個服務中。 |
2.2.2.5 profile(數據配置文件)
一個profile文件可以包含一個或者多個服務,一個profile文件包含需要的服務的信息或者為對等設備如何交互的配置文件的選項信息。設備的GAP和GATT的角色都可能在數據的交換過程中改變,因此,這個文件應該包含廣播的種類、所使用的連接間隔、所需的安全等級等信息。
需要注意的是一個profile中的屬性表不能包含另一個屬性表。
在LED BUTTON示例中的profile不是一個標准描述的profile。 |
2.2.3 標准的定制服務和特性
藍牙技術聯盟(SIG)已經定義一些profile、服務、特性和根據協議棧的GATT層定義的屬性。但是,協議棧中只實現了一部分應用的BLE服務,那就意味着,只要協議棧支持GATT,就可能為一個應用建立一個它需要的profile和服務。
既然在一個應用中可以支持profile和服務,那么就可以在這個應用中建立一個定制的服務。
對於LED BUTTON這個示例來說,藍牙技術聯盟沒有包含這個應用,因此它建立了一個定制的服務,包括2個定制的特性。 |
2.2.4 UUID
在第10頁2.2.2節“GATT層”中定義的所有屬性都有一個UUID值,UUID是全球唯一的128位的號碼,它用來識別不同的特性。
2.2.4.1 藍牙技術聯盟 UUID
藍牙核心規范制定了兩種不同的UUID,一種是基本的UUID,一種是代替基本UUID的16位UUID。
所有的藍牙技術聯盟定義UUID共用了一個基本的UUID:
0x0000xxxx-0000-1000-8000-00805F9B34FB
為了進一步簡化基本UUID,每一個藍牙技術聯盟定義的屬性有一個唯一的16位UUID,以代替上面的基本UUID的‘x’部分。例如,心率測量特性使用0X2A37作為它的16位UUID,因此它完整的128位UUID為:
0x00002A37-0000-1000-8000-00805F9B34FB
雖然藍牙技術聯盟使用相同的基本UUID,但是16位的UUID足夠唯一地識別藍牙技術聯盟所定義的各種屬性。
藍牙技術聯盟所用的基本UUID不能用於任何定制的屬性、服務和特性。對於定制的屬性,必須使用另外完整的128位UUID。
2.2.4.2 供應商特定的UUID
SoftDevice 根據藍牙技術聯盟定義UUID類似的方式定義UUID:先增加一個特定的基本UUID,再定義一個16位的UUID(類似於一個別名),再加載在基本UUID之上。這種采用為所有的定制屬性定義一個共用的基本UUID的方式使得應用變為更加簡單,至少在同一服務中更是如此。
使用軟件nRFgo Studio非常容易產生一個新的基本UUID,見第29頁第4.4.3節“服務初始化”。
例如,在LED BUTTON示例中,采用0x0000xxxx-1212-EFDE-1523-785FEABCD123作為基本UUID。 |
藍牙核心規范沒有任何規則或是建議如何對加入基本UUID的16位UUID進行分配,因此你可以按照你的意圖來任意分配。
例如,在LED BUTTON示例中,0x1523作為服務的UUID,0x1524作為LED特性的UUID,0x1525作為按鍵狀態特性的UUID。 |
2.2.5 空中操作和性質
大部分的空中操作事件都是采用句柄來進行的,因為句柄能夠唯一識別各個屬性。如何使用特性依據它的性質,特性的性質包括:
l 寫
l 沒有回應的寫
l 讀
l 通知
l 指示
更多的性質在藍牙規范中有明確的定義,但以上性質更為常用。
2.2.5
2.2.5.1 寫和沒有回應的寫
寫和沒有回應的寫允許GATT客戶端寫入一個值到GATT服務器的一個特性中。它們之間不同的地方在於沒有回應的寫事件沒有任何應用層上的確認或回應。
2.2.5.2 讀
讀性質表明一個GATT客戶端可以讀取在GATT服務器中特性的值。
2.2.5.3 通知和指示
通知和指示性質允許GATT服務器在其某個特性改變的時候對GATT客戶端進行提醒,通知和指示之間不同之處在於指示有應用層上的確認,而通知沒有。
在LED BUTTON示例中,控制LED的特性和當前按鍵狀態的特性,都是LED BUTTON服務中的2個定制的特性。
在LED特性中,集中器需要能夠設置它的值和能夠讀取它的值。因為應用層級別的確認沒有必要,因此你可以使用沒有回應的寫和讀的性質。
在按鍵特性中,當按鍵狀態改變時客戶端需要被通知到,但是應用層的確認沒有必要,因此只需要通知的性質。 |
注意:GATT和它的下一層ATT協議在《藍牙核心規范》第3卷,第F和G部分中有詳細的描述。