iOS开发蓝牙 蓝牙4.0的各种踩过的坑,希望你们少踩点
2016-03-16 10:07
375 查看
1.首先建立这个三个参数
2、初始化CBCentralManager
3.开始扫描蓝牙
4.当蓝牙状态改变的时候就会调用这个方法
5.连接外围设备
6.连接玩设备就调用成功的方法,然后开始扫描
7.发现服务和设备的服务设备services
8.找到了设备的服务然后扫描特征
9.最后一步要写上通知这个一定要写上
10.大功告成只差一步就是写数据
11.希望能帮到人,让别人少走点坑。
@property (nonatomic,strong)CBCentralManager * manager; @property (nonatomic,strong)CBPeripheral * peripheral; @property (nonatomic,strong)CBCharacteristic *writeDataCharacteristic
2、初始化CBCentralManager
-(CBCentralManager *)manager { if (!_manager ) { _manager = [[CBCentralManager alloc]initWithDelegate:self queue:dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0) options:nil]; } return _manager; }
3.开始扫描蓝牙
[self.manager scanForPeripheralsWithServices:nil options:@{CBCentralManagerRestoredStateScanOptionsKey:@(YES)}];
4.当蓝牙状态改变的时候就会调用这个方法
- (void)centralManagerDidUpdateState:(CBCentralManager *)central { switch (central.state) { case CBCentralManagerStateUnknown: //设备不支持的状态 NSLog(@">>>CBCentralManagerStateUnknown"); { dispatch_async(dispatch_get_main_queue(), ^{ ALERTVIEW(@"设备不支持"); }); } break; case CBCentralManagerStateResetting: //正在重置状态 { dispatch_async(dispatch_get_main_queue(), ^{ ALERTVIEW(@"正在重置状态"); }) ; } NSLog(@">>>CBCentralManagerStateResetting"); break; case CBCentralManagerStateUnsupported: //设备不支持的状态 { dispatch_async(dispatch_get_main_queue(), ^{ ALERTVIEW(@"设备不支持的状态"); }); } NSLog(@">>>CBCentralManagerStateUnsupported"); break; case CBCentralManagerStateUnauthorized: // 设备未授权状态 { dispatch_async(dispatch_get_main_queue(), ^{ ALERTVIEW(@"设备未授权状态"); }); } NSLog(@">>>CBCentralManagerStateUnauthorized"); break; case CBCentralManagerStatePoweredOff: //设备关闭状态 { dispatch_async(dispatch_get_main_queue(), ^{ ALERTVIEW(@"设备关闭状态"); }); } NSLog(@">>>CBCentralManagerStatePoweredOff"); break; case CBCentralManagerStatePoweredOn: NSLog(@">>>CBCentralManagerStatePoweredOn"); //开始扫描周围的外设 [self.manager scanForPeripheralsWithServices:nil options:@{CBCentralManagerRestoredStateScanOptionsKey:@(YES)}]; break; default: break; } }
5.连接外围设备
- (void)connect:(CBPeripheral *)peripheral { // 连接外围设备 [self.manager connectPeripheral:peripheral options:nil]; }
6.连接玩设备就调用成功的方法,然后开始扫描
//连接到Peripherals-成功 //扫描外设中的服务和特征 连接上外围设备的时候会调用该方法 - (void)centralManager:(CBCentralManager *)central didConnectPeripheral:(CBPeripheral *)peripheral { NSLog(@">>>连接到名称为(%@)的设备-成功",peripheral.name); //设置的peripheral委托CBPeripheralDelegate //@interface ViewController : UIViewController [peripheral setDelegate:self]; //扫描外设Services,成功后会进入方法:-(void)peripheral:(CBPeripheral *)peripheral didDiscoverServices:(NSError *)error{ [peripheral discoverServices:nil]; } //连接到Peripherals-失败 -(void)centralManager:(CBCentralManager *)central didFailToConnectPeripheral:(CBPeripheral *)peripheral error:(NSError *)error { NSLog(@">>>连接到名称为(%@)的设备-失败,原因:%@",[peripheral name],[error localizedDescription]); }
7.发现服务和设备的服务设备services
//发现服务 - (void)centralManager:(CBCentralManager *)central didDiscoverPeripheral:(CBPeripheral *)peripheral advertisementData:(NSDictionary *)advertisementData RSSI:(NSNumber *)RSSI{ NSLog(@"Discovered services for %@ ", peripheral.name); if (![self.dataSourceArray containsObject:peripheral]) { [self.dataSourceArray addObject:peripheral]; NSLog(@"%@",peripheral); dispatch_async(dispatch_get_main_queue(), ^{ [_tableView reloadData]; }); } } /** * 发现外围设备的服务会来到该方法(扫描到服务之后直接添加peripheral的services) */ - (void)peripheral:(CBPeripheral *)peripheral didDiscoverServices:(NSError *)error { NSLog(@"发现外围设备的服务"); for (CBService *serivce in peripheral.services) { NSLog(@"====%@------%@+++++++",serivce.UUID.UUIDString,self.peripheral.identifier); if ([serivce.UUID.UUIDString isEqualToString:UUIDSTR_ISSC_PROPRIETARY_SERVICE]) { // characteristicUUIDs : 可以指定想要扫描的特征(传nil,扫描所有的特征) [peripheral discoverCharacteristics:nil forService:serivce]; } } }
8.找到了设备的服务然后扫描特征
- (void)peripheral:(CBPeripheral *)peripheral didDiscoverCharacteristicsForService:(CBService *)service error:(NSError *)error { NSLog(@"发现外围设备的特征"); for (CBCharacteristic *characteristic in service.characteristics) { NSLog(@"====%@------+",characteristic.UUID.UUIDString); if ([characteristic.UUID.UUIDString isEqualToString:UUIDSTR_ISSC_TRANS_TX]) { // 拿到特征,和外围设备进行交互 [self notifyCharacteristic:peripheral characteristic:characteristic]; } } for (CBCharacteristic *characteristic in service.characteristics) { NSLog(@"====%@------+",characteristic.UUID.UUIDString); if ([characteristic.UUID.UUIDString isEqualToString:UUIDSTR_ISSC_TRANS_RX]) { // 拿到特征,和外围设备进行交互 保存写的特征 self.writeDataCharacteristic = characteristic; } } }
9.最后一步要写上通知这个一定要写上
//设置通知 -(void)notifyCharacteristic:(CBPeripheral *)peripheral characteristic:(CBCharacteristic *)characteristic{ //设置通知,数据通知会进入:didUpdateValueForCharacteristic方法 [peripheral setNotifyValue:YES forCharacteristic:characteristic]; [self.manager stopScan]; } //取消通知 -(void)cancelNotifyCharacteristic:(CBPeripheral *)peripheral characteristic:(CBCharacteristic *)characteristic{ [peripheral setNotifyValue:NO forCharacteristic:characteristic]; }
10.大功告成只差一步就是写数据
//写数据 -(void)writeCharacteristic:(CBPeripheral *)peripheral characteristic:(CBCharacteristic *)characteristic value:(NSData *)value { //只有 characteristic.properties 有write的权限才可以写 if(characteristic.properties & CBCharacteristicPropertyWrite){ /* 最好一个type参数可以为CBCharacteristicWriteWithResponse或type:CBCharacteristicWriteWithResponse,区别是是否会有反馈 */ [peripheral writeValue:value forCharacteristic:characteristic type:CBCharacteristicWriteWithResponse]; }else{ NSLog(@"该字段不可写!"); } }
11.希望能帮到人,让别人少走点坑。
相关文章推荐
- IOS 改变提示placeholder颜色和大小
- iOS开发实现音频播放功能
- 适配iOS9出现的一些问题
- iOS自定义导航栏形状
- 点击任意空白收回键盘
- 文本框随键盘动态改变位置(获取键盘弹起高度)
- iOS开发 蓝牙4.0的各种亲身经历踩过得坑
- iOS开发实战之真机调试(免证书)
- iOS项目目录结构
- IOS taBbar item角标设置
- 【转】在写一个iOS应用之前必须做的7件事(附相关资源)
- ios开发笔记之TextView
- iOS开发 - "Cast from pointer to smaller type 'int' loses information” 解决的方法
- IOS之开发者申请测试证书步骤
- iOS使用CollectionView实现瀑布流
- 在写一个iOS应用之前必须做的7件事(附相关资源)
- 详解在iOS App中自定义和隐藏状态栏的方法
- iOS报错笔记
- iOS开发笔记13:顶部标签式导航栏及下拉分类菜单
- IOS开发之 一个实例解析 录音