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

与远程外设交互的最佳实践

Core Bluetooth框架使中央端的很多事务对你的应用程序透明,也就是,你的应用程序已经控制了,并负责实现大多数中央角色方面,设备扫描,连接,探索和与远程外设数据交互。这个章节提供指导和最佳实践为以负责任的方式治理控制水平,特别是当给一个iOS设备开发你的应用程序时。

注意无线的使用和功耗

当开发一个与蓝牙低功耗设备交互的应用程序时,记住蓝牙低功耗在通信过程中会享用你的设备无线来在空中传递信号。因为其它形式的无线通信可能需要用你的设备无线--例如,Wi-Fi,经典蓝牙,和其它应用程序使用蓝牙低功耗--开发你的应用程序最小化使用无线。
当给一个iOS设备开发一个应用程序时最小化无线的使用是特别重要的,因为无线的使用不利于电池的寿命。下面的指导方针将帮你成为一个你设备的无线的好公民。因此,你的应用程序将执行得更好,你的设备的电池将持续更长的时间。

只有当你需要的时候才去扫描设备

当你调用CBCentralManager类的scanForPeripheralsWithServices:options:方法来发现正在广播服务的外设时,你的中央设备会使用无线来监听正在广播的设备,直到你明确告诉它停止。
除非你需要发现更多的设备,在你已经发现了你想要连接的设备的时候停止扫描其它设备。用CBCentralManager类的stopScan方法来停止扫描其它的设备,在Connecting to a Peripheral Device After You've Discovered It中可见。

只有在必要的时候才指定CBCentralManagerScanOptionAllowDuplicatesKey选项

远程外设可能会每秒发送多个广播包给在监听的中央来宣布它们的存在,当你使用scanForPeripheralsWithService:options:方法正在扫描设备时,这个方法的默认行为是合并多个发现的广播外设成单个发现事件--也就是说,没发现一个新的外设,中央管理者会调用它的代理对象的centralManager:didDiscoverPeripheral:advertisementData:RSSI:方法,不管它接受到了多少广播包。当一个已经准备发现的外设广播数据改变时中央管理者也会调用这个代理方法。
如果你想要改变这个默认行为,你可以在调用scanForPeripheralsWithServices:options:方法时指定CBCentralManagerScanOptionAllowDuplicatesKey常量作为扫描选项。当你这样做,每次中央接受到外设的广播包时都会形成一个发现事件。关掉默认的行为对某些情况是有用的,例如在外设上启动与外设的连接(使用外设接受信号强度指示值(RSSI)).也就是说,记住指定这个扫描选项不利于电池的寿命和应用程序的性能。因此,只有在特殊使用情况下需要的时候才指定这个扫描选项。

明智地探索一个外设的数据

当你在开发一个应用程序来实现一种特定的使用情况时一个外设可能有比你可能感兴趣的更多的服务和特征。发现所有的外设服务和相关的特征会给你的应用程序性能和电池寿命带来不好的影响。因此,你应该查看和发现你的应用程序需要的服务和特征。
例如,想象你已经连接了一个有很多有效服务的外设,但是你的应用程序只需要访问它们中的两个。你可以只查看和发现这两个服务,通过调用CBPeripheral类的discoverServices:方法传递的参数是它们的服务的UUIDs的数组(使用CBUUID对象表示),就像:

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

在你发现了你感兴趣的两个服务之后,你可以类似地发现你只感兴趣的服务的特征。再一次,通过调用CBPeripheral类的discoverCharacteristics:forService:方法传递参数是你想要发现的特征的UUIDs组成的数组(对于每个服务)。

订阅经常改变的特征值

正如Retrieving Value of a Characteristic中描述,有两种方式获得一个特征值:

  • 你可以通过每次需要值的时候调用readValueForCharacteristic:方法来明确地获取特征值
  • 你可以通过调用setNotifyValue:forCharacteristic:方法来订阅特征值,一旦值发生了变化会接受到一个从外设发来的通知。

当指定的特征值经常发生改变时订阅这个特征值是一个好的实践。有一个例子关于订阅特征值,请看Subscribing to a Characteristic's Value 。

当你已经有了你想要的所有数据的时候断开与设备的连接

当你有一个不再需要的连接的时候通过断开与外设的连接可以有助于减少你的应用程序的无线使用。你应该在下面的两种情况下断开与外设的连接:

  • 你订阅的所有特征值已经停止发送了通知(你可以通过访问特征的isNotifying属性来决定特征值是否正在通知)
  • 你已经从外设那里获取到了你想要的所有数据

在这两种情况下,取消订阅你可能有的并断开与外设的连接。你可以通过调用setNotifyValue:forCharacteristic:方法来取消订阅一个特征值,设置第一个参数为NO。你可以通过调用CBCentralManager类的cancelPeripheralConnection:方法取消与一个外设的连接。就像:

[myCentralManager cancelPeripheralConnection:peripheral];

