BLE入門07 TI BLE

一、概述

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)

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末种柑,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子匹耕,更是在濱河造成了極大的恐慌莹规,老刑警劉巖,帶你破解...
    沈念sama閱讀 219,539評(píng)論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件泌神,死亡現(xiàn)場(chǎng)離奇詭異良漱,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī)欢际,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,594評(píng)論 3 396
  • 文/潘曉璐 我一進(jìn)店門母市,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人损趋,你說(shuō)我怎么就攤上這事患久。” “怎么了?”我有些...
    開封第一講書人閱讀 165,871評(píng)論 0 356
  • 文/不壞的土叔 我叫張陵蒋失,是天一觀的道長(zhǎng)返帕。 經(jīng)常有香客問我,道長(zhǎng)篙挽,這世上最難降的妖魔是什么荆萤? 我笑而不...
    開封第一講書人閱讀 58,963評(píng)論 1 295
  • 正文 為了忘掉前任,我火速辦了婚禮铣卡,結(jié)果婚禮上链韭,老公的妹妹穿的比我還像新娘。我一直安慰自己煮落,他們只是感情好敞峭,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,984評(píng)論 6 393
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著蝉仇,像睡著了一般旋讹。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上轿衔,一...
    開封第一講書人閱讀 51,763評(píng)論 1 307
  • 那天沉迹,我揣著相機(jī)與錄音,去河邊找鬼呀枢。 笑死胚股,一個(gè)胖子當(dāng)著我的面吹牛笼痛,可吹牛的內(nèi)容都是我干的裙秋。 我是一名探鬼主播,決...
    沈念sama閱讀 40,468評(píng)論 3 420
  • 文/蒼蘭香墨 我猛地睜開眼缨伊,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼摘刑!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起刻坊,我...
    開封第一講書人閱讀 39,357評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤枷恕,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后谭胚,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體徐块,經(jīng)...
    沈念sama閱讀 45,850評(píng)論 1 317
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,002評(píng)論 3 338
  • 正文 我和宋清朗相戀三年灾而,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了胡控。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 40,144評(píng)論 1 351
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡旁趟,死狀恐怖昼激,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤橙困,帶...
    沈念sama閱讀 35,823評(píng)論 5 346
  • 正文 年R本政府宣布瞧掺,位于F島的核電站,受9級(jí)特大地震影響凡傅,放射性物質(zhì)發(fā)生泄漏辟狈。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,483評(píng)論 3 331
  • 文/蒙蒙 一像捶、第九天 我趴在偏房一處隱蔽的房頂上張望上陕。 院中可真熱鬧,春花似錦拓春、人聲如沸释簿。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,026評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)庶溶。三九已至,卻和暖如春懂鸵,著一層夾襖步出監(jiān)牢的瞬間偏螺,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,150評(píng)論 1 272
  • 我被黑心中介騙來(lái)泰國(guó)打工匆光, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留套像,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 48,415評(píng)論 3 373
  • 正文 我出身青樓终息,卻偏偏與公主長(zhǎng)得像夺巩,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子周崭,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,092評(píng)論 2 355

推薦閱讀更多精彩內(nèi)容