? ? 最近一直在開(kāi)發(fā)通過(guò)ble進(jìn)行設(shè)備與App交互的產(chǎn)品仙辟。在開(kāi)發(fā)過(guò)程中同波,手機(jī)一直作為中央設(shè)備,負(fù)責(zé)主動(dòng)發(fā)起掃描連接叠国,而設(shè)備作為邊緣設(shè)備未檩。需求需要兩者發(fā)送指令,傳輸文件粟焊。文件的傳輸就是將設(shè)備中的文件拆解成一包一包的數(shù)據(jù)通過(guò)ble發(fā)送給App冤狡。在設(shè)備與App定義了一套通用的協(xié)議的基礎(chǔ)上,兩者的指令發(fā)送很正常项棠,因?yàn)橹噶畹陌l(fā)送簡(jiǎn)短而且單一悲雳,雙方處理沒(méi)有問(wèn)題。但是在發(fā)送文件時(shí)香追,遇到了嚴(yán)重的丟包問(wèn)題合瓢。當(dāng)時(shí)設(shè)置的設(shè)備發(fā)送數(shù)據(jù)到App,拆分的數(shù)據(jù)包大小是180個(gè)字節(jié)透典,這在iphone6s上已經(jīng)達(dá)到上限了晴楔。但是在發(fā)送文件時(shí),App上接受的數(shù)據(jù)會(huì)出現(xiàn)丟包峭咒,首先懷疑的是設(shè)備端沒(méi)有將數(shù)據(jù)發(fā)送出來(lái)税弃,后來(lái)設(shè)備端改了發(fā)送邏輯,在每一包數(shù)據(jù)發(fā)送之后凑队,在收到底層的發(fā)送成功回調(diào)之后再發(fā)送下一包數(shù)據(jù)则果,在這種模式下,App端接受到的數(shù)據(jù)還是會(huì)丟顽决。當(dāng)時(shí)問(wèn)題很困擾短条,App端覺(jué)得是設(shè)備端的問(wèn)題,設(shè)備端覺(jué)得是App端的問(wèn)題才菠。后來(lái)我想到了一種場(chǎng)景茸时,在那種場(chǎng)景的啟發(fā)下,我覺(jué)得現(xiàn)在這種場(chǎng)景是之前那種場(chǎng)景的反向赋访。
? ? 之前我在做一款A(yù)I 語(yǔ)音耳機(jī)時(shí)可都,也是通過(guò)ble傳輸實(shí)時(shí)音頻以及進(jìn)行OTA(固件升級(jí))的。當(dāng)時(shí)在傳輸OTA數(shù)據(jù)包時(shí)蚓耽,由于耳機(jī)的內(nèi)存不夠渠牲,在我一直發(fā)送文件包時(shí),耳機(jī)會(huì)crash步悠,后來(lái)固件排查下來(lái)由于內(nèi)存不夠签杈,在瘋狂發(fā)送數(shù)據(jù)時(shí),把內(nèi)存撐爆了,導(dǎo)致了耳機(jī)的奔潰答姥,最后的解決方案是我對(duì)發(fā)送的每一包數(shù)據(jù)都設(shè)置了合適的長(zhǎng)度外铣除,還在每一包的發(fā)送過(guò)程中進(jìn)行sleep,給固件時(shí)間去進(jìn)行處理鹦付,這樣問(wèn)題就解決了尚粘。
? ? 然后我聯(lián)想到這次的問(wèn)題,由于不同的手機(jī)采用的藍(lán)牙芯片參差不齊敲长,不同的藍(lán)牙芯片的處理能力又不同郎嫁,所以我懷疑在固件瘋狂發(fā)送數(shù)據(jù)到手機(jī)上時(shí),根據(jù)不同手機(jī)的藍(lán)牙芯片的處理能力祈噪,會(huì)出現(xiàn)丟包的大小也不一樣泽铛。針對(duì)這種懷疑,我們測(cè)試了iphone6s钳降,iphonex厚宰,iphone11腌巾,發(fā)現(xiàn)后兩臺(tái)設(shè)備的丟包率明顯小很多遂填。我們又測(cè)試了不同價(jià)位的Android手機(jī),也發(fā)現(xiàn)低端Android手機(jī)的丟包率也明顯大于中高端手機(jī)澈蝙。在基于這種測(cè)試基礎(chǔ)上吓坚,提出了解決方案:1.降低每個(gè)數(shù)據(jù)包的大小,2.每個(gè)數(shù)據(jù)包間隔時(shí)間發(fā)送灯荧,這個(gè)時(shí)間需要測(cè)試礁击。在經(jīng)過(guò)測(cè)試之后,單純第一點(diǎn)解決方案和第二點(diǎn)解決方案都不會(huì)達(dá)到最理想的結(jié)果逗载,所以合適的方案就是兩者結(jié)合哆窿,將丟包率降到更低。所以最終的解決方案就是降低每一包的大小的同時(shí)厉斟,也保證每包數(shù)據(jù)包的發(fā)送間隔挚躯,這兩者的數(shù)據(jù)我們是通過(guò)測(cè)試之后拿到的平衡值,針對(duì)不同的固件的藍(lán)牙芯片這個(gè)數(shù)據(jù)可能都是不同的擦秽。
? ? 兜兜轉(zhuǎn)轉(zhuǎn)了一圈查到了丟包問(wèn)題的原因码荔,其實(shí)這個(gè)原因不難想,我跟固件開(kāi)發(fā)當(dāng)時(shí)都覺(jué)得是對(duì)方處理的問(wèn)題感挥,導(dǎo)致一直沒(méi)有從全局去看這個(gè)問(wèn)題缩搅,記錄一下。