1. 程式人生 > >BLE協議棧 – GAP

BLE協議棧 – GAP

轉載自:http://www.cydaxiang.com/2016/11/ble-stack-gap/

GAP(Generic Access Profile)通用訪問規範層算是BLE協議棧中最頂部的一層,它定義了裝置如何廣播、掃描、發現和建立連線,以及配置工作角色(Role)、可發現性、廣播資料內容和安全相關的引數。從程式設計視角來看,GAP中的內容就像是一個config檔案,BLE協議棧其他層的工作,都要從GAP中獲取初始化引數和配置資訊。

GAP中定義了一系列模式(Mode)和規程(Procedure),二者相互配合,完成廣播和連線的工作。

1. GAP角色(Role)

有以下幾種種GAP角色:

  • Central:中央裝置
  • Peripheral:外圍裝置
  • Broadcaster:廣播者
  • Observer:觀察者
  • Central & Peripheral

第五種Central&Peripheral,在內部是兩種角色進行按需轉換,並非一種獨立的角色。

中央裝置是向外圍發起連線的裝置,連線起來後就稱為主裝置(Master)。Peripheral是向外部廣播的裝置,連線起來後稱為從裝置(Slave)。因為建立連線需要進行資料收發,所以無論是Central還是Peripheral,他們都必須具有資料接收和傳送的能力。

廣播者是一個純廣播裝置,觀察者是一個純掃描裝置。假如功能需求極其簡單,這兩種角色可以是隻接收或只發送的裝置。

iBeacon裝置就可以設定為一個廣播者角色。

與GAP角色相似的還有一個GATT角色概念。GATT角色包括以下三種:

  • GATT Server
  • GATT Client
  • GATT Server & Client

GATT Server是指資料伺服器,有傳送資料的需求,GATT Client指資料客戶端,有接收資料的需求。GATT Server的特徵值有Read/Write/Indicate等屬性,配置後可以收發處理資料;而GATT Client的特徵值是沒有這些屬性的,僅能夠掃描讀取GATT Server的特徵值,針對Server的特徵值進行讀寫。

所以大多數情況下,Central扮演著GATT Client的角色,而Peripheral扮演著GATT Server的角色。不過這並不絕對,理論上無論Central還是Peripheral裝置,它都可以是GATT Server,或者GATT Client。

比如Alert Notification Profile,它是一個主機,提供掃描功能,但是連線後它是資料來源,向外部提供資料,承擔Server責任,因而它是GAP Central + GATT Server。

總而言之,GAP角色決定了誰廣播誰掃描,GATT角色決定了資料從哪裡出發。

2. 基本資訊

2.1 裝置地址

BLE裝置地址為6位元組,分兩部分,前半部分為公司部分,後半部分為裝置部分。一個典型的BLE裝置地址為:00A050-123456,00A050表示Cypress,123456表示裝置序號。

BLE廣播時候會攜帶裝置地址,掃描時候也會記錄裝置地址,如果兩個裝置使用相同的地址,則會產生衝突,所以BLE的裝置地址應該保證唯一。後半部分3個位元組總共6個字元空間,總的可用地址數:16 ^ 6 = 16777216。這個數字對於一個普通的應用,應該綽綽有餘。

為了保證地址唯一性,有以下2個辦法:

1)根據晶片的隨機資訊生成隨機地址

2)在量產時候用上位機累加或隨機演算法避免重複

第一個方法在PSoC BLE中很常用,它利用晶片的Silicon ID等資訊,生成一個3位元組的隨機數。Silicon ID是一個晶片唯一資訊,加上一些演算法處理,獲得的3位元組數在10年內遇到重複的機率極小,所以可以在普通的應用中使用。

第二個方法,是在量產時候,將地址資訊寫入SFlash中,每次地址資訊都不相同,BLE程式啟動時候,先從sFlash中讀出地址資訊並設定自身裝置地址。

注意這裡的隨機地址,只是兩個裝置相互之間不同,對於某個裝置,一旦寫入,就是確定了的。這些地址都屬於下面提到的public address。

在協議棧內部,地址分為兩類public address和random address。random address又分為static address和private address。private address又分為resolvable private address和non-resolvable private address。如下圖:

BLE Address Type

通常使用的地址都是public address,即明文地址。有些場合為了提高裝置的隱私性(Privacy),可以使用resolvable private address,如果將裝置地址標記為這一型別,從外部看來,每次重連,裝置的地址都會發生變化,與之繫結的另一端裝置需要利用IRK(身份解析金鑰)對加密地址進行解碼,進而獲得原始地址。

2.2 裝置名字

在GAP中設定的GAP名字,會反映到GATT Generic Access Service下的Device Name特徵值的資料。它通常跟廣播包中的裝置名相同,也可以人為設定不同。

裝置名字最長不應超過128位元組,支援UTF-8字元,所以我們可以使用中文名字。

