iOS开发 最近开发了蓝牙模块,在此记录总结一下(转载)
2018-01-15 15:03
751 查看
1.基本概念
<1>中心者模式:常用的(其实99.99%)就是使用中心者模式作为开发,就是我们手机作为主机,连接蓝牙外设。由于开发只用到了中心者模式,所以我也只介绍中心者模式。
<2>管理者模式:这个基本用到的比较少,我们手机自己作为外设,自己创建服务和特征,然后有其他的设备连接我们的手机。
<3>服务(services):蓝牙外设对外广播的必定会有一个服务,可能也有多个,服务下面包含着一些特征,服务可以理解成一个模块的窗口。
<4>特征(characteristic):存在于服务下面的,一个服务下面也可以存在多个特征,特征可以理解成具体实现功能的窗口,一般特征都会有value,也就是特征值,特征是与外界交互的最小单位。
<5>UUID:以理解成蓝牙上的唯一标识符(硬件上肯定不是这个意思,但是这样理解便于我们开发),为了区分不同的服务和特征,或者给服务和特征取名字,我们就用UUID来代表服务和特征。
<6>外设名字(name):不是每一个蓝牙外设都是拥有name的。在开发的时候,当你发现name属性为空,这是很正常的,我曾经就因为这个问题纠结了很久。
2.具体的操作流程
<1>遵循两个协议
CBCentralManagerDelegate(中心管理的协议),CBPeripheralDelegate(外设的协议),并打开手机的蓝牙。
<2>创建一个中心管理(CBCentralManager),并设置代理。
代理一旦设置,就会走协议(CBCentralManagerDelegate)里面的方法。
<3>扫描周围的外设
当-(void)centralManagerDidUpdateState:(CBCentralManager *)central方法检测到本机蓝牙开启的时候,开始扫描([central scanForPeripheralsWithServices:nil options:nil];)周围的外设,必须是本机蓝牙开启之后才去扫描周围外设。
<4>获取扫描到的外设
-(void)centralManager:(CBCentralManager *)central didDiscoverPeripheral:(CBPeripheral *)peripheral advertisementData:(NSDictionary<NSString *,id> *)advertisementData RSSI:(NSNumber *)RSSI;会返回扫描到的外设。如果你不关闭扫描,这个方法会一直被调用。
<5>连接外设
在上一步中选择一个外设进行连接。
- (void)connectPeripheral:(CBPeripheral *)peripheral options:(nullable NSDictionary<NSString *, id> *)options;
在下面三个方法中可以返回蓝牙连接的状态。如果连接成功,我们就开始设置外设的代理,并获取该外设的服务;
-(void)centralManager:(CBCentralManager *)central didConnectPeripheral:(CBPeripheral *)peripheral;
-(void)centralManager:(CBCentralManager *)central didFailToConnectPeripheral:(CBPeripheral *)peripheral error:(NSError *)error;
-(void)centralManager:(CBCentralManager *)central didDisconnectPeripheral:(CBPeripheral *)peripheral error:(NSError *)error;
[peripheral setDelegate:self];
[peripheral discoverServices:nil];
<6>获取已连接外设的服务
-(void)peripheral:(CBPeripheral *)peripheral didDiscoverServices:(NSError *)error;
该方法可以返回已连接外设的服务。在这里我们找到我们需要的服务,并获取对应服务的特征。
<7>获取对应服务的特征
-(void)peripheral:(CBPeripheral *)peripheral didDiscoverCharacteristicsForService:(CBService *)service error:(NSError *)error;
这个方法会给出你选择的服务里面的特种。在这里,我们找到我们需要的特种,并作为全局变量存储起来,因为我们在后面对外设进行写操作的时候会用到。这一点切记!
<8>对外设进行写操作
- (void)writeValue:(NSData *)data forCharacteristic:(CBCharacteristic *)characteristic type:(CBCharacteristicWriteType)type;
这里注意的是,一定要确保二进制流的正确性,检查特征的属性是否为可写,特征就是将上一步拿到的特征传入即可,type有两种,根据具体的硬件进行选择即可。对于读操作,因为比较简单,这里就不多说了。
到这里,作为中心者模式,大体的流程都已经走完。
3.使用过成功可能会遇到的坑
<1>必须在蓝牙打开的时候,才能调用扫描外围设备的API。
<2>中心外设向别的外设写入对数据的时候,一定要保证二进制串的正确性(这方面上我是吃过很大的亏的)。
4.推荐的第三方
在此,本来我是想自己封装一套蓝牙的调用机制,但是我看了BabyBlueTooth之后就放弃了。所以我强烈推荐BabyBlueTooth这个第三方库,想要的同学可以去github上面进行搜索。
5.最后附上demo地址
由于我的代码是基于我们的智能密码锁写出来的,里面的规则不便拿出来共享。所以,还是建议看BabyBlueTooth的Demo。如有任何疑问请添加QQ:2799569272,一起讨论。
<1>中心者模式:常用的(其实99.99%)就是使用中心者模式作为开发,就是我们手机作为主机,连接蓝牙外设。由于开发只用到了中心者模式,所以我也只介绍中心者模式。
<2>管理者模式:这个基本用到的比较少,我们手机自己作为外设,自己创建服务和特征,然后有其他的设备连接我们的手机。
<3>服务(services):蓝牙外设对外广播的必定会有一个服务,可能也有多个,服务下面包含着一些特征,服务可以理解成一个模块的窗口。
<4>特征(characteristic):存在于服务下面的,一个服务下面也可以存在多个特征,特征可以理解成具体实现功能的窗口,一般特征都会有value,也就是特征值,特征是与外界交互的最小单位。
<5>UUID:以理解成蓝牙上的唯一标识符(硬件上肯定不是这个意思,但是这样理解便于我们开发),为了区分不同的服务和特征,或者给服务和特征取名字,我们就用UUID来代表服务和特征。
<6>外设名字(name):不是每一个蓝牙外设都是拥有name的。在开发的时候,当你发现name属性为空,这是很正常的,我曾经就因为这个问题纠结了很久。
2.具体的操作流程
<1>遵循两个协议
CBCentralManagerDelegate(中心管理的协议),CBPeripheralDelegate(外设的协议),并打开手机的蓝牙。
<2>创建一个中心管理(CBCentralManager),并设置代理。
代理一旦设置,就会走协议(CBCentralManagerDelegate)里面的方法。
<3>扫描周围的外设
当-(void)centralManagerDidUpdateState:(CBCentralManager *)central方法检测到本机蓝牙开启的时候,开始扫描([central scanForPeripheralsWithServices:nil options:nil];)周围的外设,必须是本机蓝牙开启之后才去扫描周围外设。
<4>获取扫描到的外设
-(void)centralManager:(CBCentralManager *)central didDiscoverPeripheral:(CBPeripheral *)peripheral advertisementData:(NSDictionary<NSString *,id> *)advertisementData RSSI:(NSNumber *)RSSI;会返回扫描到的外设。如果你不关闭扫描,这个方法会一直被调用。
<5>连接外设
在上一步中选择一个外设进行连接。
- (void)connectPeripheral:(CBPeripheral *)peripheral options:(nullable NSDictionary<NSString *, id> *)options;
在下面三个方法中可以返回蓝牙连接的状态。如果连接成功,我们就开始设置外设的代理,并获取该外设的服务;
-(void)centralManager:(CBCentralManager *)central didConnectPeripheral:(CBPeripheral *)peripheral;
-(void)centralManager:(CBCentralManager *)central didFailToConnectPeripheral:(CBPeripheral *)peripheral error:(NSError *)error;
-(void)centralManager:(CBCentralManager *)central didDisconnectPeripheral:(CBPeripheral *)peripheral error:(NSError *)error;
[peripheral setDelegate:self];
[peripheral discoverServices:nil];
<6>获取已连接外设的服务
-(void)peripheral:(CBPeripheral *)peripheral didDiscoverServices:(NSError *)error;
该方法可以返回已连接外设的服务。在这里我们找到我们需要的服务,并获取对应服务的特征。
<7>获取对应服务的特征
-(void)peripheral:(CBPeripheral *)peripheral didDiscoverCharacteristicsForService:(CBService *)service error:(NSError *)error;
这个方法会给出你选择的服务里面的特种。在这里,我们找到我们需要的特种,并作为全局变量存储起来,因为我们在后面对外设进行写操作的时候会用到。这一点切记!
<8>对外设进行写操作
- (void)writeValue:(NSData *)data forCharacteristic:(CBCharacteristic *)characteristic type:(CBCharacteristicWriteType)type;
这里注意的是,一定要确保二进制流的正确性,检查特征的属性是否为可写,特征就是将上一步拿到的特征传入即可,type有两种,根据具体的硬件进行选择即可。对于读操作,因为比较简单,这里就不多说了。
到这里,作为中心者模式,大体的流程都已经走完。
3.使用过成功可能会遇到的坑
<1>必须在蓝牙打开的时候,才能调用扫描外围设备的API。
<2>中心外设向别的外设写入对数据的时候,一定要保证二进制串的正确性(这方面上我是吃过很大的亏的)。
4.推荐的第三方
在此,本来我是想自己封装一套蓝牙的调用机制,但是我看了BabyBlueTooth之后就放弃了。所以我强烈推荐BabyBlueTooth这个第三方库,想要的同学可以去github上面进行搜索。
5.最后附上demo地址
由于我的代码是基于我们的智能密码锁写出来的,里面的规则不便拿出来共享。所以,还是建议看BabyBlueTooth的Demo。如有任何疑问请添加QQ:2799569272,一起讨论。
相关文章推荐
- iOS开发 最近开发了蓝牙模块,在此记录总结一下
- 最近了解了一下ios开发的相关资料,把开源的相关文章进行记录
- 总结一下最近Nginx模块开发走过的弯路
- iOS开发之蓝牙总结
- Win7(64)+Eclipse+Hadoop2.6.4开发环境搭建--转载记录一下,虽然还没有配置成功
- oauth2 原理和理解(转载阮一峰的记录一下,后面自己再总结)
- 对于 iOS 开发基于经验的一些总结与规划 (转载侵删)
- IOS开发模块总结(一)本地数据存储7 NSKeyedArchiver归档
- 转载大神IOS开发系列【16】--通讯录、蓝牙、内购、GameCenter、iCloud、Passbook
- iOS开发 - 蓝牙学习的总结
- (转载)ios开发知识总结 — 上
- IOS开发模块总结(二)后台运行程序(1) 后台运行程序详解
- IOS开发模块总结(二)后台运行程序(1) 后台运行程序详解(二)
- ios客户端发现_动画屋后期页面重构与悬浮评论分享模块开发项目总结
- IOS开发模块总结(一)本地数据存储2 sqlite
- 记录一下iOS开发中琐碎的点点_5
- 方便与IOS开发的宏定义----别人的东西,自己记录一下
- 05-iOS蓝牙开发总结
- IOS开发(31)之关于self.用法的一些总结(转载)
- iOS蓝牙开发CoreBluetooth框架总结