1. 程式人生 > >CC2640R2F BLE5.0 藍芽協議棧通用屬性配置檔案(GATT)

CC2640R2F BLE5.0 藍芽協議棧通用屬性配置檔案(GATT)

公司主頁 文件歸類 淘寶

通用屬性配置檔案(GATT)

正如GAP層負責連線相關的功能,GATT主要是負責在兩個已經連線的裝置互動資料,GAP層把BLE裝置區分為主機Master(Central)和從機Slave(Perpherial),在GATT層則區分為Server和Client。客戶端讀取和寫入儲存在服務端的特徵值(Characteristics )。

Server
該裝置包含由GATT客戶端讀取或寫入的characteristic。

Client
從GATT伺服器讀取或寫入資料的藍芽裝置。

注意:對於GATT分層的Server/Client角色和GAP分層的Master(Central)/Slave(Perpherial)並沒有直接關係。如上圖,手機作為Central/Client,CC2640R2開發板作為 Peripheral/Server。

GATT的Profile、Service、Characteristics、Attributes

對於GATT層的Profile、Service、Characteristics、Attributes概念,我們一定要深入理解,因為一旦建立連線後,不管是嵌入式端還是應用端進行資料互動的都是這些概念。為了幫助理解,我們抽象以下包含關係:

一個或者多個Characteristic組成一個Service,一個多個Service組成Profile,Characteristic又由多個Attributes組成,每個Attribute由包含 Handle、Type、Permissions三個屬性。
以下我們著重理解Characteristic,也是我們資料互動的最終實體,每個特徵包含以下4個Attributes。

  • Characteristic Value(特徵值)
    用於characteristic的值

  • Characteristic Declaration(特徵宣告)
    儲存特徵值的屬性,位置和型別的描述符

  • Client Characteristic Configuration(客戶端特徵配置)
    允許GATT伺服器配置要通知的特性(非同步傳送訊息)或指示的配置(與確認非同步傳送訊息)

  • Characteristic User Description(特徵使用者描述)
    描述特徵的ASCII字串
    這些屬性儲存在屬性表中的GATT伺服器中。除了該值之外,以下屬性與每個屬性相關聯。

以上的每個Attributes 又由以下元素組成。

  • Handle(控制代碼)
    表中屬性的索引(每個屬性都有一個唯一的控制代碼)

  • Type(型別)
    指示屬性資料表示什麼(稱為UUID [通用唯一識別符號],其中一些是藍芽SIG定義的,一些是自定義的)

  • Permissions(許可權)
    強制GATT客戶端裝置如何以及如何訪問屬性的值

GATT客戶端抽象層

下圖所示,在GATT客戶端應用程式大部分是直接使用GATT的API(少部分直接使用ATT層API),沒有profile檔案,因為GATT客戶是得到資料,不需要建立屬性表和配置檔案。

GATT服務端抽象層

如圖所示,在GATT服務端,GATT層的大部分功能由獨立的profiles處理,然後可以看見perfiles又使用GAttservApp模組(一個可配置的模組,用於儲存和管理屬性表,詳見BLE Stack API Reference)處理。

所以在建立GATT服務端的時候首先需要配置profiles檔案,profiles檔案呼叫GattServAppApp模組並使用其API與GATT層介面。在這種情況下應用程式不需要直接呼叫GATT層API,應用程式和Profiles檔案介面。

GATT Services 和 Profile

在概述部分講過,GATT service是characteristic的集合,多個service可以組合在一起形成一個profile,許多profile僅實現一個service,所以profile和service可以互換。

在simple_peripheral示例應用程式專案中定義了四個GATT服務。

  • GAP GATT服務(GGS)
    此服務包含裝置和訪問資訊,例如裝置名稱,供應商標識和產品標識。
    為此服務定義了以下特徵:

    裝置名稱
    表現(Appearance)
    外圍首選連線引數

  • 通用屬性服務
    該服務包含有關GATT伺服器的資訊,是藍芽低功耗協議棧的一部分,每個GATT伺服器裝置都需要根據藍芽5.0版本核心規範。

  • 裝置資訊服務
    此服務公開了有關裝置的資訊,如硬體,軟體版本,韌體版本,規範資訊,合規性資訊和製造商名稱。裝置資訊服務是藍芽低功耗協議棧的一部分,由應用程式配置。

  • simple_gatt_profile服務
    此服務是用於測試和演示的示例配置檔案。完整的原始碼在simple_gatt_profile.c和simple_gatt_profile.h檔案中提供。

	  // Initialize GATT attributes
	  GGS_AddService(GATT_ALL_SERVICES);           // GAP GATT Service
	  GATTServApp_AddService(GATT_ALL_SERVICES);   // GATT Service
	  DevInfo_AddService();                        // Device Information Service
	  SimpleProfile_AddService(GATT_ALL_SERVICES); // Simple GATT Profile

