发送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位)进行不同的打包。我不确定如何正确打包值。

以下是我尝试过的三种不同程度的成功方法。

  1. 将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]; 
    
  2. 首先转换为字符串,例如, (16位)C:

    NSString * cString = [NSString stringWithFormat:@"%i",C]; 
    NSData * cData = [cString dataUsingEncoding:NSUTF16StringEncoding]; 
    [p writeValue:cData forCharacteristic:cCHAR type:CBCharacteristicWriteWithResponse]; 
    
  3. 使用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种格式?

你需要了解你的设备希望的格式多一点信息:

假设你想使用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字符串发送并在接收端将其转换回数值通常更简单,但这取决于您是否能控制设备所期望的格式。