iOS 蓝牙连接获取MAC地址的方法

                    iOS 蓝牙连接获取MAC地址的方法

iOS自从7以后就无法从API直接获取设备的MAC地址,只能用UUID来标识设备,要注意的是同一个设备在不同手机上显示的UUID不相同

解决办法

1:把它加到蓝牙的广播包里,但是这样的话对硬件来说负担很大 而且芯片会不稳定

2:有的设备可以通过 “180A”这个服务来发现特征,再来读取 “2A23”这个特征值,可以获得Mac地址(如果你的蓝牙设备不支持这样获取,你可以跟硬件工程师沟通,来获得Mac地址,添加一个获取地址命令或者增加一个含地址的特征值都可以很容易的获取)

这里着重介绍方法二:

1:蓝牙连接的流程

a.建立中心设备管理者

b.扫描外设

c.连接外设

d.扫描外设中的服务

e.扫描外设中的特征

f.订阅或读取特征值

g.获取外设中的数据

a:建立中心设备管理者

// 创建之后会马上检查蓝牙的状态,nil默认为主线程

self.centralManager = [[CBCentralManager alloc] initWithDelegate:selfqueue:nil]

b:扫描外设

// 蓝牙状态发生改变,这个方法一定要实现

- (void)centralManagerDidUpdateState:(CBCentralManager *)central{

// 蓝牙状态可用

if (central.state == CBCentralManagerStatePoweredOn) {

// 如果蓝牙支持后台模式,一定要指定服务,否则在后台断开连接不上,如果不支持,可设为nil, option里的CBCentralManagerScanOptionAllowDuplicatesKey默认为NO, 如果设置为YES,允许搜索到重名,会很耗电

[self.centralManager scanForPeripheralsWithServices:@[[CBUUID UUIDWithString:kServiceUUID]] options:nil]; }}

c.连接外设

/**

* 发现设备

* @param peripheral 设备

* @param advertisementData 广播内容

* @param RSSI 信号强度

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

// 判断是否是你需要连接的设备

if([peripheral.name isEqualToString:kPeripheralName]) {       

peripheral.delegate =self;

// 一定要记得把外设保存起来

self.selectedPeripheral = peripheral;

// 开始连接设备

[self.centralManager connectPeripheral:self.selectedPeripheral options:nil];    }}

d.扫描外设中的服务

/**

* 已经连接上设备

*/

- (void)centralManager:(CBCentralManager *)central didConnectPeripheral:(CBPeripheral *)peripheral{

// 停止扫描

[self.centralManager stopScan];

// 发现服务

[self.selectedPeripheral discoverServices:nil];

}

e.扫描外设中的特征

/**

* 已经发现服务

*/

- (void)peripheral:(CBPeripheral *)peripheral didDiscoverServices:(NSError*)error{for(CBService *serviceinperipheral.services) {

if([service.UUID isEqual:[CBUUID UUIDWithString:kServiceUUID]]) {

// 根据你要的那个服务去发现特性

[self.selectedPeripheral discoverCharacteristics:nilforService:service];       

}

// 这里我是根据 180A 用来获取Mac地址,没什么实际作用,可删掉

if([service.UUID isEqual:[CBUUID UUIDWithString:@"180A"]]) {            [self.selectedPeripheral discoverCharacteristics:nilforService:service];   

    }   

}}

f.订阅或读取特征值

/**

* 已经发现特性

*/

- (void)peripheral:(CBPeripheral *)peripheral didDiscoverCharacteristicsForService:(CBService *)service error:(NSError*)error{

for(CBCharacteristic *characteristicinservice.characteristics) {

if([characteristic.UUID isEqual:[CBUUID UUIDWithString:@"2A23"]]) {

// 这里是读取Mac地址, 可不要, 数据固定, 用readValueForCharacteristic, 不用setNotifyValue:setNotifyValue

[self.selectedPeripheral readValueForCharacteristic:characteristic];       

}

if([characteristic.UUID isEqual:[CBUUID UUIDWithString:kCharacteristicUUID]]) {

// 订阅特性,当数据频繁改变时,一般用它, 不用readValueForCharacteristic

[peripheral setNotifyValue:YESforCharacteristic:characteristic];

}

g.获取外设中的数据

/**

* 数据更新的回调

*/

- (void)peripheral:(CBPeripheral *)peripheral didUpdateValueForCharacteristic:(CBCharacteristic *)characteristic error:(NSError*)error{

//获取mac地址

if([characteristic.UUID isEqual:[CBUUID UUIDWithString:@"2A23"]]){ 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]];

NSLog(@"MAC地址是macString:%@",macString); }

//这里写其他的BLE接收参数处理方法

}

设备连接断开

- (void)centralManager:(CBCentralManager *)central didDisconnectPeripheral:(CBPeripheral *)peripheral error:(NSError*)error{

// 让它自动重连

[self.centralManager scanForPeripheralsWithServices:@[[CBUUID UUIDWithString:kServiceUUID]] options:nil];}

这是系统代理方法,如果要主动断开需要调用

- (void)cancelPeripheralConnection:(CBPeripheral *)peripheral;这个方法

写入数据成功的回调

- (void)peripheral:(CBPeripheral *)peripheral didWriteValueForCharacteristic:(CBCharacteristic *)characteristic error:(NSError*)error{

// 读取数据

[self.selectedPeripheral readValueForCharacteristic:characteristic];}

原文连接:https://www.jianshu.com/p/0ccfd53fc559

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

推荐阅读更多精彩内容