關於裝置名字,在以前的文章中有詳述。

2.3 裝置圖示(Appearance)

設定不同的圖示,可以在手機APP上顯示出來。

3. 模式(Mode)和規程(Procedure)

這兩個詞(Mode,Procedure)都可以描述裝置在一段時間內以一種狀態或方式執行,但是在GAP層的描述中被重點區分。模式強調裝置在一段時間內被設定為某種狀態,規程強調裝置在某種模式下去執行某種動作。

舉個例子,Discovery Mode表示發現模式,有“可被發現”和“不可被發現”等模式,這個引數適用於從機(Peripheral),描述從機的執行狀態;而Discovery Procedure表示發現規程,有“普通發現”和“受限發現”等規程,這個引數適用於主機(Central),描述主機怎麼去發現從機。類似的,從機有繫結模式,主機執行繫結規程等。

模式和規程大致相互對應,從機有某種模式,主機就有相應的規程。

3.1 廣播模式(Advertising Mode)

  • Connectable undirected advertising
  • Scannable undirected advertising
  • Non-connectable undirected advertising
  • Connectable directed advertising

這幾個概念其實屬於鏈路層(Link Layer),前面文章鏈路層的的“廣播”一節有詳細介紹。這裡簡單回顧一下:

可連線+無定向廣播是最常用廣播,它的廣播資料可以被周邊主機發現,可以攜帶掃描響應資料,同時可以被連線。

可掃描+無定向廣播是指可以攜帶掃描響應資料,但不能被連線。

不可連線+無定向廣播指不能攜帶掃描響應資料,也不能被連線。

可連線+定向廣播指只能被指定的主機發現和連線。

3.2 掃描規程(Scan Procedure)

  • Active:主動掃描
  • Passive:被動掃描

主動掃描是指Central裝置發出SCAN_REQ,從機收到後返回SCAN_RSP。於是從機可以在掃描響應(scan response)資料中加入一些資料,等待主機主動掃描。

被動掃描是指Central裝置不發出SCAN_REQ,僅僅接收從機的廣播資料,無法獲取掃描響應資料。

BLE SPEC中建議在廣播資料中存放變化的資料,靜態的資料放在掃描響應資料中。

絕大多數Central裝置都是用主動掃描,我至今沒有見到被動掃描的裝置。

3.3 發現模式(Discovery Mode)

  • Non-discoverable mode(不可發現模式)
  • Limited discoverable mode(受限發現模式)
  • General discoverable mode(普通發現模式)
  • Broadcast mode(廣播器模式)

發現模式與廣播模式相互關聯,“不可發現模式”下,只能選擇Scannable undirected advertising和Non-connectable undirected advertising兩種廣播模式,即這種發現模式下,BLE裝置不可以被連線。“廣播器模式”下也只能選擇不可被連線的廣播模式。“受限發現模式”和“普通發現模式”下,可以任意選擇廣播模式。

第一種不可發現模式,使廣播裝置不被發現,參考 。注意,這裡不被發現是指不被執行“普通發現規程”的Central裝置發現。如果Central裝置執行觀察規程(obverving procedure),仍然能夠看到廣播訊號。而手機APP等軟體預設為觀察規程,所以假如使用手機BLE掃描APP來測試,依舊可以看到設為“不可發現模式”的廣播裝置。正確的測試方法是使用CySmart(PC),將主機的掃描規程設定為“普通”或“受限”,而不是“觀察者”,就能夠觀察到正確現象。

第三種為普通發現模式,可以選擇任意的廣播模式,然後自由處理各項引數。

第二種受限發現模式,這裡“受限”是指受時間限制。與普通發現模式相比,這個模式好像只是強制要求廣播超時引數,其他相同。但是二者的“含義”是不同的,一個受限發現的裝置,即有超時限制的裝置,給Central傳達一個訊息,我很快就不行了,要連線應趕緊。所以Central裝置如果發現了多個廣播裝置,在顯示裝置列表的時候,應該有意識的將受限發現模式的裝置放在前面,而普通發現模式的裝置放在後面。

廣播資料中有兩個標誌位:LE General Discovery Mode和LE Limited Discovery Mode,分別設定這兩個標誌位即可設定發現模式。

3.4 發現規程(Discovery Procedure)

  • Limited discovery:受限發現規程
  • General discovery:普通發現規程
  • Observation discovery:觀察器規程

前兩個發現規程,基本上是為了匹配上面前三種發現模式而設計的。

如果Central使用普通發現規程,則能夠發現“受限發現模式”和“普通發現模式”的裝置,不能發現“不可發現模式”裝置。如果Central使用受限發現規程,則僅能夠發現“受限發現模式”的裝置。對於觀察期規程,則能發現各種發現模式下的廣播裝置。

3.5 連線模式(Connection Mode)

  • Non-connectable mode:無連線模式
  • Directed connectable mode:定向連線模式
  • Undirected connectable mode:無定向連線模式

