2016-09-07 15 views
0

私はBLEデバイスに送信する必要がある4つの異なるint値を持っています(接続はOKです)。BLEデバイスにintデータを送信する

わかりやすくするために、int値A、B、C、Dを呼び出します。 AおよびBは0〜100の範囲であり、Cは0〜2000の範囲であり、Dは0〜10000の範囲である。すべての値はユーザーの入力によって決まります。

これらの4つの値をBLEデバイスにすばやく送信し、AとB(8ビット)、C(16ビット)、D(32ビット)のそれぞれを別々にパッケージ化する必要があります。値を正しくパッケージ化する方法は不明です。

私は様々な成功度で試した3つの方法を以下に示します。

  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. 以下のための(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つのフォーマットを可能に?あなたがお使いのデバイスが期待する形式について少しより多くの情報を知っておく必要があり

答えて

1

システムです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)]; 

次にNSDataを書きます。writeValue:forCharacteristic:type:

デバイスでビッグエンディアンのデータが必要な場合は、適切な順序でバイトを操作する必要があります。このため、数値をASCII文字列として送信し、受信側で数値に変換するほうが簡単ですが、デバイスが予期しているフォーマットを制御できるかどうかによって異なります。

関連する問題