将 Characterstic.Value 解析为字节整数格式

Parse Characterstic.Value to byte integer format

我正在做核心蓝牙应用。我能够连接外围设备并从中读取、写入值。

我需要将通过 characteristic.value 接收到的数据解析为整数格式。 我的特征值为 <011f6d00 00011100 00000000 04050701 05000569 07df0203 020b0d21 02ff33>.

我按照理解划分了数据。 请帮助我转换数据的示例代码。由于我是 iOS 的新手,因此观察了很多链接但没有找到确切的答案

  <011f6d00 

11 00  event id       //2 bytes

00    event type      //1 byte

00    No of packets            //1 byte

00 00 record count               //2 byte

04 05 total duration            //2 byte

07       sensitivity            //1 byte

01    recording sensitivity   //1 byte

05    expected seizure duration  //1 byte

00    Not used parameter       //1 byte

05    Expected recorded duration     //1 byte

69    not used parameters     //1 byte

07    snooze duration       //1 byte

df    disable watch help button    //1 byte   

02 03  year        //2 byte

02    date of month     //1 byte

0b    day of week      //1 byte

0d    hour             //1 byte

21    minute            //1 byte

02   second             //1 byte

ff33>    crc          //2 byte
NSData *initialData = [yourCharacteristic value];

解析数据的一种方法是使用 NSDatasubdataWithRange: 方法。

示例:

NSData *startOfFrameData = [data subdataWithRange:NSMakeRange(0, 4)];
NSLog(@"StartOfFrameData: %@", startOfFrameData);
NSData *eventIDData = [data subdataWithRange:NSMakeRange(4, 2)];
NSLog(@"eventIDData: %@", eventIDData);

等等

输出:

>StartOfFrame: <011f6d00>
>eventIDData: <0001>

请注意,我可能颠倒了 eventIDData 的顺序,范围可能是 (6,2)(而不是 (4,2)),但您会明白整个想法。

然后,你必须"understand"数据的含义并找到正确的格式,示例(可能)为eventIDData

UInt16 eventID;
[eventIDData getBytes:&eventID length:sizeof(eventID)];
NSLog(@"eventID: %d", eventID);

等等...

如果你想"play"用它而不是每次都一遍又一遍地读取特征值(这意味着也连接等),这里有一个方法你可以使用:

-(NSData *)dataWithStringHex:(NSString *)string
{
    NSString *cleanString;
    cleanString = [string stringByReplacingOccurrencesOfString:@"<" withString:@""];
    cleanString = [cleanString stringByReplacingOccurrencesOfString:@">" withString:@""];
    cleanString = [cleanString stringByReplacingOccurrencesOfString:@" " withString:@""];

    NSInteger length = [cleanString length];
    uint8_t buffer[length/2];
    for (NSInteger i = 0; i < length; i+=2)
    {
        unsigned result = 0;
        NSScanner *scanner = [NSScanner scannerWithString:[cleanString substringWithRange:NSMakeRange(i, 2)]];
        [scanner scanHexInt:&result];
        buffer[i/2] = result;
    }
    return  [[NSMutableData alloc] initWithBytes:&buffer length:length/2];
}

使用示例:

NSData *initialData = [self dataWithStringHex:@"<011f6d00 00011100 00000000 04050701 05000569 07df0203 020b0d21 02ff33>"]; 

这样,您可以尝试在另一个 example/project/beta 测试代码上解析您的数据。