首页 > 系统 > iOS > 正文

iOS蓝牙开发数据实时传输

2020-07-26 02:18:33
字体:
来源:转载
供稿:网友

随着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}

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持武林网。

发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表