我正在开发iOS应用程序,它作为BLE核心,具有自定义服务和特性。
外围设备由某个供应商开发。
系统需要在中央和外围设备之间进行配对以写入特征值。 现在我的配对存在问题。
如果我在[设置]的[蓝牙]中[忘记此设备]删除中央(iPhone)端的配对信息,
当我的应用程序尝试在连接后写入特征值并发现服务和特性时,匹配序列再次启动。
(配对对话显示在我的申请表上)
序列如下,
1. Complete connection
[_centralMgr centralManager:didConnectPeripheral:]
2. Discover service
[_centralMgr peripheral:didDiscoverServices:]
3. Discover characteristic
[_centralMgr peripheral:didDiscoverCharacteristicsForService:error:]
4. Try to write characteristic value
[_centralMgr peripheral:writeValue:forCharacteristic:tyep:]
5. At this timing, paring dialog is shown and user tap [Paring] button
6. Complete writing of characteristic value without error
[_centralMgr peripheral:didWriteValueForCharacteristic:error:]
但如果我删除外围设备端的配对信息(通过重置设备), 当我的应用程序在连接后尝试写入特征值并发现服务和特征时,配对序列不会启动。
配对对话从不显示,写入请求的响应也不会返回。
序列如下,
1. Complete connectiton
[_centralMgr centralManager:didConnectPeripheral:]
2. Discover service
[_centralMgr peripheral:didDiscoverServices:]
3. Discover characteristic
[_centralMgr peripheral:didDiscoverCharacteristicsForService:error:]
4. Try to write characteristic value
[_centralMgr peripheral:writeValue:forCharacteristic:tyep:]
5. At this timing, paring dialog is never shown
6. Response of writing request(in STEP 4.) doesn't return
外围设备供应商表示即使外围设备返回写错误 iPhone也不会请求配对。
但是我的应用程序(至少iOS中的应用程序层)并没有收到编写错误的委托API。
有没有人有同样的问题? 如果您愿意提供一些提示或信息,我将不胜感激。
添加编写特征值的代码
- (void)peripheral:(CBPeripheral *)peripheral didDiscoverCharacteristicsForService:(nonnull CBService *)service error:(nullable NSError *)error
{
NSArray* characteristics = service.characteristics;
for (CBCharacteristic* characteristic in characteristics) {
if (characteristic.properties & CBCharacteristicPropertyWrite) {
if ([[characteristic.UUID UUIDString] isEqualToString:MY_CUSTOM_CHARACTERISTIC]) {
NSData* data = MY_CUSTOM_DATA;
[peripheral writeValue:data forCharacteristic:characteristic type:CBCharacteristicWriteWithResponse];
NSLog(@"writeValue:%@", data);
}
}
}
}
在这两种情况下(删除中心/外设侧的配对信息后),它会发现完全相同的特征并写入相同的数据。
但仅在后一种情况下(在外围方面删除),配对序列不会启动。
答案 0 :(得分:0)
在这种情况下,配件(外围设备)应该要求配对而不是电话。它应该在固件端处理。当它收到特征的写入请求时(仅在需要加密时)如果尚未配对,则应该要求配对。请求供应商处理它,你的一面都很好。