2013-05-16 86 views
0

我將廣告數據從嵌入式設備發送到iPad。這些數據標有「服務數據」-AD類型(0x16)。當我讀了advertisementData與委託didDiscoverPeripheral然後我得到如下:Objective-C藍牙:通過廣告讀取服務數據

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

的服務0xFDF0由我決定。現在我需要在字節0×010×02×03爲0x05這是服務0xFDF0用鑰匙kCBAdvDataServiceData的數據。

這將是完美的,如果我以後會有這4個字節的數組。我試了這麼久,但最近我得到的是字符串「未知(< fdf0>)」= < 01020305>

感謝您的幫助

回答

0

假設你的進階數據字典被稱爲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"); 

請注意,第一個字節爲「{」字符,其次是0X0A爲換行,那麼空間,例如: 7b,a,20,20,20,20,22,55,6e,6b,6e,6f,77,6e,20,28,3c, 然後您會找到您的服務數據。 。然後,您可以通過傳統方法將UniChars轉換爲Byte/Hex值。

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; 
    }