解析BLE制造商数据 - Objective-C

时间:2017-02-09 19:31:21

标签: ios objective-c bluetooth

我正在研发自定义蓝牙产品,制造商已在广告包中嵌入数据。如何有效地解析这些数据,使其在iOS应用程序中可用?

我目前正在从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;

我的第一个想法是将它转换为字符串并解析出我需要的数据,但这看起来很慢而且效率很低。开发人员必须采用标准方式处理此问题。对于按位运算符,我仍然很绿。所有数据都以小端格式化。

1 个答案:

答案 0 :(得分:1)

当然不要将其转换为字符串,因为它不是一个字符串,并且您将遇到编码问题。

  1. 首先检查数据的length是否符合您的预期(26字节)

  2. 使用bytes方法获取指向数据的指针

  3. 添加一个函数或方法,将两个字节组合成一个16位整数。您必须查明这些2字节字段是已签名还是未签名。

  4. 这些方面的东西:

    - (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]),
         ....
        };
    }