下圖顯示了simple_peripheral專案中的屬性表,這些屬性的設定都是通過上面4個服務函式。可以逐一開啟檢視修改。

使用BTool獲取的簡單GATT配置檔案特性表。紅色表示Profile宣告,黃色表示字元宣告,White表示與特定宣告相關的屬性。

simple_gatt_profile包含以下特性:

  • SIMPLEPROFILE_CHAR1
    可以從GATT客戶端裝置讀取或寫入的1位元組值
  • SIMPLEPROFILE_CHAR2
    可以從GATT客戶端裝置讀取但不能寫入的1位元組值
  • SIMPLEPROFILE_CHAR3
    可以從GATT客戶端裝置寫入但不能讀取的1位元組值
  • SIMPLEPROFILE_CHAR4
    不能從GATT客戶端裝置直接讀取或寫入的1位元組值(該值是通知屬性)
  • SIMPLEPROFILE_CHAR5
    可從GATT客戶端裝置讀取(但不寫入)的5位元組值

0x001C是simple_gatt_profile服務宣告。
此宣告的UUID為0x2800(藍芽定義 GATT_PRIMARY_SERVICE_UUID)。該宣告的值是simple_gatt_profile(自定義)的UUID。

0x001D是SimpleProfileChar1特徵宣告。
該宣告可以被認為是指向SimpleProfileChar1值的指標。該宣告的UUID為0x2803(藍芽定義GATT_CHARACTER_UUID)。下面解釋characteristic宣告值的含義(MSB到LSB):

  • 位元組0是藍芽核心規範版本5.0中定義的SimpleProfileChar1的屬性 (以下是某些相關屬性)。
    0x02:允許讀取特徵值
    0x04:允許寫入特徵值(無響應)
    0x08:允許寫入特徵值(帶響應)
    0x10:允許通知特徵值(無確認)
    0x20:允許通知特徵值(帶確認)
    characteristic1 0x0A的意義是該特性可讀可寫(0x02|0x08)

  • 位元組1-2:SimpleProfileChar1的值的控制代碼(控制代碼0x001E)

  • 位元組3-4:SimpleProfileChar1值的UUID(自定義0xFFF1)

  • 0x001E是SimpleProfileChar1特徵值
    該值的UUID為0xFFF1(自定義)。該值是characteristic的實際有效載荷資料。如其SimpleProfileChar1宣告(控制代碼0x01D)所示,該值是可讀寫的。

  • 0x001F是SimpleProfileChar1特徵使用者描述
    該描述的UUID為0x2901(藍芽定義)。該描述的值是描述特徵的使用者可讀字串。

  • 0x0020 - 0x002C
    剩下的四個特徵描述具有和simpleProfileChar1相同結構的屬性。唯一不同的屬性是處理0x0028時,描述如下。

    0x0028是SimpleProfileChar4客戶端特徵配置。此配置的UUID為0x2902(藍芽定義)。通過寫入此屬性,GATT伺服器可以將SimpleProfileChar4配置為通知(寫入0x0001)或指示(寫入0x0002)。將0x0000寫入此屬性將禁用通知和指示。

GATT安全

如GATT 服務端抽象所述,GATT伺服器可以為每個特性獨立定義許可權。伺服器可能允許任何客戶端訪問某些characteristic,同時將訪問其他characteristic僅限於認證或授權的客戶端。這些許可權通常被定義為更高級別的配置檔案規範的一部分。對於自定義配置檔案,使用者可以選擇他們認為合適的許可權。有關GATT安全性的更多資訊,請參閱藍芽核心規範版本5.0的安全注意事項部分([第3卷,第G部分,第8部分])。

