隨着公司對藍牙業務的深入,公司對藍牙設備的要求也越來越精準。當手機作爲從設備時目前一次交互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這個就沒問題啊老鐵。