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

更多优质文章,可以微信扫码关注:
这里写图片描述

你可能感兴趣的:(Object-C,IOS)