日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程资源 > 编程问答 >内容正文

编程问答

【低功耗蓝牙BLE】连接事件和相关参数

發(fā)布時(shí)間:2023/12/20 编程问答 62 豆豆
生活随笔 收集整理的這篇文章主要介紹了 【低功耗蓝牙BLE】连接事件和相关参数 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

低功耗藍(lán)牙連接相關(guān)的知識(shí)

1、連接事件

在一個(gè)連接當(dāng)中,主設(shè)備會(huì)在每個(gè)連接事件里向從設(shè)備發(fā)送數(shù)據(jù)包。一個(gè)連接事件是指主設(shè)備和從設(shè)備之間相互發(fā)送數(shù)據(jù)包的過(guò)程。連接事件的進(jìn)行始終位于一個(gè)頻率,每個(gè)數(shù)據(jù)包會(huì)在上個(gè)數(shù)據(jù)包發(fā)完之后等待?150μs?再發(fā)送。

連接間隔決定了主設(shè)備與從設(shè)備的交互間隔;它是指兩個(gè)連續(xù)的連接事件開(kāi)始處的時(shí)間距離,可以是7.5ms ~ 4s內(nèi)的任意值,但必須為?1.25ms?的整數(shù)倍。要確定從設(shè)備與主設(shè)備的實(shí)際交互間隔,需要用到從設(shè)備延遲這一參數(shù),代表從設(shè)備在必須偵聽(tīng)之前可以忽略多少個(gè)連接事件。

如下圖所示,連接事件被一個(gè)個(gè)的連接間隔分開(kāi)。從主設(shè)備發(fā)送數(shù)據(jù)包開(kāi)始,每個(gè)連接事件可以持續(xù)進(jìn)行,直至主設(shè)備或從設(shè)備停止響應(yīng)。在連接事件之外,主從設(shè)備之間不發(fā)送任何數(shù)據(jù)包。

?

舉個(gè)例子,如果連接間隔為?100ms,從設(shè)備延遲是?9,那么從設(shè)備可以忽略?9?個(gè)鏈接事件,但不得不偵聽(tīng)第?10?個(gè)連接事件。換言之,從設(shè)備必須每秒偵聽(tīng)一次,而此時(shí)監(jiān)控超時(shí)的最小值應(yīng)為?1010ms。反過(guò)來(lái),另一個(gè)極端的例子是,如果監(jiān)控超時(shí)使用了?32s?的最大值,對(duì)于間隔為?100ms?的鏈路,從設(shè)備延時(shí)必須小于等于?319。

雖然如此,如果將從設(shè)備延遲設(shè)為可行的最大值,在監(jiān)控超時(shí)發(fā)生前從設(shè)備只能獲得唯一一次偵聽(tīng)主設(shè)備的機(jī)會(huì),這可不是一個(gè)好主意。因此,建議至少給從設(shè)備留出?6?次偵聽(tīng)的機(jī)會(huì)。在前面的例子中,如果連接間隔為?100ms?,從設(shè)備延遲為?9,那么監(jiān)控超時(shí)應(yīng)該至少為?6s,這樣一來(lái),鏈路在最終斷開(kāi)前從設(shè)備至少會(huì)有?6?次偵聽(tīng)的機(jī)會(huì)。

2、連接參數(shù)介紹

主設(shè)備和從設(shè)備建立連接之后,所有的數(shù)據(jù)通信都是在連接事件(Connection?Events)中進(jìn)行的。

尖刺的波就是連接事件(Connection?events),剩下的Sleeping是睡眠時(shí)間,設(shè)備在建立連接之后的大多數(shù)時(shí)間都是處于Sleeping,這種情況下耗電量比較低,而在連接事件(Connection?events)中,耗電量就相對(duì)高很多,這也是BLE為什么省電的原因之一。

每個(gè)連接事件(Connection?events)中,都需要由Master發(fā)起包,再由Slave回復(fù)。

Master即主機(jī),簡(jiǎn)稱M;Slave即從機(jī),簡(jiǎn)稱S。抓包過(guò)程中看到的M->S或者S->M即主機(jī)到從機(jī)或者從機(jī)到主機(jī)。

連接參數(shù) (Connection?Parameters):

通過(guò)修改下面三個(gè)參數(shù),就可以設(shè)置BLE連接過(guò)程中的傳輸速度和功耗。

