iOS蓝牙开发之数据传输精华篇
?? 最近對藍(lán)牙傳輸比較感興趣,所以抽時(shí)間研究了一下。由于身邊沒有合適的外部設(shè)備,我這邊就一臺手機(jī)作為中心設(shè)備,一臺手機(jī)作為從設(shè)備來進(jìn)行調(diào)試,開發(fā)。由于關(guān)于藍(lán)牙設(shè)備配對,連接,簡單發(fā)送數(shù)據(jù)網(wǎng)上相關(guān)的文章已經(jīng)很多了,我今天對于這些就不再詳細(xì)的說明了,大家感興趣的話。可以看看下面的這些文章。
《iOS開發(fā)之玩轉(zhuǎn)藍(lán)牙CoreBluetooth》
??我今天主要和大家分享的是藍(lán)牙傳輸時(shí)大量數(shù)據(jù)的傳輸方案。我們結(jié)合網(wǎng)上的藍(lán)牙demo,簡單的傳輸一個(gè)字符串沒有問題,但是如果涉及到大量數(shù)據(jù)的參數(shù)就不行了。
藍(lán)牙進(jìn)行大量數(shù)據(jù)的使用場景
??coreBluetooth屬于低功耗藍(lán)牙,所以在進(jìn)行數(shù)據(jù)傳輸時(shí)一般數(shù)據(jù)量比較小,但是也存在一些大量數(shù)據(jù)傳輸?shù)男枨?#xff0c;比如固件升級,文件傳輸?shù)葓鼍?#xff0c;音頻傳輸?shù)取_@些場景由于需要傳輸?shù)臄?shù)據(jù)比較大,多以要進(jìn)行分包處理。相對簡單的幾個(gè)字符的傳輸,操作起來要麻煩的多。
CoreBlueTooth知識點(diǎn)普及
1,藍(lán)牙傳輸?shù)淖止?jié)順序是小端
2,coreBlueTooth 的最大傳輸單元是20個(gè)字節(jié)。
通過藍(lán)牙實(shí)現(xiàn)大量數(shù)據(jù)傳輸?shù)脑?/h3>
&esmp?為了保證數(shù)據(jù)傳輸?shù)臏?zhǔn)確性和有序性。我們需要在每個(gè)傳輸單元中分出一部分字節(jié),用來標(biāo)記這部分?jǐn)?shù)據(jù)的順序。并且我們還需要給數(shù)據(jù)創(chuàng)建包頭,來表明數(shù)據(jù)的總長度。
JKTransferDataHelper簡介
??知道了原理,實(shí)現(xiàn)起來還是有一定的難度的,我在網(wǎng)上搜了一下,并沒有發(fā)現(xiàn)類似的pod庫,無奈之下,決定自己來寫一個(gè)。下面來給大家介紹一下這個(gè)庫。 pod 'JKTransferDataHelper' 源碼地址:https://github.com/xindizhiyin2014/JKTransferDataHelper
下面結(jié)合源碼來說明下
JKTransferDataConfig 類
其中mtuSize是最大傳輸單元,由于該框架適用于coreBlueTooth,同時(shí)也適用于UDP傳輸。packetHeadSize是每個(gè)傳輸單元上標(biāo)記順序的包頭所占用的字節(jié)長度。byteSortType 是指傳輸?shù)淖止?jié)順序
JKTransferDataHelper類
@interface JKTransferDataHelper : NSObject/**handle the data with packet sort Num //主要是對要傳輸?shù)臄?shù)據(jù)進(jìn)行轉(zhuǎn)換,根據(jù)需求為每個(gè)傳輸單元加上序列號@param data binary data@param dataConfig dataConfig@return data with sort Num*/ + (NSMutableData *)formatData:(NSData *)data dataConfig:(JKTransferDataConfig *)dataConfig;/**remove the sort Num in binary data //對接收到的含有序列號的數(shù)據(jù),去掉序列號的包頭,然后重新拼接成為我們真正需求要的數(shù)據(jù)@param data binary data@param dataConfig dataConfig@return binary without sorNum*/ + (NSMutableData *)unFormatData:(NSMutableData *)data dataConfig:(JKTransferDataConfig *)dataConfig;/**append unitPacketData //數(shù)據(jù)接收到單元數(shù)據(jù),然后感覺需求進(jìn)行拼接的操作@param unitPacketData unitPacketData@param originData the origin data@param dataLength the target data length@param dataConfig dataConfig@return <#return value description#>*/ + (NSMutableData *)appendUnitPacketData:(NSData *)unitPacketData originData:(NSMutableData *)originData dataLength:(NSUInteger)dataLength dataConfig:(JKTransferDataConfig *)dataConfig;/**config the binary data head //根據(jù)數(shù)據(jù)的長度,生成包頭數(shù)據(jù)@param originDataLength the data length@param dataConfig dataConfig@return the binary data of data head*/ + (NSData *)configPacketHead:(NSUInteger)originDataLength dataConfig:(JKTransferDataConfig *)dataConfig;/**get the origin data length //獲取包頭數(shù)據(jù),并解析出數(shù)據(jù)的長度@param data binary data@param dataConfig dataConfig@return the origin length of the data*/ + (NSUInteger)getOriginDataLength:(NSData *)data dataConfig:(JKTransferDataConfig *)dataConfig;/**get the format dataLength with packet sort Num //根據(jù)需求,獲取數(shù)據(jù)添加萬序列號以后的長度。@param originData originData@param dataConfig dataConfig@return the dataLenght*/ + (NSUInteger)getFormatBodyDataLengthWithOriginData:(NSData *)originData dataConfig:(JKTransferDataConfig *)dataConfig;/**get appropriate PacketHeadSize with originData and mtuSize //根據(jù)要傳輸?shù)臄?shù)據(jù),計(jì)算出合適的傳輸包序列號所占的字節(jié)長度。@param originData originData@param mtuSize mtuSize@return PacketHeasSize*/ + (NSUInteger)getPacketHeadSizeWithOriginData:(NSData *)originData mtuSize:(NSUInteger)mtuSize;@end更多優(yōu)質(zhì)文章,可以微信掃碼關(guān)注:
總結(jié)
以上是生活随笔為你收集整理的iOS蓝牙开发之数据传输精华篇的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 【python】有意思的python小项
- 下一篇: SPI协议详解