发送int数据到BLE设备
问题描述:
我有4个不同的int值,我需要发送到BLE设备(建立连接正常)。发送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位)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,例如,对于(32位)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种格式?
答
你需要了解你的设备希望的格式多一点信息:
- 签署或无符号
- 中的数值系统little-endian or big-endian
假设你想使用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:
写入NSData如果设备需要big-endian数据,那么您将需要操纵字节到正确的顺序。出于这个原因,只需将数字值作为ASCII字符串发送并在接收端将其转换回数值通常更简单,但这取决于您是否能控制设备所期望的格式。