1.Connection?Interval(連接間隔)

Connection?Interval(GAPROLE_MIN_CONN_INTERVAL?&&?GAPROLE_MAX_CONN_INTERVAL)連接間隔,在BLE的兩個(gè)設(shè)備的連接中使用跳頻機(jī)制。兩個(gè)設(shè)備使用特定的信道發(fā)送和接收數(shù)據(jù),然后過(guò)一段時(shí)間后再使用新的信道(BLE協(xié)議棧的鏈路層處理信道的切換)。兩個(gè)設(shè)備在切換信道后發(fā)送和接收數(shù)據(jù)稱為一個(gè)連接事件。盡管沒(méi)有應(yīng)用數(shù)據(jù)被發(fā)送和接收,兩個(gè)設(shè)備仍舊會(huì)交換鏈路層數(shù)據(jù)(空包 Empty?PDU)來(lái)維持連接。

這個(gè)連接間隔就是指在一個(gè)連接事件(Connection?events)的開(kāi)始到下一個(gè)連接事件(Connection?events)的開(kāi)始的時(shí)間間隔。連接間隔以1.25ms為單元,連接間隔的范圍是6?~?3200既7.5ms?~?4s之間。

2.Slave?Latency(從設(shè)備延遲或者從設(shè)備時(shí)延)

允許Slave(從設(shè)備)在沒(méi)有數(shù)據(jù)要發(fā)的情況下,跳過(guò)一定數(shù)目的連接事件(Connection?events),在這些連接事件(Connection?events)中不必回復(fù)Master(主設(shè)備)的包,這樣就能更加省電。

范圍可以是0 ~ 499

更詳細(xì)的使用解析如下:

Slave?Latency?=?OFF也就是Slave?Latency為0時(shí),Master發(fā)包,Slave必須回復(fù),如果不回復(fù),Master就會(huì)認(rèn)為Slave那邊接收不正常。

Slave?Latency?=?ON也就是Slave?Latency不為0的時(shí)候,圖中Slave?Latency為?3。Master發(fā)包,Slave沒(méi)有數(shù)據(jù)要回復(fù)的時(shí)候,就會(huì)忽略?3?個(gè)連接事件,在第?4?個(gè)連接事件接收到Master發(fā)送的數(shù)據(jù)之后,回復(fù)Master。如果Slave有數(shù)據(jù)要發(fā)送就會(huì)喚醒,也就是說(shuō)即使Slave?Latency為?3,但是在Master發(fā)第二包的時(shí)候Slave有數(shù)據(jù)要回復(fù),這個(gè)時(shí)候就會(huì)立即回復(fù)Master而不是等到?3?個(gè)連接事件之后的第?4?個(gè)連接事件去回復(fù)。

3.Supervision?Timeout(超時(shí)時(shí)間或者監(jiān)控超時(shí))

這個(gè)參數(shù)設(shè)定了一個(gè)超時(shí)時(shí)間,如果BLE在這個(gè)時(shí)間內(nèi)沒(méi)有發(fā)生通信的話,就會(huì)自動(dòng)斷開(kāi)。

單位是?10ms,該變量的范圍是10 ~ 3200,折算成時(shí)間范圍是100ms ~ 32s?。

連接間隔、從機(jī)時(shí)延以及超時(shí)時(shí)間這三者必須滿足如下公式:

Supervision?Timeout ?>?(1?+slaveLatency)*?(connectionInterval)

上述公式必須滿足,否則連接就會(huì)不正常斷開(kāi)。

這三個(gè)連接參數(shù)不同情況下對(duì)通信速率和功耗的影響:

1.Connection?Interval縮短,Master和Slave通信更加頻繁,提高數(shù)據(jù)吞吐速度,縮短了數(shù)據(jù)發(fā)送的時(shí)間,當(dāng)然也增加了功耗。

2.Connection?Interval增長(zhǎng),通信頻率降低,數(shù)據(jù)吞吐速度降低,增加了數(shù)據(jù)發(fā)送的時(shí)間,當(dāng)然,這種設(shè)置降低了功耗。

3.Slave?Latency減少或者設(shè)置為?0,每次Connection?Events中都需要回復(fù)Master的包,功耗會(huì)上升,數(shù)據(jù)發(fā)送速度會(huì)提高。

4.Slave?Latency加長(zhǎng),功耗下降,數(shù)據(jù)發(fā)送速度降低。

