随着公司对蓝牙业务的深入,公司对蓝牙设备的要求也越来越精准。当手机作为从设备时目前一次交互100byte的数据耗时250毫秒左右。但是听说别的公司只需要150毫秒,所以我们还在努力靠近的路上。
手机App作为从设备在交互过程中,安卓那边可以通过提前改变订阅状态即广播之前就设置订阅状态不需要主设备改变的情况下,大约可以节约50毫秒的时间,所以想让苹果这边也这么做,首先我想到的是查看Characteristics的属性和方法看看有木有初始化操作,然而并没有,经过反复查找第一次发现
characteristics的值可以初始化,然后就开始了搜索NSData的构成。经过一上午的实验证明幡然悔悟,此处时初始化Characteristics的值也就是characteristics.value并且初始化之后主设备只读不可根据需求动态改变,所以一上午白费。
下午又开始了漫长的官方文档查找之路,在跟硬件主设备开发工程师交流的过程中他偶然提到,他是通过描述符来改变订阅状态的,但是我对他说我上次公司已经禁用所有描述符了我已经把所有描述符都去掉了。经过他那边的搜索确认我确实发送了一个Client Characteristic Configuration的描述符,然后我查看了描述符中的定义,发现CBUUID中包含了一个CBUUIDClientCharacteristicConfigurationString这样的描述符,解释是:
@discussion The string representation of the UUID for the client configuration descriptor.
*The corresponding value for this descriptor is an <code>NSNumber</code> object.
于是我想在代码中进行重置操作:
CBMutableCharacteristic *readCharacteristic = [[CBMutableCharacteristic alloc] initWithType:[CBUUID UUIDWithString:ReadCharacterUUID] properties:CBCharacteristicPropertyRead | CBCharacteristicPropertyNotify value:nil permissions:CBAttributePermissionsReadable];
self.characterM = (CBMutableCharacteristic *)readCharacteristic;
CBUUID *charactersDescription = [CBUUID UUIDWithString:CBUUIDClientCharacteristicConfigurationString];
//设置description
CBMutableDescriptor *readwriteCharacteristicDescription = [[CBMutableDescriptor alloc]initWithType:charactersDescription value:[NSNumber numberWithBool:YES]];
[readCharacteristic setDescriptors:@[readwriteCharacteristicDescription]] ;
但是发现崩了(欲哭无泪):
理由是这个UUID是只读属性不允许修改。
到此确认,苹果App作为从设备不允许自动订阅特征值!!!
添加描述符使用CBUUIDCharacteristicUserDescriptionString这个就没问题啊老铁。