欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

iOS-Best Practices for Interacting with a Remote Peripheral Device(API Reference) the sixth part

程序员文章站 2022-07-15 12:48:27
...

Best Practices for Interacting with a Remote Peripheral Device


Core Bluetooth framework使许多central端交易简洁在app。你的应用程序控制,并负责,实现最方面的central 角色,如设备发现和连通性和探索和与远程peripheral的数据交互。本章提供了指导原则和最佳实践以一种负责任的方式来利用这种级别的控制,特别是当为一个iOS设备开发app


Be Mindful of Radio Usage and Power Consumption


当开发一个与蓝牙低能量设备交互的app,记住蓝牙低能量通信分享你的无线到传输信号在空气。自其他形式的无线通信需要使用你的设备的无线,例如,,wi - fi,蓝牙类,甚至其他apps使用蓝牙低能量开发你的app最小化的使用多少无线。

最小化无线电的使用尤为重要在iOS设备开发应用程序时,由于无线使用iOS设备上有不良影响的电池寿命。下面的指南将帮助你成为一个无线电设备好公民。因此,应用程序将有更好的表现,你的设备的电池将持续时间更长


Scan for Devices Only When You Need To


当你调用CBCentralManager类的 scanForPeripheralsWithServices:options: 方法去发现远程peripheral广播services,你的central设备使用它的无线去监听广播设备直到你希望告诉它停止。

除非你需要发现更多的设备,停止扫描之后去连接想要的发现的peripheral。使用 CBCentralManager 类的 stopScan 停止扫描设备,在 Connecting to a Peripheral Device After You’ve Discovered It. 演示。


Specify the CBCentralManagerScanOptionAllowDuplicatesKey Option Only When Necessary


远程peripheral设备可以发送多个广告每秒数据包监听central、宣布他们的存在。当你使用 scanForPeripheralsWithServices:options: 方法扫描设备的时候,方法的默认行为是广播peripheral合并的多个发现成一个单一的事件——也就是说,central 管理者它的代理方法为每一个发现的新的peripheral调用 centralManager:didDiscoverPeripheral:advertisementData:RSSI: ,不管有多少广播包它都接收。当一个已经发现的peripheral 的广播数据改变central 管理者也调用这个代理方法。

如果你想要改变这个默认的行为,你可以指定 CBCentralManagerScanOptionAllowDuplicatesKey 常量作为 一个扫描选项 当调用scanForPeripheralsWithServices:options: 。当你这样做,发现事件是每个时间central 接收一个广播包来自peripheral 调用。关闭默认行为可能是有用的在特定情况下,如初始化一个连接到peripheral基于peripheral的距离(使用Peripheral接收信号强度指示(RSSI)值)。记住,指定该扫描选项可能对电池寿命有不利影响和应用性能。因此,指定该扫描选项只有当需要满足一个特定的用例


Explore a Peripheral’s Data Wisely


当你在开发app完成一个特殊的情况,peripheral 设备可能有许多services和characteristics 比你感兴趣的多。发现所有的peripheral的services和相关的characteristics 会减短电池寿命和app性能。因此,你应该寻找和发现你app需要的services和相关的characteristics。

例如,假设你已经连接了有许多可用sercies的peripheral,但是你的app仅仅需要两个。你可以只寻找和发现2个,通过在service UUIDs数组,像这样:

[peripheral discoverServices:@[firstServiceUUID, secondServiceUUID]];

你已经发现两个你感兴趣的services之后,你能相似的寻找和发现这两个service中你感兴趣的characteristics。在CBPeripheral 类的 discoverCharacteristics:forService: 方法通过UUIDs数组 发现你想要的characteristics。


Subscribe to Characteristic Values That Change Often


Retrieving the Value of a Characteristic
有两个方法你能检索一个characteristic的值:

  • 您可以显式地轮询characteristic的值通过调用readValueForCharacteristic:方法每次你需要的值。
  • 你可以订阅characteristics 的值通过调用 setNotifyValue:forCharacteristic: 方法, 一旦接收一个通知来自periperhal 当它的值改变

订阅一个characteristic的值它是最佳实践在可能的情况下,特别是对于经常改变的characteristic。例如如何订阅characteristic的值,看到 Subscribing to a Characteristic’s Value


Disconnect from a Device When You Have All the Data You Need


