iOS蓝牙连接多台设备
来源:互联网 发布:数据定义语言 编辑:程序博客网 时间:2024/06/06 02:19
1. 框架
利用蓝牙CoreBluetooth框架 在7.0以上就用这个连接蓝牙框架。
2.连接
连接多台蓝牙设备与单台连接蓝牙设备的道理是一样,同样需要首先发现蓝牙设备然后把发现的设备添加到一个 NSMutableArray 保存起来。
具体看下面代码:
首先 我们需要创建
@property (nonatomic,strong ) CBCentralManager *manager;// 中心设备@property (nonatomic,strong ) NSMutableArray <CBPeripheral*>*devices;// 扫描到的外围设备@property (nonatomic, strong) NSMutableArray *connectSuccess;//连接成功的的外设
上面 CBCentralManager 是指定的中心设备(手机 ,平板…)
而 CBPeripheral 所指的是需要连接的蓝牙设备(耳机,手表,手环…等等)
需要一个 connectSuccess 用来保存连接成功的设备。
设置 CBCentralManager 代理
@interface ViewController ()<CBCentralManagerDelegate>
当打开程序的时候就要实现此代理 CBCentralManagerDelegate
并自动检查手机蓝牙是否打开,只有打开的时候才会去自动的扫描蓝牙设备
//中心设备状态改变的代理必须实现- (void)centralManagerDidUpdateState:(CBCentralManager *)central{ switch (central.state) { case CBManagerStatePoweredOn: NSLog(@"蓝牙已打开"); //自动开始扫描 [self startScan]; break; case CBManagerStateUnknown: break; case CBManagerStatePoweredOff: NSLog(@"蓝牙未打开"); break; case CBManagerStateResetting: // [self showInfo:@"蓝牙初始化中"]; break; case CBManagerStateUnsupported: NSLog(@"蓝牙不支持状态"); // [self showInfo:@"蓝牙不支持状态"]; break; case CBManagerStateUnauthorized: // [self showInfo:@"蓝牙设备未授权"]; break; default: break; }}
扫描蓝牙
下面的代码 扫描不是一直在进行 15秒后结束扫描
/* * 开始扫描 */-(void) startScan{ NSLog(@"scan...."); [self.manager scanForPeripheralsWithServices:nil options:nil]; //15秒后停止。 //(开启扫描后会不停的扫描) [self performSelector:@selector(stopScan) withObject:nil afterDelay:15];}
停止扫描
中心设备停止(手机、平板…)
/** * 停止扫描 */-(void)stopScan{ [self.manager stopScan]; NSLog(@"stopScan....");}
扫描到设备就要添加设备 最好是放到tableview中
并所有扫描出来的 peripheral 添加到 self.devices 中
相应的tableview也要刷新一下
/** * 扫描蓝牙的代理 * * @param central 中心设备 * @param peripheral 扫描到的蓝牙 * @param advertisementData 在ios中蓝牙广播信息中通常会包含以下4种类型的信息。ios的蓝牙通信协议中不接受其他类型的广播信息。 因此需要注意的是,如果需要在扫描设备时,通过蓝牙设备的Mac地址来唯一辨别设备,那么需要与蓝牙设备的硬件工程师沟通好:将所需要的Mac地址放到一下几种类型的广播信息中。 通常放到kCBAdvDataManufacturerData这个字段中。 kCBAdvDataIsConnectable = 1; kCBAdvDataLocalName = XXXXXX; kCBAdvDataManufacturerData = <XXXXXXXX>; kCBAdvDataTxPowerLevel = 0; * @param RSSI 信号强度 *///扫描到的蓝牙设备添加到devices数组中,刷新列表-(void)centralManager:(CBCentralManager *)centraldidDiscoverPeripheral:(CBPeripheral *)peripheral advertisementData:(NSDictionary<NSString *,id> *)advertisementData RSSI:(NSNumber *)RSSI{ if (![self.devices containsObject:peripheral]) { [self.devices addObject:peripheral]; [self.tableView reloadData]; NSLog(@"发现外围设备:%@---RSSI:%@---advertisementData:%@",peripheral,RSSI,advertisementData); }}
点击tableview中各个蓝牙选择项 并连接蓝牙 提示给用户 连接成功
并把连接成功的 peripheral 添加到 self.connectSuccess中
/** * 蓝牙连接成功时候的代理 * * @param central 中心设备 * @param peripheral 当前连接的设备 */-(void)centralManager:(CBCentralManager *)central didConnectPeripheral:(CBPeripheral *)peripheral{ NSLog(@"%@名字的蓝牙连接成功",peripheral.name); _maincell.txtDeviceContent.text = @"已连接"; //cell.detailTextLabel.text = @"已连接"; [self.connectSuccess addObject:peripheral];}
同样也有失败和断开的时候
失败的时候不做处理 也可以做处理
但是断开的时候 需要把 连接成功的 self.connectSuccess 设备移除掉
并在tableview中把 连接成功的文字清空。这样就变为没有连接的状态
/** * 蓝牙链接失败的代理 * * @param central 中心设备 * @param peripheral 当前连接的外设 * @param error 错误信息 */- (void)centralManager:(CBCentralManager *)central didFailToConnectPeripheral:(CBPeripheral *)peripheral error:(nullable NSError *)error;{ NSLog(@"%@名字的蓝牙连接失败",peripheral.name);}/** * 蓝牙断开连接的代理 * * @param central 中心设备 * @param peripheral 当前需要断开连接的外设 * @param error 错误信息 */-(void)centralManager:(CBCentralManager *)central didDisconnectPeripheral:(CBPeripheral *)peripheral error:(NSError *)error{ NSLog(@"%@名字的蓝牙断开链接",peripheral.name); _maincell.txtDeviceContent.text = @""; for(int i=0;i<_connectSuccess.count;i++){ CBPeripheral *p = [_connectSuccess objectAtIndex:i]; if ([p.identifier.UUIDString isEqualToString:peripheral.identifier.UUIDString]) { [self.connectSuccess removeObject:p]; } }}
具体的连接的代码如下:
头部没有东西
ViewController.m
//// ViewController.m//#import "ViewController.h"#import <CoreBluetooth/CoreBluetooth.h>#import "mainViewCell.h"@interface ViewController ()<CBCentralManagerDelegate,UITableViewDelegate,UITableViewDataSource>- (IBAction)btnSure:(id)sender;@property (weak, nonatomic) IBOutlet UITableView *tableView;@property(nonatomic,strong) mainViewCell *maincell;@property (nonatomic,strong ) CBCentralManager *manager;// 中心设备@property (nonatomic,strong ) NSMutableArray <CBPeripheral*>*devices;// 扫描到的外围设备@property (nonatomic, strong) NSMutableArray *connectSuccess;//链接成功的的外设@end@implementation ViewController- (void)viewDidLoad { [super viewDidLoad]; UIColor *blues = [self stringTOColor:@"#436EEE"]; [self.navigationController.navigationBar setTitleTextAttributes:[NSDictionary dictionaryWithObjectsAndKeys:[UIColor whiteColor],UITextAttributeTextColor,nil]]; [self.navigationController.navigationBar setBarTintColor:blues]; self.navigationController.navigationBar.tintColor = [UIColor whiteColor]; UIBarButtonItem *item = [[UIBarButtonItem alloc] initWithTitle:@"Back" style:UIBarButtonItemStylePlain target:nil action:nil]; self.navigationItem.backBarButtonItem = item; _maincell = [[mainViewCell alloc] init]; self.manager = [[CBCentralManager alloc] initWithDelegate:self queue:nil]; self.devices = [NSMutableArray array]; self.connectSuccess = [NSMutableArray array]; self.tableView.delegate = self; self.tableView.dataSource = self; //创建下啦刷新 //UIRefreshControl *rc = [[UIRefreshControl alloc] init]; //rc.attributedTitle = [[NSAttributedString alloc] initWithString:@"Drop Scan"]; //[rc addTarget:self action:@selector(redreshTableView) forControlEvents:UIControlEventValueChanged]; //self.refreshControl = rc;}/* * 字符串转为颜色值 */- (UIColor *) stringTOColor:(NSString *)str{ if (!str || [str isEqualToString:@""]) { return nil; } unsigned red,green,blue; NSRange range; range.length = 2; range.location = 1; [[NSScanner scannerWithString:[str substringWithRange:range]] scanHexInt:&red]; range.location = 3; [[NSScanner scannerWithString:[str substringWithRange:range]] scanHexInt:&green]; range.location = 5; [[NSScanner scannerWithString:[str substringWithRange:range]] scanHexInt:&blue]; UIColor *color= [UIColor colorWithRed:red/255.0f green:green/255.0f blue:blue/255.0f alpha:1]; return color;}/* * 开始扫描 */-(void) startScan{ NSLog(@"scan...."); [self.manager scanForPeripheralsWithServices:nil options:nil]; //[self.manager scanForPeripheralsWithServices:nil options:@{CBCentralManagerScanOptionAllowDuplicatesKey:@YES}]; //3秒后停止。(开启扫描后会不停的扫描) [self performSelector:@selector(stopScan) withObject:nil afterDelay:15];}/** * 停止扫描 */-(void)stopScan{ [self.manager stopScan]; NSLog(@"stopScan....");}//中心设备状态改变的代理必须实现- (void)centralManagerDidUpdateState:(CBCentralManager *)central{ switch (central.state) { case CBManagerStatePoweredOn: NSLog(@"蓝牙已打开"); //自动开始扫描 [self startScan]; break; case CBManagerStateUnknown: break; case CBManagerStatePoweredOff: NSLog(@"蓝牙未打开"); break; case CBManagerStateResetting: // [self showInfo:@"蓝牙初始化中"]; break; case CBManagerStateUnsupported: NSLog(@"蓝牙不支持状态"); // [self showInfo:@"蓝牙不支持状态"]; break; case CBManagerStateUnauthorized: // [self showInfo:@"蓝牙设备未授权"]; break; default: break; }}- (void)didReceiveMemoryWarning { [super didReceiveMemoryWarning]; // Dispose of any resources that can be recreated.}/** * 扫描蓝牙的代理 * * @param central 中心设备 * @param peripheral 扫描到的蓝牙 * @param advertisementData 在ios中蓝牙广播信息中通常会包含以下4种类型的信息。ios的蓝牙通信协议中不接受其他类型的广播信息。 因此需要注意的是,如果需要在扫描设备时,通过蓝牙设备的Mac地址来唯一辨别设备,那么需要与蓝牙设备的硬件工程师沟通好:将所需要的Mac地址放到一下几种类型的广播信息中。 通常放到kCBAdvDataManufacturerData这个字段中。 kCBAdvDataIsConnectable = 1; kCBAdvDataLocalName = XXXXXX; kCBAdvDataManufacturerData = <XXXXXXXX>; kCBAdvDataTxPowerLevel = 0; * @param RSSI 信号强度 *///扫描到的蓝牙设备添加到devices数组中,刷新列表-(void)centralManager:(CBCentralManager *)centraldidDiscoverPeripheral:(CBPeripheral *)peripheral advertisementData:(NSDictionary<NSString *,id> *)advertisementData RSSI:(NSNumber *)RSSI{ if (![self.devices containsObject:peripheral]) { [self.devices addObject:peripheral]; [self.tableView reloadData]; NSLog(@"发现外围设备:%@---RSSI:%@---advertisementData:%@",peripheral,RSSI,advertisementData); }}/** * 蓝牙连接成功时候的代理 * * @param central 中心设备 * @param peripheral 当前连接的设备 */-(void)centralManager:(CBCentralManager *)central didConnectPeripheral:(CBPeripheral *)peripheral{ NSLog(@"%@名字的蓝牙连接成功",peripheral.name); _maincell.txtDeviceContent.text = @"已连接"; //cell.detailTextLabel.text = @"已连接"; [self.connectSuccess addObject:peripheral];}/** * 蓝牙链接失败的代理 * * @param central 中心设备 * @param peripheral 当前连接的外设 * @param error 错误信息 */- (void)centralManager:(CBCentralManager *)central didFailToConnectPeripheral:(CBPeripheral *)peripheral error:(nullable NSError *)error;{ NSLog(@"%@名字的蓝牙连接失败",peripheral.name);}/** * 蓝牙断开连接的代理 * * @param central 中心设备 * @param peripheral 当前需要断开连接的外设 * @param error 错误信息 */-(void)centralManager:(CBCentralManager *)central didDisconnectPeripheral:(CBPeripheral *)peripheral error:(NSError *)error{ NSLog(@"%@名字的蓝牙断开链接",peripheral.name); _maincell.txtDeviceContent.text = @""; for(int i=0;i<_connectSuccess.count;i++){ CBPeripheral *p = [_connectSuccess objectAtIndex:i]; if ([p.identifier.UUIDString isEqualToString:peripheral.identifier.UUIDString]) { [self.connectSuccess removeObject:p]; } } /*for (CBPeripheral *p in self.connectSuccess) { if ([p.identifier.UUIDString isEqualToString:peripheral.identifier.UUIDString]) { [self.connectSuccess removeObject:p]; } }*/}-(void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath{ [self.manager connectPeripheral:self.devices[indexPath.row] options:nil]; _maincell = [tableView cellForRowAtIndexPath:indexPath];}-(NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section{ return self.devices.count;}-(UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath{ static NSString *CellIdentifier = @"ViewCell"; mainViewCell *cell1 = [tableView dequeueReusableCellWithIdentifier:CellIdentifier]; if (cell1 == nil) { cell1 = [[mainViewCell alloc] initWithStyle:UITableViewCellStyleValue1 reuseIdentifier:CellIdentifier]; } if (!self.devices[indexPath.row].name) { cell1.txtDeviceName.text=@"null"; }else{ cell1.txtDeviceName.text=self.devices[indexPath.row].name; //cell1.txtDeviceAddre.text=self.devices[indexPath.row].identifier; NSString *c = [NSString stringWithFormat:@"%@",self.devices[indexPath.row].identifier]; NSString *b = NULL; if ([[UIDevice currentDevice].systemVersion floatValue] < 10.0) { b = [c substringFromIndex:30]; }else{ b = [c substringFromIndex:30]; } cell1.txtDeviceAddre.text = b; } return cell1;}-(BOOL)tableView:(UITableView *)tableView canEditRowAtIndexPath:(NSIndexPath *)indexPath{ mainViewCell *cell2 = [tableView cellForRowAtIndexPath:indexPath]; if ([cell2.txtDeviceContent.text isEqualToString:@"已连接"]) { return YES; } return NO;}- (NSArray<UITableViewRowAction *> *)tableView:(UITableView *)tableView editActionsForRowAtIndexPath:(NSIndexPath *)indexPath{ _maincell = [tableView cellForRowAtIndexPath:indexPath]; UITableViewRowAction *disconnect = [UITableViewRowAction rowActionWithStyle:1 title:@"断开连接" handler:^(UITableViewRowAction * _Nonnull action, NSIndexPath * _Nonnull indexPath) { //断开蓝牙连接 CBPeripheral *peripheral = self.devices[indexPath.row]; [self.manager cancelPeripheralConnection:peripheral]; [self.tableView reloadRowsAtIndexPaths:@[indexPath] withRowAnimation:UITableViewRowAnimationLeft]; }]; return @[disconnect];}- (IBAction)btnSure:(id)sender { LinkViewController *link = [[LinkViewController alloc] init]; if (self.connectSuccess.count > 0) { for (int i = 0; i < self.connectSuccess.count; i++) { CBPeripheral *p = self.connectSuccess[i]; if (i == 0) { link.oneperipheral = p; } else if (i == 1) { link.twoperipheral = p; } else if(i == 2){ link.threeperipheral = p; } else if(i==3){ link.fourperipheral = p; } else if(i==4){ link.fiveperipheral = p; } else if(i==5){ link.sexperipheral = p; } else if(i==6){ link.sevenperipheral = p; } } [self.navigationController pushViewController:link animated:YES]; }}@end
3.数据读取
这里的数据读取是分开来写的 如果是同样的设备 并底层给的UUID 接收和发送数据是同样的话可以写一个就可以并可以用tabview 中的cell来写
但是如果需要连接不相同的UUID的时候 并解析格式不一样介意使用多个
我创建的是view 可以使用MVC 来实现 创建NSObject也可以 毕竟是 数据获取
用不上view
如 OneView.h
#import <UIKit/UIKit.h>#import <CoreBluetooth/CoreBluetooth.h>@interface OneView : UIView<CBPeripheralDelegate>@property (nonatomic, strong) UITextView *textView;@property (nonatomic, strong) CBCharacteristic *oneNotiC, *oneWriteC;@property (nonatomic, strong) NSMutableString *mutStr;@end
OneView.m 如下
在这个里面 我们连接到设备之后 需要读取 peripheral 里面的UUID 包含了服务和特征的 UUID
首先读取服务的 一样的要实现 CBPeripheralDelegate 代理
#pragma mark - 外围设备服务的代理- (void)peripheral:(CBPeripheral *)peripheral didDiscoverServices:(NSError *)error{ //NSLog(@"123"); for (CBService *s in peripheral.services) { NSLog(@"%@",[s.UUID UUIDString]); [peripheral discoverCharacteristics:nil forService:s]; }}
当发现了服务UUID之后 我们需要 服务里面的具体携带的特征UUID 也是数据解析的 UUID
这里面有些是多余的你可以选择你自己需要的
#pragma mark 2. 外围设备 扫描到服务下有哪些特征- (void)peripheral:(CBPeripheral *)peripheral didDiscoverCharacteristicsForService:(nonnull CBService *)service error:(nullable NSError *)error{ if (error){ NSLog(@"扫描特征出现错误,错误原因:%@",error); }else{ //拿到服务中所有的特征 NSArray *characteristics = service.characteristics; //遍历特征,拿到需要的特征进行处理 for (CBCharacteristic *characteristic in characteristics){ NSLog(@"所有的特征为:%@",characteristic.UUID.UUIDString); //如果是温度数据处理 if([characteristic.UUID.UUIDString isEqualToString:@"底层给你的UUID"]){ //将全部的特征信息打印出来 //_peripheral = peripheral; [peripheral setNotifyValue:YES forCharacteristic:characteristic]; NSLog(@"%@",characteristic); } //这里是发送 设备设置蓝牙发送温度数据的值 else if([characteristic.UUID.UUIDString isEqualToString:@"底层给你的UUID"]){ [peripheral setNotifyValue:YES forCharacteristic:characteristic]; NSLog(@"写入的值为:%@",characteristic); } //如果是ota进行ota升级 else if([characteristic.UUID.UUIDString isEqualToString:@"底层给你的UUID"]){ //_peripheral = peripheral; //设置通知 [peripheral setNotifyValue:YES forCharacteristic:characteristic]; NSString *s = @"OTA"; NSDictionary *tempOta = [NSDictionary dictionaryWithObject:s forKey:@"ota"]; [[NSNotificationCenter defaultCenter] postNotificationName:@"tempOTA" object:nil userInfo:tempOta]; } //无键按钮DFU else if([characteristic.UUID.UUIDString isEqualToString:@"底层给你的UUID"]){ [peripheral setNotifyValue:YES forCharacteristic:characteristic]; NSLog(@"写入的OTA值为:%@",characteristic); } } }}
当读取到你需要的UUID的时候直接读取数据
在这里面你 可以用你们底层给你们的算法去解析数据
我写的不代表你的
#pragma mark 3.接收外围设备的数据(这里就能接到蓝牙发送过来的数据,具体协议就要看你们是怎么定义的)-(void)peripheral:(CBPeripheral *)peripheral didUpdateValueForCharacteristic:(CBCharacteristic *)characteristic error:(NSError *)error{ NSString *temps=[self getTempData:characteristic]; //self.textView.text = temps; //发送广播来更新通知信息 //第一个的温度数据 NSString *blename = peripheral.name; NSString *c = [NSString stringWithFormat:@"%@",peripheral.identifier]; NSString *b = NULL; if ([[UIDevice currentDevice].systemVersion floatValue] < 10.0) { b = [c substringFromIndex:30]; }else{ b = [c substringFromIndex:30]; } NSString *bleaddre = b; NSString *tempss = [temps stringByAppendingString:@","]; NSString *tempsss = [blename stringByAppendingString:@","]; NSString *tempssss = [tempsss stringByAppendingString:bleaddre]; NSString *tempsssss = [tempss stringByAppendingString:tempssss]; NSDictionary *tempDict = [NSDictionary dictionaryWithObject:tempsssss forKey:@"tempOne"]; [[NSNotificationCenter defaultCenter] postNotificationName:@"tempNofictionOne" object:nil userInfo:tempDict];}
还需要打开通知 我这个项目是通过接收通知来更新温度数据的
//设置通知-(void)notifyCharacteristic:(CBPeripheral *)peripheral characteristic:(CBCharacteristic *)characteristic{ //设置通知,数据通知会进入:didUpdateValueForCharacteristic方法 [peripheral setNotifyValue:YES forCharacteristic:characteristic]; //[_centerManager stopScan];}
OneView.m详细代码
//// OneView.m// LHTempProject//// Created by rnd on 2017/5/2.// Copyright © 2017年 GoDream. All rights reserved.//#import "OneView.h"@implementation OneView-(instancetype)initWithFrame:(CGRect)frame{ self = [super initWithFrame:frame]; if (self) { self.mutStr = [NSMutableString string]; //[self addTextView]; } return self;}//添加textView-(void)addTextView{ self.textView = [[UITextView alloc] initWithFrame:self.bounds]; self.textView.backgroundColor = [UIColor whiteColor]; [self addSubview:self.textView];}#pragma mark - 外围设备服务的代理- (void)peripheral:(CBPeripheral *)peripheral didDiscoverServices:(NSError *)error{ //NSLog(@"123"); for (CBService *s in peripheral.services) { NSLog(@"%@",[s.UUID UUIDString]); [peripheral discoverCharacteristics:nil forService:s]; }}#pragma mark 2. 外围设备 扫描到服务下有哪些特征- (void)peripheral:(CBPeripheral *)peripheral didDiscoverCharacteristicsForService:(nonnull CBService *)service error:(nullable NSError *)error{ if (error){ NSLog(@"扫描特征出现错误,错误原因:%@",error); }else{ //拿到服务中所有的特征 NSArray *characteristics = service.characteristics; //遍历特征,拿到需要的特征进行处理 for (CBCharacteristic *characteristic in characteristics){ NSLog(@"所有的特征为:%@",characteristic.UUID.UUIDString); //如果是温度数据处理 if([characteristic.UUID.UUIDString isEqualToString:@"783F2991-23E0-4BDC-AC16-78601BD84B39"]){ //将全部的特征信息打印出来 //_peripheral = peripheral; [peripheral setNotifyValue:YES forCharacteristic:characteristic]; NSLog(@"%@",characteristic); } //这里是发送 设备设置蓝牙发送温度数据的值 else if([characteristic.UUID.UUIDString isEqualToString:@"849B5163-93BE-4229-9A6A-BB38D6471917"]){ [peripheral setNotifyValue:YES forCharacteristic:characteristic]; NSLog(@"写入的值为:%@",characteristic); } //如果是ota进行ota升级 else if([characteristic.UUID.UUIDString isEqualToString:@"00060001-F8CE-11E4-ABF4-0002A5D5C51B"]){ //_peripheral = peripheral; //设置通知 [peripheral setNotifyValue:YES forCharacteristic:characteristic]; NSString *s = @"OTA"; NSDictionary *tempOta = [NSDictionary dictionaryWithObject:s forKey:@"ota"]; [[NSNotificationCenter defaultCenter] postNotificationName:@"tempOTA" object:nil userInfo:tempOta]; } //无键按钮DFU else if([characteristic.UUID.UUIDString isEqualToString:@"33040179-CAC9-4A06-B83D-433ED3F8C55E"]){ [peripheral setNotifyValue:YES forCharacteristic:characteristic]; NSLog(@"写入的OTA值为:%@",characteristic); } } }}#pragma mark 3.接收外围设备的数据(这里就能接到蓝牙发送过来的数据,具体协议就要看你们是怎么定义的)-(void)peripheral:(CBPeripheral *)peripheral didUpdateValueForCharacteristic:(CBCharacteristic *)characteristic error:(NSError *)error{ NSString *temps=[self getTempData:characteristic]; //self.textView.text = temps; //发送广播来更新通知信息 //第一个的温度数据 NSString *blename = peripheral.name; NSString *c = [NSString stringWithFormat:@"%@",peripheral.identifier]; NSString *b = NULL; if ([[UIDevice currentDevice].systemVersion floatValue] < 10.0) { b = [c substringFromIndex:30]; }else{ b = [c substringFromIndex:30]; } NSString *bleaddre = b; NSString *tempss = [temps stringByAppendingString:@","]; NSString *tempsss = [blename stringByAppendingString:@","]; NSString *tempssss = [tempsss stringByAppendingString:bleaddre]; NSString *tempsssss = [tempss stringByAppendingString:tempssss]; NSDictionary *tempDict = [NSDictionary dictionaryWithObject:tempsssss forKey:@"tempOne"]; [[NSNotificationCenter defaultCenter] postNotificationName:@"tempNofictionOne" object:nil userInfo:tempDict];}//设置通知-(void)notifyCharacteristic:(CBPeripheral *)peripheral characteristic:(CBCharacteristic *)characteristic{ //设置通知,数据通知会进入:didUpdateValueForCharacteristic方法 [peripheral setNotifyValue:YES forCharacteristic:characteristic]; //[_centerManager stopScan];}/* * 温度数据的转换 */-(NSString *)getTempDatas:(CBCharacteristic *)characteristic{ NSString *tempUnit; int temps = 0; NSData *data= characteristic.value; if(data!=nil){ const uint8_t *bytes = [data bytes]; int b0,b1,b2,b3; b0 = bytes[1]&0xff; b1 = bytes[2]&0xff; b2 = bytes[3]&0xff; b3 = bytes[4]&0xff; temps = (b0<<24)|(b1<<16)|(b2<<8)|b3; const uint8_t flagByte = bytes[0]; if ((flagByte & 0x01) != 0) { tempUnit = @"°F"; //[_userDefaults setObject:tempUnit forKey:@"tempUnit"]; //存储温度数据 } else { tempUnit = @"°C"; //[_userDefaults setObject:tempUnit forKey:@"tempUnit"]; } } float a = temps; //保留小数点后面的1位小数 NSString *s = [NSString stringWithFormat:@"%.1f",a/10]; NSString *ss = [NSString stringWithFormat:@"%@,%@",s,tempUnit]; return ss;}-(NSString *)getTempData:(CBCharacteristic *)characteristic{ NSString *tempUnit; int temps = 0; int alarm = 0; int normal = 0; NSData *data= characteristic.value; if(data!=nil){ const uint8_t *bytes = [data bytes]; int b0,b1,b2,b3,b4,b5,b6,b7,b8,b9; b0 = bytes[0]&0xff; b1 = bytes[1]&0xff; b2 = bytes[2]&0xff; b3 = bytes[3]&0xff; b4 = bytes[4]&0xff; b5 = bytes[5]&0xff; b6 = bytes[6]&0xff; b7 = bytes[7]&0xff; b8 = bytes[8]&0xff; b9 = bytes[9]&0xff; temps = (b5<<24)|(b4<<16)|(b3<<8)|b2; alarm = (b9<<24)|(b8<<16)|(b7<<8)|b6; const uint8_t flagBB = bytes[1]; normal = flagBB&0x01; const uint8_t flagByte = bytes[0]; if ((flagByte & 0x01) != 0) { tempUnit = @"°F"; //[_userDefaults setObject:tempUnit forKey:@"tempUnit"]; //存储温度数据 } else { tempUnit = @"°C"; //[_userDefaults setObject:tempUnit forKey:@"tempUnit"]; } } float a = temps; //保留小数点后面的1位小数 NSString *am = [NSString stringWithFormat:@"%d",alarm]; NSString *no = [NSString stringWithFormat:@"%d",normal]; NSString *zuhe = [am stringByAppendingString:@","]; NSString *zuhe1 = [zuhe stringByAppendingString:no]; NSString *s = [NSString stringWithFormat:@"%.1f",a]; //NSString *ss = [NSString stringWithFormat:@"%@,%@",s,tempUnit]; NSString *ss = [NSString stringWithFormat:@"%@,%@,%@",s,tempUnit,zuhe1]; return ss;}@end
4.展示数据
把读取出来的数据放到一个界面里面显示
LinkViewController.h
//// LinkViewController.h// LHTempProject//// Created by rnd on 2017/5/2.// Copyright © 2017年 GoDream. All rights reserved.//#import <UIKit/UIKit.h>#import "OneView.h"#import "TwoView.h"#import "ThreeView.h"#import "FourView.h"#import "FiveView.h"#import "SixView.h"#import "SevenView.h"#import "NormalUtil.h"#import <CoreBluetooth/CoreBluetooth.h>@interface LinkViewController : UIViewController@property(nonatomic,strong) CBPeripheral *oneperipheral;@property(nonatomic,strong) CBPeripheral *twoperipheral;@property(nonatomic,strong) CBPeripheral *threeperipheral;@property(nonatomic,strong) CBPeripheral *fourperipheral;@property(nonatomic,strong) CBPeripheral *fiveperipheral;@property(nonatomic,strong) CBPeripheral *sexperipheral;@property(nonatomic,strong) CBPeripheral *sevenperipheral;//显示温度的数值 关键 切换@property(nonatomic,strong) UILabel *labelTempOne;@property(nonatomic,strong) UILabel *labelSymbolOne;@property(nonatomic,strong) UILabel *labelTempTwo;@property(nonatomic,strong) UILabel *labelSymbolTwo;@property(nonatomic,strong) UILabel *labelTempThree;@property(nonatomic,strong) UILabel *labelSymbolThree;@property(nonatomic,strong) UILabel *labelTempFour;@property(nonatomic,strong) UILabel *labelSymbolFour;@property(nonatomic,strong) UILabel *labelTempFive;@property(nonatomic,strong) UILabel *labelSymbolFive;@property(nonatomic,strong) UILabel *labelTempSix;@property(nonatomic,strong) UILabel *labelSymbolSix;@property(nonatomic,strong) UILabel *labelTempSeven;@property(nonatomic,strong) UILabel *labelSymbolSeven;//两个label@property(nonatomic,strong) UILabel *labelNameOne;@property(nonatomic,strong) UILabel *labelAddreOne;@property(nonatomic,strong) UILabel *labelNameTwo;@property(nonatomic,strong) UILabel *labelAddreTwo;@property(nonatomic,strong) UILabel *labelNameThree;@property(nonatomic,strong) UILabel *labelAddreThree;@property(nonatomic,strong) UILabel *labelNameFour;@property(nonatomic,strong) UILabel *labelAddreFour;@property(nonatomic,strong) UILabel *labelNameFive;@property(nonatomic,strong) UILabel *labelAddreFive;@property(nonatomic,strong) UILabel *labelNameSix;@property(nonatomic,strong) UILabel *labelAddreSix;@property(nonatomic,strong) UILabel *labelNameSeven;@property(nonatomic,strong) UILabel *labelAddreSeven;@property(nonatomic,strong) NormalUtil *normalUtil;@end
LinkViewController.m
//// LinkViewController.m// LHTempProject//// Created by rnd on 2017/5/2.// Copyright © 2017年 GoDream. All rights reserved.//#import "LinkViewController.h"#ifdef __OBJC__//define this constant if you want to use Masonry without the 'mas_' prefix#define MAS_SHORTHAND//define this constant if you want to enable auto-boxing for default syntax#define MAS_SHORTHAND_GLOBALS#import "Masonry.h"#endif@interface LinkViewController ()<UIScrollViewDelegate>@property(nonatomic,strong)OneView *one;@property(nonatomic,strong)TwoView *two;@property(nonatomic,strong)ThreeView *three;@property(nonatomic,strong)FourView *four;@property(nonatomic,strong)FiveView *five;@property(nonatomic,strong)SixView *six;@property(nonatomic,strong)SevenView *seven;@property(nonatomic,strong)UIScrollView *myscrollview;@end@implementation LinkViewController- (void)viewDidLoad { [super viewDidLoad]; _normalUtil = [NormalUtil sharedManager]; [self setUIView]; [self setValues]; //发现左边外设的服务 (运行到这个方法会进入leftView.m文件中的外围设备服务的代理) [self.oneperipheral discoverServices:nil]; //发现右边外设的服务 [self.twoperipheral discoverServices:nil]; [self setNotification];}//初始化值显示-(void) setValues{ //_labelTempOne.text = @"No Data"; _labelTempOne.text = @"Load."; _labelTempTwo.text = @"Load."; _labelTempThree.text = @"Load."; _labelTempFour.text = @"Load."; _labelTempFive.text = @"Load."; _labelTempSix.text = @"Load."; _labelTempSeven.text = @"Load."; _labelTempOne.textAlignment = NSTextAlignmentCenter; _labelTempTwo.textAlignment = NSTextAlignmentCenter; _labelTempThree.textAlignment = NSTextAlignmentCenter; _labelTempFour.textAlignment = NSTextAlignmentCenter; _labelTempFive.textAlignment = NSTextAlignmentCenter; _labelTempSix.textAlignment = NSTextAlignmentCenter; _labelTempSeven.textAlignment = NSTextAlignmentCenter; _labelNameOne.text = @""; _labelAddreOne.text = @""; _labelNameTwo.text = @""; _labelAddreTwo.text = @""; _labelNameThree.text = @""; _labelAddreThree.text = @""; _labelNameFour.text = @""; _labelAddreFour.text = @""; _labelNameFive.text = @""; _labelAddreFive.text = @""; _labelNameSix.text = @""; _labelAddreSix.text = @""; _labelNameSeven.text = @""; _labelAddreSeven.text = @"";}//接收通知-(void)setNotification{ [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(tempCompletionOne:) name:@"tempNofictionOne" object:nil]; [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(tempCompletionTwo:) name:@"tempNofictionTwo" object:nil]; [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(tempCompletionThree:) name:@"tempNofictionThree" object:nil]; [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(tempCompletionFour:) name:@"tempNofictionFour" object:nil]; [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(tempCompletionFive:) name:@"tempNofictionFive" object:nil]; [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(tempCompletionSix:) name:@"tempNofictionSix" object:nil]; [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(tempCompletionSeven:) name:@"tempNofictionSeven" object:nil];}/* 接到温度数据的通知 */-(void)tempCompletionOne:(NSNotification*)notification{ NSDictionary *temps = [notification userInfo]; NSString *all = [temps objectForKey:@"tempOne"]; NSArray *allarry = [all componentsSeparatedByString:@","]; _labelTempOne.textAlignment = NSTextAlignmentCenter; _labelSymbolOne.textAlignment = NSTextAlignmentCenter; //这里面做数据判断 //int temp = [allarry[0] intValue]; int normal = [allarry[3] intValue]; if(normal==0){ _labelTempOne.text = allarry[0]; }else if(normal == 1){ _labelTempOne.text = @"HHH"; }else if(normal == 2){ _labelTempOne.text = @"LLL"; }else{ _labelTempOne.text = @"NONE"; } _labelSymbolOne.text = allarry[1]; _labelNameOne.text = allarry[5]; _labelAddreOne.text = allarry[4];}-(void)tempCompletionTwo:(NSNotification*)notification{ NSDictionary *temps = [notification userInfo]; NSString *all = [temps objectForKey:@"tempTwo"]; NSArray *allarry = [all componentsSeparatedByString:@","]; _labelTempTwo.textAlignment = NSTextAlignmentCenter; _labelSymbolTwo.textAlignment = NSTextAlignmentCenter; //int a = [allarry[0] intValue]; int normal = [allarry[3] intValue]; if(normal==0){ _labelTempTwo.text = allarry[0]; }else if(normal == 1){ _labelTempTwo.text = @"HHH"; }else if(normal == 2){ _labelTempTwo.text = @"LLL"; }else{ _labelTempTwo.text = @"NONE"; } _labelSymbolTwo.text = allarry[1]; _labelNameTwo.text = allarry[5]; _labelAddreTwo.text = allarry[4];}-(void)tempCompletionThree:(NSNotification*)notification{ NSDictionary *temps = [notification userInfo]; NSString *all = [temps objectForKey:@"tempThree"]; NSArray *allarry = [all componentsSeparatedByString:@","]; _labelTempThree.textAlignment = NSTextAlignmentCenter; _labelSymbolThree.textAlignment = NSTextAlignmentCenter; //int a = [allarry[0] intValue]; int normal = [allarry[3] intValue]; if(normal==0){ _labelTempThree.text = allarry[0]; }else if(normal == 1){ _labelTempThree.text = @"HHH"; }else if(normal == 2){ _labelTempThree.text = @"LLL"; }else{ _labelTempThree.text = @"NONE"; } _labelSymbolThree.text = allarry[1]; _labelNameThree.text = allarry[5]; _labelAddreThree.text = allarry[4];}-(void)tempCompletionFour:(NSNotification*)notification{ NSDictionary *temps = [notification userInfo]; NSString *all = [temps objectForKey:@"tempFour"]; NSArray *allarry = [all componentsSeparatedByString:@","]; _labelTempFour.textAlignment = NSTextAlignmentCenter; _labelSymbolFour.textAlignment = NSTextAlignmentCenter; //int a = [allarry[0] intValue]; int normal = [allarry[3] intValue]; if(normal==0){ _labelTempFour.text = allarry[0]; }else if(normal == 1){ _labelTempFour.text = @"HHH"; }else if(normal == 2){ _labelTempFour.text = @"LLL"; }else{ _labelTempFour.text = @"NONE"; } _labelSymbolFour.text = allarry[1]; _labelNameFour.text = allarry[5]; _labelAddreFour.text = allarry[4];}-(void)tempCompletionFive:(NSNotification*)notification{ NSDictionary *temps = [notification userInfo]; NSString *all = [temps objectForKey:@"tempFive"]; NSArray *allarry = [all componentsSeparatedByString:@","]; _labelTempFive.textAlignment = NSTextAlignmentCenter; _labelSymbolFive.textAlignment = NSTextAlignmentCenter; //int a = [allarry[0] intValue]; int normal = [allarry[3] intValue]; if(normal==0){ _labelTempFive.text = allarry[0]; }else if(normal == 1){ _labelTempFive.text = @"HHH"; }else if(normal == 2){ _labelTempFive.text = @"LLL"; }else{ _labelTempFive.text = @"NONE"; } _labelSymbolFive.text = allarry[1]; _labelNameFive.text = allarry[5]; _labelAddreFive.text = allarry[4];}-(void)tempCompletionSix:(NSNotification*)notification{ NSDictionary *temps = [notification userInfo]; NSString *all = [temps objectForKey:@"tempSix"]; NSArray *allarry = [all componentsSeparatedByString:@","]; _labelTempSix.textAlignment = NSTextAlignmentCenter; _labelSymbolSix.textAlignment = NSTextAlignmentCenter; //int a = [allarry[0] intValue]; int normal = [allarry[3] intValue]; if(normal==0){ _labelTempSix.text = allarry[0]; }else if(normal == 1){ _labelTempSix.text = @"HHH"; }else if(normal == 2){ _labelTempSix.text = @"LLL"; }else{ _labelTempSix.text = @"NONE"; } _labelSymbolSix.text = allarry[1]; _labelNameSix.text = allarry[5]; _labelAddreSix.text = allarry[4];}-(void)tempCompletionSeven:(NSNotification*)notification{ NSDictionary *temps = [notification userInfo]; NSString *all = [temps objectForKey:@"tempSeven"]; NSArray *allarry = [all componentsSeparatedByString:@","]; _labelTempSeven.textAlignment = NSTextAlignmentCenter; _labelSymbolSeven.textAlignment = NSTextAlignmentCenter; //int a = [allarry[0] intValue]; int normal = [allarry[3] intValue]; if(normal==0){ _labelTempSeven.text = allarry[0]; }else if(normal == 1){ _labelTempSeven.text = @"HHH"; }else if(normal == 2){ _labelTempSeven.text = @"LLL"; }else{ _labelTempSeven.text = @"NONE"; } _labelSymbolSeven.text = allarry[1]; _labelNameSeven.text = allarry[5]; _labelAddreSeven.text = allarry[4];}//加载UIView-(void)setUIView{ NSString *getpm = [_normalUtil getPingMuWindow]; int a = [getpm intValue]; _myscrollview = [[UIScrollView alloc] init]; _myscrollview.delegate = self; // 设置内容大小 _myscrollview.contentSize = CGSizeMake(a, 1100); // 提示用户,Indicators flash //[UIScrollView flashScrollIndicators]; // 是否同时运动,lock _myscrollview.scrollEnabled = YES; _myscrollview.directionalLockEnabled = YES; _myscrollview.backgroundColor = [self stringTOColor:@"#D6D6D6"]; [self.view addSubview:_myscrollview]; [_myscrollview makeConstraints:^(MASConstraintMaker *make){ make.left.equalTo(self.view).offset(0); make.right.equalTo(self.view).offset(0); make.top.equalTo(self.view).offset(0); make.bottom.equalTo(self.view).offset(0); }]; //创建主要的View UIView *mainView = [[UIView alloc] init]; mainView.backgroundColor = [self stringTOColor:@"#D6D6D6"]; [_myscrollview addSubview:mainView]; //给主view添加约束 [mainView makeConstraints:^(MASConstraintMaker *make){ make.edges.equalTo(_myscrollview); make.width.equalTo(_myscrollview); //make.top.equalTo(_myscrollview).offset(64); make.height.equalTo(_myscrollview).multipliedBy(1.5); }]; /*UIColor *blues = [self stringTOColor:@"#436EEE"]; //创建一个导航栏 UINavigationBar *navBar = [[UINavigationBar alloc] initWithFrame:CGRectMake(0, 0, a, 64)]; //创建一个导航栏集合 UINavigationItem *navItem = [[UINavigationItem alloc] initWithTitle:@"111"]; //在这个集合Item中添加标题,按钮 //style:设置按钮的风格,一共有三种选择 //action:@selector:设置按钮的点击事件 //创建一个左边按钮 UIBarButtonItem *leftButton = [[UIBarButtonItem alloc] initWithTitle:@"< Back" style:UIBarButtonItemStyleDone target:self action:@selector(clickLeftButton)]; //设置导航栏的内容 [navItem setTitle:@"Display Device"]; //把导航栏集合添加到导航栏中,设置动画关闭 [navBar pushNavigationItem:navItem animated:NO]; [navBar setBarTintColor:blues]; //[navBar setTitleTextAttributes:[NSDictionary dictionaryWithObjectsAndKeys:[UIColor whiteColor],UITextAttributeTextColor,nil]]; [navBar setTitleTextAttributes:@{NSForegroundColorAttributeName:[UIColor whiteColor], NSFontAttributeName:[UIFont boldSystemFontOfSize:20] }]; //把左右两个按钮添加到导航栏集合中去 [navItem setLeftBarButtonItem:leftButton]; [leftButton setTintColor:[UIColor whiteColor]]; //将标题栏中的内容全部添加到主视图当中 [self.view addSubview:navBar];*/ //添加View头部 UIView *topView = [UIView new]; [mainView addSubview:topView]; [topView makeConstraints:^(MASConstraintMaker *make){ make.top.equalTo(mainView).offset(0); make.left.equalTo(mainView).offset(0); make.right.equalTo(mainView).offset(0); make.height.equalTo(@0); }]; //添加第一个显示温度view _one = [[OneView alloc] initWithFrame:CGRectMake(0, 0, [UIScreen mainScreen].bounds.size.width, 100)]; _one.backgroundColor = [UIColor whiteColor]; [mainView addSubview:_one]; _oneperipheral.delegate = _one; //添加里面的布局模式 //UIColor *bgColor = [UIColor colorWithPatternImage:[UIImage imageNamed:@"circle.png"]]; UIView *c1 = [[UIView alloc] init]; [_one addSubview:c1]; [c1 makeConstraints:^(MASConstraintMaker *make){ make.top.equalTo(_one).offset(10); make.left.equalTo(_one).offset(35); make.width.equalTo(@80); make.height.equalTo(@80); }]; UIImageView *circle1 = [[UIImageView alloc] init]; circle1.image = [UIImage imageNamed:@"circle.png"]; //[circle1 setBackgroundColor:bgColor]; [_one addSubview:circle1]; [circle1 makeConstraints:^(MASConstraintMaker *make){ make.top.equalTo(c1).offset(0); make.left.equalTo(c1).offset(0); make.width.equalTo(@80); make.height.equalTo(@80); }]; _labelTempOne = [[UILabel alloc] init]; [circle1 addSubview:_labelTempOne]; [_labelTempOne makeConstraints:^(MASConstraintMaker *make){ make.top.equalTo(c1).offset(15); make.centerX.equalTo(c1); make.width.equalTo(@80); make.height.equalTo(@30); }]; _labelSymbolOne = [[UILabel alloc] init]; [circle1 addSubview:_labelSymbolOne]; [_labelSymbolOne makeConstraints:^(MASConstraintMaker *make){ make.top.equalTo(_labelTempOne).offset(25); make.centerX.equalTo(c1); make.width.equalTo(@80); make.height.equalTo(@25); }]; //添加第一个2个label _labelNameOne = [[UILabel alloc] init]; _labelNameOne.text = @""; _labelNameOne.textColor = [UIColor blackColor]; //设置字体的大小 [_one addSubview:_labelNameOne]; [_labelNameOne makeConstraints:^(MASConstraintMaker *make){ make.top.equalTo(_one).offset(20); make.left.equalTo(_one).offset(130); make.width.equalTo(@100); make.height.equalTo(@30); }]; _labelAddreOne = [[UILabel alloc] init]; _labelAddreOne.text = @""; _labelAddreOne.textColor = [UIColor blackColor]; [_one addSubview:_labelAddreOne]; [_labelAddreOne makeConstraints:^(MASConstraintMaker *make){ make.top.equalTo(_one).offset(50); make.left.equalTo(_one).offset(130); make.width.equalTo(@200); make.height.equalTo(@30); }]; //添加第二个view _two = [[TwoView alloc]initWithFrame:CGRectMake(0, 101, [UIScreen mainScreen].bounds.size.width, 100)]; _two.backgroundColor = [UIColor whiteColor]; [mainView addSubview:_two]; _twoperipheral.delegate = _two; UIView *c2 = [[UIView alloc] init]; [_two addSubview:c2]; [c2 makeConstraints:^(MASConstraintMaker *make){ make.top.equalTo(_two).offset(10); make.left.equalTo(_two).offset(35); make.width.equalTo(@80); make.height.equalTo(@80); }]; UIImageView *circle2 = [[UIImageView alloc] init]; circle2.image = [UIImage imageNamed:@"circle.png"]; //[circle1 setBackgroundColor:bgColor]; [c2 addSubview:circle2]; [circle2 makeConstraints:^(MASConstraintMaker *make){ make.top.equalTo(c2).offset(0); make.left.equalTo(c2).offset(0); make.width.equalTo(@80); make.height.equalTo(@80); }]; _labelTempTwo = [[UILabel alloc] init]; [c2 addSubview:_labelTempTwo]; [_labelTempTwo makeConstraints:^(MASConstraintMaker *make){ make.top.equalTo(c2).offset(15); make.centerX.equalTo(c2); make.width.equalTo(@80); make.height.equalTo(@30); }]; _labelSymbolTwo = [[UILabel alloc] init]; [c2 addSubview:_labelSymbolTwo]; [_labelSymbolTwo makeConstraints:^(MASConstraintMaker *make){ make.top.equalTo(_labelTempTwo).offset(25); make.centerX.equalTo(c2); make.width.equalTo(@80); make.height.equalTo(@25); }]; //添加第一个2个label _labelNameTwo = [[UILabel alloc] init]; _labelNameTwo.text = @""; _labelNameTwo.textColor = [UIColor blackColor]; [_two addSubview:_labelNameTwo]; [_labelNameTwo makeConstraints:^(MASConstraintMaker *make){ make.top.equalTo(_two).offset(20); make.left.equalTo(_two).offset(130); make.width.equalTo(@100); make.height.equalTo(@30); }]; _labelAddreTwo = [[UILabel alloc] init]; _labelAddreTwo.text = @""; _labelAddreTwo.textColor = [UIColor blackColor]; [_two addSubview:_labelAddreTwo]; [_labelAddreTwo makeConstraints:^(MASConstraintMaker *make){ make.top.equalTo(_two).offset(50); make.left.equalTo(_two).offset(130); make.width.equalTo(@100); make.height.equalTo(@30); }]; //添加第三个view _three = [[ThreeView alloc]initWithFrame:CGRectMake(0, 202, [UIScreen mainScreen].bounds.size.width, 100)]; _three.backgroundColor = [UIColor whiteColor]; [mainView addSubview:_three]; _threeperipheral.delegate = _three; UIView *c3 = [[UIView alloc] init]; [_three addSubview:c3]; [c3 makeConstraints:^(MASConstraintMaker *make){ make.top.equalTo(_three).offset(10); make.left.equalTo(_three).offset(35); make.width.equalTo(@80); make.height.equalTo(@80); }]; UIImageView *circle3 = [[UIImageView alloc] init]; circle3.image = [UIImage imageNamed:@"circle.png"]; //[circle1 setBackgroundColor:bgColor]; [c3 addSubview:circle3]; [circle3 makeConstraints:^(MASConstraintMaker *make){ make.top.equalTo(c3).offset(0); make.left.equalTo(c3).offset(0); make.width.equalTo(@80); make.height.equalTo(@80); }]; _labelTempThree = [[UILabel alloc] init]; [c3 addSubview:_labelTempThree]; [_labelTempThree makeConstraints:^(MASConstraintMaker *make){ make.top.equalTo(c3).offset(15); make.centerX.equalTo(c3); make.width.equalTo(@80); make.height.equalTo(@30); }]; _labelSymbolThree = [[UILabel alloc] init]; [c3 addSubview:_labelSymbolThree]; [_labelSymbolThree makeConstraints:^(MASConstraintMaker *make){ make.top.equalTo(_labelTempThree).offset(25); make.centerX.equalTo(c3); make.width.equalTo(@80); make.height.equalTo(@25); }]; //添加第一个2个label _labelNameThree = [[UILabel alloc] init]; _labelNameThree.text = @""; _labelNameThree.textColor = [UIColor blackColor]; [_three addSubview:_labelNameThree]; [_labelNameThree makeConstraints:^(MASConstraintMaker *make){ make.top.equalTo(_three).offset(20); make.left.equalTo(_three).offset(130); make.width.equalTo(@100); make.height.equalTo(@30); }]; _labelAddreThree = [[UILabel alloc] init]; _labelAddreThree.text = @""; _labelAddreThree.textColor = [UIColor blackColor]; [_three addSubview:_labelAddreThree]; [_labelAddreThree makeConstraints:^(MASConstraintMaker *make){ make.top.equalTo(_three).offset(50); make.left.equalTo(_three).offset(130); make.width.equalTo(@100); make.height.equalTo(@30); }]; //添加第4个view _four = [[FourView alloc]initWithFrame:CGRectMake(0, 303, [UIScreen mainScreen].bounds.size.width, 100)]; _four.backgroundColor = [UIColor whiteColor]; [mainView addSubview:_four]; _fourperipheral.delegate = _four; UIView *c4 = [[UIView alloc] init]; [_four addSubview:c4]; [c4 makeConstraints:^(MASConstraintMaker *make){ make.top.equalTo(_four).offset(10); make.left.equalTo(_four).offset(35); make.width.equalTo(@80); make.height.equalTo(@80); }]; UIImageView *circle4 = [[UIImageView alloc] init]; circle4.image = [UIImage imageNamed:@"circle.png"]; //[circle1 setBackgroundColor:bgColor]; [c4 addSubview:circle4]; [circle4 makeConstraints:^(MASConstraintMaker *make){ make.top.equalTo(c4).offset(0); make.left.equalTo(c4).offset(0); make.width.equalTo(@80); make.height.equalTo(@80); }]; _labelTempFour = [[UILabel alloc] init]; [c4 addSubview:_labelTempFour]; [_labelTempFour makeConstraints:^(MASConstraintMaker *make){ make.top.equalTo(c4).offset(15); make.centerX.equalTo(c4); make.width.equalTo(@80); make.height.equalTo(@30); }]; _labelSymbolFour = [[UILabel alloc] init]; [c4 addSubview:_labelSymbolFour]; [_labelSymbolFour makeConstraints:^(MASConstraintMaker *make){ make.top.equalTo(_labelTempFour).offset(25); make.centerX.equalTo(c4); make.width.equalTo(@80); make.height.equalTo(@25); }]; //添加第一个2个label _labelNameFour = [[UILabel alloc] init]; _labelNameFour.text = @""; _labelNameFour.textColor = [UIColor blackColor]; [_four addSubview:_labelNameFour]; [_labelNameFour makeConstraints:^(MASConstraintMaker *make){ make.top.equalTo(_four).offset(20); make.left.equalTo(_four).offset(130); make.width.equalTo(@100); make.height.equalTo(@30); }]; _labelAddreFour = [[UILabel alloc] init]; _labelAddreFour.text = @""; _labelAddreFour.textColor = [UIColor blackColor]; [_four addSubview:_labelAddreFour]; [_labelAddreFour makeConstraints:^(MASConstraintMaker *make){ make.top.equalTo(_four).offset(50); make.left.equalTo(_four).offset(130); make.width.equalTo(@100); make.height.equalTo(@30); }]; //添加第5个view _five = [[FiveView alloc]initWithFrame:CGRectMake(0, 404, [UIScreen mainScreen].bounds.size.width, 100)]; _five.backgroundColor = [UIColor whiteColor]; [mainView addSubview:_five]; _fiveperipheral.delegate = _five; UIView *c5 = [[UIView alloc] init]; [_five addSubview:c5]; [c5 makeConstraints:^(MASConstraintMaker *make){ make.top.equalTo(_five).offset(10); make.left.equalTo(_five).offset(35); make.width.equalTo(@80); make.height.equalTo(@80); }]; UIImageView *circle5 = [[UIImageView alloc] init]; circle5.image = [UIImage imageNamed:@"circle.png"]; //[circle1 setBackgroundColor:bgColor]; [c5 addSubview:circle5]; [circle5 makeConstraints:^(MASConstraintMaker *make){ make.top.equalTo(c5).offset(0); make.left.equalTo(c5).offset(0); make.width.equalTo(@80); make.height.equalTo(@80); }]; _labelTempFive = [[UILabel alloc] init]; [c5 addSubview:_labelTempFive]; [_labelTempFive makeConstraints:^(MASConstraintMaker *make){ make.top.equalTo(c5).offset(15); make.centerX.equalTo(c5); make.width.equalTo(@80); make.height.equalTo(@30); }]; _labelSymbolFive = [[UILabel alloc] init]; [c5 addSubview:_labelSymbolFive]; [_labelSymbolFive makeConstraints:^(MASConstraintMaker *make){ make.top.equalTo(_labelTempFive).offset(25); make.centerX.equalTo(c4); make.width.equalTo(@80); make.height.equalTo(@25); }]; //添加第一个2个label _labelNameFive = [[UILabel alloc] init]; _labelNameFive.text = @""; _labelNameFive.textColor = [UIColor blackColor]; [_five addSubview:_labelNameFive]; [_labelNameFive makeConstraints:^(MASConstraintMaker *make){ make.top.equalTo(_five).offset(20); make.left.equalTo(_five).offset(130); make.width.equalTo(@100); make.height.equalTo(@30); }]; _labelAddreFive = [[UILabel alloc] init]; _labelAddreFive.text = @""; _labelAddreFive.textColor = [UIColor blackColor]; [_five addSubview:_labelAddreFive]; [_labelAddreFive makeConstraints:^(MASConstraintMaker *make){ make.top.equalTo(_five).offset(50); make.left.equalTo(_five).offset(130); make.width.equalTo(@100); make.height.equalTo(@30); }]; //第六个view _six = [[SixView alloc]initWithFrame:CGRectMake(0, 505, [UIScreen mainScreen].bounds.size.width, 100)]; _six.backgroundColor = [UIColor whiteColor]; [mainView addSubview:_six]; _sexperipheral.delegate = _six; UIView *c6 = [[UIView alloc] init]; [_six addSubview:c6]; [c6 makeConstraints:^(MASConstraintMaker *make){ make.top.equalTo(_six).offset(10); make.left.equalTo(_six).offset(35); make.width.equalTo(@80); make.height.equalTo(@80); }]; UIImageView *circle6 = [[UIImageView alloc] init]; circle6.image = [UIImage imageNamed:@"circle.png"]; //[circle1 setBackgroundColor:bgColor]; [c6 addSubview:circle6]; [circle6 makeConstraints:^(MASConstraintMaker *make){ make.top.equalTo(c6).offset(0); make.left.equalTo(c6).offset(0); make.width.equalTo(@80); make.height.equalTo(@80); }]; _labelTempSix = [[UILabel alloc] init]; [c6 addSubview:_labelTempSix]; [_labelTempSix makeConstraints:^(MASConstraintMaker *make){ make.top.equalTo(c6).offset(15); make.centerX.equalTo(c6); make.width.equalTo(@80); make.height.equalTo(@30); }]; _labelSymbolSix = [[UILabel alloc] init]; [c6 addSubview:_labelSymbolSix]; [_labelSymbolSix makeConstraints:^(MASConstraintMaker *make){ make.top.equalTo(_labelTempSix).offset(25); make.centerX.equalTo(c6); make.width.equalTo(@80); make.height.equalTo(@25); }]; //添加第一个2个label _labelNameSix = [[UILabel alloc] init]; _labelNameSix.text = @""; _labelNameSix.textColor = [UIColor blackColor]; [_six addSubview:_labelNameSix]; [_labelNameSix makeConstraints:^(MASConstraintMaker *make){ make.top.equalTo(_six).offset(20); make.left.equalTo(_six).offset(130); make.width.equalTo(@100); make.height.equalTo(@30); }]; _labelAddreSix = [[UILabel alloc] init]; _labelAddreSix.text = @""; _labelAddreSix.textColor = [UIColor blackColor]; [_six addSubview:_labelAddreSix]; [_labelAddreSix makeConstraints:^(MASConstraintMaker *make){ make.top.equalTo(_six).offset(50); make.left.equalTo(_six).offset(130); make.width.equalTo(@100); make.height.equalTo(@30); }]; //第7个view _seven = [[SevenView alloc]initWithFrame:CGRectMake(0, 606, [UIScreen mainScreen].bounds.size.width, 100)]; _seven.backgroundColor = [UIColor whiteColor]; [mainView addSubview:_seven]; _sevenperipheral.delegate = _seven; UIView *c7 = [[UIView alloc] init]; [_seven addSubview:c7]; [c7 makeConstraints:^(MASConstraintMaker *make){ make.top.equalTo(_seven).offset(10); make.left.equalTo(_seven).offset(35); make.width.equalTo(@80); make.height.equalTo(@80); }]; UIImageView *circle7 = [[UIImageView alloc] init]; circle7.image = [UIImage imageNamed:@"circle.png"]; //[circle1 setBackgroundColor:bgColor]; [c7 addSubview:circle7]; [circle7 makeConstraints:^(MASConstraintMaker *make){ make.top.equalTo(c7).offset(0); make.left.equalTo(c7).offset(0); make.width.equalTo(@80); make.height.equalTo(@80); }]; _labelTempSeven = [[UILabel alloc] init]; [c7 addSubview:_labelTempSeven]; [_labelTempSeven makeConstraints:^(MASConstraintMaker *make){ make.top.equalTo(c7).offset(15); make.centerX.equalTo(c7); make.width.equalTo(@80); make.height.equalTo(@30); }]; _labelSymbolSeven = [[UILabel alloc] init]; [c7 addSubview:_labelSymbolSeven]; [_labelSymbolSeven makeConstraints:^(MASConstraintMaker *make){ make.top.equalTo(_labelTempSeven).offset(25); make.centerX.equalTo(c6); make.width.equalTo(@80); make.height.equalTo(@25); }]; //添加第一个2个label _labelNameSeven = [[UILabel alloc] init]; _labelNameSeven.text = @""; _labelNameSeven.textColor = [UIColor blackColor]; [_seven addSubview:_labelNameSeven]; [_labelNameSeven makeConstraints:^(MASConstraintMaker *make){ make.top.equalTo(_seven).offset(20); make.left.equalTo(_seven).offset(130); make.width.equalTo(@100); make.height.equalTo(@30); }]; _labelAddreSeven = [[UILabel alloc] init]; _labelAddreSeven.text = @""; _labelAddreSeven.textColor = [UIColor blackColor]; [_seven addSubview:_labelAddreSeven]; [_labelAddreSeven makeConstraints:^(MASConstraintMaker *make){ make.top.equalTo(_seven).offset(50); make.left.equalTo(_seven).offset(130); make.width.equalTo(@100); make.height.equalTo(@30); }]; //备用一个 UIView *cys8 = [[UIView alloc] init]; cys8.backgroundColor = [UIColor whiteColor]; [mainView addSubview:cys8]; [cys8 makeConstraints:^(MASConstraintMaker *make){ make.top.equalTo(mainView).offset(707); make.left.equalTo(mainView).offset(0); make.right.equalTo(mainView).offset(0); make.bottom.equalTo(mainView).offset(0); }];}-(void)clickLeftButton{ [self dismissViewControllerAnimated:YES completion:nil];}- (BOOL)navigationShouldPopOnBackButton{ [self dismissViewControllerAnimated:YES completion:nil]; return YES;}/* * 字符串转为颜色值 */- (UIColor *) stringTOColor:(NSString *)str{ if (!str || [str isEqualToString:@""]) { return nil; } unsigned red,green,blue; NSRange range; range.length = 2; range.location = 1; [[NSScanner scannerWithString:[str substringWithRange:range]] scanHexInt:&red]; range.location = 3; [[NSScanner scannerWithString:[str substringWithRange:range]] scanHexInt:&green]; range.location = 5; [[NSScanner scannerWithString:[str substringWithRange:range]] scanHexInt:&blue]; UIColor *color= [UIColor colorWithRed:red/255.0f green:green/255.0f blue:blue/255.0f alpha:1]; return color;}- (void)didReceiveMemoryWarning { [super didReceiveMemoryWarning];}// 是否支持滑动至顶部- (BOOL)scrollViewShouldScrollToTop:(UIScrollView *)scrollView{ return YES;}@end
上面的代码 我用的是通过 接收到蓝牙的通知来 更新温度数据的显示。
如果有什么问题可以 联系QQ群 482915243
源码如下:
http://download.csdn.net/download/a1989214/9968056
- iOS蓝牙连接多台设备
- 蓝牙BLE如何连接连接多台设备
- 安卓蓝牙4.0以上连接多台设备并接收蓝牙设备数据
- 连接蓝牙设备
- 连接蓝牙设备
- 连接蓝牙设备
- 连接蓝牙设备
- 连接蓝牙设备
- 蓝牙设备的连接
- MultipeerConnectivity连接蓝牙设备
- 蓝牙设备连接电脑
- ios 检查系统是否连接了蓝牙设备
- IOS app蓝牙连接硬件设备 自动断开问题
- iOS蓝牙开发连接系统或其他APP已经连接、配对成功的蓝牙设备
- iOS开发中通过蓝牙连接蓝牙打印机设备进行小票打印
- android手机蓝牙连接蓝牙设备
- Linux使用蓝牙连接设备
- 笔记本电脑连接蓝牙耳机设备
- 1.前传
- linux vim编辑器命令总结(转载)
- 数据接入处理(数据源文件乱码)
- UE4 中的 C++ 编程介绍
- 集合List、Set、Map的遍历方式
- iOS蓝牙连接多台设备
- laravel中使用阿里云视频点播遇到的坑解决思路
- AIDL学习并应用
- safari调试iPhone app web页面
- 7. Reverse Integer
- nginx: [emerg] bind() to [::]:80 failed (98: Address already in use)解决方案
- mybatis的sql标签使用
- 自然语言处理扫盲·第二天——白话机器翻译原理
- 剑指offer_从尾到头打印链表