3、連接參數(shù)更新規(guī)程

連接建立時(shí),主設(shè)備通過(guò)鏈接請(qǐng)求數(shù)據(jù)包發(fā)送連接參數(shù)。當(dāng)連接活躍了一段時(shí)間,連接參數(shù)也許不再適用于當(dāng)前使用的服務(wù)。出于提高效率的目的,連接參數(shù)需要進(jìn)行更新。較之首先斷開(kāi)連接、接著更換新參數(shù)重新連接,還有一種在鏈路中更新參數(shù)更為簡(jiǎn)單的途徑,如下圖所示:

為此,主設(shè)備向從設(shè)備發(fā)送連接更新請(qǐng)求,即LL_CONNECTION_UPDATE_REQ,當(dāng)中攜帶了新的參數(shù)。這些參數(shù)不必進(jìn)行協(xié)商,從設(shè)備或者接受和使用它們,或者斷開(kāi)鏈路。連接更新請(qǐng)求中包含了早先創(chuàng)建連接時(shí)用過(guò)的一部分參數(shù),還有一個(gè)稱為瞬時(shí)(instant)的新參數(shù):

1.傳輸窗口大小

2.傳輸窗口偏移量

3.連接間隔

4.從設(shè)備延遲

5.監(jiān)控超時(shí)

6.瞬時(shí)

瞬時(shí)參數(shù)決定了連接更新的開(kāi)始時(shí)刻。發(fā)送消息時(shí),主設(shè)備為連接更新選定一個(gè)未來(lái)的時(shí)間點(diǎn),并且放在消息中。接到消息后,從設(shè)備會(huì)記住這個(gè)未來(lái)的時(shí)刻,屆時(shí)再切換至新的連接參數(shù)。這有助于解決無(wú)線系統(tǒng)里的一個(gè)最大問(wèn)題----報(bào)文重傳。只要數(shù)據(jù)包的重傳次數(shù)足夠,并最終在瞬時(shí)之前傳輸成功,上述過(guò)程執(zhí)行起來(lái)就不會(huì)有問(wèn)題。但是,如果該數(shù)據(jù)包屆時(shí)沒(méi)能完成傳輸,鏈路就有可能丟失。

由于低功耗藍(lán)牙沒(méi)有時(shí)鐘,要決定瞬時(shí)時(shí)刻只有依靠計(jì)算連接事件的個(gè)數(shù)。因此,每一個(gè)連接事件都會(huì)被計(jì)數(shù),鏈路上的第一個(gè)連接事件,也就是在連接請(qǐng)求之后的位于首個(gè)傳輸窗口里的連接事件記為?0。因此,瞬時(shí)實(shí)際上是一個(gè)連接事件的計(jì)數(shù)器,相應(yīng)的連接事件到來(lái)時(shí)就使用新的參數(shù)。為了讓從設(shè)備收到數(shù)據(jù)包,主設(shè)備必須為其提供足夠的機(jī)會(huì)。不過(guò)從設(shè)備延遲是多少,都應(yīng)該至少保證 6 次數(shù)據(jù)發(fā)送機(jī)會(huì)。也就是說(shuō),如果從設(shè)備延遲為?500ms,那么瞬時(shí)通常被設(shè)定在?3s?之后的某個(gè)未來(lái)時(shí)刻。

瞬時(shí)到來(lái)時(shí),從設(shè)備開(kāi)始偵聽(tīng)發(fā)送窗口,就好像連接建立的過(guò)程那樣。主設(shè)備能夠調(diào)整從設(shè)備的計(jì)時(shí),總體而言不超過(guò)?1.25ms。不過(guò),由于主設(shè)備可能還是一個(gè)經(jīng)典藍(lán)牙設(shè)備,上述調(diào)整使其得以協(xié)調(diào)低功耗藍(lán)牙從設(shè)備,從而更好地完成調(diào)度。一旦該過(guò)程結(jié)束,新的連接間隔、監(jiān)控超時(shí)、從設(shè)備延遲值將投入使用。

4、連接參數(shù)的修改

“連接參數(shù)更新請(qǐng)求”命令可以讓從設(shè)備更新鏈路層的連接參數(shù),如下圖所示。這些參數(shù)包括連接間隔(從設(shè)備希望主設(shè)備允許從設(shè)備發(fā)送數(shù)據(jù)包的頻率)、從設(shè)備延遲(從設(shè)備能夠忽略主設(shè)備的連接事件的最大值)以及監(jiān)控超時(shí)。

