简体   繁体   中英

Parse BLE Manufacturer data - Objective-C

I'm working on a custom bluetooth product, the manufacturer has embeded data in the advertisement packet. How do I effectively parse this data so it's usable within an iOS app?

I'm currently grabbing the data from the NSDictionary as follows:

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

The data in the packet is structured like so:

    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;

My first thought was to convert it to a string and parse out the data that I need, but this seems slow and really inefficient. There has to be a standard way developers deal with this. I'm still pretty green when it comes to bitwise operators. All the data is formatted in little endian.

Certainly don't convert it to a string, as it isn't one, and you'll have issues with encoding.

  1. Start by checking that the length of the data matches what you're expecting (26 bytes)

  2. Use the bytes method to get a pointer to the data

  3. Add a function or method to combine two bytes into a 16-bit integer. You'll have to find out if those 2-byte fields are signed or unsigned.

Something along these lines:

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

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM