日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

iOS蓝牙开发之数据传输精华篇

發布時間:2023/12/20 编程问答 31 豆豆
生活随笔 收集整理的這篇文章主要介紹了 iOS蓝牙开发之数据传输精华篇 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

?? 最近對藍牙傳輸比較感興趣,所以抽時間研究了一下。由于身邊沒有合適的外部設備,我這邊就一臺手機作為中心設備,一臺手機作為從設備來進行調試,開發。由于關于藍牙設備配對,連接,簡單發送數據網上相關的文章已經很多了,我今天對于這些就不再詳細的說明了,大家感興趣的話。可以看看下面的這些文章。
《iOS開發之玩轉藍牙CoreBluetooth》

??我今天主要和大家分享的是藍牙傳輸時大量數據的傳輸方案。我們結合網上的藍牙demo,簡單的傳輸一個字符串沒有問題,但是如果涉及到大量數據的參數就不行了。

藍牙進行大量數據的使用場景

??coreBluetooth屬于低功耗藍牙,所以在進行數據傳輸時一般數據量比較小,但是也存在一些大量數據傳輸的需求,比如固件升級,文件傳輸等場景,音頻傳輸等。這些場景由于需要傳輸的數據比較大,多以要進行分包處理。相對簡單的幾個字符的傳輸,操作起來要麻煩的多。

CoreBlueTooth知識點普及

1,藍牙傳輸的字節順序是小端
2,coreBlueTooth 的最大傳輸單元是20個字節。

通過藍牙實現大量數據傳輸的原理

&esmp?為了保證數據傳輸的準確性和有序性。我們需要在每個傳輸單元中分出一部分字節,用來標記這部分數據的順序。并且我們還需要給數據創建包頭,來表明數據的總長度。

JKTransferDataHelper簡介

??知道了原理,實現起來還是有一定的難度的,我在網上搜了一下,并沒有發現類似的pod庫,無奈之下,決定自己來寫一個。下面來給大家介紹一下這個庫。 pod 'JKTransferDataHelper' 源碼地址:https://github.com/xindizhiyin2014/JKTransferDataHelper
下面結合源碼來說明下
JKTransferDataConfig 類

@interface JKTransferDataConfig : NSObject@property (nonatomic,assign) NSUInteger mtuSize; ///< the transportlation unit the size is byte @property (nonatomic,assign) NSUInteger packetHeadSize;///< the data head,the unit is byte @property (nonatomic,assign) JKTransferByteSortType byteSortType;///<+ (instancetype)configMTUSize:(NSUInteger)mtuSize packetHeadSize:(NSUInteger)packetHeadSize byteSortType:(JKTransferByteSortType)byteSortType;@end

其中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蓝牙开发之数据传输精华篇的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。