iOS 获取蓝牙外设的Mac地址的两种方法

写在前面:

很久没有做记录,一方面是因为工作比较忙,另一方面也是因为最近在准备马拉松,所以平时空余的时间训练的比较多,个人觉得这一辈子起码要完成一次马拉松嘛~虽然只是个半程=、= 但是对于我等整天坐在公司、躺在家里的程序员们来说,挑战还是不小的,所以平时的训练也不敢懈怠。
在马拉松结束后,差不多也要到明年一月初了,计划的项目会稍微少一些,打算那个时候把这几个月关于BLE的学习与遇到的问题做个汇总。在此立个flag!

为何要获取蓝牙外设的Mac地址?

蓝牙外设的Mac地址,简而言之就是这个物理地址,每个设备都是唯一的,可以理解为省份证号。
一般在做BLE的开发中,会遇到通过app去绑定一个蓝牙外设的需求,由于在app关闭后,BLE就会断开连接,所以第二次打开app的时候,就需要通过绑定时保存在本地或者数据库中的这个外设的信息,来进行定向扫描以及绑定。所以这里就涉及到了这个外设信息的唯一性的问题,如果不能保证保存的这个外设信息的唯一性的话,可能我第二次打开app就连接不到之前的设备,或者连接到别的设备。
然而万恶的苹果在原生的CoreBluetooth中,将设备的Mac进行了封装(通过外设的Mac地址和手机的Mac地址进行了加密计算),最后对外提供了一个UUID,在一台手机上,一般情况,UUID就可以作为这个外设的唯一标识了,但是如果换了一台手机的话,可能就会发生变化,所以如果需求是需要在多台手机上的话,UUID可能就不太实用了。
特别是需要兼容安卓的情况下,安卓是可以获取到Mac地址的,所以我们就只能想办法获取外设的Mac地址了。
这里提供两种方法来获取Mac地址,获取的时机也不一样:

1.在连接后获取

这里参考了这个博客,博主自己对原生的CoreBluetooth做了分装,并且用自己的封装类去实现的,这里我们转换为原生下的Mac获取

//连接成功
- (void)centralManager:(CBCentralManager *)central didConnectPeripheral:(CBPeripheral *)peripheral
 {
     peripheral.delegate = self;
 //查找mac地址
    [peripheral discoverServices:@[[CBUUID UUIDWithString:@"180A"]]];
}

#pragma mark - CBPeripheralDelegate
//发现到服务
- (void)peripheral:(CBPeripheral *)peripheral didDiscoverServices:(NSError *)error{ 
    CBService *service = peripheral.services.firstObject;
    [peripheral discoverCharacteristics:@[[CBUUID UUIDWithString:@"2A23"]] forService:service];
}

 //获得某服务的特征
- (void)peripheral:(CBPeripheral *)peripheral didDiscoverCharacteristicsForService:(CBService *)service error:(NSError *)error{
     [peripheral readValueForCharacteristic:characteristic];
}

- (void)peripheral:(CBPeripheral *)peripheral didUpdateValueForCharacteristic:(CBCharacteristic *)characteristic error:(NSError *)error
{
     NSString *value = [NSString stringWithFormat:@"%@",characteristic.value];
     NSMutableString *macString = [[NSMutableString alloc] init];
     [macString appendString:[[value substringWithRange:NSMakeRange(16, 2)] uppercaseString]];
     [macString appendString:@":"];
     [macString appendString:[[value substringWithRange:NSMakeRange(14, 2)] uppercaseString]];
     [macString appendString:@":"];
     [macString appendString:[[value substringWithRange:NSMakeRange(12, 2)] uppercaseString]];
     [macString appendString:@":"];
     [macString appendString:[[value substringWithRange:NSMakeRange(5, 2)] uppercaseString]];
     [macString appendString:@":"];
     [macString appendString:[[value substringWithRange:NSMakeRange(3, 2)] uppercaseString]];
     [macString appendString:@":"];
     [macString appendString:[[value substringWithRange:NSMakeRange(1, 2)] uppercaseString]];
     DLog(@"mac == %@",macString);
}