認證(Authentication)

在客戶端通過認證配對方法之前,無法訪問需要身份驗證的特性。此驗證在堆疊內執行,無需應用程式處理。唯一的要求是使GATT服務端正確註冊該特性。
例如,simple_gatt_profile的characteristic5設定需要認證的讀取。

//characteristic 5 
{ 
   {  ATT_BT_UUID_SIZE , simpleProfilechar5UUID  },
   GATT_PERMIT_AUTHEN_READ ,
   0 ,
   simpleProfileChar5 
},

當未經身份驗證的客戶端嘗試讀取此值時,GATT伺服器將自動拒絕它,而不呼叫simpleProfile_ReadAttrCB()。只有當認證成功之後,讀寫的請求才會轉發到profiles的讀寫回調,請參閱一下程式碼,該程式碼在simple_gatt_profile.c中simpleProfile_ReadAttrCB()函式裡面。

  case SIMPLEPROFILE_CHAR1_UUID:
  case SIMPLEPROFILE_CHAR2_UUID:
  case SIMPLEPROFILE_CHAR4_UUID:
    *pLen = 1;
    pValue[0] = *pAttr->pValue;
    break;

  case SIMPLEPROFILE_CHAR5_UUID:
    *pLen = SIMPLEPROFILE_CHAR5_LEN;
    VOID memcpy( pValue, pAttr->pValue, SIMPLEPROFILE_CHAR5_LEN );
    break;
    
  default:
    // Should never get here! (characteristics 3 和 4沒有讀許可權)
    *pLen = 0;
    status = ATT_ERR_ATTR_NOT_FOUND;
    break;

授權(Authorization)

授權是發生在認證之後對一些文件的訪問許可權更改刪除,需要授權。授權是BLE已經實現的一個安全層。由於應用程式需要定義自己的授權要求,所以協議棧將這些特性的讀/寫請求轉發到配置檔案的應用程式層。

要從profile檔案註冊GATT伺服器的授權資訊,它必須使用堆疊定義一個授權回撥。如下面虛擬碼(例程中沒有使用授權)。

  1. 註冊授權回撥
	CONST  gattServiceCBs_t  simpleProfileCBs  = { 
	   simpleProfile_ReadAttrCB ,      //讀回撥函式指標
	   simpleProfile_WriteAttrCB ,     //寫回調函式指標
	   simpleProfile_authorizationCB   //授權回撥函式指標
	};
  1. 實現授權回撥程式碼
	static  bStatus_t  simpleProfile_authorizationCB ( uint16  connHandle , gattAttribute_t  * pAttr , uint8  opcode  )
	{ 
	   //這只是一個示例實現,正常的用例將需要
	   更復雜的邏輯來確定裝置是否被授權
	
	   if (clientIsAuthorized )
	      return SUCCESS ; 
	   else
	      return ATT_ERR_INSUFFICIENT_AUTHOR ; 
	}

授權回撥在協議棧上下文中執行,因此在這個函式中不應該執行太複雜的處理。具體實現由開發人員決定;上述回撥應該被視為一個shell。如果客戶端有權訪問該特徵返回SUCCESS,如果沒有返回ATT_ERR_INSUFFICIENT_AUTHOR,授權需要事先通過連線進行身份驗證,否則ATT_ERR_INSUFFICIENT_AUTHEN將作為錯誤響應傳送。

如果需要授權的特性並註冊了授權回撥,但沒有定義應用級授權回撥,那麼協議棧將返回ATT_ERR_UNLIKELY。因為這個錯誤並不明確,所以TI建議使用授權回撥。

直接使用GATT層

上面客戶端抽象說過,應用程式也可以直接使用GATT層API,本節就介紹如何在應用程式中使用GATT層,GATT層的功能在庫中實現,但標頭檔案功能可在gatt.h中找到。BLE Stack API Reference中有完整的API參考。作為GATT客戶端(在simple_central專案中)使用GATT層的一般過程如下:

