IOS BLE 蓝牙实现方式
2016-03-10 15:20
555 查看
// // ViewController.m // BleTemperatureDemo // // Created by jacob on 16/3/9. // Copyright © 2016年 jacob. All rights reserved. // #import "ViewController.h" #import <CoreBluetooth/CoreBluetooth.h> //电池的service uuid static NSString *BATTERY_SERVICE = @"1xxx"; //电池的特征值的UUID static NSString *BATTERY_READ_CHAR = @"2Axx"; //体温数据的service UUID static NSString *HEALTH_SERVICE = @"1xxx"; //体温特征值的UUID static NSString *HEALTH_READ_CHAR = @"2xxx"; @interface ViewController () <CBCentralManagerDelegate,CBPeripheralDelegate> @property (weak, nonatomic) IBOutlet UILabel *labelState; @property (weak, nonatomic) IBOutlet UILabel *labelTemperature; @property (weak, nonatomic) IBOutlet UILabel *labelBattery; @property(nonatomic,strong) CBCentralManager *bleManager; @property(nonatomic,strong) NSMutableArray *multArray; @property(nonatomic,strong) CBPeripheral *myPeripheral; - (IBAction)startScan:(UIButton *)sender; - (IBAction)stopScan:(UIButton *)sender; @end @implementation ViewController - (void)viewDidLoad { [super viewDidLoad]; _bleManager = [[CBCentralManager alloc]initWithDelegate:self queue:nil]; } - (void)centralManagerDidUpdateState:(CBCentralManager *)central{ NSLog(@"centralManagerDidUpdateState"); switch (central.state) { case CBCentralManagerStatePoweredOff: NSLog(@"蓝牙已关闭"); break; case CBCentralManagerStatePoweredOn: NSLog(@"蓝牙已打开"); break; case CBCentralManagerStateUnsupported: NSLog(@"不支持蓝牙"); break; default: break; } } -(void)centralManager:(CBCentralManager *)central didDiscoverPeripheral:(CBPeripheral *)peripheral advertisementData:(NSDictionary<NSString *,id> *)advertisementData RSSI:(NSNumber *)RSSI{ NSLog(@"peripheral--:%@",peripheral); if ([peripheral.name containsString:@"Thermometer"]) { self.labelState.text = @"已发现设备"; peripheral.delegate = self; NSLog(@"开始连接设备"); self.myPeripheral = peripheral; [self.bleManager connectPeripheral:self.myPeripheral options:nil]; } } /** *连接上设备的信息回调,连接上设备后,开始发现服务 */ -(void)centralManager:(CBCentralManager *)central didConnectPeripheral:(CBPeripheral *)peripheral{ NSLog(@"设备连接成功,准备扫描服务"); [peripheral discoverServices:nil]; self.labelState.text = @"设备连接成功"; } -(void)centralManager:(CBCentralManager *)central didDisconnectPeripheral:(CBPeripheral *)peripheral error:(NSError *)error{ self.labelState.text = @"设备已经断开"; if (error) { NSLog(@"didDisconnectPeripheral with error : %@",error); return; } } /** 扫描外设服务的数据回调 */ -(void)peripheral:(CBPeripheral *)peripheral didDiscoverServices:(NSError *)error{ if (error) { NSLog(@"didDiscoverServices with error : %@",error); return; } for (CBService *service in peripheral.services) { NSLog(@"service uuid: %@",service.UUID.UUIDString); if ([service.UUID.UUIDString isEqualToString:BATTERY_SERVICE]) { NSLog(@"已经发现电池对应的服务"); [peripheral discoverCharacteristics:nil forService:service]; } if ([service.UUID.UUIDString isEqualToString:HEALTH_SERVICE]) { NSLog(@"已经发现体温数据对应的服务"); [peripheral discoverCharacteristics:nil forService:service]; } } } -(void)peripheral:(CBPeripheral *)peripheral didDiscoverCharacteristicsForService:(CBService *)service error:(NSError *)error{ NSLog(@"发现服务 %@, 特性数: %ld", service.UUID, [service.characteristics count]); if (error) { NSLog(@"didDiscoverCharacteristicsForService with error : %@",error); return; } //电池电量的数据直接读对应的特征值即可 if ([service.UUID.UUIDString isEqualToString:BATTERY_SERVICE]) { for (CBCharacteristic *character in service.characteristics) { if ([character.UUID.UUIDString isEqualToString:BATTERY_READ_CHAR]) { NSLog(@"已找到電池对应服务中的 特征值"); [peripheral readValueForCharacteristic:character]; } } } //体温数据需要通过notify的方式进行获取 if ([service.UUID.UUIDString isEqualToString:HEALTH_SERVICE]) { for (CBCharacteristic *character in service.characteristics) { if ([character.UUID.UUIDString isEqualToString:HEALTH_READ_CHAR]) { NSLog(@"已找到体温对应服务中的 特征值"); [peripheral setNotifyValue:YES forCharacteristic:character]; } } } } /** read 或者 notify的方式都会在这个函数中返回数据 */ -(void)peripheral:(CBPeripheral *)peripheral didUpdateValueForCharacteristic:(CBCharacteristic *)characteristic error:(NSError *)error{ if (error) { NSLog(@"didUpdateValueForCharacteristic with error : %@",error); return; } NSData *data = characteristic.value; NSLog(@"收到数据啦 %@---%@", data,characteristic.UUID); //电量数据 if ([characteristic.UUID.UUIDString isEqualToString:BATTERY_READ_CHAR]) { int battery; [data getBytes: &battery length: sizeof(battery)]; self.labelBattery.text = [NSString stringWithFormat:@"%d",battery]; } //体温数据 if ([characteristic.UUID.UUIDString isEqualToString:HEALTH_READ_CHAR]) { Byte *testByte = (Byte *)[data bytes]; Byte orgin[4]; orgin[0] = testByte[1]; orgin[1] = testByte[2]; orgin[2] = testByte[3]; NSData *chidata=[NSData dataWithBytes:orgin length:4]; int code; [chidata getBytes:&code length:4]; //NSInteger temp = [self byteToInt:orgin]; self.labelTemperature.text = [NSString stringWithFormat:@"%.2f",(0.1+0.01*code)]; } } - (IBAction)startScan:(UIButton *)sender { [self.bleManager scanForPeripheralsWithServices:nil options:@{CBCentralManagerScanOptionAllowDuplicatesKey:@(YES)}]; NSLog(@"开始扫描"); } - (IBAction)stopScan:(UIButton *)sender { NSLog(@"停止扫描"); [self.bleManager stopScan ]; [self.bleManager cancelPeripheralConnection:self.myPeripheral]; self.labelBattery.text = @""; self.labelState.text = @""; self.labelTemperature.text = @""; } @end
相关文章推荐
- iOS之常用宏定义
- iOS 开启热点 和 打电话等 高度适配
- iOS开发--CoreGraphics简单绘图
- IOS各种系统控件的高度记录
- iOS 一些常用的开发技巧
- iOS 多线程 pthread的简单使用——iOS 编码复习(五)(多线程3)
- 学习AutoLayout(VFL)
- Xcode 7免证书真机调试
- iOS 开发怎么入门?
- iOS-自定义textView键盘收回按钮
- ios 原生推送配置
- 【图灵】iOS技能书单——入门+进阶+精通
- iOS Xcode必备插件
- ios runtime基础应用
- 枚举 以及 block的定义
- 怎么给iOS项目打包
- iOS学习路线
- hidesBottomBarWhenPushed的正确用法
- iOS图解多线程
- 准备整理一套iOS开发的类库(敬请期待!)