iOS蓝牙开发数据实时传输
随着iOS项目开发 很多app需要通过蓝牙与设备连接
蓝牙开发注意:
先定义中心设备和外围设备以及遵守蓝牙协议
@interface ViewController()<CBCentralManagerDelegate,CBPeripheralDelegate> @property (strong, nonatomic) CBCentralManager *manager; @property (nonatomic, strong) CBPeripheral *peripheral; @property (nonatomic, weak)NSTimer * connentTimer; @end
再实现delegate方法
1.判断蓝牙状态,如成功则扫描指定UUID设备(如不指定UUID,则无法后台持续连接)
2.当发现指定设备后,连接该设备
3.当连接指定外围设备成功,编写定时器,每秒读取1次RSSI
4.当监听到失去和外围设备连接,重新建立连接
5.当读取到RSSI值,打印出它的值
//蓝牙状态 - (void)centralManagerDidUpdateState:(CBCentralManager *)central { NSString * state = nil; switch ([central state]) { case CBCentralManagerStateUnsupported: state = @"The platform/hardware doesn't support Bluetooth Low Energy."; break; //应用程序没有被授权使用蓝牙 case CBCentralManagerStateUnauthorized: state = @"The app is not authorized to use Bluetooth Low Energy."; break; //尚未打开蓝牙 case CBCentralManagerStatePoweredOff: state = @"Bluetooth is currently powered off."; break; //连接成功 case CBCentralManagerStatePoweredOn: [self.manager scanForPeripheralsWithServices:nil options:nil]; state = @"work"; break; case CBCentralManagerStateUnknown: default: ; } NSLog(@"Central manager state: %@", state); } //查找设备 - (void)centralManager:(CBCentralManager *)central didDiscoverPeripheral:(CBPeripheral *)peripheral advertisementData:(NSDictionary *)advertisementData RSSI:(NSNumber *)RSSI { //每个蓝牙设备有自己唯一的标识符,根据标识符确认自己要连接的设备 if ([peripheral.identifier isEqual:self.peripheral.identifier]) { self.peripheral = peripheral; //数据连接定时器 self.connentTimer = [NSTimer scheduledTimerWithTimeInterval:1 target:self selector:@selector(connentPeripheral) userInfo:@"timer" repeats:YES]; [self.connentTimer fire]; } } - (void)connentPeripheral { //连接外设 self.manager.delegate = self; [self.manager connectPeripheral:_peripheral options:[NSDictionary dictionaryWithObject:[NSNumber numberWithBool:YES] forKey:CBConnectPeripheralOptionNotifyOnDisconnectionKey]]; } //连接成功后调用 - (void)centralManager:(CBCentralManager *)central didConnectPeripheral:(CBPeripheral *)peripheral { NSLog(@"Did connect to peripheral: %@,%@", peripheral,peripheral.name); [peripheral setDelegate:self]; //查找服务 [peripheral discoverServices:nil]; [self.connentTimer invalidate]; //监测设备是否断开了 // [self createWorkDataSourceWithTimeInterval:1]; } //当监听到失去和外围设备连接,重新建立连接 //这个方法是必须实现的,因为蓝牙会中断连接,正好触发这个方法重建连接。重建连接可能造成数秒后才能读取到RSSI。 - (void)centralManager:(CBCentralManager *)central didDisconnectPeripheral:(CBPeripheral *)peripheral error:(NSError *)error { [self.manager connectPeripheral:peripheral options:nil]; } - (void)centralManager:(CBCentralManager *)central didFailToConnectPeripheral:(CBPeripheral *)peripheral error:(NSError *)error { NSLog(@"%@",error.description); } //返回的蓝牙服务通知通过代理实现 - (void)peripheral:(CBPeripheral *)peripheral didDiscoverServices:(NSError *)error { if (error) { NSLog(@"Discovered services for %@ with error: %@", peripheral.name, [error localizedDescription]); return; } for (CBService *service in peripheral.services) { // NSLog(@"Service found with UUID: %@", service.UUID.UUIDString); //发现服务 if ([service.UUID isEqual:[CBUUID UUIDWithString:@"180D"]])//heart rate { //在一个服务中寻找特征值 [peripheral discoverCharacteristics:nil forService:service]; } } } //返回的蓝牙特征值通知通过代理实现 - (void)peripheral:(CBPeripheral *)peripheral didDiscoverCharacteristicsForService:(CBService *)service error:(NSError *)error { if (error) { NSLog(@"Discovered characteristics for %@ with error: %@", service.UUID, [error localizedDescription]); return; } for (CBCharacteristic * characteristic in service.characteristics) { NSLog(@"characteristic:%@",characteristic); if( [characteristic.UUID isEqual:[CBUUID UUIDWithString:@"2A37"]]) { [self notification:service.UUID characteristicUUID:characteristic.UUID peripheral:peripheral on:YES]; // [self.peripheral setNotifyValue:YES forCharacteristic:characteristic]; } } } //处理蓝牙发过来的数据 - (void)peripheral:(CBPeripheral *)peripheral didUpdateValueForCharacteristic:(CBCharacteristic *)characteristic error:(NSError *)error { } -(void) notification:(CBUUID *) serviceUUID characteristicUUID:(CBUUID *)characteristicUUID peripheral:(CBPeripheral *)p on:(BOOL)on { CBService *service = [self getServiceFromUUID:serviceUUID p:p]; if (!service) { // if (p.UUID == NULL) return; // zach ios6 addedche // NSLog(@"Could not find service with UUID on peripheral with UUID \n"); return; } CBCharacteristic *characteristic = [self getCharacteristicFromUUID:characteristicUUID service:service]; if (!characteristic) { // if (p.UUID == NULL) return; // zach ios6 added // NSLog(@"Could not find characteristic with UUID on service with UUID on peripheral with UUID\n"); return; } [p setNotifyValue:on forCharacteristic:characteristic]; } -(CBService *) getServiceFromUUID:(CBUUID *)UUID p:(CBPeripheral *)p { for (CBService* s in p.services) { if ([s.UUID isEqual:UUID]) return s; } return nil; //Service not found on this peripheral } -(CBCharacteristic *) getCharacteristicFromUUID:(CBUUID *)UUID service:(CBService*)service { for (CBCharacteristic* c in service.characteristics) { if ([c.UUID isEqual:UUID]) return c; } return nil; //Characteristic not found on this service }
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持我们。
您可能感兴趣的文章
- 01-11iOS常用算法之两个有序数组合并(要求时间复杂度为0(n))
- 01-11iOS 弹幕功能的实现思路图解
- 01-11iOS调试Block引用对象无法被释放的小技巧分享
- 01-11iOS动态更换Icon的全过程记录
- 01-11iOS实现文本分页的方法示例
- 01-11iOS常见宏理解及使用方法
- 01-11iOs迁至WKWebView跨过的一些坑
- 01-11iOS模拟中奖名单循环滚动效果
- 01-11Python一键查找iOS项目中未使用的图片、音频、视频资源
- 01-11iOS中如何获取某个视图的截图详析
阅读排行
本栏相关
- 01-11UILabel显示定时器文本跳动问题的解决
- 01-11iOS常用算法之两个有序数组合并(要
- 01-11iOS 弹幕功能的实现思路图解
- 01-11详解MacOs免密登录CentOs操作步骤
- 01-11iOS动态更换Icon的全过程记录
- 01-11iOS调试Block引用对象无法被释放的小技
- 01-11iOS常见宏理解及使用方法
- 01-11iOS实现文本分页的方法示例
- 01-11iOs迁至WKWebView跨过的一些坑
- 01-11iOS模拟中奖名单循环滚动效果
随机阅读
- 08-05织梦dedecms什么时候用栏目交叉功能?
- 08-05dedecms(织梦)副栏目数量限制代码修改
- 01-10使用C语言求解扑克牌的顺子及n个骰子
- 01-11ajax实现页面的局部加载
- 01-10C#中split用法实例总结
- 01-10delphi制作wav文件的方法
- 01-11Mac OSX 打开原生自带读写NTFS功能(图文
- 01-10SublimeText编译C开发环境设置
- 04-02jquery与jsp,用jquery
- 08-05DEDE织梦data目录下的sessions文件夹有什