第二十二節 藍牙協議棧之從機通訊

第二十二節  藍牙協議棧之從機通訊
之前都是外圍模塊的驅動程序,這一節開始,我們進入藍牙4.0協議棧的核心部分,從機通訊的程序設計。接下來的章節是藍牙4.0協議棧最爲核心的程序設計部分。
    前面的大都是外圍器件的實驗,這節我們介紹藍牙通訊中從機的角色,從機的主要工作是對外廣播,接受主機的連接,並且接受主機發送過來的數據。這裏介紹兩個函數:
bStatus_t GAPRole_SetParameter( uint16 param, uint8 len, void *pValue );
這個函數主要是用來配置從機的一些參數,第一個參數表示需要配置哪個參數,例如我們需要時能從機廣播,則需要這樣調用:
    uint8 initial_advertising_enable = TRUE;
GAPRole_SetParameter( GAPROLE_ADVERT_ENABLED, sizeof( uint8 ), &initial_advertising_enable );
第二個函數是特徵值改變時的回調函數,當主機給從機發送數據時,從機就會回調這個函數來告知應用層有數據送達。
static void simpleProfileChangeCB( uint8 paramID );
在低功耗藍牙中,數據的傳輸是通過特徵值的讀寫來實現的。
    BLE協議棧的GATT層用於應用程序在兩個連接設備之間的數據通信的。從GATT層的角度看,當設備連接後,將充當一下兩種角色中的一個:
    GATT Client  —— 從GATT服務器讀/寫數據的設備。
    GATT Server —— 包含客戶端需要讀/寫的數據的設備。
    重要的是要注意,GATTClient和Server 的角色完全獨立於BLE的鏈路層的 slave和master的角色,或GAP層peripheral和central的角色。一個slave 可以是GATT Client或GATT Server,一個master同樣可以是GATT Client或GATT Server。 一個GATT Server可以有多個完成一個特定的功能或特性GATT Server組成。
在SimpleBLEPeripheral應用程序中有三個GATT服務:
    Mandatory GAP Service:這個服務包含設備和訪問信息,比如設備名稱、供應商和產品標識。
    Mandatory GATT Service :這個服務包含有關服務UUID相關信息。
SimpleGATTProfile Service——這個服務是一個示例配置文件,供測試和演示。


Profile簡介
    爲了更容易的保持Bluetooth 設備之間的兼容,Bluetooth規範中定義了 Profile。Profile 定義了設備如何實現一種連接或者應用,你可以把 Profile 理解爲連接層或者應用層協議。Bluetooth 的一個很重要特性,就是所有的 Bluetooth 產品都無須實現全部的 Bluetooth 規範,你可根據所需要的產品實現需要的Profile,不必給開發帶來更大的開銷。這就是說當需要利用藍牙提供數據傳輸功能時就必須建立對應的Profile,TI的BLE協議棧爲我們提供了部分Profile,其中一部分是非標準的Profile。其中非標準的有SimpleGATTProfile和SimpleKeysProfile,我們將通過對這兩個Profile的介紹及實驗來了解Profile的特性和使用。每個 Profile 初始化其響應的服務和內部寄存器。GATT 服務器將整個服務加到屬性表中,併爲每個屬性分配唯一的句柄。 GATTProfile用於存儲和處理GATT服務器中的數據。在下面的實驗中需要用到的都是我們自己新建的Profile,即非標準的Profile。其中主要要注意Profile、UUID、handle、CharacteristicValues。


SimpleGATTProfile及Btool的使用
SimpleGATTProfile中包含5個特徵值,每一個的屬性都不同:
    SimpleGATTProfile 特徵值屬性:


