gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-29 00:30:01 25 4
gpt4 key购买 nike

我正在开发定制蓝牙产品,制造商已在广告数据包中嵌入数据。我如何有效地解析这些数据,以便它可以在 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. 首先检查数据的长度是否符合您的预期(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]),
....
};
}

关于ios - 解析 BLE 制造商数据 - Objective-C,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42145291/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com