我有4个不同的int值,我需要发送到BLE设备(连接建立OK)。
为了清楚起见,我将调用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位)int:
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,例如for(32 bit)D int:
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种格式?
答案 0 :(得分:1)
您需要了解有关设备所需格式的更多信息:
假设您要使用iOS使用的little-endian格式,您可以使用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字符串发送并将其转换回接收端的数值通常更容易,但这取决于您是否可以控制设备所期望的格式。