IOS Core Bluetooth:为特性编写 NSData
IOS Core Bluetooth : Writing NSData for Characteristic
我正在使用以下代码使用 IOS 核心蓝牙为蓝牙特性(重置设备)写入 0xDE 值:
...
NSData *bytes = [@"0xDE" dataUsingEncoding:NSUTF8StringEncoding];
[peripheral writeValue:bytes
forCharacteristic:characteristic
type:CBCharacteristicWriteWithResponse];
...
是不是我的代码写错了,值没写好?
实际上,您在这里所做的是将字符串“0xDE”写入特征。如果要使用 binary/octal 表示法,则需要远离字符串。
int integer = 0xDE;
NSData *data = [[NSData alloc] initWithBytes:&integer length:sizeof(integer)];
[peripheral writeValue:data
forCharacteristic:characteristic
type:CBCharacteristicWriteWithResponse];
尝试使用单字节值数组创建数据。
const uint8_t bytes[] = {0xDE};
NSData *data = [NSData dataWithBytes:bytes length:sizeof(bytes)];
这是创建任意常量数据的有用方法。对于更多字节,
const uint8_t bytes[] = {0x01,0x02,0x03,0x04,0x05};
NSData *data = [NSData dataWithBytes:bytes length:sizeof(bytes)];
如果您想创建要使用变量发送的数据,我建议您使用 NSMutableData 并附加您需要的字节。它不是很漂亮,但很容易阅读/理解,尤其是当您在嵌入式端匹配打包结构时。下面的示例来自一个 BLE 项目,我们在该项目中制作了一个简单的通信协议。
NSMutableData *data = [[NSMutableData alloc] init];
//pull out each of the fields in order to correctly
//serialize into a correctly ordered byte stream
const uint8_t start = PKT_START_BYTE;
const uint8_t bitfield = (uint8_t)self.bitfield;
const uint8_t frame = (uint8_t)self.frameNumber;
const uint8_t size = (uint8_t)self.size;
//append the individual bytes to the data chunk
[data appendBytes:&start length:1];
[data appendBytes:&bitfield length:1];
[data appendBytes:&frame length:1];
[data appendBytes:&size length:1];
bensarz 的回答几乎是正确的。除了一件事:你不应该使用 sizeof(int)
作为 NSData
的长度。 int
的大小为 4 或 8 个字节(取决于体系结构)。由于您要发送 1 个字节,请改用 uint8_t
或 Byte
:
uint8_t byteToWrite = 0xDE;
NSData *data = [[NSData alloc] initWithBytes:&byteToWrite length:sizeof(&byteToWrite)];
[peripheral writeValue:data
forCharacteristic:characteristic
type:CBCharacteristicWriteWithResponse];
当然你也可以使用int
作为变量的类型,但是你必须初始化NSData
长度为1.
此代码将解决问题:
NSData * data = [self dataWithHexString: @"DE"];
[peripheral writeValue:data forCharacteristic:characteristic
type:CBCharacteristicWriteWithResponse];
dataWithHexString 实现:
- (NSData *)dataWithHexString:(NSString *)hexstring
{
NSMutableData* data = [NSMutableData data];
int idx;
for (idx = 0; idx+2 <= hexstring.length; idx+=2) {
NSRange range = NSMakeRange(idx, 2);
NSString* hexStr = [hexstring substringWithRange:range];
NSScanner* scanner = [NSScanner scannerWithString:hexStr];
unsigned int intValue;
[scanner scanHexInt:&intValue];
[data appendBytes:&intValue length:1];
}
return data;
}
Swift 3.0:如果有人想知道 Swift 的格式略有不同,因为 writeValue 可以从数组中获取计数。
let value: UInt8 = 0xDE
let data = Data(bytes: [value])
peripheral.writeValue(data, for: characteristic, type: .withResponse)
我正在使用以下代码使用 IOS 核心蓝牙为蓝牙特性(重置设备)写入 0xDE 值:
...
NSData *bytes = [@"0xDE" dataUsingEncoding:NSUTF8StringEncoding];
[peripheral writeValue:bytes
forCharacteristic:characteristic
type:CBCharacteristicWriteWithResponse];
...
是不是我的代码写错了,值没写好?
实际上,您在这里所做的是将字符串“0xDE”写入特征。如果要使用 binary/octal 表示法,则需要远离字符串。
int integer = 0xDE;
NSData *data = [[NSData alloc] initWithBytes:&integer length:sizeof(integer)];
[peripheral writeValue:data
forCharacteristic:characteristic
type:CBCharacteristicWriteWithResponse];
尝试使用单字节值数组创建数据。
const uint8_t bytes[] = {0xDE};
NSData *data = [NSData dataWithBytes:bytes length:sizeof(bytes)];
这是创建任意常量数据的有用方法。对于更多字节,
const uint8_t bytes[] = {0x01,0x02,0x03,0x04,0x05};
NSData *data = [NSData dataWithBytes:bytes length:sizeof(bytes)];
如果您想创建要使用变量发送的数据,我建议您使用 NSMutableData 并附加您需要的字节。它不是很漂亮,但很容易阅读/理解,尤其是当您在嵌入式端匹配打包结构时。下面的示例来自一个 BLE 项目,我们在该项目中制作了一个简单的通信协议。
NSMutableData *data = [[NSMutableData alloc] init];
//pull out each of the fields in order to correctly
//serialize into a correctly ordered byte stream
const uint8_t start = PKT_START_BYTE;
const uint8_t bitfield = (uint8_t)self.bitfield;
const uint8_t frame = (uint8_t)self.frameNumber;
const uint8_t size = (uint8_t)self.size;
//append the individual bytes to the data chunk
[data appendBytes:&start length:1];
[data appendBytes:&bitfield length:1];
[data appendBytes:&frame length:1];
[data appendBytes:&size length:1];
bensarz 的回答几乎是正确的。除了一件事:你不应该使用 sizeof(int)
作为 NSData
的长度。 int
的大小为 4 或 8 个字节(取决于体系结构)。由于您要发送 1 个字节,请改用 uint8_t
或 Byte
:
uint8_t byteToWrite = 0xDE;
NSData *data = [[NSData alloc] initWithBytes:&byteToWrite length:sizeof(&byteToWrite)];
[peripheral writeValue:data
forCharacteristic:characteristic
type:CBCharacteristicWriteWithResponse];
当然你也可以使用int
作为变量的类型,但是你必须初始化NSData
长度为1.
此代码将解决问题:
NSData * data = [self dataWithHexString: @"DE"];
[peripheral writeValue:data forCharacteristic:characteristic
type:CBCharacteristicWriteWithResponse];
dataWithHexString 实现:
- (NSData *)dataWithHexString:(NSString *)hexstring
{
NSMutableData* data = [NSMutableData data];
int idx;
for (idx = 0; idx+2 <= hexstring.length; idx+=2) {
NSRange range = NSMakeRange(idx, 2);
NSString* hexStr = [hexstring substringWithRange:range];
NSScanner* scanner = [NSScanner scannerWithString:hexStr];
unsigned int intValue;
[scanner scanHexInt:&intValue];
[data appendBytes:&intValue length:1];
}
return data;
}
Swift 3.0:如果有人想知道 Swift 的格式略有不同,因为 writeValue 可以从数组中获取计数。
let value: UInt8 = 0xDE
let data = Data(bytes: [value])
peripheral.writeValue(data, for: characteristic, type: .withResponse)