Btool是PC端工具,使用特定的HCI命令與CC2540通信,PC端需要通過串口或 USB 連接 CC2540,CC2540 使用 HostTestRelease 工程,硬件可以使用 USBDongle(對應CC2540USB)或我們提供的USBDongle。
USBDongle連接從機
    使用饅頭科技有限公司的USBDongle,燒寫HostTestRelease固件,連接電腦後就可以用Btool軟件來連接從機設備。
    將從機工程編譯下載到開發板,連接串口到PC端,我們通過串口來觀察設備的運行,運行後可以看到設備處於廣播。


 這是我們插入USBDongle到電腦,可以看到識別到一個串口插入,如圖,這就是USBDongle用CDC的方式實現的串口。




打開Btool,按左圖配置,可以看到右圖的信息,這是說明Btool已經識別到了USBDongle。




Btool的界面可以分爲4個區:
1. 設備信息展示
2. 歷史記錄
3. 設備控制
4. 連接信息


確保周圍存在設備可發現,點擊Discover/Connect標籤的scan按鈕,CC2540 就會進行10s的掃描過程,在這期間可通過Cancle按鈕停止掃描。


可以看到,我們周邊有兩個設備,其中一個就是我們的開發板,根據串口輸出的信息我們知道我們設備的地址是0X7C669D9F6297,下面我們點擊establish來連接我們的開發板。


連接後可以看到兩邊都同時顯示了連接信息。開發板輸出連接:


Btool連接的設備信息:


特徵值的讀寫
    接下來我們用Btool對SimpleProfile 進行使用操作。剛剛我們已經列出了SimpleProfile中的各個特徵值。


    使用UUID讀取特徵值,CHAR1具有讀寫屬性,這裏對 SimpleProfile 的第一特徵值 CHAR1進行讀取操作,UUID 爲0xfff1。選擇 Read/Write 選項頁並選擇 ReadUsing Characteristic UUID 功能,在Characteristic UUID選項填入f1:ff(高字節在前),點擊Read按鈕。
    讀取特徵值成功:


下面對此特徵值進行寫入操作,寫入操作必須使用Handle值進行,而無法使用UUID來操作,那CHAR1的Handle值的什麼呢?其實剛剛在我們讀取CHAR1的值的時候就已經獲取到了它的Handle。如圖,CHAR1的Handle爲0x0025。
    CHAR1的Handle值:


下面我們通過這個Handle對CHAR1寫入十進制的10,如圖,我們寫入成功了。
    寫入成功:


在SimpleBLEPeripheral設備的串口輸出中可以看到設備提示CHAR1的值變爲了10。


下面來驗證我們是否成功的將CHAR1改爲了10,按照剛剛讀取CHAR1的步驟,重新讀取CHAR1的值。
    CHAR1的值改爲了10:


藍牙點燈
    上面我們已經能夠成功的改寫一個特徵值,那我們是不是可以通過發送特定的值來控制一個燈的亮滅呢?答案是肯定的。下面我們來實現這個功能。


    從機工程已經有5個特徵值了,我們現在增加一個特徵值來控制燈的亮滅。那我們該如何來添加特徵值呢?特徵值的管理是在profile中實現的。所以我們需要對profile進行修改。


(1)修改simpleGATTProfile.h


    在simpleGATTProfile.h中可以看到現在定義的5個特徵值的標示符和UUID,我們添加一個1Byte的特徵值來控制燈的亮滅。


因爲simpleGATTProfile是共用的文件,爲了不影響其它工程,我們使用一個宏來控制新增加的屬性。


接下來我們需要修改simpleGATTProfile.c,這個文件需要修改的地方較多,下面我們一步一步來修改。
(2)添加UUID


(3)添加屬性


(4)屬性表


(5)屬性設置操作


6)屬性獲取操作


(7)屬性讀操作


(8)屬性寫操作


Profile的改造完成後,我們將這個宏打開,配置工程。


接着我們在staticvoid simpleProfileChangeCB( uint8 paramID )函數的switch中加入CHAR6的判斷即可。


編譯燒錄後,按照我們前面說的在Btool中對FFF6的UUID進行讀寫操作即可實現對LED的控制。
本文章轉載自
http://www.deyisupport.com/question_answer/wireless_connectivity/bluetooth/f/103/t/69222.aspx
請勿用於商業

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