用自家的几台设备做了测试,都可以获取到Mac地址,建议在使用前先demo测试下。
这种情况实在连接上了设备之后,通过读取他的180A服务里的2A23特征值,再去进行剪切和拼接的方法来获取Mac地址。那么问题来了,有些时候我的周边有很多蓝牙设备,我不可能一台一台去连接然后获取Mac地址,再判断是不是我保存的设备!这样太耗时了,而且可能会导致一些莫民奇妙的bug,所以我们的需求就变成了如何仅仅在扫描的过程中就获取到每台外设的Mac地址呢?扫描的过程是很快的,可以在短短几秒钟内就可以找到周围的上百台设备。
这个时候我们就只有使用第二种方法了,但是这种方法需要你么硬件工程师的支持了。

2.在扫描的过程中就获取设备的Mac地址

在发现设备的回调里面:

- (void)centralManager:(CBCentralManager *)central didDiscoverPeripheral:(CBPeripheral *)peripheral advertisementData:(NSDictionary *)advertisementData RSSI:(NSNumber *)RSSI

可以看到有一个 advertisementData ,这个字典类型的就是广播包,这里面会有一些设备的属性,比如设备的名字啊,服务啊等,但是都是被苹果限制了的,所以并不是你硬件工程师想广播什么都可以的。
这个字典里有一个:

key:kCBAdvDataManufacturerData

只有这个key是可以放入信息的,所以叫硬件工程师将Mac地址写到这个字段里去,这样你就可以在发现设备的过程中得到Mac地址了~!

//查找到正在广播的指定外设
- (void)centralManager:(CBCentralManager *)central didDiscoverPeripheral:(CBPeripheral *)peripheral advertisementData:    (NSDictionary *)advertisementData RSSI:(NSNumber *)RSSI
{
    if (peripheral.name != nil ) {
        if (![self.deviceArr containsObject:peripheral]) {
           [self.deviceArr addObject:peripheral];
        
            BleDevice *device = [[manridyBleDevice alloc] initWith:peripheral andAdvertisementData:advertisementData andRSSI:RSSI];
        }
    }
}

//BleDevice.m
- (instancetype)initWith:(CBPeripheral *)cbPeripheral andAdvertisementData:(NSDictionary *)advertisementData andRSSI:(NSNumber *)RSSI
{
    BleDevice *per = [[BleDevice alloc] init];

    per.peripheral = cbPeripheral;
    per.deviceName = cbPeripheral.name;
    per.uuidString = cbPeripheral.identifier.UUIDString;
    NSData *data = [advertisementData objectForKey:@"kCBAdvDataManufacturerData"];
    NSString *mac = [NSStringTool convertToNSStringWithNSData:data];
    mac = [mac stringByReplacingOccurrencesOfString:@" " withString:@""];
    per.macAddress = mac;
    per.RSSI = RSSI;

    return per;
}

这就是我目前发现的两种获得蓝牙外设Mac地址的方法,如果有什么更好的方法,也麻烦评论告诉我~大家一起学习!

以上!

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 203,456评论 5 477
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,370评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,337评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,583评论 1 273
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,596评论 5 365
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,572评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,936评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,595评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,850评论 1 297
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,601评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,685评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,371评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,951评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,934评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,167评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 43,636评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,411评论 2 342

推荐阅读更多精彩内容

  • 背景 蓝牙历史说到蓝牙,就不得不说下蓝牙技术联盟(Bluetooth SIG),它负责蓝牙规范制定和推广的国际组织...
    徐正峰阅读 12,223评论 6 33
  • 这里我们具体说明一下中心模式的应用场景。主设备(手机去扫描连接外设,发现外设服务和属性,操作服务和属性的应用。一般...
    丶逝水流年阅读 2,234评论 3 4
  • iOS开发蓝牙4.0初识转载 2015-09-20 15:26:44标签:ios开发蓝牙ios开发蓝牙4.0ios...
    Jany_4a9a阅读 2,711评论 0 3
  • Guide to BluetoothSecurity原文 本出版物可免费从以下网址获得:https://doi.o...
    公子小水阅读 7,882评论 0 6
  • 成长在春风里,奉献在夏日里,绽放在秋风里,沉默在寒冬中。
    天煜Tony阅读 123评论 0 0