一、基礎知識
想要進行 BLE
相關的開發,我們必須具備一定的基礎知識,當然基礎知識肯定是非常簡單的,僅羅列些和本文介紹指令相關的知識。
ESP32
裏的藍牙協議棧是符合藍牙4.2
協議規範的, 本文的描述也僅針對藍牙4.2
規範。
1. BLE 協議架構
在 BLE
協議棧中,大致分爲這幾個層級:PHY
、LL
、HCI
、L2CAP
、SM
、ATT
、GATT
。其中 PHY
和 LL
我們一般稱之爲 controller
,HCI
之上的稱之爲 Host
,而 HCI
是中間的接口層。
下面是對這幾個層所負責的事的大致描述,如果需要了解更細緻的信息,需要去藍牙官網下載詳細的 spec
:
-
PHY: 主要是射頻相關的,
BLE
有 40 個信道,從2402MHz - 2480MHz
。 -
LL: 鏈路層,
RF
控制層,用於控制設備的射頻狀態,控制芯片工作在standby
(準備)、advertising
(廣播)、scanning
(監聽/掃描),initiating
(發起連接)、connected
(已連接) 這五個狀態中的一種。 -
HCI:主機控制接口層,通信層,向
host
和controller
提供一個標準化的接口。該層可以由軟件API
實現或者使用硬件接口uart
、spi
、usb
來控制。 -
L2CAP:邏輯鏈路控制及自適應協議層,相當於快遞,將數據打包,爲上層提供數據封裝服務,可以讓客戶點對點的通信。
-
SM:安全管理層,提供配對和密鑰的分發,實現安全連接和數據交換。
-
ATT:屬性協議層,
ATT
環境中,允許設備向另外一個設備展示一塊特定的數據,稱之爲“屬性”,展示“屬性” 的設備稱爲服務器,與之配對的設備稱爲客戶端。鏈路層狀態(主機和從機)與設備的ATT
角色是相互獨立的,也就是說,主機設備可以是ATT
服務器,也可以是ATT
客戶端,從機也一樣。 -
GATT:通用屬文件健配置層,從名字就能看出,
GATT
是在ATT
上面的一層結構,定義了使用ATT
的服務框架,GATT
規定了配置文件(鼎鼎有名的profile
)的結構,在BLE
中,所有被profile
或者服務用到的數據塊都稱爲“特性,characteristic
”兩個建立連接的設備之間的所有數據通信都是通過GATT
子程序處理,應用程序和profile
直接使用GATT
層,在後面具體的代碼中,我們會經常見到GATT
,數據交互也是再GATT
層。
2. BLE 角色劃分
在 BLE
協議棧,不同的層級裏面有不同的角色劃分:
-
LL:可以把設備分爲主機和從機,從機廣播,主機發起連接;
-
GAP:可以把設備分爲中心設備和外圍設備;
-
GATT:可以把設備分爲服務端和客戶端;
我們需要記住一點就是,這些劃分相互是不受影響的,在這裏,我們只討論 GATT
層的角色。
GATT
其實是一種屬性傳輸協議,簡單的講可以認爲是一種屬性傳輸的應用層協議,這個屬性的結構其實非常簡單,其實也就是由一個個 services
組成,每個 service
又由數量不等的 characteristic
組成,每個characteristic
又由很多其它的元素組成,就如下圖所示。在這裏,我們不進一次描述,只需要有個概念,我們會在其它文檔中進一步介紹。
在 GATT
中,有 Server
和 Client
之分:
-
Server 屬性數據庫的存儲的地方
-
Client 會發起與
server
的連接, 發現service
上面的屬性數據庫。
GATT server 和 GATT client 這兩種角色存在的階段則是建立連接之後,根據對話地位的不同進行區分的,很容易理解的是,保有數據的那一方我們稱之爲 GATT server
,訪問數據的那一方我們稱之爲 GATT client
。
二、應用場景介紹
在這裏,我們還用一個簡單的例子進行說明GATT server 和 GATT client的工作方式,比如手機 APP
和小米手環。
手機 APP
和小米手環建立連接之前,一般我們都會打開手機的藍牙功能,然後打開手機 APP
,用手機 APP
搜索周邊的藍牙設備,搜索的結果可能不止一個,但是手環應該是在設備列表裏的,這個過程中手機負責掃描的任務,兩者建立了GATT
連接後,手機扮演的角色就是 GATT client
,然後,手機這裏需要做服務發現,看看小米手環那裏有哪些服務,手機可以從手環中讀取各種等傳感器數據(比如步數和心跳),兩者交互的數據是保存在手環中的,此時手環就是 GATT server
。
三、用 ESP32-AT 實現GATT Client
從上面的知識背景和應用場景介紹中,可以瞭解到 GATT client
主要就是幹這些事情:
- 掃描設備
- 建立連接
- 服務發現
- 數據傳輸
當然除了上面提到的,client
還會幹很多其它的事情,比如:
- 更新連接參數
- 更新 MTU Szie
- 發起加密
不過這些操作,在本文不會涉及,會在下面的文檔中有進一步的介紹。
AT
指令的操作介紹:
1. 初始化
首先要做的就是初始化 BLE
的角色,在這裏,角色就是指 GATT
層的角色。
AT+BLEINIT=1
OK
AT+BLEINIT
這條指令用來初始化 GATT
角色, 參數可以設置爲 0,1,2
。
- 0: 關閉
BLE
- 1: 初始化爲
client
- 2: 初始化爲
server
2. 掃描周邊設備
AT+BLESCAN=1,3
OK
AT+BLESCAN
這條命令可以用來開啓和關閉 BLE
掃瞄,第一個參數 1 代表開啓掃描,如果是 0,代表關閉掃描。
第二個參數是可選參數,如果是關閉掃描,第二個參數不必輸入,如果是開啓掃描,第二個參數是掃描時間,這個時候缺省第二個參數或者設置爲0,都代表持續掃描下去。
掃描的時候,是不阻塞的,隨時可以下命令停止掃描。
3. 發起連接
AT+BLECONN=0,"12:34:56:78:90:12"
OK
第一個參數是連接的序列號,由用戶隨意設置,第二個參數是想要連接的對端設備地址,這裏可以通過上面那條掃描的命令的得到。
如果用戶想斷開連接,可以調用這條命令:
AT+BLEDISCONN=0
OK
這裏只需要輸入連接序列號一個參數即可,如果忘記了連接的序號,可以查詢:
AT+BLECONN?
OK
4. 服務發現
AT+BLEGATTCPRIMSRV=0
OK
這裏的參數 0 代表連接的序列號,表示用戶想去查那個 server
上的服務(主要服務)。
用戶可以拿一塊 ESP32
的模組,燒錄 ESP32-AT
的固件,試一下。