文章從以下幾個(gè)問(wèn)題著手分析藍(lán)牙5的速率:
- BLE的實(shí)際吞吐量是多少潘酗?
- 藍(lán)牙5的新2M PHY用于數(shù)據(jù)傳輸?
- 影響/確定數(shù)據(jù)吞吐量的因素有哪些眶拉?
- 如何計(jì)算應(yīng)用程序中的數(shù)據(jù)吞吐量谍倦?
- 如何最大化數(shù)據(jù)吞吐量?
實(shí)際吞吐量
藍(lán)牙5定義的 LE 2M PHY以及藍(lán)牙4.x協(xié)議 LE 1M PHY都稱為未編碼PHY,因?yàn)樗鼈兠课粩?shù)據(jù)使用1個(gè)符號(hào)表示(與使用S=2或S=8的新LE編碼PHY相比)檩赢。
我們需要明白各大芯片廠商數(shù)據(jù)手冊(cè)宣傳的速度(1 Mbps和新的2 Mbps)僅僅只是理論值(空中速率),并且在應(yīng)用程序中吞吐量會(huì)被削減违寞。原因有多種贞瞒,我們將在下面一一介紹。
藍(lán)牙5“2x速度”需要硬件支持趁曼,因此老的設(shè)備/芯片/模塊將不支持藍(lán)牙5 2M PHY(市面已經(jīng)有手機(jī)支持藍(lán)牙5 2M PHY)军浆。要注意,為了實(shí)現(xiàn)更高吞吐量挡闰,需要兩個(gè)BLE設(shè)備相互都支持LE 2M PHY乒融。
此外,當(dāng)使用更高速度的PHY時(shí),實(shí)際上功耗可以做的更低(傳輸相同數(shù)量的數(shù)據(jù)簇抵,時(shí)間短功耗低)庆杜。這是因?yàn)闇p少了芯片工作時(shí)間而又沒(méi)有增加發(fā)射功率。反過(guò)來(lái)這樣做改善了與2.4 GHz頻譜內(nèi)的其他無(wú)線技術(shù)的共存(也是由于減少了無(wú)線電工作時(shí)間碟摆,減少2,4G帶寬的占用)晃财。
為什么不可能達(dá)到BLE的理論速度?
1 Mbps(LE 1M PHY)典蜕,2 Mbps(LE 2M PHY)断盛,125 kbps和500 kbps(均使用LE編碼PHY,S = 8和S = 2)的數(shù)據(jù)速率是無(wú)線電在空中的速率傳輸數(shù)據(jù)愉舔,但由于以下原因钢猛,應(yīng)用程序吞吐量是達(dá)不到該理論值:
- 藍(lán)牙規(guī)范限制每個(gè)連接間隔的數(shù)據(jù)包數(shù)量
- 數(shù)據(jù)包之間的幀間間隔(IFS)延遲(150 us)
- 即使沒(méi)有可用于傳輸?shù)臄?shù)據(jù),也需要從設(shè)備發(fā)送空數(shù)據(jù)包
- 數(shù)據(jù)包開(kāi)銷 - 并非數(shù)據(jù)包中的所有字節(jié)都用于有效負(fù)載
我們感興趣的部分(真正定義應(yīng)用程序數(shù)據(jù)的部分)是ATT Payload。 從圖中可以看出火的,藍(lán)牙低功耗中的每一層都使用了許多額外開(kāi)銷字節(jié)壶愤。
在4.0和4.1中,最大ATT有效載荷為20個(gè)字節(jié)馏鹤。
在4.2和5.0中征椒,稱為數(shù)據(jù)長(zhǎng)度擴(kuò)展(DLE)的新功能允許ATT有效載荷最多可容納244個(gè)字節(jié)的數(shù)據(jù)。
藍(lán)牙5速率:使用新的2M PHY實(shí)現(xiàn)2倍速
首先了解下藍(lán)牙5中使用新LE 2M PHY的局限性:
- 不能用于主要廣播信道(37湃累,38勃救,39)。
- 可用于與數(shù)據(jù)包在同一通道上發(fā)送的輔助“輔助數(shù)據(jù)包”(37個(gè)通道:0-36)治力。
藍(lán)牙5規(guī)格書(shū)說(shuō)明蒙秒,LE 1M PHY是強(qiáng)制性的,而LE 2M PHY是可選的琴许,因此税肪,并非所有聲稱支持藍(lán)牙5的芯片都必須能夠處理更高的吞吐量。
LE 2M PHY上可以發(fā)生從端廣播模式和主端掃描模式榜田,然后使用LE 2M PHY在第二廣告信道上進(jìn)行連接益兄。
用戶交互數(shù)據(jù)從一個(gè)設(shè)備傳輸?shù)搅硪粋€(gè)設(shè)備是發(fā)生在兩個(gè)設(shè)備的連接階段。連接的設(shè)備可以通過(guò)更新PHY來(lái)協(xié)商使用不同PHY箭券。它可以在建立連接后由從設(shè)備或主設(shè)備發(fā)起净捅,但主設(shè)備最終將決定哪個(gè)PHY(基于從設(shè)備的請(qǐng)求和主設(shè)備支持的PHY)。影響B(tài)LE應(yīng)用程序的數(shù)據(jù)吞吐量因素:
- 使用的PHY(LE 1M vs. LE 2M與LE編碼(S = 2或S = 8))
- 連接間隔
- 每個(gè)連接間隔的最大數(shù)據(jù)包數(shù)
- ATT最大傳輸單元(ATT MTU)
- 數(shù)據(jù)長(zhǎng)度擴(kuò)展(DLE)
- 操作類型:寫(xiě)入響應(yīng)與寫(xiě)入無(wú)響應(yīng)辩块,指示與通知
- 幀間間隔(IFS):后續(xù)數(shù)據(jù)包之間的時(shí)間間隔(150 us)
- 傳輸空包
- 數(shù)據(jù)包開(kāi)銷 - 并非數(shù)據(jù)包中的所有字節(jié)都用于應(yīng)用程序有效負(fù)載
根據(jù)這9點(diǎn)蛔六,我們一點(diǎn)一點(diǎn)詳細(xì)地討論荆永。
PHY
藍(lán)牙5中基本上有三種PHY:原始的1 Mbps PHY,新的2 Mbps和編碼的PHY(S = 2或S = 8)国章。所使用的PHY將直接影響您可以實(shí)現(xiàn)的最大數(shù)據(jù)吞吐量具钥,因?yàn)樗_定了通過(guò)無(wú)線方式發(fā)送數(shù)據(jù)包的實(shí)際原始數(shù)據(jù)速率。
每個(gè)連接事件的連接間隔和最大數(shù)據(jù)包
連接間隔有效地確定在一個(gè)連接事件期間可以發(fā)送多少數(shù)據(jù)包液兽。值越高骂删,在一個(gè)連接事件中可以發(fā)送的數(shù)據(jù)包越多(某些設(shè)備達(dá)到某個(gè)限制)。
BLE連接間隔和事件
每個(gè)連接事件的數(shù)據(jù)包數(shù)量取決于設(shè)備和BLE堆棧四啰,因此它受到限制宁玫,并且在特定設(shè)備上的設(shè)備和堆棧版本之間有所不同。此值還取決于設(shè)備的操作柑晒,因此無(wú)線電可能必須處理其他事件欧瘪,并且每個(gè)連接事件發(fā)送的數(shù)據(jù)包數(shù)量可能達(dá)不到堆棧允許的最大值。例如匙赞,iOS和Android之間的數(shù)量不同佛掖,也會(huì)根據(jù)設(shè)備上運(yùn)行的操作系統(tǒng)版本而有所不同。
數(shù)據(jù)長(zhǎng)度擴(kuò)展(DLE)
此功能允許數(shù)據(jù)包大小保持更大的有效負(fù)載(最多251個(gè)字節(jié)涌庭,而禁用時(shí)為27個(gè)字節(jié))苦囱。此功能是在藍(lán)牙規(guī)范4.2版中引入的。
ATT最大傳輸單元(ATT MTU)
ATT MTU確定發(fā)送器和接收器可以處理的最大數(shù)據(jù)量以及它們可以保存在緩沖器中的數(shù)據(jù)量脾猛。
MTU值影響開(kāi)銷數(shù)據(jù)量(特別是3個(gè)字節(jié)的ATT頭)。允許的最小ATT MTU是27個(gè)字節(jié)鱼鸠。這允許最多20個(gè)字節(jié)的ATT有效載荷(3個(gè)字節(jié)用于ATT報(bào)頭猛拴,4個(gè)字節(jié)用于L2CAP報(bào)頭)。
對(duì)于MTU值有多高蚀狰,每個(gè)規(guī)范沒(méi)有限制愉昆,但使用中的特定堆棧可能有其自身的局限性麻蹋。例如跛溉,如果啟用DLE,則最多可以傳輸251 - 4 = 247個(gè)字節(jié)(扣除L2CAP標(biāo)頭大小后)扮授。在考慮ATT報(bào)頭(3個(gè)字節(jié))之后芳室,我們留下了244個(gè)字節(jié)用于實(shí)際的ATT有效載荷數(shù)據(jù)。如果MTU至少為247字節(jié)刹勃,則MTU將適合一個(gè)單獨(dú)的數(shù)據(jù)包堪侯。如果MTU大于247字節(jié),則MTU將跨越多個(gè)分組荔仁,導(dǎo)致吞吐量下降(由于分組開(kāi)銷和分組之間的定時(shí))伍宦。
有效MTU由客戶端和服務(wù)器支持的ATT MTU的最小值確定芽死。例如,如果客戶端支持100字節(jié)的ATT MTU并且服務(wù)器響應(yīng)它支持150字節(jié)的ATT MTU次洼,則客戶端將決定用于從其上進(jìn)行連接的ATT MTU是100字節(jié)关贵。
操作類型:寫(xiě)入響應(yīng)與寫(xiě)入無(wú)響應(yīng),指示與通知
如果需要高吞吐量卖毁,那么我們可以使用Write without response或Notifications將數(shù)據(jù)從客戶端傳輸?shù)椒?wù)器以及從服務(wù)器傳輸?shù)娇蛻舳艘驹_@些操作不需要其他設(shè)備確認(rèn)收到數(shù)據(jù)并在下一個(gè)數(shù)據(jù)塊發(fā)送之前做出響應(yīng)。
幀間間隔(IFS):連續(xù)數(shù)據(jù)包之間的時(shí)間延遲(150 us)
藍(lán)牙規(guī)范:傳輸空包
如果接收數(shù)據(jù)的設(shè)備沒(méi)有要發(fā)回的數(shù)據(jù),則仍需要按照藍(lán)牙規(guī)范發(fā)送空數(shù)據(jù)包跑芳。
數(shù)據(jù)包開(kāi)銷
正如我們?cè)跀?shù)據(jù)包格式圖中看到的那樣迂苛,數(shù)據(jù)包包含一些不計(jì)入應(yīng)用程序數(shù)據(jù)(ATT數(shù)據(jù))的開(kāi)銷數(shù)據(jù)∧罴溃基本上,這些字節(jié)將消耗部分傳輸數(shù)據(jù)速率碍侦,而不考慮作為應(yīng)用程序數(shù)據(jù)的一部分發(fā)送的任何字節(jié)粱坤。
計(jì)算應(yīng)用程序數(shù)據(jù)吞吐量
正如我們之前提到的,有如下些因數(shù)會(huì)影響數(shù)據(jù)吞吐量:
- 使用藍(lán)牙版本和PHY
- DLE:數(shù)據(jù)長(zhǎng)度擴(kuò)展 - 啟用與否
- ATT MTU值
- 連接間隔
- 每個(gè)連接事件的最大數(shù)據(jù)包數(shù)
- 操作(寫(xiě)入響應(yīng)與寫(xiě)入沒(méi)有響應(yīng)瓷产,以及通知與指示)
- 幀間間隔(IFS):150微秒
藍(lán)牙版本和PHY確定原始數(shù)據(jù)傳輸速率站玄。例如,如果我們使用藍(lán)牙版本4.2和LE 1M PHY濒旦,則傳輸速率為1 Mbps株旷。另一方面,如果我們使用藍(lán)牙5 S = 8的 LE編碼PHY尔邓,則數(shù)據(jù)速率降至125 kbps晾剖。
DLE,ATT MTU梯嗽,連接間隔齿尽,每個(gè)連接間隔的最大數(shù)據(jù)包數(shù),操作和IFS都是用于實(shí)際數(shù)據(jù)傳輸時(shí)間灯节。
數(shù)據(jù)包格式在傳輸?shù)臄?shù)據(jù)量是實(shí)際應(yīng)用程序數(shù)據(jù)方面起著重要作用循头。 LE 1M PHY和LE 2M PHY都具有類似的數(shù)據(jù)包格式。 LE編碼PHY具有明顯不同的數(shù)據(jù)包格式炎疆,因此我們將分別查看這兩種情況:LE 1M PHY和LE 2M PHY計(jì)算卡骂。
參考LE未編碼PHY的數(shù)據(jù)包格式:
針對(duì)不同PHY,數(shù)據(jù)開(kāi)銷略有不同磷雇。 對(duì)于1M PHY偿警,前導(dǎo)碼是1字節(jié),而對(duì)于2M PHY唯笙,前導(dǎo)碼是2字節(jié)螟蒸。 MIC字段是可選字段盒使,僅用于加密連接。 為簡(jiǎn)單起見(jiàn)七嫌,我們只考慮未加密的連接 - 對(duì)于加密的情況少办,它只是增加了4個(gè)字節(jié)的開(kāi)銷。
對(duì)于LE編碼PHY诵原,數(shù)據(jù)包格式如下所示(來(lái)自藍(lán)牙5.0規(guī)范第6卷英妓,第B部分,第2.2節(jié)):
計(jì)算吞吐量的步驟(以Mbps為單位):
為簡(jiǎn)單起見(jiàn)绍赛,我們做假設(shè)如下:
- 未啟用加密(數(shù)據(jù)包中不包含MIC字段)蔓纠。
- 我們感興趣的是單方向的吞吐量(例如Master to Slave),所以我們假設(shè)另一個(gè)方向只傳輸空數(shù)據(jù)包吗蚌。
- 寫(xiě)入時(shí)腿倚,對(duì)方無(wú)需響應(yīng)(No Ack)。
步驟:
- 確定正在使用的PHY并記下原始數(shù)據(jù)傳輸速率
例如: 對(duì)于1M PHY - > 1 Mbps蚯妇,對(duì)于編碼PHY和S = 8 - > 125 kbps
-
確定從接收器發(fā)送一個(gè)數(shù)據(jù)包和空包的時(shí)間敷燎。
可以發(fā)送一個(gè)數(shù)據(jù)包的時(shí)間包括以下內(nèi)容:
Data_Packet_Time =發(fā)送空包的時(shí)間+ IFS +發(fā)送實(shí)際數(shù)據(jù)包+ IFS的時(shí)間
空包傳輸時(shí)間可以如下計(jì)算:
傳輸空包的時(shí)間=空包大小/原始數(shù)據(jù)速率
空包將包含以下字段:前導(dǎo) + 訪問(wèn)地址(access address)+ LL頭+ CRC。
對(duì)于1M PHY箩言,前導(dǎo)將為1字節(jié)硬贯,因此空包的總大小= 1 + 4 + 2 + 3字節(jié)= 10字節(jié)= 80位。
對(duì)于2M PHY陨收,空數(shù)據(jù)包的大小將為88位饭豹,因?yàn)镻remable是2個(gè)字節(jié)而不是1個(gè)字節(jié))。
基于此务漩,傳輸空1M PHY數(shù)據(jù)包的時(shí)間將是:
傳輸空數(shù)據(jù)包的時(shí)間=空數(shù)據(jù)包大小/原始數(shù)據(jù)速率= 80位/ 1兆位/秒= 80微秒
數(shù)據(jù)包將包含數(shù)據(jù)包格式圖中列出的所有字段墨状,但MIC字段除外(加密禁用)。
傳輸數(shù)據(jù)包的時(shí)間=數(shù)據(jù)包size / raw data rate
如果我們啟用了DLE并且ATT MTU等于一個(gè)數(shù)據(jù)包中允許的最大字節(jié)數(shù):247個(gè)字節(jié)菲饼,那么我們可以將數(shù)據(jù)包大小計(jì)算為:
數(shù)據(jù)包size= 1 + 4 + 2 + 4 + 247 + 3字節(jié)= 265字節(jié)= 265 * 8位= 2088 bit
發(fā)送數(shù)據(jù)包的時(shí)間= 2088位/ 1 Mbps = 2,088us
Data_Packet_Time =發(fā)送空包的時(shí)間+ IFS +發(fā)送實(shí)際數(shù)據(jù)包的時(shí)間+ IFS = 80 + 2 * 150 + 2088 = 2,468us
在2M PHY的情況下,它將是:
Data_Packet_Time =發(fā)送空包的時(shí)間+ IFS +發(fā)送實(shí)際數(shù)據(jù)包的時(shí)間+ IFS = 88/2 + 2 * 150 +(2 + 4 + 2 + 4 + 247 + 3)* 8/2 = 1,392us
當(dāng)啟用DLE并且ATT MTU設(shè)置為小于247時(shí)列赎,會(huì)產(chǎn)生更多開(kāi)銷(因?yàn)楝F(xiàn)在大于ATT MTU的數(shù)據(jù)被分成更多數(shù)據(jù)包)宏悦。例如,假設(shè)我們將ATT MTU設(shè)置為158包吝,那么為了傳輸244個(gè)字節(jié)的應(yīng)用程序數(shù)據(jù)饼煞,我們需要兩個(gè)數(shù)據(jù)包而不是一個(gè),導(dǎo)致吞吐量因字節(jié)開(kāi)銷增加而增加而增加數(shù)據(jù)包之間的IFS诗越。
在另一種情況下砖瞧,我們可以禁用DLE(有效負(fù)載大小最多27個(gè)字節(jié))和ATT MTU大于27個(gè)字節(jié)。這也將導(dǎo)致需要為相同數(shù)量的數(shù)據(jù)發(fā)送更多數(shù)據(jù)包嚷狞,從而導(dǎo)致吞吐量下降块促。
注意:
用于計(jì)算上面使用的數(shù)據(jù)和空數(shù)據(jù)包大小的方法可以用于計(jì)算LE編碼PHY荣堰。
一個(gè)連接間隔期間可以傳輸多少數(shù)據(jù)包
前一篇文章講過(guò),這種計(jì)算并不總是純粹的數(shù)學(xué)計(jì)算竭翠,需要考慮使用的堆棧和設(shè)備的限制振坚。在藍(lán)牙芯片供應(yīng)商的SDK中,通常在其文檔中會(huì)列出最大值斋扰。 iOS和Android的最大值隨操作系統(tǒng)版本而變化渡八,所以要弄清楚并不容易。
一旦計(jì)算出最大值传货,就可以計(jì)算出適合所選連接間隔的最大理論數(shù)據(jù)包數(shù)屎鳍。例如,如果我們的連接間隔為7.5毫秒(規(guī)范允許的最低值)问裕,則對(duì)于上面的示例(使用1M PHY逮壁,啟用DLE):
每個(gè)連接間隔的最大數(shù)據(jù)包數(shù)= [連接間隔/ Data_Packet_Time]
其中[] 表示舍入到最大整數(shù)(整數(shù))。
每個(gè)連接間隔的最大數(shù)據(jù)包數(shù)= [7.5 * 1,000微秒/ 2,468微秒] = 3個(gè)數(shù)據(jù)包
通常僻澎,這個(gè)數(shù)字是不現(xiàn)實(shí)的貌踏,因?yàn)樵谶B續(xù)的連接事件上發(fā)送的數(shù)據(jù)包之間存在時(shí)間延遲。因此窟勃,對(duì)于我們的示例祖乳,我們將使用2個(gè)數(shù)據(jù)包而不是3個(gè)數(shù)據(jù)包。
一旦我們計(jì)算出每個(gè)連接間隔可以傳輸?shù)淖畲髷?shù)據(jù)包數(shù)秉氧,我們就可以計(jì)算出數(shù)據(jù)吞吐量:
數(shù)據(jù)吞吐量 = 每個(gè)連接間隔的數(shù)據(jù)/連接間隔 = 每個(gè)連接間隔的數(shù)據(jù)包數(shù)量*每個(gè)數(shù)據(jù)包/連接間隔的數(shù)據(jù)大小
= 2 * 244 * 8位/7.5毫秒= 520,533位/秒?= 508kbps
大家會(huì)認(rèn)為眷昆,連接間隔越小,速率肯定更高汁咏,實(shí)際并不是這樣的亚斋。
下面就根據(jù)真實(shí)測(cè)試數(shù)據(jù)和計(jì)算理論值一一對(duì)比。總結(jié):
路由器攘滩,藍(lán)牙帅刊,手機(jī)wifi等2.4G的設(shè)備干擾,測(cè)試設(shè)備主從之間的距離漂问,設(shè)備之間存在障礙等因數(shù)都會(huì)影響測(cè)試結(jié)果赖瞒。
上面列出的測(cè)試值和理論值,可能實(shí)際環(huán)境中的測(cè)量數(shù)據(jù)吞吐量不一致蚤假。
干擾和傳輸/接收錯(cuò)誤會(huì)影響數(shù)據(jù)吞吐量(重試栏饮,數(shù)據(jù)丟失和連接事件關(guān)閉會(huì)導(dǎo)致吞吐量降低)。
但本文詳細(xì)分析了所有和速率相關(guān)的因素磷仰,在實(shí)際使用中袍嬉,大家可以自由DIY。