你可以帮助减少你的app的无线使用通过断开连接从peripheral设备,当连接不再需要。你应该断开连接来自一个peripheral设备在下列两个情况:

  • 所有characteristic
    值,您已经订阅已经停止发送通知。(你可以确定一个characteristic的值是唤醒通过访问characteristic的isNotifying
    属性)。

  • 你已经有来自peripheral 设备的所有数据

在这两种情况下,取消你的订阅,然后从peripheral断开。你可以取消任何characteristic的值的订阅通过调用 setNotifyValue:forCharacteristic: 方法 ,设置第一个参数为No .你可以取消一个peripheral连接,通过调用CBCentralManager 类的 cancelPeripheralConnection: 方法,像这样:

[myCentralManager cancelPeripheralConnection:peripheral];

Note: cancelPeripheralConnection: 方法不是阻塞的,任何CBPeripheral类命令,仍等待peripheral你可能想断开或不可能完成执行。因为其他的应用程序可能仍然有一个连接到peripheral,取消一个本地连接不保证底层物理链接立即断开连接。从应用程序的角度来看,然而,peripheral被认为是断开连接,和central管理器对象调用它的代理方法 centralManager:didDisconnectPeripheral:error:


Reconnecting to Peripherals


使用Core Bluetooth 框架,你有三种方式重新连接peripheral,你可以:

Note:数量的重新连接选项你决定尝试,和你这样做的顺序,可能不同的用例应用程序正试图实现。例如,您可能决定不使用第一个连接选项,或者你可能会决定尝试并行前两个选项。


Retrieving a List of Known Peripherals


第一个见你发现一个peripheral ,系统生成一个标识符(一个UUID,NSUUID对象)去标识peripheral。然后,你可以存储这个标识符(例如:使用NSUserDefautls类的资源) ,和之后使用它尝试重新连接peripheral 使用 CBCentralManager 类的 retrievePeripheralsWithIdentifiers:
下面描述一个方法使用这个方法去重新连接你之前连接过的peripheral

当你的app运行的时候,调用 retrievePeripheralsWithIdentifiers: 方法 ,传入一个数组,其中包含您之前发现的peripheral的标识和连接过的(和其标识符你已经保存了),像这样:

knownPeripherals =
        [myCentralManager retrievePeripheralsWithIdentifiers:savedIdentifiers];

central管理器试图匹配您提供的标识符(之前发现的外围设备的标识符),并返回结果CBPeripheral对象数组。如果没有发现匹配数组为空,你应该试试其他两个重新连接选项之一。如果数组为非空,让用户选择(UI)尝试重新连接peripheral。

当用户选择一个peripheral,尝试连接调用 CBCentralManager 类的 connectPeripheral:options: 方法。如果periperhal 设备一直可以连接到,central 管理者调用它的代理方法 centralManager:didConnectPeripheral: 表示重新连接是成功的。

Note:一个peripheral 设备不可能一直是可以连接的。例如,设备可能 central 附件。额外的,一些蓝牙低能量设备使用一个随机的设备地址定期改变。因此,即使设备是在附近的,设备的地址可能改变了自从上次系统发现,在这种情况下,CBPeripheral对象你想连接到不符合实际的peripheral设备。如果你不能重新连接到peripheral,因为它的地址已经改变,你必须重新发现它使用 scanForPeripheralsWithServices:options: 方法。
关于随机设备地址的更多信息,请参见蓝牙4.0规范,卷3 C部分,10.8节和 Bluetooth Accessory Design Guidelines for Apple Products.


Retrieving a List of Connected Peripherals


连接到peripheral的另一种方法是通过检查是否你正在寻找的peripheral已经连接到系统(例如,通过其他的app)。你可以这样做通过调用 CBCentralManager 类的 retrieveConnectedPeripheralsWithServices: 方法,返回一个 CBPeripheral 对象数组 代表当前连接到系统的peripheral 设备。

因为这里可能比当前连接到系统的一个peripheral 更多,你可以通过 CBUUID对象数组检索当前连接系统的peripheral 和包含任何标识的(通过UUID指定的) services。如果没有peripheral设备当前连接到系统,数组是空的和你应该尝试重新连接其他的两个选项之一。如果数组不是空的,让用户选择(在UI)尝试重新连接。

假设用户发现并选择所需的peripheral,在本地连接到你的app 通过调用CBCentralManager类的方法 connectPeripheral:options这里写链接内容:。(即使该设备已经连接到系统时,您还必须连接它在本地app去开始探索和交互。)在当地建立连接,central管理器调用它的代理对象的方法 centralManager:didConnectPeripheral:, 表示peripheral设备连接成功。