因为公司提出新的需求,需要在不做连接的时候获取外设的MAC地址。后来跟公司的硬件工程师讨论后,得出下面一个方法可以在不连接的时候就可以获取外设的MAC地址了。其实方法有多种。下面这篇文章有提到两种方法:(http://www.jianshu.com/p/1d6a8fc8134f) ,那么不多废话,介绍我现在使用的一种方法。
我们都知道在这个方法中可以得到扫描周围外设的相关信息(不清楚的请点击):
-(void)centralManager:(CBCentralManager *)central didDiscoverPeripheral:(CBPeripheral *)peripheral advertisementData:(NSDictionary *)advertisementData RSSI:(NSNumber *)RSSI
那么在advertisementData
中有个字段kCBAdvDataLocalName"
,这个字段可以放你外设的名字。那么我们当时就尝试在这个字段中把MAC地址也写进来,然后iOS这边在做一点相关的字符串的筛选就行了。
直接在didDiscoverPeripheral:
中添加此方法:
// 筛选设备
[self sendPeripheralArrName:advertisementData[@"kCBAdvDataLocalName"]];
具体实现sendPeripheralArrName:
方法:
-(void)sendPeripheralArrName:(NSString *)peripheralName{
NSString *newStr = [peripheralName substringWithRange:NSMakeRange(0, 4)];
// 用来判断的条件,这个具体得看你们硬件的名字
if ([newStr isEqualToString:@"C100"] || [newStr isEqualToString:@"C200"] || [newStr isEqualToString:@"C300"] || [newStr isEqualToString:@"D100"]) {
if (![self.deviceArr containsObject:peripheralName]) {
[self.deviceArr addObject:peripheralName];
}
for (NSString *nameStr in self.deviceArr) {
if (nameStr.length >= 20) {
// 截取C1000263 即前8位,这个前8位就是我们公司产品的名字。
NSString *devieceStr = [nameStr substringWithRange:NSMakeRange(0, 8)];
// 截取后面拼接的MAC地址
NSString *mac1 = [nameStr substringWithRange:NSMakeRange(18, 2)];
NSString *mac2 = [nameStr substringWithRange:NSMakeRange(16, 2)];
NSString *mac3 = [nameStr substringWithRange:NSMakeRange(14, 2)];
NSString *mac4 = [nameStr substringWithRange:NSMakeRange(12, 2)];
NSString *mac5 = [nameStr substringWithRange:NSMakeRange(10, 2)];
NSString *mac6 = [nameStr substringWithRange:NSMakeRange(8, 2)];
//得到的MAC地址。
NSString *macStr = [NSString stringWithFormat:@"%@:%@:%@:%@:%@:%@",mac1,mac2,mac3,mac4,mac5,mac6];
[self.peripheralName addObject:devieceStr];
[self.peripheralMac addObject:macStr];
}
}
}
[self.deviceTableView reloadData];
NSLog(@"外设名字数组%@",self.deviceArr);
}