圖中可以看出,GATT客戶端傳送命令之後,通過ICALL給協議棧傳送ATT命令,然後協議棧處理之後返回響應,再由ICALL以ATT事件通知應用程式,應用程式得到ATT事件之後非同步處理。注意:除了收到對自己的命令的響應外,GATT客戶端還可以從GATT伺服器接收非同步資料作為指示或通知。使用GATT_RegisterForInd(selfEntity)註冊接收這些ATT通知和指示。這些通知和指示也作為ATT事件(ATT_HANDLE_VALUE_NOTI& ATT_HANDLE_VALUE_INDG)傳送到應用程式。這些事件必須按照GATT Services和Profile中的說明進行處理。

GAP GATT 服務(GGS)

在前面GATT服務和簡介中說過,GGS服務包含裝置和訪問資訊,例如裝置名稱,Appearance,外圍首選連線引數。GGS的目的是在裝置發現和連線啟動過程中進行輔助。有關GGS的更多資訊,請參閱藍芽核心規範版本5.0的“GAT service”和“Characteristics for GATT Server”部分([Vol 3],C部分,第12節)。

  1. 包含標題
#include  “gapgattserver.h”
  1. 初始化GGS引數
// GAP GATT Attributes 
static  uint8_t  attDeviceName [ GAP_DEVICE_NAME_LEN ]  =  “This is a text” ;	
GGS_SetParameter (GGS_DEVICE_NAME_ATT , GAP_DEVICE_NAME_LEN , attDeviceName );
  1. 使用GGS初始化應用程式回撥(可選)。當GGS中的任何特徵發生變化時,都會通知應用程式。
GGS_RegisterAppCB (&appGGSCBs );
  1. 將GGS新增到GATT伺服器。
bStatus_t  GGS_AddService (GATT_ALL_SERVICES );

經過上面4個步驟的配置,就成功設定了GGS的引數,在central裝置連線外圍裝置的時候就能獲取這些引數,使用我們公司提供的XXX.apk可以在手機介面直接檢視我們設定的引數值。

加入我們

文章所有程式碼、工具、文件開源。加入我們QQ群 591679055獲取更多支援,共同研究CC2640R2F&BLE5.0。

CC2640R2F&BLE5.0-樂控暢聯© Copyright 2017, 成都樂控暢聯科技有限公司.

相關推薦

CC2640R2F BLE5.0 協議通用屬性配置檔案GATT

通用屬性配置檔案(GATT) 正如GAP層負責連線相關的功能,GATT主要是負責在兩個已經連線的裝置互動資料,GAP層把BLE裝置區分為主機Master(Central)和從機Slave(Perpherial),在GATT層則區分為Server和Client。客

通用屬性配置檔案GATT及其服務,特性與屬性介紹

宣告:本文轉載自http://blog.chinaunix.net/uid-21411227-id-5750680.html 1. 角色        除了GAP定義了角色之外,BLE還定義了另外2種角色:GATT伺服器和GATT客戶端,它們完全獨立於GAP的角色。提

在Android4.2中實現bluetooth A2dp Sink——移植Android5.0協議

    在Android中,藍芽系統的結構如下圖所示:     在這個體系結構中,從下往上依次是模組驅動、藍芽協議棧、Bluetooth.apk、Framework和各種藍芽應用。其中,核心中的驅動是直接和硬體打交道的,一般由模組廠商提供。Android層中,最下面的是處

在Android4.2中實現bluetooth A2dp Sink——移植Android5.0協議

    一直以來,Android對於藍芽的支援都很混亂,簡直可以說是一坨shit。各個版本的協議棧都不一樣,最早用的是bluez,進入4.x時代之後,換成了谷歌自己的bluedroid。換就換吧,至少等做完了再用吧,結果4.2、4.3、4.4的bluedroid全都不一樣。

BLE協議 — BLE連線建立過程梳理

