我在找到写蓝牙设备特性的正确方法时遇到了问题。这个密码有3个字节,在写完所有特征之后,我必须将这个密码写入其最后一个字段(名为FFFF
),以便保存。
密码为000015
或0x00000f
十六进制,我正在使用此代码:
if([characteristic.UUID isEqual: [CBUUID UUIDWithString: @"FFFF"]]) {
bt = 15;
NSString *hex = [NSString stringWithFormat:@"0x%06x", (unsigned int) bt];
NSLog(@"Hex value: %@", hex);
[peripheral writeValue:[NSData dataWithBytes:&hex length:3]forCharacteristic:characteristic type:CBCharacteristicWriteWithResponse];
}
问题是虽然从int到hex的转换似乎是正确完成的,但在尝试将其写为NSData
时,我收到错误"Encryption is insufficient"
。制造商说这意味着“错误的密码”(他们没有任何关于如何编写它的iOS示例代码)。
答案 0 :(得分:5)
使用字节缓冲区更简单,如下所示。这假设密码是小端(首先是最低有效字节)。如果它期望大端,你只需要反转字节顺序。
if([characteristic.UUID isEqual: [CBUUID UUIDWithString: @"FFFF"]]) {
Byte byteArray[] = { 0x0F, 0x00, 0x00 };
[peripheral writeValue:[[NSData alloc] initWithBytes: byteArray length: 3]forCharacteristic:characteristic type:CBCharacteristicWriteWithResponse];
}
问题中的代码不起作用,因为它会将十六进制字符串转换为字节,这根本不是您想要的。您最终会为字符串中的八个字符中的每个字符获取一个字节," 0x00000F"。你想要三个字节。