向 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 位)。我不确定如何正确打包这些值。

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

  1. 将 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];
    
  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 整数:

    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 使用的小端格式,你可以只使用 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 字符串发送并在接收端将它们转换回数值,但这取决于您是否可以控制设备期望的格式。