注意:cancelPeripheralConnection:方法是不闭塞的,你尝试断开连接的外设的还没发出的命令可能没执行完。因为其它的应用程序可能仍然与该外设连接着,取消一个本地的连接不能保证底层的物理链路立即断开。从你的应用程序角度来看,外设是断开的,和中央角色会调用它的代理对象的centralManager:didDisconnectPeripheral:error:方法。

重新连接外设

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

  • 获得外设的列表-在过去你发现或已经连接的外设-使用retrievePeripheralsWithIdentifiers:方法。如果这个外设你能在该列表中查找到,尝试连接。这个重连的选项在Retrieving a List of Known Peripherals中有描述。
  • 使用retrieveConnectedPeripheralsWithServices:方法获得当前与系统连接的外设列表。如果这个外设你能在该列表中查找到,连接它到你的本地应用程序。这个重连的选项在Retrieving a List of Connected Peripherals中有描述。
  • 使用scanForPeripheralsWithServices:options:方法扫描和发现外设。如果你找到它了,连接它。这一步在Discover Peripheral Devices That Are Advertising和Connecting to a Peripheral Device After You're Discovered It中都有描述。

视使用情况而定,你想重连它但又不想每次都必须扫描和发现相同的外设,你可能想要尝试使用第一个选项来重连它来代替。如图5-1所示,它们在上面列出的顺序中有可能尝试每一个选项的重连工作流程。

Core Bluetooth库编程指南官方文档翻译1-6_第1张图片
重连流程图.png

注意:你决定尝试的重连选项的数目,和你这样做的顺序,可能由你的应用程序尝试满足的使用情况而有所不同。例如,你可能决定根本就不使用第一个连接的选项,或者你可能决定尝试使用第一个和第二个选项。

获取已知的外设列表

第一次你发现一个外设,系统会用一个标识符(一个UUID,用NSUUID对象表示)来标识这个外设。然后你可以存储这个标识符(使用NSUserDefaults类的资源),然后用CBCentralManager类的retrievePeripheralsWithIdentifiers:方法尝试重连这个外设。下面描述了一个方式来使用这个方法来重连一个你已经之前连接过的外设。
当你的应用程序启动时,调用retrievePeripheralsWithIdentifiers:方法,通过你之前发现和连接过的外设(你已经保存了它的标识符)的标识符号来获得一个数组,就像:

knownPeripherals = [myCentralManager retrievePeripheralsWithIdentifiers:savedIdentifiers];

中央管理者尝试匹配你提供的之前发现外设的标识符号然后返回一个包含CBPeripheral对象的数组结果。如果发现的都没有匹配上,这个数组是空的,你应该尝试使用另外两种重连方式。如果这个数组不是空的,让用户在界面上选择尝试重新连接哪一个外设。
当用户选择了一个外设,通过调用CBCentralManager类的connectPeripheral:options:方法尝试连接它。如果这个外设依然能有效地被连接上,中央管理者会调用它的代理对象的centralManager:didConnectPeripheral:方法,这个外设就被成功重新连接上了。

注意:一个外设可能因为一些原因在被连接的时候无效。对于这种情况,外设可能不在中央附近。另外,一些蓝牙低功耗设备使用一个随机的设备地址周期性的改变。因此,即使设备在附近,设备的地址可能已经改变了自从它被系统发现的上一次。在这种情况下,你尝试连接的CBPeripheral对象不符合真实的外设。如果你因为它的设备地址已经改变了而不能重新连接上这个外设,你必须使用scanForPeripheralsWithServices:options:方法重新发现它。关于随机设备地址的更多信息,请看蓝牙4.0规范,和Bluetooth Accessory Design Guidelines for Apple Produces。

获取已经连接的外设列表

另外一种方式来重新连接外设是通过检查看你发现已经与系统(例如,被其它的应用程序)连接的哪个外设.你可以通过调用CBCentralManager类的retrieveConnectedPeripheralsWithServices:方法,会返回一个装有当前与系统连接的外设用CBPeripheral对象表示的数组。
因为可能当前与系统连接的外设不止一个,你可以通过有CBUUID对象(表示服务的UUIDs)的数组来获取只与当前系统连接的和包含一些被你指定的UUIDs的标识的服务的外设。如果没有外设与当前系统连接,这个数组是空的,你应该尝试用其它的两种重连方法。如果这个数组不是空的,让用户在界面上尝试连接哪个外设。
假定用户发现和选择了想要的外设,通过调用CBCentralManager类的connectPeripheral:options:方法来让它与你的应用程序连接。(即使这个设备已经与系统连接了,你仍然必须连接它到你的应用程序来开始探索和与它交互)。当这个本地连接建立了,中央管理者会调用它的代理对象的centralManager:didConnectPeripheral:方法,这个外设就成功地被重新连接了。

-- 翻译的文档地址:Best Practices for Interacting With a Remote Peripheral Device

你可能感兴趣的:(Core Bluetooth库编程指南官方文档翻译1-6)