【技術分享】在Apollo2_ble 中添加一個service

日期:2019-07-06 作者:潤欣科技創研社 返回列表

導語


Apollo2_ble模塊硬件由Apollo2(ble host)+ em9304(ble controller)組成。軟件上,使用ARM的Cordio Stack and Profiles協議棧,這個協議棧又是基于WSF(Wireless Software Foundation)實現的。


Apollo2_ble協議棧采用的是藍牙4.2標準。


什么是profile和service?


profile,可以有多種翻譯,在藍牙技術聯盟規定的藍牙4.2標準中,定義Bluetooth profiles是用來實現藍牙系統中應用的互操作性的。[1]這個profile的定義就比較廣,本文不做具體描述。本文中的profile和service,都指的是圖1中GATT-Based Profile/Services層的概念,也就是application層的概念。


要談這兩者,首先說一下GATT。


1.png


圖1 簡易BLE層次劃分圖


圖1是簡易的BLE層次劃分,GATT(Generic Attribute Profile)是藍牙中一種基于ATT協議(Attribute Protocol)的profile框架(framework)。ATT協議的初衷,可以說是為物聯網服務的。在物聯網時代,需要傳感器采集各種信息,例如,溫度,濕度,位置,電量等,ATT協議就將這些信息以屬性(attribute)的形式傳輸到上層,以供讀取或修改。它規定了這些屬性的格式,權限,讀取方式等。而GATT就是將抽象的ATT協議具體化,規定了一個通用的關于這些屬性如何讀取修改的框架(framework)。到了具體的應用場景,我們就可以根據GATT規定好的框架,來編寫對應的GATT-Based Profile。而每一個profile,其實是各種services的集合。


舉個例子,假如我們的應用場景是一個可以測心率的手環,該手環除了測心率的功能,我們還需要它有測電量的功能。這些不同的功能,其實就是不同的services。藍牙技術聯盟已經通過了各種不同的GATT services,詳細列表可以參看文獻[2]。這么多的services,并不是每一個我們都需要,所以,我們可以自己寫GATT-Based Profile,將我們需要的services包含進來。如上面手環的例子,這個profile,就只包含了Heart Rate service和Battery Service。


開始添加service


現在可以開始在Apollo2_ble的SDK中添加我們想要的service了。


本文以fit工程為例。


打開工程后,整個工程的main函數入口在src目錄下。(本文的編譯環境用的是keil)圖2是打開沒有移植freertos系統的工程目錄,假如移植了freertos,也是同樣在src目錄下,只是freertos系統的main函數入口在freertos_fit.c文件中,但具體的線程對應的代碼在radio_task.c中,直接到對應線程的C文件中查看即可。



222.png   

圖2


333.png

圖3


在main函數或者對應線程中找到函數FitStart()


44.png


圖4


進入該函數,找到Initialize attribute server database代碼段如圖5:


55.png


圖5


由圖5可知,該profile已經添加了4個services。(注意,4個中不包括GAP和GATT,這兩個services是每個GATT-Based Profile都必須添加的,代碼中由函數SvcCoreAddGroup進行添加)分別是,測心率的(Heart Rate),讀取設備信息的(device information),測電量的(battery service)和測速率的(running speed and cadence)。


現在假設我們要新添加一個HID的service。則首先就要在start函數里面注冊這個service,增加的代碼如下:


6.png


圖6


并且將對應的頭文件都包含進來:


7.png


圖7


svc_hid.h里面聲明了SvcHidRegister和SvcHidAddGroup,而hid_api.h里面聲明了函數HidAttsWriteCback。


并不是所有的service都需要注冊讀寫回調函數,只有當Attribute list中的Attribute settings項出現ATTS_SET_WRITE_CBACK或者ATTS_SET_READ_CBACK時才需要。以fit工程為例,heart rate的Attribute list如下:



8.png

圖8


最后一個attribute需要用到寫回調,因此在fitstart函數中才需要注冊寫回調函數的入口。


看我們的service有沒有添加成功,我們可以用手機打開藍牙調試助手:


1561598847391133.png


圖9


下圖10是未添加HID service時打開調試工具看到的服務列表,可以看見本來除了GAP(generic access profile)和GATT(generic attribute profile)外,有4個services,與我們在圖5代碼中所見一致,圖11是我們添加代碼后再打開測試工具看到的服務列表,可以看見HID service已經添加進去了。


1561598872268969.png

圖10


1561598891360173.png

圖11


參考文獻:

[1] BLUETOOTH SPECIFICATION Version 4.2 [Vol 1, Part A] page 97

[2] https://www.bluetooth.com/specifications/gatt/services/

返回列表
重庆时时官网开奖结果 欢乐捕鱼人输了好多钱 vv音乐音符赚钱 山东11选5哪里可以买 甘肃快三开奖结果500 大庆冠通棋牌大厅下载 迅雷赚钱宝光猫联通断网 火山小视频主持人如何赚钱 南昌开客栈赚钱吗 北京pk10官网走势 梦幻西游69最省钱赚钱的门派 捕鱼游戏通用秒杀器 买挂平台 金蟾捕鱼的打鱼技巧 幸运农场走势图表 北京500强企业名单 小说按小时赚钱的小说