在連接中,如果從設(shè)備希望修改當(dāng)前的連接參數(shù)則可以使用該命令。比方說(shuō),如果連接事件的間隔有可能太快了,導(dǎo)致過(guò)多的電量浪費(fèi)。這在從設(shè)備時(shí)延很大時(shí)沒(méi)有問(wèn)題,但如果不是這樣,從設(shè)備將會(huì)頻繁的偵聽(tīng)鏈路。這在一些情況下是必要的,例如設(shè)備間首次綁定、互發(fā)多個(gè)數(shù)據(jù)包、探索服務(wù)和設(shè)備特性等。但在很多其他情況下,盡可能地減少?gòu)脑O(shè)備必須偵聽(tīng)連接事件的數(shù)量對(duì)提高電池壽命至關(guān)重要。

連接參數(shù)更新請(qǐng)求命令僅用于從設(shè)備向主設(shè)備發(fā)送,這是由于主設(shè)備隨時(shí)都能啟動(dòng)鏈路層連接參數(shù)更新控制(Connection?Parameter?Update?Control)規(guī)程。如果該命令由主設(shè)備發(fā)送,從設(shè)備會(huì)將其視為一個(gè)錯(cuò)誤,并返回帶有“命令不理解”原因代碼的“命令拒絕”命令。

從設(shè)備可以在任何時(shí)候發(fā)送該命令;收到該信息的主設(shè)備如果可以修改連接參數(shù),則將返回“連接參數(shù)更新響應(yīng)”(Connection?Parameter?Update?Response),其中的結(jié)果代碼設(shè)為“接受(accepted)”。隨后,主設(shè)備將會(huì)啟動(dòng)鏈路層連接參數(shù)更新控制規(guī)程。

當(dāng)然,如果主設(shè)備不同意從設(shè)備的請(qǐng)求參數(shù),它可以發(fā)送結(jié)果代碼為“拒絕(rejected)”的連接參數(shù)更新響應(yīng)命令以拒絕請(qǐng)求。此時(shí)從設(shè)備有兩個(gè)選擇:要么接受主設(shè)備希望的正在使用的連接參數(shù),要么終止連接。終止連接的做法咋看起來(lái)可能讓人覺(jué)得很激進(jìn),但是,假如使用當(dāng)前的參數(shù)從設(shè)備將會(huì)在一周內(nèi)耗盡電量,而使用請(qǐng)求的參數(shù)則可以持續(xù)數(shù)年,很明顯,合理的選擇只有一個(gè)。

修改連接參數(shù)時(shí),如果要減少主設(shè)備拒絕從設(shè)備請(qǐng)求的可能性,可以在請(qǐng)求里設(shè)置一個(gè)可接受的參數(shù)范圍。經(jīng)過(guò)精心設(shè)計(jì)的從設(shè)備會(huì)樂(lè)意接受很寬的參數(shù)范圍。由于主設(shè)備可能正忙于實(shí)時(shí)會(huì)話音頻連接或者高質(zhì)量語(yǔ)音連接等任務(wù),它可以接受一定范圍內(nèi)的連接間隔參數(shù)。設(shè)備可接受的間隔參數(shù)會(huì)根據(jù)當(dāng)前任務(wù)的不同而不同,可能有別于上一次設(shè)備連接時(shí)的參數(shù)。

要提高主設(shè)備接受連接參數(shù)的機(jī)率,還有個(gè)方法是從設(shè)備提供一個(gè)合理的從設(shè)備延遲。主設(shè)備可以選擇最合適的連接事件間隔,從設(shè)備則使用最佳功耗的從設(shè)備延遲參數(shù)。

舉個(gè)例子,如果從設(shè)備想每?600ms?同步一次,它可以請(qǐng)求范圍?100ms ~ 750ms?的連接間隔參數(shù),并帶上從設(shè)備延遲5。如果主設(shè)備選擇?100ms,則從設(shè)備每6個(gè)連接事件同步一次;如果主設(shè)備選擇?200ms,則從設(shè)備每?3?個(gè)連接事件同步一次,實(shí)現(xiàn)其所期望的?600ms?間隔;如果主設(shè)備選擇?300ms,則從設(shè)備忽略每隔一個(gè)連接事件同步一次;如果主設(shè)備選擇?400ms,則從設(shè)備每?400ms?同步一次。

