您好,欢迎来到二三娱乐。
搜索
您的当前位置:首页Core Bluetooth库编程指南官方文档翻译1-3

Core Bluetooth库编程指南官方文档翻译1-3

来源:二三娱乐

执行普通中央角色任务

启动一个中央管理者

一个CBCentralManager对象是在Core Bluetooth中对象定向表示为本地中央设备,你必须在你执行一些蓝牙低功耗事务时分配内存和初始化一个中央管理者实例,你可以通过调用CBCentralManager类中的initWithDelegate:queue:options:方法来启动你的中央管理者,例如:

myCentralManager = [[CBCentralManager alloc] initWithDelegate:self queue:nil options:nil];

发现正在广播的外设

[myCentralManager scanForPeripheralsWithService:nil options:nil];

在你调用scanForPeripheralsWithServices:options:方法来发现可用的外设后,中央管理者在每次发现外设时会调用它的代理对象的centralManager:didDiscoverPeripheral:advertisementData:RSSI:方法。任何一个被发现的外设都会返回一个CBPeripheral对象。如以下所示,你可以实现这个代理方法来列出任何被发现的外设。

- (void)centralManager:(CBCentralManager *)central didDiscoverPeripheral:(CBPeripheral *)peripheral advertisementData:(NSDictionary *)advertisementData RSSI:(NSNumber *)RSSI {
      NSLog(@"Discovered %@", peripheral.name);
      ...
}

当你已经发现了你感兴趣想要连接的外设,为了保存手机能量停止扫描其他的外设。

[myCentralManager stopScan];
NSLog(@"Scanning stopped");

当你已经发现了外设之后连接外设

当你已经发现了正在广播你感兴趣的服务的外设,你可以通过调用CBCentralManager类的connectPeripheral:options:方法来请求连接外设。用简单地调用这个方法并指定你想连接的已经发现的外设。例如:

[myCentralManager connectPeripheral:peripheral options:nil];

假设连接成功,中央管理者会调用它代理对象的centralManager:didConnectPeripheral:方法,你可以在这里面实现打印建立连接的信息,如下所示:

- (void)centralManager:(CBCentralManager *)central didConnectPeripheral:(CBPeripheral *)peripheral {
    NSLog(@"Peripheral connected");
    ...
}

在你与该外设交互之前,你应该设置外设的代理来确保它能接受到适当的回调,例如:

peripheral.delegate = self;

发现你已经连接外设的服务

在你已经与外设建立连接之后,你可以开始探索它的数据。在探索的第一步外设必须提供正在被发现的有效服务。因为外设能广播有大小限制的数据量,你可能会发现一个外设有更多的广播服务(在它的广播包中),你可以通过调用CBPeripheral类中的discoverServices:方法来发现外设提供的所有服务。如下:

[peripheral discoverServices:nil];
- (void)peripheral:(CBPeripheral *)peripheral didDiscoverServices:(NSError *)error {
  for(CBService *service in peripheral.services) {
      NSLog(@"Discovered service %@", service);
      ...
  }
  ...
}

发现服务的特征

假设你已经发现了你感兴趣的服务,接下来的一步是探索外设已经提供的正在被发现的服务的特征。通过调用CBPeripheral类的discoverCharacteristics:forService:方法很容易发现服务的所有特征,指定合适的服务,如下:

NSLog(@"Discovering characteristics for service %@", interestingService);
[peripheral discoverCharacteristics:nil forService:interestingService];

注意:在真实的应用程序中,你可能不需要设置第一个参数为空,这样做会返回一个外设服务的所有特征。因为一个外设服务可能包含你感兴趣的更多的特征,发现它们的所有会浪费电池的寿命,而且也会花费不必要的时间。所以在发现特征的时候,你可以指定你感兴趣的已知特征的UUIDs。

当指定服务的特征被发现了外设会调用它的代理对象的peripheral:didDiscoverCharacteristicsForService:error:方法,Core Bluetooth创建一个数组保存CBCharacteristic对象--一个被发现的特征。下面的例子显示你可以实现这个代理方法来简单的打印每个被发现的特征值的信息:

- (void)peripheral:(CBPeripheral *)peripheral didDiscoverCharacteristicsForService:(CBService *)service error:(NSError *)error {
  for (CBCharacteristic *characteristic in service.characteristics) {
    NSLog(@"Discovered characteristic %@", characteristic);
    ...
  }
  ...
}

得到特征值

一个特征包含一个代表一个外设服务信息的值。例如,一个健康温度计的一个温度测量特征可能有一个值来表明一个摄氏温度。你可以通过正确地读取或订阅它来得到这个特征值。

读取特征值

在你发现了一个你感兴趣的服务的特征之后,你可以通过CBPeripheral类的readValueForCharacteristic:方法,指定一个合适的特征,来读取特征值。就像:

NSLog(@"Reading value for characteristic %@", interestingCharacteristic);
[peripheral readValueForCharacteristic:interestingCharacteristic];

当你想要读取一个特征值时,外设会调用它的代理对象的peripheral:didUpdateValueForCharacteristic:error:方法来得到这个值。如果这个值是成功的获得,你可以通过这个特征的值属性来访问它。就像:

- (void)peripheral:(CBPeripheral *)peripheral didUpdateValueForCharacteristic:(CBCharacteristic *)characteristic error:(NSError *)error {
    NSData *data = characteristic.value;
    // parse the data as needed
    ...
}

订阅特征值

通过使用readValueForCharacteristic:方法来读取特征值在一些情况下是有效的,但它并不是一个高效的方式来获取一个改变的特征值。对于大多数改变的特征值--例如在每一个给定的时间的心率值--你应该通过订阅它们来获取它们的值,当你订阅了一个特征值,当外设的特征值改变的时候你会接受到一个通知。你可以通过调用CBPeripheral类的setNotifyValue:forCharacteristic:方法并指定第一个参数为YES来订阅一个你感兴趣的特征值。就像:

[peripheral setNotifyValue:YES forCharacteristic:interestingCharacteristic];

当你想要订阅(或取消订阅)一个特征值时,外设会调用它的代理对象的peripheral:didUpdateNotificationStateForCharacteristic:error:方法,如果因为一些原因而订阅失败,你可以实现这个代理方法来访问错误的原因,如下所示:

- (void)peripheral:(CBPeripheral *)peripheral didUpdateNotificationStateForCharacteristic:(CBCharacteristic *)characteristic error:(NSError *)error {
    if (error) {
        NSLog(@"Error changing notification state : %@", [error localizedDescription]);
    }
    ...
}

给特征值写入数据

在一些情况下,需要给一些特征写一些有意义的值。例如,如果你的应用程序与蓝牙低功耗数字恒温控制器交互,你可能会想要提供给恒温控制器一些值来设置房间的温度。如果一个特征值是可写的,你可以通过调用CBPeripheral类的writeValue:forCharacteristic:type:方法来写入一些数据(NSData类型的实例).就像:

NSLog(@"Writing value for characteristic %@", interestingCharacteristic);
[peripheral writeValue:dataToWrite forCharacteristic:interestingCharacteristic type:CBCharacteristicWriteWithResponse];
- (void)peripheral:(CBPeripheral *)peripheral didWriteValueForCharacteristic:(CBCharacteristic *)characteristic error:(NSError *)error {
    if (error) {
        NSLog(@"Error writing characteristic value: %@", [error localizedDescription]);
    }
    ...
}

Copyright © 2019- yule263.com 版权所有 湘ICP备2023023988号-1

违法及侵权请联系:TEL:199 1889 7713 E-MAIL:2724546146@qq.com

本站由北京市万商天勤律师事务所王兴未律师提供法律服务