0

組み込みデバイスから iPad に Advertising-Data を送信しています。このデータは、「サービス データ」-AD タイプ (0x16) でタグ付けされます。デリゲートのdidDiscoverPeripheralを使用してadvertisementDataを読んでいると、次のようになります。

 Adv.-Data: {
kCBAdvDataServiceData =     {
    "Unknown (<fdf0>)" = <01020305>;
};
kCBAdvDataServiceUUIDs =     (
    "Unknown (<fdf0>)"
);

Service 0xFDF0 は私が選択したものです。そして今、キーkCBAdvDataServiceDataを持つサービス 0xFDF0 のデータであるバイト0x010x020x030x05を取得する必要があります。

後でこれらの4バイトの配列があれば完璧です。私は長い間試しましたが、得られた最も近いものは文字列"Unknown (< fdf0>)" = <01020305>でした。

4

2 に答える 2

0

Adv データ ディクショナリが current_adv_dic と呼ばれるとします。

NSArray *aa4 = [current_adv_dic valueForKey:@"kCBAdvDataServiceData"];
NSString *ss2 = [NSString stringWithFormat:@"%@",aa4];
Byte AdvDataArray[ss2.length];
NSLog(@"AdvDataArray: ");
for(int i=0; i<ss2.length; i++){
    AdvDataArray[i]=[ss2 characterAtIndex:i];
    printf("%x,",AdvDataArray[i]);
}
printf("\r\n");

最初のバイトは「{」文字であり、その後に LineFeed の 0x0a が続き、その後にスペースなどが続くことに注意してください。例: 7b,a,20,20,20,20,22,55,6e,6b,6e,6f ,77,6e,20,28,3c の場合、Service Data が見つかります。その後、従来の方法で UniChars を Byte / Hex 値に変換できます。

于 2013-11-08T17:49:33.530 に答える
0
- (void)centralManager:(CBCentralManager *)central didDiscoverPeripheral:(CBPeripheral *)peripheral advertisementData:(NSDictionary *)advertisementData RSSI:(NSNumber *)RSSI
{
    NSString *serviceData = [advertisementData valueForKey:@"kCBAdvDataServiceData"];
    NSString *devInfo = [self serviceDataValue:@"Device Information" withData:serviceData];

    devInfo = [[devInfo stringByReplacingOccurrencesOfString:@" " withString:@""] uppercaseString];

    NSLog(@"ServiceData: %@", serviceData);
    NSLog(@"Data: %@", devInfo);
}

- (NSString *)serviceDataValue:(NSString *)key withData:(NSString *)data
{
    if (!data) return NULL;

    data = [NSString stringWithFormat:@"%@", data];

    NSError *error = NULL;
    NSString *pattern = [NSString stringWithFormat:@"\"%@\" = <(.*)>", key];
    NSRegularExpression *regex = [NSRegularExpression regularExpressionWithPattern:pattern
                                                                           options:NSRegularExpressionCaseInsensitive
                                                                             error:&error];
    if (!error)
    {
        NSTextCheckingResult *match =
        [regex firstMatchInString:data options:0 range:NSMakeRange(0, data.length)];

        if (match.numberOfRanges > 1)
        {
            return [data substringWithRange:[match rangeAtIndex:1]];
        }

    }

    return NULL;
}
于 2015-05-21T03:39:25.837 に答える