先上个 Demo 让大家可以看看
这个 Demo 很简单,连界面都没搭,但具体数据可以从 XCode 的终端打印出来,这个 Demo 必须真机调试,Mac 上的模拟器是作用不了的。
苹果提供的 CoreBluetooh 框架是很繁琐的,使用起来比较复杂,要求大家必须掌握一定的蓝牙知识(涉及蓝牙开发,掌握一下蓝牙协议还是很必要的)。为此,我对 CoreBluetooh 进行了封装,让大家尽量掌握少蓝牙协议的情况下能进行蓝牙开发,且开发的 API 较简单。
可以简单的描述一下蓝牙协议,蓝牙传输数据,可以看做三层:
第一层是 peripheral(也可能是 central),表明所连接的设备;
第二层是 service,处于 peripheral 下,意思是 peripheral 之下至少有一个 service;
第三层是 characteristic,每个 service 至少有一个 characteristic。
传输数据的通道是 characteristic,characteristic可以设置为接收或者发送(具体肯定不是这么简单,但就这样认为也没什么错误),接收的 characteristic 可以接收数据,发送的 characteristic 可以发送数据。每个 peripheral,service,characteristic 都有自己的 UUID,我们可以根据他们的 UUID 选择连接的 peripheral 和 通信的 characteristic。
我个人写的封装 CoreBluetooth 的 ZHBLE 是极其简单的 API 的,CoreBluetooth 框架连接上外设,至少也得经过十个代理方法以上,而 ZHBLE 对 CBCentralManager 封装只有两个代理,大部分都以 block 的形式封装起来。我个人是想把两个代理都封装起来,但这样做的话,逻辑太不清晰,而且有可能在使用的时候造成 block 层层嵌套,很麻烦。现在来看一下我写的 API 吧:
API 的注释:
- (instancetype)initWithDelegate:(id)delegate;
构造函数,设置 ZHBLECentralManager 的 delegate;
- (void)startScan:(ZHDiscoverPeripheralBlock)ZHDiscoverPeripheral;
开始扫描,扫描得到的外设保存在数组里面,即可以从代理中获取外设数组,也可以从 block 中获取;
- (void)stopScan;
停止扫描
- (void)connectPeripheral:(CBPeripheral*)peripheral fail:(ZHFailConnectPeripheralBlock)failling succeed:(ZHSucceedConnectPeripheralBlock)succeed;
连接某个外设,注意,取消连接和连接失败的时候,信息会反馈回到 ZHFailConnectPeripheralBlock 上,取消连接也是哦;
- (void)writeData:(NSData*)data periphaler:(CBPeripheral*)peri characteristic:(CBCharacteristic*)characteristic error:(NSError*)error;
向某个外设的 characteristic 写数据,注意,必须是连接的外设;
- (void)readPeripheral:(CBPeripheral*)peripheral Characteristic:(CBCharacteristic*)characteristic receivedData:(ZHReceivedDataBlock)receivedData;
读取某个外设的 Characteristic 的数据,注意,必须是连接的外设;
- (void)cancelConnectPeripheral:(CBPeripheral*)peri;
取消某个外设的连接。