2017-02-09 12 views
0

私はカスタムbluetooth製品で作業していますが、メーカーは広告パケットにデータを埋め込んでいます。このデータを効果的に解析してiOSアプリで使用できるようにするにはどうすればよいですか?Parse BLE製造元データ - Objective-C

NSData *rawData = [advertisement objectForKey:@"kCBAdvDataManufacturerData"]; 

パケット内のデータがそうのように構成されています:

uint8_t compId[2]; 
    uint8_t empty[6]; 
    uint8_t temperature[2]; 
    uint8_t rampRate[2]; 
    uint8_t dutyFactor[2]; 
    uint8_t alarms[2]; 
    uint8_t statusFlag; 
    uint8_t speedRpm[2]; 
    uint8_t vib[2]; 
    uint8_t deviceTypeId; 
    uint8_t radioStatus; 
    uint8_t cycleTimer[2]; 
    uint8_t batteryLevel; 

私の最初の考えは、それを変換するために、以下のとおりであった

私は現在、NSDictionaryのからデータをつかみました私が必要とするデータを解析しますが、これは遅く、実際には非効率的です。開発者がこれに対処する標準的な方法がなければなりません。ビット演算子についてはまだかなり緑色です。すべてのデータはリトルエンディアンでフォーマットされます。

+0

私の質問を見てください。メーカーデータにアクセスできないのはなぜですか? https://stackoverflow.com/questions/46402904/is-there-any-way-access-manufacturer-data-from-ios-device – sorunluadam

答えて

1

確かに文字列に変換しないでください。文字列ではないので、エンコードに問題があります。データのlengthは、あなたがデータへのポインタを取得するために(26バイト)

  • 使用bytes方法を期待しているものと一致することを確認することで

    1. スタート

    2. 機能を追加します。または2バイトを16ビット整数に結合する方法。これらの2バイトのフィールドが符号付きか符号なしかを調べる必要があります。

    これらの線に沿って何か:

    - (int)getWordFromBuffer:(const unsigned char *)bytes atOffset:(int) offset 
    { 
        return (int)bytes[offset] | (bytes[offset+1] << 8); 
    } 
    
    - (NSDictionary *)decodeData:(NSData *)data 
    { 
        if (data.length != 26) 
        { 
         NSLog(@"wrong length %d instead of 26", data.length); 
         return nil; 
        } 
    
        const unsigned char *bytes = (unsigned char *)data.bytes; 
    
        return 
        @{ 
         @"compId": @([self getWordFromBuffer:bytes atOffset:0]), 
         @"temperature": @([self getWordFromBuffer:bytes atOffset:8]), 
         @"rampRate": @([self getWordFromBuffer:bytes atOffset:10]), 
        .... 
        }; 
    } 
    
  • +0

    'subdataWithRange:'ではなく、バイトを使うより良い方法です'? – Larme

    +0

    @Larme、あなたは新しい 'NSData'オブジェクトで終わるでしょう、そしてあなたはまだそれを整数に変換する必要があります。 – jcaron

    関連する問題