下面介紹一下在TI的CC2540和CC2541中,連接參數(shù)修改的方法。

(一)連接成功建立之后從設(shè)備自動(dòng)申請(qǐng)修改連接參數(shù)。

我們以TI 1.4.0協(xié)議棧中的“simpleBLEPeripheral”工程為例來(lái)進(jìn)行講解,在這個(gè)工程的“Projects\ble\SimpleBLEPeripheral\Source\simpleBLEPeripheral.c”應(yīng)用文件中定義了如下的宏:

?

  • // Whether to enable automatic parameter update request when a connection is formed

  • #define DEFAULT_ENABLE_UPDATE_REQUEST TRUE

  • ?

    ?

    從上面的注釋中,我們可以看出這個(gè)宏的作用是當(dāng)一個(gè)連接建立的時(shí)候,是否需要自動(dòng)申請(qǐng)連接參數(shù)更新。當(dāng)設(shè)置為“TRUE”的時(shí)候就是需要,當(dāng)設(shè)置為“FALSE”的時(shí)候就是不需要。那這個(gè)宏到底是如何起作用的呢?下面我們來(lái)看一下。

    ?

    1.“Projects\ble\SimpleBLEPeripheral\Source\simpleBLEPeripheral.c”應(yīng)用文件中的“SimpleBLEPeripheral_Init”初始化方法里對(duì)該宏進(jìn)行了處理,源碼如下:

    ?

  • uint8 enable_update_request = DEFAULT_ENABLE_UPDATE_REQUEST;

  • GAPRole_SetParameter( GAPROLE_PARAM_UPDATE_ENABLE, sizeof( uint8 ), &enable_update_request );

  • ?

    ?

    2.我們看下“GAPRole_SetParameter”方法里面的相關(guān)的操作,相關(guān)操作在“Projects\ble\Profiles\Roles\peripheral.c”文件里,源碼如下:

    ?

  • case GAPROLE_PARAM_UPDATE_ENABLE:

  • if ( (len == sizeof ( uint8 )) && (*((uint8*)pValue) <= TRUE) )

  • {

  • gapRole_ParamUpdateEnable = *((uint8*)pValue);

  • }

  • else

  • {

  • ret = bleInvalidRange;

  • }

  • break;

  • ?

    ?

    3.從上面的代碼不難看出,將我們?cè)O(shè)置的宏賦給了“gapRole_ParamUpdateEnable”全局變量,下面我們?cè)诒疚募兴阉饕幌略撊肿兞渴褂玫牡胤?#xff0c;發(fā)現(xiàn)在如下源碼中用到了:

    ?

  • // 連接成功建立之后底層返回的事件

  • case GAP_LINK_ESTABLISHED_EVENT:

  • {

  • gapEstLinkReqEvent_t *pPkt = (gapEstLinkReqEvent_t *)pMsg;

  • ?
  • if ( pPkt->hdr.status == SUCCESS )

  • {

  • VOID osal_memcpy( gapRole_ConnectedDevAddr, pPkt->devAddr, B_ADDR_LEN );

  • gapRole_ConnectionHandle = pPkt->connectionHandle;

  • gapRole_state = GAPROLE_CONNECTED;

  • ?
  • if ( gapRole_RSSIReadRate )

  • {

  • // Start the RSSI Reads

  • VOID osal_start_timerEx( gapRole_TaskID, RSSI_READ_EVT, gapRole_RSSIReadRate );

  • }

  • ?
  • // Store connection information

  • // 保存連接剛建立時(shí)的連接參數(shù)

  • gapRole_ConnInterval = pPkt->connInterval;

  • gapRole_ConnSlaveLatency = pPkt->connLatency;

  • gapRole_ConnTimeout = pPkt->connTimeout;

  • ?
  • // Check whether update parameter request is enabled

  • // 檢測(cè)更新連接參數(shù)請(qǐng)求是否被使能

  • if ( gapRole_ParamUpdateEnable == TRUE )

  • {

  • // Get the minimum time upon connection establishment before the

  • // peripheral can start a connection update procedure.

  • // 獲取設(shè)置的時(shí)間間隔,從機(jī)將在連接建立之后

  • // 延時(shí)至少該時(shí)間間隔之后觸發(fā)連接參數(shù)更新事

  • // 件。

  • uint16 timeout = GAP_GetParamValue( TGAP_CONN_PAUSE_PERIPHERAL );

  • ?
  • // 在延時(shí)timeout*1000 ms之后觸發(fā)連接參數(shù)更新事件

  • osal_start_timerEx( gapRole_TaskID, START_CONN_UPDATE_EVT, timeout*1000 );

  • }

  • ?

    ?

    4.上面的注釋非常清楚了,在連接成功建立返回的事件中判斷我們?cè)O(shè)置的宏,如果設(shè)置為“TRUE”,那就獲取我們?cè)O(shè)置的時(shí)間間隔,在延時(shí)我們?cè)O(shè)置的時(shí)間間隔(上面注釋中提到至少,因?yàn)橛玫氖窍到y(tǒng)定時(shí)器,有可能在執(zhí)行別的事件,所以實(shí)際的延時(shí)時(shí)間會(huì)大于我們?cè)O(shè)置的時(shí)間,當(dāng)然,一般情況下偏移的那點(diǎn)時(shí)間是可以忽略的)之后,觸發(fā)連接參數(shù)更新事件,進(jìn)行連接參數(shù)的更新。那上面源碼中獲取的時(shí)間間隔以及后面要更新的連接參數(shù)是在什么地方設(shè)置的呢?下面我們繼續(xù)回到應(yīng)用層文件中查看相關(guān)設(shè)置。

    ?

    5.在“Projects\ble\SimpleBLEPeripheral\Source\simpleBLEPeripheral.c”文件中定義了如下宏用來(lái)設(shè)置自動(dòng)更新連接參數(shù)時(shí),相關(guān)連接參數(shù)的值,源碼如下:

    ?

  • // Minimum connection interval (units of 1.25ms, 80=100ms) if automatic parameter update request is enabled

  • // 如果自動(dòng)更新連接參數(shù)請(qǐng)求被使能的話,用到的最小連接間隔,單位1.25 ms

  • #define DEFAULT_DESIRED_MIN_CONN_INTERVAL 80

  • ?
  • // Maximum connection interval (units of 1.25ms, 800=1000ms) if automatic parameter update request is enabled

  • // 如果自動(dòng)更新連接參數(shù)請(qǐng)求被使能的話,用到的最大連接間隔,單位1.25 ms

  • #define DEFAULT_DESIRED_MAX_CONN_INTERVAL 800

  • ?
  • // Slave latency to use if automatic parameter update request is enabled

  • // 如果自動(dòng)更新連接參數(shù)請(qǐng)求被使能的話,用到的從機(jī)時(shí)延

  • #define DEFAULT_DESIRED_SLAVE_LATENCY 0

  • ?
  • // Supervision timeout value (units of 10ms, 1000=10s) if automatic parameter update request is enabled

  • // 如果自動(dòng)更新連接參數(shù)請(qǐng)求被使能的話,用到的超時(shí)時(shí)間,單位10 ms

  • #define DEFAULT_DESIRED_CONN_TIMEOUT 1000

  • ?
  • // Connection Pause Peripheral time value (in seconds)

  • // 如果自動(dòng)更新連接參數(shù)請(qǐng)求被使能的話,用到的時(shí)間間隔,單位s

  • #define DEFAULT_CONN_PAUSE_PERIPHERAL 6

  • ?

    ?

    6.通過(guò)上述宏進(jìn)行相應(yīng)設(shè)置的地方在“Projects\ble\SimpleBLEPeripheral\Source\simpleBLEPeripheral.c”文件的“SimpleBLEPeripheral_Init”初始化方法中,源碼如下:

    ?

  • VOID GAP_SetParamValue( TGAP_CONN_PAUSE_PERIPHERAL, DEFAULT_CONN_PAUSE_PERIPHERAL );

  • ?
  • uint16 desired_min_interval = DEFAULT_DESIRED_MIN_CONN_INTERVAL;

  • uint16 desired_max_interval = DEFAULT_DESIRED_MAX_CONN_INTERVAL;

  • uint16 desired_slave_latency = DEFAULT_DESIRED_SLAVE_LATENCY;

  • uint16 desired_conn_timeout = DEFAULT_DESIRED_CONN_TIMEOUT;

  • ?
  • GAPRole_SetParameter( GAPROLE_MIN_CONN_INTERVAL, sizeof( uint16 ), &desired_min_interval );

  • GAPRole_SetParameter( GAPROLE_MAX_CONN_INTERVAL, sizeof( uint16 ), &desired_max_interval );

  • GAPRole_SetParameter( GAPROLE_SLAVE_LATENCY, sizeof( uint16 ), &desired_slave_latency );

  • GAPRole_SetParameter( GAPROLE_TIMEOUT_MULTIPLIER, sizeof( uint16 ), &desired_conn_timeout );

  • ?

    ?

    上述操作在“Projects\ble\Profiles\Roles\peripheral.c”文件里的具體實(shí)現(xiàn)我們就不一起看了,因?yàn)槔锩嫫鋵?shí)就是一個(gè)賦值的過(guò)程,所以大家自行查看即可。

    ?

    (二)連接成功建立之后從設(shè)備在需要的時(shí)候去修改某個(gè)連接參數(shù)或者全部的連接參數(shù)。

    1.修改單個(gè)連接參數(shù)的方法

    修改最小連接間隔

    ?

  • uint16 desired_min_interval = DEFAULT_DESIRED_MIN_CONN_INTERVAL;

  • GAPRole_SetParameter( GAPROLE_MIN_CONN_INTERVAL, sizeof( uint16 ), &desired_min_interval );

  • ?

    ?

    修改最大連接間隔

  • uint16 desired_max_interval = DEFAULT_DESIRED_MAX_CONN_INTERVAL;

  • GAPRole_SetParameter( GAPROLE_MAX_CONN_INTERVAL, sizeof( uint16 ), &desired_max_interval );

  • ?

    修改從設(shè)備延遲

  • uint16 desired_slave_latency = DEFAULT_DESIRED_SLAVE_LATENCY;

  • GAPRole_SetParameter( GAPROLE_SLAVE_LATENCY, sizeof( uint16 ), &desired_slave_latency );

  • ?

    修改超時(shí)時(shí)間

  • uint16 desired_conn_timeout = DEFAULT_DESIRED_CONN_TIMEOUT;

  • GAPRole_SetParameter( GAPROLE_TIMEOUT_MULTIPLIER, sizeof( uint16 ), &desired_conn_timeout );

  • ?

    2.所有連接參數(shù)一起修改的方法

  • uint16 minConnInterval;

  • uint16 maxConnInterval;

  • uint16 slaveLatency;

  • uint16 timeoutMultiplier;

  • ?
  • // Update connection parameters

  • GAPRole_SendUpdateParam( minConnInterval, maxConnInterval, slaveLatency, timeoutMultiplier, GAPROLE_TERMINATE_LINK);

  • ?

    GAPRole_SendUpdateParam傳入的前四個(gè)參數(shù)在之前都已經(jīng)介紹過(guò)了,下面介紹下最后一個(gè)參數(shù),最后一個(gè)參數(shù)設(shè)置的是連接參數(shù)更新失敗后的操作,可取值定義在peripheral.h文件中,如下:

    ?

  • /**

  • * Possible actions the peripheral device may take if an unsuccessful parameter

  • * update is received.

  • *

  • * Parameters for GAPRole_SendUpdateParam() only

  • */

  • ?
  • #define GAPROLE_NO_ACTION 0 // Take no action upon unsuccessful parameter updates

  • #define GAPROLE_RESEND_PARAM_UPDATE 1 // Continue to resend request until successful update

  • #define GAPROLE_TERMINATE_LINK 2 // Terminate link upon unsuccessful parameter updates

  • ?

    ?

    GAPROLE_NO_ACTION:沒(méi)有任何動(dòng)作

    GAPROLE_RESEND_PARAM_UPDATE:重新發(fā)送參數(shù)更新請(qǐng)求

    GAPROLE_TERMINATE_LINK:斷開(kāi)連接

    ?

    對(duì)于上述介紹的兩種修改連接參數(shù)的方法,個(gè)人建議還是采用第二種方法,因?yàn)榈谝环N方法在修改某一個(gè)參數(shù)的時(shí)候,可能會(huì)導(dǎo)致其他參數(shù)的變化,比如我們只修改了連接間隔,但從機(jī)延時(shí)可能會(huì)隨之改變,這樣我們就無(wú)法根據(jù)自己的需求控制連接參數(shù)的更新。

    ?

    第二種方法在使用的時(shí)候有可能碰到一種情況,就是我們只想修改某一個(gè)或者某兩個(gè)連接參數(shù),剩下的參數(shù)想保持原有的,這樣的話,我們需要在修改連接參數(shù)之前先去讀取連接參數(shù),然后將需要修改的參數(shù)進(jìn)行重新設(shè)置即可,讀取連接參數(shù)的代碼如下:

  • uint16 interval;

  • uint16 latency;

  • uint16 timeout;

  • GAPRole_GetParameter(GAPROLE_CONN_INTERVAL, &interval);

  • GAPRole_GetParameter(GAPROLE_CONN_LATENCY, &latency);

  • GAPRole_GetParameter(GAPROLE_CONN_TIMEOUT, &timeout);

  • ?

    下面我們通過(guò)一個(gè)實(shí)例來(lái)具體了解下連接參數(shù)修改的方法,需求是將連接間隔修改為25,從機(jī)延遲修改為8,超時(shí)時(shí)間不修改,更新失敗后重新發(fā)送參數(shù)更新請(qǐng)求,本實(shí)例中主設(shè)備是安卓設(shè)備,從設(shè)備是CC2541。代碼實(shí)現(xiàn)如下:

  • uint16 interval;

  • uint16 latency;

  • uint16 timeout;

  • ?
  • GAPRole_GetParameter(GAPROLE_CONN_INTERVAL, &interval);

  • GAPRole_GetParameter(GAPROLE_CONN_LATENCY, &latency);

  • GAPRole_GetParameter(GAPROLE_CONN_TIMEOUT, &timeout);

  • ?
  • GAPRole_SendUpdateParam( 25, 25, 8, timeout, GAPROLE_RESEND_PARAM_UPDATE);

  • 該過(guò)程抓包顯示如下:

    ?

    從抓到的包中我們看到首先是S->M,即從設(shè)備發(fā)送連接參數(shù)更新請(qǐng)求,請(qǐng)求中帶有申請(qǐng)的連接參數(shù),然后M->S,即主設(shè)備返回連接參數(shù)更新響應(yīng),Result為0,表示同意修改更新。最后M->S發(fā)送Data?type為Control的鏈路層連接參數(shù)更新控制規(guī)程,攜帶同意的連接參數(shù),這樣,新的連接參數(shù)就會(huì)投入使用。

    注意修改連接參數(shù)的時(shí)候要滿足一定的要求:

    1.安卓設(shè)備作主設(shè)備時(shí),連接參數(shù)滿足的要求見(jiàn)本篇博文第二節(jié)“連接參數(shù)介紹”中提到的內(nèi)容。另外實(shí)際開(kāi)發(fā)過(guò)程中發(fā)現(xiàn)安卓設(shè)備作主設(shè)備時(shí)存在一個(gè)問(wèn)題,就是部分安卓設(shè)備連接BLE設(shè)備之后,只能進(jìn)行一次連接參數(shù)的修改。

    2. 蘋(píng)果系統(tǒng)設(shè)備作主設(shè)備時(shí),連接參數(shù)更新的要求比較苛刻,如下:

    Interval?Max?*?(Slave?Latency?+?1)?≤?2?seconds

    Interval?Min?≥?20?ms

    Interval?Min?+?20?ms?≤?Interval?Max

    Slave?Latency?≤?4

    connSupervisionTimeout?≤?6?seconds

    Interval?Max?*?(Slave?Latency?+?1)?*?3?<?connSupervisionTimeout

    即:

    最大連接間隔時(shí)間 *(從機(jī)延遲?+?1)?≤?2s

    最小連接間隔時(shí)間 ≥?20?ms

    最小連接間隔時(shí)間 +?20?ms?≤?最大連接間隔時(shí)間

    從機(jī)延遲?≤?4

    超時(shí)時(shí)間?≤?6s

    最大連接間隔時(shí)間 *(從機(jī)延遲?+?1)*?3??<?超時(shí)時(shí)間

    所以如果你的BLE從設(shè)備需要被IOS主設(shè)備連接,那你的BLE從設(shè)備的默認(rèn)申請(qǐng)的連接參數(shù)一定要滿足上述要求,并且連接過(guò)程中修改連接參數(shù)的時(shí)候也要滿足上述要求。

    ?

    總結(jié)

    以上是生活随笔為你收集整理的【低功耗蓝牙BLE】连接事件和相关参数的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

    如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。