我正在研发自定义蓝牙产品,制造商已在广告包中嵌入数据。如何有效地解析这些数据,使其在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;
我的第一个想法是将它转换为字符串并解析出我需要的数据,但这看起来很慢而且效率很低。开发人员必须采用标准方式处理此问题。对于按位运算符,我仍然很绿。所有数据都以小端格式化。
答案 0 :(得分:1)
当然不要将其转换为字符串,因为它不是一个字符串,并且您将遇到编码问题。
首先检查数据的length
是否符合您的预期(26字节)
使用bytes
方法获取指向数据的指针
添加一个函数或方法,将两个字节组合成一个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]),
....
};
}