2017-02-09 21 views
0

我正在制定一个自定义蓝牙产品,制造商已经在广告数据包中嵌入了数据。如何有效解析这些数据,以便在iOS应用程序中可用?解析BLE制造商数据 - Objective-C

我目前从NSDictionary中抓取数据,如下所示:

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; 

我首先想到的是将其转换为一个字符串并解析出我需要的数据,但这看起来很慢并且效率很低。开发人员应该有一个标准的方式来处理这个问题。对于按位运算符,我仍然很绿。所有的数据格式化为小端。

+0

请看看我的问题。为什么我无法访问制造商数据? https://stackoverflow.com/questions/46402904/is-there-any-way-access-manufacturer-data-from-ios-device – sorunluadam

回答

1

肯定不会将其转换为字符串,因为它不是一个,你就会有编码问题。

  1. 开始通过检查数据的匹配length你期待什么(26个字节)

  2. 使用bytes方法得到一个指针数据

  3. 新增功能或将两个字节组合成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