藍(lán)牙具有5種狀態(tài):
待機(jī)狀態(tài)(standby) :沒(méi)有連接任何設(shè)備,沒(méi)有傳輸和發(fā)送數(shù)據(jù)。
廣播狀態(tài)(Advertiser/advertising):周期性廣播狀態(tài)。
掃描狀態(tài)(Scanner/scanning) :主動(dòng)尋找正在廣播的設(shè)備。
發(fā)起連接狀態(tài)(Initiator/initiating):主動(dòng)發(fā)起連接。
連接狀態(tài)(connected) :已經(jīng)連接。
藍(lán)牙的角色將決定藍(lán)牙如何在5種狀態(tài)中跳轉(zhuǎn),在藍(lán)牙SDK的框架中也是按照這五種狀態(tài)為脈絡(luò)來(lái)進(jìn)行架設(shè)的。
SLAVE? ? ? ? ? ? ? ? ? ? ? ?MASTER
standby? ? ? ? ? ? ? ? ? ? ?standby
advertising? ? ? ? ? ? ? ? ?scanning
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?initiating
connected? ? ? ? ? ? ? ? ? ?connected
從設(shè)備從standby狀態(tài)進(jìn)入advertising后就開(kāi)始按照廣播參數(shù)進(jìn)行廣播,主機(jī)從standby狀態(tài)進(jìn)入scanning后,則開(kāi)始在對(duì)應(yīng)的三個(gè)廣播通道上監(jiān)聽(tīng)。監(jiān)聽(tīng)到的廣播信息將通過(guò)掃描事件和消息返回。主機(jī)決定發(fā)起連接設(shè)備,進(jìn)入initiating狀態(tài)。
鏈接事件和鏈接參數(shù)
主設(shè)備和從設(shè)備建立連接后,所有的數(shù)據(jù)的通信都是在連接事件中進(jìn)行的。如下圖的電流檢測(cè)曲線(xiàn)所示。
主從設(shè)備會(huì)按照約定好的一個(gè)時(shí)間間隔進(jìn)行一次首發(fā)通信,這就像我們通常使用的串口一樣,約定好一個(gè)波特率,串口中叫波特率是因?yàn)槊看味即當(dāng)?shù)一個(gè)bit,而藍(lán)牙中則被稱(chēng)為鏈接間隔。在鏈接間隔之間,藍(lán)牙一直處于sleep模式,這樣就會(huì)讓藍(lán)牙的整個(gè)通信非常的省電。所以藍(lán)牙對(duì)于時(shí)鐘計(jì)數(shù)非常的在意,為什么經(jīng)常手機(jī)連接著設(shè)備一會(huì)就斷了,就是不同步了。
在每個(gè)鏈接事件中,都需要MASTER設(shè)備發(fā)起包,然后有SLAVE設(shè)備進(jìn)行回復(fù)。對(duì)于鏈接的參數(shù),主要是規(guī)定主從機(jī)通信的時(shí)間:
- intervalMin :最小的連接間隔,一般設(shè)置范圍為6-3200,單位是1.25msintervalMax:最大鏈接間隔,范圍同樣是6-3200,單位是1.25msslaverLatency:從機(jī)忽略時(shí)間,范圍是0-499,單位也是1.25mstimeout:超時(shí)時(shí)間,設(shè)置范圍10-3200,單位是10ms。
從上面可以計(jì)算,藍(lán)牙的鏈接間隔最短是7.5ms,最長(zhǎng)是4s。這里要注意,手機(jī)藍(lán)牙的連接間隔的可是值范圍并不一樣,蘋(píng)果系統(tǒng)的一般是20ms起步,而各式各樣的Android手機(jī)不盡相同,但大多數(shù)可以從7.5ms起步。
什么是slave Latency呢?
上面提到過(guò),每過(guò)一個(gè)鏈接間隔,主從機(jī)都會(huì)發(fā)送和回復(fù)一次數(shù)據(jù)。那么為了讓從機(jī)能夠更省電,我們肯定不希望從機(jī)每次都老老實(shí)實(shí)的回復(fù),因此藍(lán)牙協(xié)議中允許從機(jī)可以沉默幾次,下圖是slaverLatency分別為0和3的對(duì)比:
再說(shuō)timeout參數(shù),其設(shè)置范圍實(shí)際為100ms - 32s。這個(gè)參數(shù)給主從機(jī)提供一個(gè)判斷鏈接的門(mén)限,如果沒(méi)有鏈接事件的時(shí)間持續(xù)超過(guò)設(shè)定的timeout值,則認(rèn)定通信連接斷開(kāi)。
連接參數(shù)影響功耗和體驗(yàn)
- 鏈接間隔設(shè)置縮短,也就意味著1s內(nèi)MASTER和SLAVE之間的額通信更頻繁,這樣可以提高數(shù)據(jù)吞吐量,當(dāng)然對(duì)應(yīng)的功耗就會(huì)增加。鏈接間隔設(shè)置增長(zhǎng),通信頻率降低,數(shù)據(jù)吞吐量也降低,這樣可以有效的降低藍(lán)牙通信的功耗。salve Latency設(shè)置小的話(huà),從機(jī)回復(fù)主機(jī)的頻次增多,從機(jī)的功耗就會(huì)增加。salve Latency設(shè)置大的話(huà),從機(jī)回復(fù)主機(jī)的頻次減少,從機(jī)的功耗就會(huì)減小。
手機(jī)中需要注意的問(wèn)題:
- 安卓手機(jī)作為主設(shè)備時(shí),部分手機(jī)連接BLE設(shè)備后,只能進(jìn)行一次連接參數(shù)的修改,因此從設(shè)備最好不要頻繁請(qǐng)求修改,開(kāi)始就規(guī)劃好鏈接參數(shù)。蘋(píng)果系統(tǒng)對(duì)于鏈接參數(shù)的更新更苛刻,想上面提到的鏈接間隔必須從20ms起步,slave Latency要小于4,同時(shí)timeou要小于6s。