ESP-AT 系列: BLE client 的 scan、創建和連接

一、基礎知識

想要進行 BLE相關的開發,我們必須具備一定的基礎知識,當然基礎知識肯定是非常簡單的,僅羅列些和本文介紹指令相關的知識。

ESP32 裏的藍牙協議棧是符合藍牙4.2協議規範的, 本文的描述也僅針對藍牙4.2規範。

1. BLE 協議架構

BLE 協議棧中,大致分爲這幾個層級:PHYLLHCIL2CAPSMATTGATT。其中 PHYLL 我們一般稱之爲 controllerHCI 之上的稱之爲 Host,而 HCI 是中間的接口層。

下面是對這幾個層所負責的事的大致描述,如果需要了解更細緻的信息,需要去藍牙官網下載詳細的 spec

  • PHY: 主要是射頻相關的,BLE 有 40 個信道,從 2402MHz - 2480MHz

  • LL: 鏈路層,RF 控制層,用於控制設備的射頻狀態,控制芯片工作在 standby(準備)、advertising(廣播)、scanning(監聽/掃描), initiating(發起連接)、connected(已連接) 這五個狀態中的一種。

  • HCI:主機控制接口層,通信層,向 hostcontroller 提供一個標準化的接口。該層可以由軟件 API 實現或者使用硬件接口 uartspiusb 來控制。

  • 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 中,有 ServerClient 之分:

  • Server 屬性數據庫的存儲的地方

  • Client 會發起與 server 的連接, 發現 service 上面的屬性數據庫。

GATT serverGATT client 這兩種角色存在的階段則是建立連接之後,根據對話地位的不同進行區分的,很容易理解的是,保有數據的那一方我們稱之爲 GATT server,訪問數據的那一方我們稱之爲 GATT client

二、應用場景介紹

在這裏,我們還用一個簡單的例子進行說明GATT serverGATT 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 的固件,試一下。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章