ios蓝牙开发学习笔记(六)作为Peripheral端的最佳方
本文转自:http://blog.csdn.net/swibyn/article/details/52096673
Best Practices for Setting Up Your Local Device as a Peripheral
作为Peripheral端的最佳方式
与central端类似,蓝牙库让你能够实现peripheral角色的多方面的控制。本章节提供指引,并讲述如何使用。
Advertising Considerations
广播是实现peripheral建立连接的一个重要部分。
Respect the Limits of Advertising Data
注意广播数据的限制
在CBPeripheralManager 的startAdvertising: 方法中,通过dictionary参数传递peripheral的广播数据。创建广播字典时,时刻记住有哪些限制。
虽然广播包通常情况下可以有多种的信息,但你只能广播设备名称和services的uuid。也就是说,在你创建广播字典时,你只能设置这两个key: CBAdvertisementDataLocalNameKey and CBAdvertisementDataServiceUUIDsKey 。设置其他key将导致错误。
广播数据的空间也有限制。当应用在前台时,这两个key的值最多有28 字节可用。搜索时,如果这个空间用完,另外还有10个字节的响应数据可以用来标识设备名称。超出规定空间的service uuids将会被放到“Overflow”区域,在iOS设备显示搜索他们时会被搜索到。当设备在后台时,local name不会被广播,同时所有的services uuids 都放入 overflow 区域。
注意:这个限制的数值不包括2字节的头部信息。详细格式信息参见Bluetooth 4.0 specification, Volume 3, Part C, Section 11.
为了使你的数据符合空间要求,请使用主要的services的uuid
Advertise Data Only When You Need To
只在需要的时候广播数据
广播数据会使用设备的无线电(当然了还有电池),所以只有在你希望被连的时候才广播数据。一旦连接上,这个设备就可以检索和交互数据了,而不需要你在广播数据了。因此,为了少使用无线电,增加应用响应性能,保护电池,请停止发送广播。使用stopAdvertising 方法停止,如下
[myPeripheralManager stopAdvertising];
Let the User Decide When to Advertise
让用户决定什么时候广播
往往只有用户才最知道什么时候需要发送广播。如果附近没有蓝牙设备,你发送广播也是没有意义的。既然应用本身不知道何时需要发送广播,那就提供接口让用户来决定。
Configuring Your Characteristics
配置characteristic
创建可变characteristic之后,我们修改其属性,值,和访问权限。这些设置决定连接的central如何访问和与之交互数据。虽然不同的属性和访问权限由各自app决定,但当你要完成下面两项任务时,这里提供相关指引:
1,允许central订阅你的characteristics
2,如果未配对,请保护敏感数据
Configure Your Characteristics to Support Notifications
设置characteristic,使之支持通知
在Subscribe to Characteristic Values That Change Often 中有描述,推荐在characteristic的值经常变化时,使用订阅的方式。如果可能的话,尽量让central端能够采用订阅的方式。
创建的时候,通过CBCharacteristicPropertyNotify 设置characteristic的属性,使之支持订阅
myCharacteristic = [[CBMutableCharacteristic alloc] initWithType:myCharacteristicUUID properties:CBCharacteristicPropertyRead | CBCharacteristicPropertyNotify value:nil permissions:CBAttributePermissionsReadable];
这样,characteristic会是可读,可被订阅的。
Require a Paired Connection to Access Sensitive Data
要求配对连接才能访问敏感数据
实际情况下,你可能需要发送敏感数据。比如数据中有姓名,email地址等,你希望只有可信任的设备才能访问这些数据。
要保证只有可信任的设备才能访问敏感数据,可以通过设置合适的characteristic属性和访问权限。比如上面创建的例子,可做如下修改:
emailCharacteristic = [[CBMutableCharacteristic alloc] initWithType:emailCharacteristicUUID properties:CBCharacteristicPropertyRead| CBCharacteristicPropertyNotifyEncryptionRequired value:nil permissions:CBAttributePermissionsReadEncryptionRequired];
在这里characteristic被配置成只允许可信任设备访问和订阅他的值。当central想要连接和订阅这个characteristic的值时,蓝牙库就会尝试配对来建立安全连接。
配对过程完成后,peripheral就会认为这个central是一个可信任设备,并允许central访问其加密过的值。