主裝置和從裝置建立連線之後,所有的資料通訊都是在連線事件(Connection Events)中進行的。尖刺的波就是連線事件(Connection events),剩下的Sleeping是睡眠時間,裝置在建立連線之後的大多數時間都是處於Sleeping,這種情況下耗電量比較低,而在連線事件(Connectio

4.0協議官方手冊--- 通用屬性配置檔案

1 總則                      通用屬性配置檔案                                                                      (GATT)                       

ARM平臺上協議Bluez的移植使用和配置(寫的狠不錯) .

目錄(?)[-] 相關說明 網站資源 工作環境 編譯 核心 Bluez Lib / Utils 藍芽硬體初始化及基礎服務啟動 何謂硬體初始化 硬體初始化步驟

協議分析

 協議棧原始碼位置:external/bluetooth/bluedroid 藍芽協議棧架構: 描述了協議棧Bluedroid,HAL層藍芽適配庫以及上層應用類 模組及應用程式介面 Bluedroid 分為兩層: - BTE: Bluetooth Embedde

nrf51822 協議 API 入門

需要看的文件 : 《07_Simple BLE sensor application walk though.pdf》 《06_nRF51 Toolchain and Software Development kit.pdf》 《04_nRF51_seri

ARM平臺上協議Bluez的移植使用和配置

作者:劉旭暉 Raymond轉載請註明出處 主頁:http://rgbbones.googlepages.com/ Bluez作為當前最成熟的開源藍芽協議棧,在Linux的各大發行版中已

Bluedroid: 協議原始碼剖析

一、 基礎知識介紹 1.縮略語 BTIF: Bluetooth Interface  BTU : Bluetooth Upper Layer  BTM: Bluetooth Manager  BTE: Bluetooth embedded system 

BlueTooth: 協議實現模式分析

藍芽協議棧實現模式分析 藍芽技術是一項新興的技術。它的主要目的就是要在全世界範圍內建立一個短距離的無線通訊標準 。它使用 2.4-2.5 GHz 的 ISM( Industrion Scientifc Medical ) 頻段來傳送話音和資料。運用成熟、實用、先進的無線

1、核心技術瞭解協議、架構、硬體和軟體筆記

原文地址:http://www.cnblogs.com/zjutlitao/p/4742428.html 宣告:這篇文章是樓主beautifulzzzz學習網上關於藍芽的相關知識的筆記,其中比較多的受益於xubin341719的藍芽系列文章,同時還有其他網上作者的資料。由於有些文章只做參

認識BLE 5協議 —— 通用屬性規範層 (GATT,Generic Attribute Profile)

轉自 http://www.sunyouqun.com/2017/04/understand-ble-5-stack-generic-attribute-profile-layer/ 通用屬性規範GATT(Generic Attribute Profile)將ATT層定義的屬性打包

核心技術瞭解協議、架構、硬體和軟體筆記

下面是摘抄筆記內容:     藍芽,是一種支援裝置短距離通訊(一般10m內)的無線電技術。能在包括行動電話、PDA、無線耳機、膝上型電腦、相關外設等眾多裝置之間進行無線資訊交換。利用“藍芽”技術,能夠有效地簡化行動通訊終端裝置之間的通訊,也能夠成功地

速攻NRF52832系列教程之方法篇

三、如何快速攻克一個SoC晶片     在這個講求速度、效率的年代,慢一步就會愈發被動,錯失諸多良機。     對產品研發公司來說,工程師如能迅速攻克一款更新更強的晶片,搶先發布產品,就能早一步搶佔市

Linux 核心網路協議 ----- Linux 核心路由機制 (2.6.25)

       核心的路由部分是是網路中重要部分,目前在Linux核心中預設的路由查詢演算法使用的是Hash查詢,所以你會看到很多的資料結構是XXX_hash什麼之類(例如fn_hash)。Linux核心從2.1開始就支援基於策略的路由,那麼什麼是基於策略的路由呢?我們一般

Linux 網路協議開發番外篇—— Windows路由表詳解

一、檢視Windows路由表  路由表是Windows的TCP/IP協議棧的一個重要的部分。但是,路由表不是Windows作業系統向普通使用者顯示的東西。如果你要看到這個路由表,你必須要開啟一個命令提示符對話方塊,然後輸入“ROUTE PRINT”命令。結果如下: 路由

協議4.0、4.1、4.2的比較

SIG在2010年釋出了4.0的specification,2013年釋出了4.1的specification,一年以後,在2014年又釋出了4.2的specification,specification的調整很快。從4.0版本起,革命性的加入了BLE協議部分,同時將2.1

nrf51822 BLE 4.0 低功耗協議 解析

參考文件: 《TI 2013研討會藍芽4.0講解部分PPT 20130508.pdf》重點 《TI_BT-LE-TRAINNING.PDF》 《05_BLE Intro.pdf》 BLE: Bluetooth Low Energy 協議棧結構和配置