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