BLE 連接參數(shù)(原文)
有幾個(gè)參數(shù)影響中央和外圍設(shè)備之間的連接。 這反過來影響設(shè)備的功耗:設(shè)備上的無(wú)線電活動(dòng)越多,消耗就越大。
setAdvertisingInterval()
當(dāng)外圍設(shè)備處于廣告模式時(shí),它以固定的間隔發(fā)送短達(dá)20毫秒或長(zhǎng)達(dá)10.28秒的廣告包。 短時(shí)間間隔允許中央設(shè)備快速找到外設(shè),但由于需要頻繁的無(wú)線電工作,因此功耗較高。 因此,它是速度和電池使用時(shí)間之間的平衡。
廣告間隔完全在外圍設(shè)備的控制之下。 這與其他連接參數(shù)不同,如下所示,哪些參數(shù)是中央設(shè)備可以忽略的建議。
間隔使用BLE_API的這個(gè)BLEDevice類中的setAdvertisingInterval()函數(shù)設(shè)置。 該函數(shù)接受以毫秒為單位的值。
ble.setAdvertisingInterval(1000); // one second
注意:
1. 如果設(shè)置為0,廣告將被禁用。
2. 當(dāng)連接模式為ADV_CONNECTABLE_DIRECTED(意味著只接受來自預(yù)先定義的中央設(shè)備的連接)時(shí),應(yīng)將其設(shè)置為0(即禁用)。
3. 如果設(shè)置的值低于最小值(20),則會(huì)自動(dòng)使用最小值。
連接間隔和從設(shè)備延遲(Connection interval and slave latency)
當(dāng)外圍設(shè)備和中央設(shè)備之間的連接建立(連接模式)時(shí),中心決定與外設(shè)同步的頻率(how often)。 這個(gè)決定是單方面的:外圍設(shè)備不能對(duì)中央強(qiáng)制任何東西。 但是,它可以提出中央可能選擇尊重的建議。
外設(shè)的建議是使用三個(gè)參數(shù): MIN_CONN_INTERVAL (最短間隔)和MAX_CONN_INTERVAL (最長(zhǎng)間隔),它們一起描述了間隔范圍; 以及SLAVE_LATENCY,它定義了外設(shè)可以忽略連接事件的次數(shù)。
連接間隔(Connection interval)
間隔(interval)參數(shù)以毫秒為單位接收值。 例如,以下代碼表示最短間隔時(shí)間為250毫秒,最長(zhǎng)時(shí)間為350毫秒:
#define MIN_CONN_INTERVAL 250 //250 milliseconds
#define MAX_CONN_INTERVAL 350 //350 milliseconds
連接間隔不能小于7.5毫秒或長(zhǎng)于4秒。 中央將選擇由外設(shè)建議的最小值和最大值之間的值,或強(qiáng)制實(shí)現(xiàn)其自身的值。 重要的是要明白,雖然外設(shè)可以建議一個(gè)范圍(兩個(gè)值),但最終只能使用一個(gè)值。 這是因?yàn)橥奖旧肀仨毷冀K以固定的間隔發(fā)生,而不是范圍上的隨機(jī)點(diǎn)。 這兩個(gè)參數(shù)僅在外圍設(shè)備向中心提供一個(gè)范圍時(shí)使用。 當(dāng)中央選擇一個(gè)值時(shí),它存儲(chǔ)在一個(gè)新變量中,連接僅指該變量。
連接間隔(Connection interval)是一個(gè)誤導(dǎo)性的名稱; 在每個(gè)連接事件中并不會(huì)重新嘗試新的連接。 相反,在正在進(jìn)行的連接的上下文中,連接事件允許雙方發(fā)送和接收數(shù)據(jù)。具體來說,如果有任何狀態(tài)更改要報(bào)告,BLE設(shè)備有機(jī)會(huì)向客戶端發(fā)送通知。
從設(shè)備延遲 (Slave latency)
理想情況下,當(dāng)BLE設(shè)備(特別是外圍設(shè)備)處于非活動(dòng)狀態(tài)時(shí),需要睡眠才能保持電池。 這意味著它不想處理信息或響應(yīng)連接事件。 但是,客戶端(通常是可充電電話或平板電腦)通常較少受限制,可能會(huì)想頻繁地與外設(shè)同步以保持最新狀態(tài)。 因此,它將不斷地啟動(dòng)連接事件(connection events),喚醒外設(shè)。 當(dāng)外設(shè)回答客戶端時(shí),盡管沒有新的信息,它也浪費(fèi)了大量的精力。
減輕這種情況的一種方法是使用SLAVE_LATENCY參數(shù)。 此參數(shù)由中央設(shè)備設(shè)置,但外設(shè)可以根據(jù)自己的操作知道提出建議。SLAVE_LATENCY允許外設(shè)根據(jù)新數(shù)據(jù)的存在來處理連接事件:
如果沒有要發(fā)送的新數(shù)據(jù),外設(shè)可以忽略參數(shù)中指定數(shù)量的連續(xù)連接事件。 這意味著外設(shè)可以繼續(xù)睡眠,盡管客戶端嘗試同步。
即使沒有新數(shù)據(jù),外設(shè)仍然必須定期響應(yīng)客戶端,以證明連接仍然存在。
如果有新的數(shù)據(jù)要發(fā)送,外設(shè)將響應(yīng)一個(gè)連接事件,無(wú)論自從上一次響應(yīng)事件以來已經(jīng)有多長(zhǎng)時(shí)間了。
SLAVE_LATENCY參數(shù)接受一個(gè)整數(shù),指定可以忽略的連接事件數(shù)。 例如,以下代碼意味著設(shè)備可以忽略四個(gè)連續(xù)的連接事件,但必須響應(yīng)第五個(gè)連接事件:
#define SLAVE_LATENCY 4 // four events can be ignored, the fifth must be met
SLAVE_LATENCY和MIN_CONN_INTERVAL之間的區(qū)別是狀態(tài)依賴。 MIN_CONN_INTERVAL是獨(dú)立于狀態(tài)的:即使有新的數(shù)據(jù)要發(fā)送也是如此。 SLAVE_LATENCY與狀態(tài)相關(guān) :僅當(dāng)外圍設(shè)備沒有數(shù)據(jù)時(shí)才使用。 這些參數(shù)的組合使我們可以有條件地控制我們的無(wú)線電使用情況:當(dāng)有新的信息時(shí),我們會(huì)經(jīng)常進(jìn)行通信,但是當(dāng)沒有信息時(shí)很少。 一個(gè)很好的例子是BLE鼠標(biāo)。 為了節(jié)省能源,當(dāng)用戶沒有移動(dòng)鼠標(biāo)時(shí),我們不想經(jīng)常使用射頻。 但是為了方便使用,當(dāng)用戶使用鼠標(biāo)時(shí),我們不希望緩慢的通信(慢速通信會(huì)使鼠標(biāo)落后于用戶的操作)。 因此,我們將設(shè)置一個(gè)高延遲,但是最小連接間隔很小。
注意: SLAVE_LATENCY的最大值取決于您使用的堆棧。檢查您的供應(yīng)商的規(guī)格。
把它們放在一起
這是一個(gè)描述外設(shè)和中央之間的交互的圖。 請(qǐng)注意,在本例中,我們命名了連接間隔connectionInterval
的變量:
連接監(jiān)控超時(shí)
有時(shí)設(shè)備會(huì)丟失它們之間的連接,例如當(dāng)它們移出彼此的傳輸范圍時(shí)。 這些設(shè)備不知道連接是否丟失,但是如果沒有從另一方接收到任何信息,他們可以假設(shè)已經(jīng)有足夠的時(shí)間了。 我們定義為“足夠”以確定連接丟失的時(shí)間稱為超時(shí) 。 連接監(jiān)控超時(shí)(Connection Supervision Timeout)參數(shù)定義為在假設(shè)連接丟失之前等待數(shù)據(jù)傳輸?shù)臅r(shí)間。
在我們的示例中,此參數(shù)稱為CON??N_SUP_TIMEOUT,并以毫秒為單位接收值。 例如,以下代碼表示超時(shí)為6秒:
#define CONN_SUP_TIMEOUT 6000 // six seconds
連接監(jiān)視超時(shí)是中央設(shè)備自由忽略的建議。 這限制了我們使用其他參數(shù)創(chuàng)建數(shù)據(jù)傳輸之間長(zhǎng)距離的能力,因?yàn)殚L(zhǎng)間隔需要將其他參數(shù)與長(zhǎng)監(jiān)控超時(shí)相結(jié)合。 如果中央拒絕我們的監(jiān)督超時(shí),同時(shí)接受其他參數(shù),它可能設(shè)置很長(zhǎng)的差距,但短暫的超時(shí)。 然后假設(shè)我們斷開連接。
注意: CONN_SUP_TIMEOUT的最大值取決于您使用的堆棧。檢查您的供應(yīng)商的規(guī)格。
最大限度地延長(zhǎng)電池壽命
由于連接參數(shù)對(duì)能源消耗有影響,我們應(yīng)該考慮一下,即使知道中央可能會(huì)選擇不遵守我們的建議。 一個(gè)考慮因素是我們的連接間隔應(yīng)該與我們期望生成新數(shù)據(jù)的速率相匹配。 例如,如果我們每秒讀取一個(gè)傳感器,則連接間隔不應(yīng)該小于此。 如果它更小,那么當(dāng)沒有數(shù)據(jù)生成時(shí),我們將處理很多請(qǐng)求。 作為相反的示例,對(duì)于數(shù)據(jù)更新非定期(例如鼠標(biāo)移動(dòng))的應(yīng)用,連接間隔可以確定用戶在應(yīng)用等待更新時(shí)經(jīng)歷的延遲。 由于我們重視用戶體驗(yàn)超過能量,我們將使用一個(gè)短的連接間隔。 我們可以補(bǔ)充短連接間隔,具有高從機(jī)延遲,讓鼠標(biāo)在運(yùn)動(dòng)之間睡眠更長(zhǎng)。
對(duì)于電池壽命,我們使用射頻越少越好。 所有的參數(shù)總體意味著我們可以很少使用射頻:在廣告模式下,我們可以每10.28秒使用一次射頻。
在連接模式下,我們可以設(shè)置四秒的最大連接間隔,但是當(dāng)我們沒有生成新數(shù)據(jù)時(shí),沒有無(wú)線電活動(dòng)的最長(zhǎng)持續(xù)時(shí)間可能只要[(max interval) * (slave latency)]。 但是,請(qǐng)記住,我們受到監(jiān)督超時(shí)(supervision timeout)的限制; 如果我們的間隔太大,中央設(shè)備可能會(huì)斷開連接(請(qǐng)記住,我們不能強(qiáng)制中央設(shè)備接受我們的監(jiān)控超時(shí)設(shè)置,因此可能會(huì)出現(xiàn)不匹配)。