最近对蓝牙传输比较感兴趣,所以抽时间研究了一下。由于身边没有合适的外部设备,我这边就一台手机作为中心设备,一台手机作为从设备来进行调试,开发。由于关于蓝牙设备配对,连接,简单发送数据网上相关的文章已经很多了,我今天对于这些就不再详细的说明了,大家感兴趣的话。可以看看下面的这些文章。
《iOS开发之玩转蓝牙CoreBluetooth》
我今天主要和大家分享的是蓝牙传输时大量数据的传输方案。我们结合网上的蓝牙demo,简单的传输一个字符串没有问题,但是如果涉及到大量数据的参数就不行了。
蓝牙进行大量数据的使用场景
coreBluetooth属于低功耗蓝牙,所以在进行数据传输时一般数据量比较小,但是也存在一些大量数据传输的需求,比如固件升级,文件传输等场景,音频传输等。这些场景由于需要传输的数据比较大,多以要进行分包处理。相对简单的几个字符的传输,操作起来要麻烦的多。
CoreBlueTooth知识点普及
1,蓝牙传输的字节顺序是小端
2,coreBlueTooth 的最大传输单元是20个字节。
通过蓝牙实现大量数据传输的原理
为了保证数据传输的准确性和有序性。我们需要在每个传输单元中分出一部分字节,用来标记这部分数据的顺序。并且我们还需要给数据创建包头,来表明数据的总长度。
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
更多优质文章,可以微信扫码关注: