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框架,有三种方式可以用来重新连接外设,你可以:

视使用情况而定,你想重连它但又不想每次都必须扫描和发现相同的外设,你可能想要尝试使用第一个选项来重连它来代替。如图5-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

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 162,825评论 4 377
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 68,887评论 2 308
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 112,425评论 0 255
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 44,801评论 0 224
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 53,252评论 3 299
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 41,089评论 1 226
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 32,216评论 2 322
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 31,005评论 0 215
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,747评论 1 250
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,883评论 2 255
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 32,354评论 1 265
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,694评论 3 265
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 33,406评论 3 246
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,222评论 0 9
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,996评论 0 201
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 36,242评论 2 287
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 36,017评论 2 281

推荐阅读更多精彩内容