向 BLE 设备发送 int 数据
Sending int data to BLE device
我有 4 个不同的 int 值需要发送到 BLE 设备(连接建立正常)。
为清楚起见,我将调用 int 值 A、B、C、D。 A和B的范围在0-100之间,C的范围是0-2000,D的范围是0-10000。所有值均由用户输入确定。
我需要快速连续地将这四个值发送到 BLE 设备,并对它们分别进行不同的封装:A 和 B(8 位)、C(16 位)和 D(32 位)。我不确定如何正确打包这些值。
以下是我尝试过并取得不同程度成功的三种方法。
将 int 转换为数据并发送,例如对于 A(8 位)整数:
const unsigned char CHR = (float)A;
float size = sizeof(CHR);
NSData * aData = [NSData dataWithBytes:&CHR length:size];
[p writeValue:aData forCharacteristic:aCHAR type:CBCharacteristicWriteWithResponse];
先转换为字符串,例如对于(16 位)C:
NSString * cString = [NSString stringWithFormat:@"%i",C];
NSData * cData = [cString dataUsingEncoding:NSUTF16StringEncoding];
[p writeValue:cData forCharacteristic:cCHAR type:CBCharacteristicWriteWithResponse];
使用 uint,例如对于(32 位)D 整数:
uint32_t val = D;
float size = sizeof(val);
NSData * dData = [NSData dataWithBytes:(void*)&val length:size];
[p writeValue:valData forCharacteristic:dCHAR type:CBCharacteristicWriteWithResponse];
我在上面做错了什么,以及如何最好地将 int 值转换并发送到设备,以允许所需的 3 种格式?
您需要了解更多关于您的设备期望格式的信息:
- 这些值是有符号的还是无符号的
- 是系统little-endian or big-endian
假设你想使用 iOS 使用的小端格式,你可以只使用 dataWithBytes
-
unsigned char a = 100
NSData *aData = [NSData dataWithBytes:&a length:sizeof(i)];
UInt16 c = 1000
NSData *cData = [NSData dataWithBytes:&c length:sizeof(c)];
Unit32 d = 10000
NSData *dData = [NSData dataWithBytes:&d length:sizeof(d)];
然后使用 writeValue:forCharacteristic:type:
编写 NSData
如果设备需要大端数据,那么您需要将字节按正确的顺序进行操作。出于这个原因,通常更容易将数值作为 ASCII 字符串发送并在接收端将它们转换回数值,但这取决于您是否可以控制设备期望的格式。
我有 4 个不同的 int 值需要发送到 BLE 设备(连接建立正常)。
为清楚起见,我将调用 int 值 A、B、C、D。 A和B的范围在0-100之间,C的范围是0-2000,D的范围是0-10000。所有值均由用户输入确定。
我需要快速连续地将这四个值发送到 BLE 设备,并对它们分别进行不同的封装:A 和 B(8 位)、C(16 位)和 D(32 位)。我不确定如何正确打包这些值。
以下是我尝试过并取得不同程度成功的三种方法。
将 int 转换为数据并发送,例如对于 A(8 位)整数:
const unsigned char CHR = (float)A; float size = sizeof(CHR); NSData * aData = [NSData dataWithBytes:&CHR length:size]; [p writeValue:aData forCharacteristic:aCHAR type:CBCharacteristicWriteWithResponse];
先转换为字符串,例如对于(16 位)C:
NSString * cString = [NSString stringWithFormat:@"%i",C]; NSData * cData = [cString dataUsingEncoding:NSUTF16StringEncoding]; [p writeValue:cData forCharacteristic:cCHAR type:CBCharacteristicWriteWithResponse];
使用 uint,例如对于(32 位)D 整数:
uint32_t val = D; float size = sizeof(val); NSData * dData = [NSData dataWithBytes:(void*)&val length:size]; [p writeValue:valData forCharacteristic:dCHAR type:CBCharacteristicWriteWithResponse];
我在上面做错了什么,以及如何最好地将 int 值转换并发送到设备,以允许所需的 3 种格式?
您需要了解更多关于您的设备期望格式的信息:
- 这些值是有符号的还是无符号的
- 是系统little-endian or big-endian
假设你想使用 iOS 使用的小端格式,你可以只使用 dataWithBytes
-
unsigned char a = 100
NSData *aData = [NSData dataWithBytes:&a length:sizeof(i)];
UInt16 c = 1000
NSData *cData = [NSData dataWithBytes:&c length:sizeof(c)];
Unit32 d = 10000
NSData *dData = [NSData dataWithBytes:&d length:sizeof(d)];
然后使用 writeValue:forCharacteristic:type:
如果设备需要大端数据,那么您需要将字节按正确的顺序进行操作。出于这个原因,通常更容易将数值作为 ASCII 字符串发送并在接收端将它们转换回数值,但这取决于您是否可以控制设备期望的格式。