這幾個連線模式與上面的幾種定向、無定性的廣播模式基本對應,確定了廣播模式,就會在內部建立相應的連線模式。

3.6 連線規程(Connection Procedure)

  • Auto connection establishment procedure
  • General connection establishment procedure
  • Selective connection establishment procedure
  • Direct connection establishment procedure

自動連線規程,需要白名單(White List)的配合,即只能自動連線白名單中的裝置,不是毫無限制的自動連線。

普通連線規程,就是最常用的連線方式。

選擇連線規程,這個“選擇”是選擇合適的連線引數。Central周邊有多個廣播裝置,從機的連線引數各不相同,主機裝置可以選擇期望的連線引數裝置進行連線。選擇連線規程與自動連線規程都用於一拖多的場景,一對一的場景,他們倆幾乎功能一樣。

定向連線規程,與定向廣播模式相對應。

與連線相關的規程,還有:

  • 連線引數更新規程
  • 連線終止規程

3.7 繫結模式(Bonding Mode)

  • Bonding:可繫結
  • No bonding:不可繫結

3.8 繫結規程(Bonding Procedure)

就是將配對過程中的金鑰儲存起來,詳細過程參考前面關於安全管理(SM)層的介紹。

4. 安全特性(Security)

4.1 安全模式(Security Mode)

  • Mode 1
  • Mode 2

模式1是進行加密形式的配對,模式2是進行簽名形式的配對。這兩種模式含義很明瞭,不明白BLE協議為什麼沒有取個有意義的名字。

4.2 安全級別(Security Level)

模式1下有三種安全等級:

  • No Security(No authentication, no encryption)
  • Unauthenticated pairing with encryption
  • Authenticated pairing with encryption
  • Authenticated LE Secure Connections pairing with encryption (BLE v4.2 only)

第一種是無安全,不認證也不加密,俗稱裸奔。第二、三種均進行加密,第三種做認證,第二種不認證。

第二種安全等級將使用Just Works配對方式,而第三種安全等級則根據IO Capability選擇合適的配對方式。

第四種安全等級是BLE v4.2新增的選項。BLE配對時候傳輸Passkey有被竊聽風險,而這種等級使用特殊演算法避免傳輸Passkey被竊聽。

模式2有兩種安全等級:

  • Unauthenticated pairing with data signing
  • Authenticated pairing with data signing

跟模式1相比,不做資料加密,而是進行資料簽名。這種模式,鏈路不進行加密。

資料簽名和資料加密,可以通過這個帖子有個感性的認識。簡單的講,加密是將資料明文轉成密文,而簽名則不改動資料本身,但是伴隨資料額外提供一份事先約定好的資訊,接收方一看到這個額外資訊就知道是指定的傳送方發來的訊息,於是確認這個訊息的真實性。這個額外資訊,就是“簽名”。如果沒有這個簽名,假如第三方攻擊者混入通訊鏈路,發出偽造訊息,接收方就無法判斷訊息真偽。在配對過程的第三個階段,分發一系列的金鑰,其中CSRK就是用於資料簽名的金鑰。

5. 廣播包資料(Advertisement Packet)

廣播包最大長度為31位元組,廣播包中可以包含多種元素,各個元素的格式是確定的:

AD Element = Length + AD Type + AD Data

其中Length = length(AD Type) + lenght(AD Data)。

一些常用過的元素如下:

  • Flags
  • Local Name
  • Tx power level
  • Service UUID
  • LE BD Address
  • Manufacturer Specific Data

全部元素列表參考官方頁面

對於Flags,它的資料內容為單位元組數,在CySmart(PC)上可以清楚看到各個bit表示的含義:

Flags bits

其中BR/EDR指Basic Rate/Enhanced Data Rate,是經典藍芽的特性,對BLE裝置,這幾項標誌位應該清空,對於雙模和經典藍芽裝置,則按需置位。

其他元素在使用時候稍加理解便知其義,這裡不做贅言。

關於廣播包的講解,網上帖子一大把,比如:1, 2, 3

6. GAP服務(Generic Access Service)

Generic Access Service是每個BLE裝置都有的服務,可以理解為強制服務。該服務項中包括:

Generic Access Service
	|- Device Name
	|- Appearance
	|- Peripheral Preferred Connection Parameters (PPCP)

由於每個裝置都有這個Device Name,所以主機端可以通過UUID讀取特徵值資料,快速獲取裝置名。在Android系統中,APP是通過廣播包中的Device Name來識別裝置名的,在iOS系統中,則不管廣播包,只認這個GAP服務下的Device Name。

Appearance就是個圖示。

外設期望連線引數PPCP,BLE主機可以通過UUID快速讀取PPCP的特徵值資料,獲取從機期望的連線引數資訊。市面上大多數APP並不去讀這個引數,從而只能在從機中發起更新連線引數的請求,顯式的告訴主機更新連線引數。

(完)