一、概述
1完残、BLE藍(lán)牙協(xié)議棧結(jié)構(gòu)
協(xié)議棧分為兩部分:控制器和主機(jī)只搁。對(duì)于4.0以前的藍(lán)牙,這兩部分是分開的纺非。所有profile(姑且稱為劇本吧,用來(lái)定義設(shè)備或組件的角色)和應(yīng)用都建構(gòu)在GAP或GATT之上赘方。下面由結(jié)構(gòu)圖的底層組件開始介紹。
PHY層弱左,工作車間窄陡,1Mbps自適應(yīng)跳頻GFSK(高斯頻移鍵控),運(yùn)行在免證的2.4GHz
LL層為RF控制器拆火,控制室跳夭,控制設(shè)備處于準(zhǔn)備(standby)、廣播们镜、監(jiān)聽/掃描(scan)币叹、初始化、連接模狭,這五種狀態(tài)中一種颈抚。
五種狀態(tài)切換描述為:未連接時(shí),設(shè)備廣播信息(向周圍鄰居講“我來(lái)了”)嚼鹉,另外一個(gè)設(shè)備一直監(jiān)聽或按需掃描(看看有沒有街坊鄰居家常里短可聊贩汉,打招呼“哈驱富,你來(lái)啦”),兩個(gè)設(shè)備連接初始化(搬幾把椅子到院子)匹舞,設(shè)備連接上了(開聊)褐鸥。發(fā)起聊天的設(shè)備為主設(shè)備,接受聊天的設(shè)備為從設(shè)備赐稽,同一次聊天只能有一個(gè)意見領(lǐng)袖叫榕,即主設(shè)備和從設(shè)備不能切換。
HCI層姊舵,為接口層晰绎,通信部,向上為主機(jī)提供軟件應(yīng)用程序接口(API)蠢莺,對(duì)外為外部硬件控制接口寒匙,可以通過(guò)串口、SPI躏将、USB來(lái)實(shí)現(xiàn)設(shè)備控制锄弱。
L2CAP層,物流部祸憋,行李打包盒拆封處会宪,提供數(shù)據(jù)封裝服務(wù)
SM層,保衛(wèi)處蚯窥,提供配對(duì)和密匙分發(fā)掸鹅,實(shí)現(xiàn)安全連接和數(shù)據(jù)交換
ATT層,庫(kù)房拦赠,負(fù)責(zé)數(shù)據(jù)檢索
GATT層巍沙,出納/庫(kù)房前臺(tái),出納負(fù)責(zé)處理向上與應(yīng)用打交道荷鼠,而庫(kù)房前臺(tái)負(fù)責(zé)向下把檢索任務(wù)子進(jìn)程交給ATT庫(kù)房去做句携,其關(guān)鍵工作是把為檢索工作提供合適的profile結(jié)構(gòu),而profile由檢索關(guān)鍵詞(characteristics)組成允乐。
GAP層矮嫉,秘書處,對(duì)上級(jí)牍疏,提供應(yīng)用程序接口蠢笋,對(duì)下級(jí),管理各級(jí)職能部門鳞陨,尤其是指示LL層控制室五種狀態(tài)切換昨寞,指導(dǎo)保衛(wèi)處做好機(jī)要工作。
TI的這款CC2540器件可以單芯片實(shí)現(xiàn)BLE藍(lán)牙協(xié)議棧結(jié)構(gòu)圖的所有組件,包括應(yīng)用程序编矾。
2熟史、任務(wù)調(diào)度---OSAL操作系統(tǒng)抽象層
正如一個(gè)公司為了實(shí)現(xiàn)擴(kuò)大產(chǎn)能和產(chǎn)品多樣化,建立了多個(gè)辦公室和工廠一樣窄俏,藍(lán)牙為了實(shí)現(xiàn)同多個(gè)設(shè)備相連蹂匹,或?qū)崿F(xiàn)多功能,也實(shí)現(xiàn)了功能擴(kuò)充凹蜈,這就產(chǎn)生了調(diào)度問題限寞。因?yàn)椋m然軟件和協(xié)議椦鎏梗可擴(kuò)充履植,但終究最底層的執(zhí)行部門只有一個(gè)。
為了實(shí)現(xiàn)多事件和多任務(wù)切換悄晃,需要把事件和任務(wù)對(duì)應(yīng)的應(yīng)用玫霎,以及其相關(guān)的提供支撐“辦公室”和“工廠”打包起來(lái),并起一個(gè)名字OSAL操作系統(tǒng)抽象層妈橄,類似于集團(tuán)公司以下的子公司庶近。
3、設(shè)備改造---HAL硬件抽象層
如果實(shí)現(xiàn)軟件和硬件的低耦合眷蚓,使軟件不經(jīng)改動(dòng)或很少改動(dòng)即可應(yīng)用在另外的硬件上鼻种,這樣就方便硬件改造、升級(jí)沙热、遷移后叉钥,軟件的移植。HAL硬件抽象層正是用來(lái)抽象各種硬件的資源篙贸,告知給軟件投队。其作用類似于嵌入式系統(tǒng)設(shè)備驅(qū)動(dòng)的定義硬件資源的h頭文件。其角色類似于現(xiàn)代工廠的設(shè)備管理部爵川。
4敷鸦、BLE低功耗藍(lán)牙系統(tǒng)架構(gòu)
BLE低功耗藍(lán)牙軟件有2個(gè)主要組成: OSAL操作系統(tǒng)抽象層和 HAL硬件抽象層。
多個(gè)Task任務(wù)和事件在OSAL管理下工作雁芙,而每個(gè)任務(wù)和事件又包括3個(gè)組成:BLE 協(xié)議棧,profiles和應(yīng)用程序钞螟。
附圖7同樣可以用現(xiàn)代工廠模式來(lái)類比兔甘,如附圖8。
下面對(duì)OSAL鳞滨、HAL和BLE進(jìn)行稍微深入的介紹洞焙。
二、OSAL操作系統(tǒng)抽象層
1、軟件功能由OSAL管理下的事件來(lái)實(shí)現(xiàn)
OSAL作為調(diào)度核心澡匪,BLE協(xié)議棧熔任、profile定義、所有的應(yīng)用都圍繞它來(lái)實(shí)現(xiàn)唁情。OSAL不是傳統(tǒng)大家使用的操作系統(tǒng)疑苔,而是一個(gè)允許軟件建立和執(zhí)行事件的循環(huán)。
軟件功能是由任務(wù)事件來(lái)實(shí)現(xiàn)的甸鸟,創(chuàng)建一個(gè)任務(wù)事件需要以下工作:
創(chuàng)建task identifier任務(wù)ID惦费;
編寫任務(wù)初始化(task initialization routine)進(jìn)程,并需要添加到OSAL初始化進(jìn)程中抢韭,這就是說(shuō)系統(tǒng)啟動(dòng)后不能動(dòng)態(tài)添加功能薪贫;
編寫任務(wù)處理程序;
如有需要提供消息服務(wù)刻恭。
BLE協(xié)議棧的各層都是以O(shè)SAL任務(wù)方式實(shí)現(xiàn)瞧省,由于LL控制室的時(shí)間要求最為迫切,所以其任務(wù)優(yōu)先級(jí)最高鳍贾。為了實(shí)現(xiàn)任務(wù)管理鞍匾,OSAL通過(guò)消息處理(message process),存儲(chǔ)管理贾漏,計(jì)時(shí)器定時(shí)等附加服務(wù)實(shí)現(xiàn)候学。
2、系統(tǒng)啟動(dòng)流程
為了使用OSAL纵散,在main函數(shù)的最后要啟動(dòng)一個(gè)名叫osal_start_system的進(jìn)程梳码,該進(jìn)程會(huì)調(diào)用由特定應(yīng)用決定的啟動(dòng)函數(shù)(osalInitTasks)來(lái)啟動(dòng)系統(tǒng)。
osalInitTasks逐個(gè)調(diào)用BLE協(xié)議棧各層的啟動(dòng)進(jìn)程來(lái)初始化協(xié)議棧伍掀。隨后掰茶,設(shè)置一個(gè)任務(wù)的8bit任務(wù)ID(task ID),跳入循環(huán)等待執(zhí)行任務(wù)蜜笤,系統(tǒng)啟動(dòng)完成濒蒋。
3、任務(wù)事件與事件處理
進(jìn)程優(yōu)先級(jí)和任務(wù)ID
· 任務(wù)優(yōu)先級(jí)決定于任務(wù)ID把兔,任務(wù)ID越小沪伙,優(yōu)先級(jí)越高
· BLE協(xié)議棧各層的任務(wù)優(yōu)先級(jí)比應(yīng)用程序的高
· 初始化協(xié)議棧后,越早調(diào)入的任務(wù)县好,任務(wù)ID越高围橡,優(yōu)先級(jí)越低,即系統(tǒng)傾向于處理新到的任務(wù)
事件變量和旗語(yǔ)
每個(gè)事件任務(wù)由對(duì)應(yīng)的16bit事件變量來(lái)標(biāo)示缕贡,事件狀態(tài)由旗號(hào)(taskflag)來(lái)標(biāo)示翁授。如果事件處理程序已經(jīng)完成拣播,但其旗號(hào)并沒有移除,OSAL會(huì)認(rèn)為事情還沒有完成而繼續(xù)在該程序中不返回收擦。比如贮配,在SimpleBLEPeripheral實(shí)例工程中,當(dāng)事件START_DEVICE_EVT發(fā)生塞赂,其處理函數(shù)SimpleBLEPeripheral_ProcessEvent就運(yùn)行泪勒,結(jié)束后返回16bit事件變量,并清除旗語(yǔ)SBP_START_DEVICE_EVT减途。
事件處理表單
每當(dāng)OSAL事件檢測(cè)到了有任務(wù)事件酣藻,其相應(yīng)的處理進(jìn)程將被添加到由處理進(jìn)程指針構(gòu)成的事件處理表單中,該表單名叫taskArr(taskarray)鳍置。taskArr中各個(gè)事件進(jìn)程的順序和osalInitTasks初始化函數(shù)中任務(wù)ID的順序是對(duì)應(yīng)的辽剧。
事件調(diào)度的方法
有三種:
最簡(jiǎn)單的方法是使用osal_set_event函數(shù)(函數(shù)原型在OSAL.h文件中),在這個(gè)函數(shù)中税产,用戶可以像定義函數(shù)參數(shù)一樣設(shè)置任務(wù)ID和事件旗語(yǔ)怕轿。
第二種方法是使用osal_start_timerEx函數(shù)(函數(shù)原型在OSAL_Timers.h文件中),使用方法同osal_set_event函數(shù)辟拷。
第三個(gè)以毫秒為單位的參數(shù)osal_start_timerEx則指示該事件處理必須要在這個(gè)限定時(shí)間內(nèi)撞羽,通過(guò)定時(shí)器來(lái)為事件處理計(jì)時(shí)。
4衫冻、存儲(chǔ)管理
類似于Linux嵌入式系統(tǒng)內(nèi)存分配C函數(shù)mem_alloc诀紊,OSAL利用osal_mem_alloc提供基本的存儲(chǔ)管理,但osal_mem_alloc只有一個(gè)用于定義byte數(shù)的參數(shù)隅俘。對(duì)應(yīng)的內(nèi)存釋放函數(shù)為osal_mem_free邻奠。
5、進(jìn)程間通信—通過(guò)消息機(jī)制實(shí)現(xiàn)
不同的子系統(tǒng)通過(guò)OSAL的消息機(jī)制通信为居。消息即為數(shù)據(jù)碌宴,數(shù)據(jù)種類和長(zhǎng)度都不限定。
消息收發(fā)過(guò)程描述如下:
接收信息蒙畴,調(diào)用函數(shù)osal_msg_allocate創(chuàng)建消息占用內(nèi)存空間(已經(jīng)包含了osal_mem_alloc函數(shù)功能)贰镣,需要為該函數(shù)指定空間大小,該函數(shù)返回內(nèi)存空間地址指針膳凝,利用該指針就可把所需數(shù)據(jù)拷貝到該空間碑隆。
發(fā)送數(shù)據(jù),調(diào)用函數(shù)osal_msg_send蹬音,需為該函數(shù)指定發(fā)送目標(biāo)任務(wù)上煤,OSAL通過(guò)旗語(yǔ)SYS_EVENT_MSG告知目標(biāo)任務(wù),目標(biāo)任務(wù)的處理函數(shù)調(diào)用osal_msg_receive來(lái)接收發(fā)來(lái)的數(shù)據(jù)祟绊。建議每個(gè)OSAL任務(wù)都有一個(gè)消息處理函數(shù)楼入,每當(dāng)任務(wù)收到一個(gè)消息后,通過(guò)消息的種類來(lái)確定需要本任務(wù)做相應(yīng)處理牧抽。消息接收并處理完成嘉熊,調(diào)用函數(shù)osal_msg_deallocate來(lái)釋放內(nèi)存(已經(jīng)包含了osal_mem_free函數(shù)功能)。
三扬舒、硬件抽象層HAL
當(dāng)新的硬件平臺(tái)做好后阐肤,只需修改HAL,而不需修改HAL之上的協(xié)議棧的其他組件和應(yīng)用程序讲坎。
四孕惜、BLE低功耗藍(lán)牙協(xié)議棧
1、BLE庫(kù)文件
TI藍(lán)牙協(xié)議棧是以單獨(dú)一個(gè)庫(kù)文件提供的晨炕,并沒有提供源代碼衫画,因此不做深入說(shuō)明。對(duì)于TI的BLE實(shí)例應(yīng)用瓮栗,這個(gè)單獨(dú)庫(kù)文件已經(jīng)夠用削罩,列出了所有的庫(kù)文件。
由于GAP和GATT與用戶程序直接交互费奸,因此下文對(duì)庫(kù)文件中GAP和GATT一一講解弥激。
2、GAP秘書處
2.1角色(即服務(wù)愿阐,功能)
GAP運(yùn)行在如下四種角色的一種:
· Broadcaster 廣播員—我在微服,但只可遠(yuǎn)觀,不可連接缨历。
· Observer 觀察員—看看誰(shuí)在以蕴,但我只遠(yuǎn)觀,不連接戈二。
· Peripheral 外設(shè)(從機(jī))—我在舒裤,誰(shuí)要我就跟誰(shuí)走,協(xié)議棧單層連接觉吭。
· Central 核心(主機(jī))—看看誰(shuí)在腾供,并且愿意跟我走我就帶她/他走,協(xié)議棧單層或多層連接鲜滩,目前最多支持3個(gè)同時(shí)連接伴鳖。
雖然指標(biāo)顯示BLE可以同時(shí)扮演多個(gè)角色,但是在TI提供的BLE實(shí)例應(yīng)用中缺省只支持外設(shè)角色徙硅。每一種角色都由一個(gè)劇本(roleprofile)來(lái)定義榜聂。
2.2連接
主從機(jī)連接過(guò)程
一個(gè)典型的低功耗藍(lán)牙系統(tǒng)同時(shí)包含外設(shè)和核心(主機(jī)),兩者的連接過(guò)程如下:
外設(shè)角色向外發(fā)送自己的信息(設(shè)備地址嗓蘑、名字等)须肆,主機(jī)收到外設(shè)廣播信息后匿乃,發(fā)送掃描請(qǐng)求(scanrequest)給外設(shè),外設(shè)響應(yīng)主機(jī)的請(qǐng)求豌汇,連接建立完成幢炸。
連接參數(shù)
主要有通信間隙(connectioninterval)、外設(shè)延時(shí)(slavelatency)拒贱、最大耐心等待時(shí)間(supervisiontimeout)等宛徊,下面簡(jiǎn)單說(shuō)明。
- 通信間隙
藍(lán)牙通信是間斷的逻澳、跳頻的闸天,每次連接都可能選擇不同的子頻帶。跳頻的好處是避免頻道擁塞斜做,間斷連接的好處是節(jié)省功耗苞氮,通信間隙就是指兩次連接之間的時(shí)間間隔。這個(gè)間隔以1.25ms為基本單位瓤逼,最小6單位最大3200單位葱淳,間隙越小通信越及時(shí),間隙越大功耗越低抛姑。
- 外設(shè)延時(shí)
外設(shè)與主機(jī)建立連接以后赞厕,沒事的時(shí)候主機(jī)總會(huì)定期發(fā)送問候信息到外設(shè),外設(shè)懶得搭理定硝,這些主機(jī)發(fā)送的信息就浮云般飄過(guò)皿桑。可以忽略的連接事件個(gè)數(shù)從0到499個(gè)蔬啡,最多不超過(guò)32秒诲侮。有效連接間隙= 連接間隙x (1+ 外設(shè)延時(shí)).
- 最大耐心等待時(shí)間
指的是為了創(chuàng)建一個(gè)連接,主機(jī)允許的最大等候時(shí)間箱蟆,在這個(gè)時(shí)間內(nèi)沟绪,不停的嘗試連接。范圍是10個(gè)~3200個(gè)通信間隙基本單位(1.25ms)空猜。
以上三參數(shù)大小設(shè)置優(yōu)劣是顯而易見的绽慈,在此也飄過(guò)。連接參數(shù)的設(shè)置請(qǐng)參看后文“5.1GAP外設(shè)劇本”小節(jié)辈毯。
連接異常處理
舉例說(shuō)明連接異常坝疼,如主機(jī)采用從機(jī)并不適合的參數(shù)來(lái)請(qǐng)求連接,又如主從機(jī)已經(jīng)連接了谆沃,但從機(jī)需要改參數(shù)條約钝凶。通過(guò)“連接參數(shù)更新請(qǐng)求(ConnectionParameter Update Request)”來(lái)解決問題,交由L2CAP“收發(fā)室物流處”處理唁影。連接參數(shù)上文已經(jīng)說(shuō)了耕陷,不再敘述掂名。
加密處理
利用配對(duì)實(shí)現(xiàn),利用密匙來(lái)加密授權(quán)連接哟沫。典型的過(guò)程是:外設(shè)向主機(jī)請(qǐng)求口令一個(gè)(passkey)以便進(jìn)行配對(duì)铆隘,待主機(jī)發(fā)送了正確的口令之后,連接通信通過(guò)主從機(jī)互換密碼來(lái)校驗(yàn)南用。由于藍(lán)牙通信是間斷通信,如果一個(gè)應(yīng)用需要經(jīng)常通信掏湾,而每次通信都要重新申請(qǐng)連接裹虫,那將是勞神費(fèi)力的,為此GAP安全衛(wèi)士(SM,security profile)提供了一種長(zhǎng)期簽證(long-termset of keys)融击,叫做綁定(bonding)筑公,這樣每次建立連接通關(guān)流程就簡(jiǎn)便快捷了。
3尊浪、出納GATT
GATT負(fù)責(zé)兩個(gè)設(shè)備間通信的數(shù)據(jù)交互匣屡。共有兩種角色:出納員(GATTClient)和銀行(GATTServer),銀行提供資金拇涤,出納從銀行存取款捣作。銀行可以同時(shí)面對(duì)多個(gè)出納員。這兩種角色和主從機(jī)等角色是無(wú)關(guān)的鹅士。
GATT把工作拆分成幾部分來(lái)實(shí)現(xiàn):讀關(guān)鍵詞(CharacteristicValue)和描述符(CharacteristicDescriptor)券躁,用來(lái)去庫(kù)房查找提取數(shù)據(jù)。寫讀關(guān)鍵詞和描述符掉盅。
GATT銀行(GATTServer)的業(yè)務(wù)部門(API)主要提供兩個(gè)主要的功能:一是服務(wù)功能也拜,注冊(cè)或銷毀服務(wù)(serviceattribute),并作為回調(diào)函數(shù)(callbackfunction)趾痘;二是管理功能慢哈,添加或刪除GATT銀行業(yè)務(wù)。
一個(gè)角色定義的劇本可以同時(shí)定義多個(gè)角色永票,每個(gè)角色的服務(wù)卵贱、關(guān)鍵詞、關(guān)鍵值侣集、描述符(service,characteristic, characteristic value and descriptors)都以句柄(attributes)形式保存在角色提供的服務(wù)上艰赞。所有的服務(wù)都是一個(gè)gattAttribute_t類型的array,在文件gatt.h.中定義肚吏。
4方妖、調(diào)用GAP和GATT的一般過(guò)程
API調(diào)用
協(xié)議棧響應(yīng)并返回
協(xié)議棧發(fā)送一個(gè)OSAL消息(數(shù)據(jù))去調(diào)用相應(yīng)任務(wù)事件
調(diào)用任務(wù)去接收和處理消息
消息清除
以設(shè)備初始化為GAP外設(shè)角色來(lái)舉例說(shuō)明,外設(shè)角色由其劇本(GAPperipheral role profile)來(lái)決定罚攀,實(shí)例程序在文件peripheral.c內(nèi)党觅。
調(diào)用API函數(shù)GAP_DeviceInit雌澄。
GAP檢查了一下說(shuō),好杯瞻,可以初始化镐牺,返回值為SUCCESS (0x00),并通知BLE干活魁莉。
BLE協(xié)議棧發(fā)送OSAL消息給外設(shè)角色劇本(peripheral roleprofile)睬涧,消息內(nèi)容包括要干什么(eventvalue)GAP_MSG_EVENT和指標(biāo)是什么(opcodevalue,參數(shù))旗唁。
角色劇本的服務(wù)任務(wù)就收到了事件請(qǐng)求SYS_EVENT_MSG畦浓,表示有消息來(lái)了。
角色劇本接收消息检疫,并拆看到底是什么事讶请,接著把消息數(shù)據(jù)轉(zhuǎn)換(cast)成具體要干事情,并完成相應(yīng)的工作(這里為gapDeviceInitDoneEvent_t)屎媳。
角色劇本清除消息并返回夺溢。
再舉一個(gè)例子:GATT客戶端設(shè)備想從GATT服務(wù)器端讀取數(shù)據(jù),即GATT出納想從GATT銀行那邊取點(diǎn)錢出來(lái)
應(yīng)用程序調(diào)用GATT子進(jìn)程API函數(shù)GATT_ReadCharValue烛谊,傳遞的參數(shù)為連接句柄风响、關(guān)鍵詞句柄和自身任務(wù)的ID。
GATT答應(yīng)了這個(gè)請(qǐng)求丹禀,返回值為SUCCESS (0x00)钞诡,向下告知BLE有活干了。
BLE協(xié)議棧在下次建立藍(lán)牙連接時(shí)湃崩,發(fā)送取錢的指令給銀行荧降,當(dāng)銀行說(shuō)好,我們正好有柜員沒事在干剪指甲攒读,于是把錢取出來(lái)交給了BLE朵诫。
BLE接著就把取到的錢包成消息(OSAL message),通過(guò)出納GATT返回給了應(yīng)用程序薄扁。消息內(nèi)包含GATT_MSG_EVENT和修改了的ATT_READ_RSP剪返。
應(yīng)用程序接收到了從OSAL來(lái)的SYS_EVENT_MSG事件,表示錢可能到了
應(yīng)用程序接收消息邓梅,拆包檢查脱盲,并把需要的錢拿走。
最后日缨,應(yīng)用程序把包裝袋銷毀钱反,沒事了,返回。
5面哥、GAP角色劇本profiles
在TI的BLE實(shí)例應(yīng)用中提供了3中GAP角色劇本哎壳,保衛(wèi)處角色,和幾種GATT出納/庫(kù)管示例程序服務(wù)角色尚卫。
5.1 GAP外設(shè)劇本
其API函數(shù)在peripheral.h中定義归榕,包括:
GAPROLE_ADVERT_ENABLED—廣播使能。
GAPROLE_ADVERT_DATA—包含在廣播里的信息吱涉。
GAPROLE_SCAN_RSP_DATA—外設(shè)用于回復(fù)主機(jī)掃描請(qǐng)求的信息刹泄。
GAPROLE_ADVERT_OFF_TIME—表示外設(shè)關(guān)閉廣播持續(xù)時(shí)間,該值為零表示無(wú)限期關(guān)閉廣播直到下一次廣播使能信號(hào)到來(lái)。
GAPROLE_PARAM_UPDATE_ENABLE—使能自動(dòng)更新連接參數(shù),可以讓外設(shè)連接失敗時(shí)自動(dòng)調(diào)整連接參數(shù)以便重新連接劈狐。
GAPROLE_MIN_CONN_INTERVAL—設(shè)置最小連接間隙,缺省值為80個(gè)單位(每單位1.25ms)。
GAPROLE_MIN_CONN_INTERVAL—設(shè)置最大連接間隙风科,缺省值為3200個(gè)單位撒轮。
GAPROLE_SLAVE_LATENCY—外設(shè)鄙視參數(shù),缺省為零贼穆。
GAPROLE_TIMEOUT_MULTIPLIER--最大耐心等待時(shí)間题山,缺省為1000個(gè)單位。
GAPRole_StartDevice函數(shù)用來(lái)初始化GAP外設(shè)角色故痊,其唯一的參數(shù)是gapRolesCBs_t顶瞳,這個(gè)參數(shù)是一個(gè)包含兩個(gè)函數(shù)指針的結(jié)構(gòu)體,這兩函數(shù)是pfnStateChange和pfnRssiRead愕秫,前者標(biāo)示狀態(tài)慨菱,后者標(biāo)示RSSI已經(jīng)被讀走了。
5.2 多角色同時(shí)扮演
前文5.1中設(shè)備配置為外設(shè)戴甩,這里以設(shè)備同時(shí)為外設(shè)和廣播員兩種角色符喝。方法為:去除前文外設(shè)的定義劇本peripheral.c和peripheral.h,添加新的劇本peripheralBroadcaster.c和peripheralBroadcaster.h甜孤;定義處理器值(preprocessorvalue)PLUS_BROADCASTER协饲。
5.3 GAP主機(jī)劇本
與外設(shè)劇本相似,主機(jī)劇本的API函數(shù)在central.h中定義缴川,包括GAPCentralRole_GetParameter和GAPCentralRole_SetParameter以及其他茉稠。如GAPROLE_PARAM_UPDATE_ENABLE連接參數(shù)自動(dòng)更新使能的功能,跟外設(shè)角色的一樣把夸。
GAPCentralRole_StartDevice函數(shù)用來(lái)初始化GAP主機(jī)角色而线,其唯一的參數(shù)是gapCentralRolesCBs_t,,這個(gè)參數(shù)是一個(gè)包含兩個(gè)函數(shù)指針的結(jié)構(gòu)體,這兩函數(shù)是eventCB和rssiCB吞获,每次GAP時(shí)間發(fā)生况凉,前者都會(huì)被調(diào)用,后者標(biāo)示RSSI已經(jīng)被讀走各拷。
5.4 GAP綁定管理器劇本
用于保持長(zhǎng)期的連接刁绒。同時(shí)支持外設(shè)配置和主機(jī)配置。當(dāng)建立了配對(duì)連接后烤黍,如果綁定使能知市,綁定管理器就維護(hù)這個(gè)連接。主要參數(shù)有:GAPBOND_PAIRING_MODE速蕊,GAPBOND_MITM_PROTECTION嫂丙,GAPBOND_IO_CAPABILITIES,GAPBOND_IO_CAP_DISPLAY_ONLY规哲,GAPBOND_BONDING_ENABLED
GAPBondMgr_Register函數(shù)用來(lái)初始化GAP主機(jī)角色跟啤,其唯一的參數(shù)是gapBondCBs_t,,這個(gè)參數(shù)是一個(gè)包含兩個(gè)函數(shù)指針的結(jié)構(gòu)體唉锌,這兩函數(shù)是pairStateCB和passcodeCB隅肥,前者返回狀態(tài),后者用于配對(duì)時(shí)產(chǎn)生6為數(shù)字口令(passcode)袄简。
5.5怎樣編寫一個(gè)劇本來(lái)創(chuàng)建(定義)新的角色(功能腥放、服務(wù))
以SimpleGATT Profile為劇本名稱,包含兩個(gè)文件simpleGATTProfile.c和simpleGATTProfile.h绿语。包含如下主要API函數(shù):
· SimpleProfile_AddService—用于初始化的進(jìn)程秃症,作用是添加服務(wù)句柄(serviceattributes)到句柄組(attributetable)內(nèi),寄存器讀取和回寫吕粹。
· SimpleProfile_SetParameter—設(shè)置劇本(profile)關(guān)鍵詞(characteristics)
· SimpleProfile_GetParameter—獲取獲取設(shè)置劇本關(guān)鍵詞
· SimpleProfile_RegisterAppCBs
· simpleProfile_ReadAttrCB
· simpleProfile_WriteAttrCB
· simpleProfile_HandleConnStatusCB
這個(gè)實(shí)例劇本共有5個(gè)關(guān)鍵詞:
· SIMPLEPROFILE_CHAR1
· …
· SIMPLEPROFILE_CHAR5
參考
https://mp.weixin.qq.com/s/NenJmVBVboD8bZaRluykwg
CC2540Bluetooth Low Energy Software Developer’s Guide (Rev. B)