1.创建中心设备,并设置代理

CBCentralManagerDelegate,CBPeripheralDelegate

一般情况下,手机是中心设备,蓝牙设备是外围设备。

  1. self.centralManager = [[CBCentralManager alloc] initWithDelegate:self queue:nil];

1.创建之后,会进入到改变蓝牙状态的代理方法中。

  1. - (void)centralManagerDidUpdateState:(CBCentralManager *)central;

在这个方法中,可以判断蓝牙的状态,进行相应的操作。

  1. CBCentralManagerStateUnknown = CBManagerStateUnknown,
  2. CBCentralManagerStateResetting = CBManagerStateResetting,
  3. CBCentralManagerStateUnsupported = CBManagerStateUnsupported,
  4. CBCentralManagerStateUnauthorized = CBManagerStateUnauthorized,
  5. CBCentralManagerStatePoweredOff = CBManagerStatePoweredOff,
  6. CBCentralManagerStatePoweredOn = CBManagerStatePoweredOn,

2.当蓝牙的状态是开启的时候,开始扫描外围设备。如果蓝牙支持后台模式,那么要指定服务的UUID,否则在后台断开之后,连接不上蓝牙,不支持后台的话,就设置成nil。option:CBCentralManagerScanOptionAllowDuplicatesKey 如果为YES,会让中心设备不断的监听外部设备的消息,NO则不能。如果为YES可能会很耗电,根据需求设置就好。

  1. if (central.state == CBCentralManagerStatePoweredOn) {
  2. [self.centralManager scanForPeripheralsWithServices:@[[CBUUID UUIDWithString:kServiceUUID]] options:nil];
  3. }

3.当扫描到外围设备的时候,就会进入下面方法。

  1. - (void)centralManager:(CBCentralManager *)central didDiscoverPeripheral:(CBPeripheral *)peripheral advertisementData:(NSDictionary<<span style="color: #00b1ff">NSString *,id> *)advertisementData RSSI:(NSNumber *)RSSI;

在这个方法中,我们可以根据不同的条件来筛选我们需要连接的外围设备,我这边是根据名字来筛选的。匹配到你需要的设备之后,就开始连接这个设备了。

  1. if ([peripheral.name isEqualToString:kPeripheralName]) {
  2. peripheral.delegate = self;
  3. self.selectedPeripheral = peripheral;
  4. // 开始连接设备
  5. [self.centralManager connectPeripheral:self.selectedPeripheral options:nil];
  6. }

4.连接成功和失败都会进入代理方法。

  1. - (void)centralManager:(CBCentralManager *)central didFailToConnectPeripheral:(CBPeripheral *)peripheral error:(NSError *)error ;
  2. - (void)centralManager:(CBCentralManager *)central didConnectPeripheral:(CBPeripheral *)peripheral;

这里暂停一下,

如果你附近就一个需要连接的蓝牙,那么直接判断名字来连接就好了,但是如果像蓝牙锁这种,附近可能名字一样的蓝牙有很多,那么你怎么知道你要连接的是哪一个蓝牙呢?那么,在这个时候,就要根据蓝牙的mac地址来区分了。因为iOS7之后,苹果就无法获取设备的mac地址,所以现在的蓝牙大部分是将蓝牙的mac地址写在蓝牙设备系统的sevrice里面,一般UUID是180A(Device Information),而特征的UUID 是2A23(System ID)。根据你需要连接的蓝牙的mac地址,来连接。

好了继续刚才说的,扫描相应的特征。

  1. for (CBService *service in peripheral.services) {
  2. if ([service.UUID isEqual:[CBUUID UUIDWithString:@"180A"]]) {
  3. [self.selectedPeripheral discoverCharacteristics:nil forService:service];
  4. }
  5. }

5.扫描到特征之后,进入代理方法

  1. - (void)peripheral:(CBPeripheral *)peripheral didDiscoverCharacteristicsForService:(CBService *)service error:(NSError *)error;```
  2. 在这里就可以进行读写的操作了。读数据有两种方式,一种是read,一种是notify。我们可以用LightBlue来看到这个特征是否是支持notify,一般固定不变的数据都是用read,会有改变的数据用notify。

for (CBCharacteristic *characteristic in service.characteristics) {

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

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

[self.selectedPeripheral readValueForCharacteristic:characteristic];

}

}


  1. 6.读取到数据的时候,进入代理方法。
  • (void)peripheral:(CBPeripheral *)peripheral didUpdateValueForCharacteristic:(CBCharacteristic *)characteristic error:(NSError *)error;

  1. 在这里根据公司定下的数据规则来解析数据就好了。
  2. 我这边把mac地址的解析出来了,当例子来看吧。

NSString *orStr = characteristic.value.description;

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

NSMutableString *macString = [[NSMutableString alloc] init];

[macString appendString:[[orStr substringWithRange:NSMakeRange(16, 2)] uppercaseString]];

[macString appendString:@":"];

[macString appendString:[[orStr substringWithRange:NSMakeRange(14, 2)] uppercaseString]];

[macString appendString:@":"];

[macString appendString:[[orStr substringWithRange:NSMakeRange(12, 2)] uppercaseString]];

[macString appendString:@":"];

[macString appendString:[[orStr substringWithRange:NSMakeRange(5, 2)] uppercaseString]];

[macString appendString:@":"];

[macString appendString:[[orStr substringWithRange:NSMakeRange(3, 2)] uppercaseString]];

[macString appendString:@":"];

[macString appendString:[[orStr substringWithRange:NSMakeRange(1, 2)] uppercaseString]];

}


  1. 7.写入数据

iOS学习笔记之蓝牙(有关蓝牙设备mac地址处理) 2的更多相关文章

  1. iOS学习笔记之蓝牙(有关蓝牙设备mac地址处理)

    原文: http://blog.sina.com.cn/s/blog_6f2f0bed0102xn0e.html

  2. iOS学习笔记-自己动手写RESideMenu

    代码地址如下:http://www.demodashi.com/demo/11683.html 很多app都实现了类似RESideMenu的效果,RESideMenu是Github上面一个stars数 ...

  3. iOS 学习笔记七 【博爱手把手教你使用2016年gitHub Mac客户端】

    iOS 学习笔记七 [博爱手把手教你使用gitHub客户端] 第一步:首先下载git客户端 链接:https://desktop.github.com 第二步:fork 大神的代码[这里以我的代码为例 ...

  4. IOS学习笔记25—HTTP操作之ASIHTTPRequest

    IOS学习笔记25—HTTP操作之ASIHTTPRequest 分类: iOS2012-08-12 10:04 7734人阅读 评论(3) 收藏 举报 iosios5网络wrapper框架新浪微博 A ...

  5. iOS学习笔记22-推送通知

    一.推送通知 推送通知就是向用户推送一条信息来通知用户某件事件,可以在应用退到后台后,或者关闭后,能够通过推送一条消息通知用户某件事情,比如版本更新等等. 推送通知的常用应用场景: 一些任务管理APP ...

  6. iOS学习笔记——AutoLayout的约束

    iOS学习笔记——AutoLayout约束 之前在开发iOS app时一直以为苹果的布局是绝对布局,在IB中拖拉控件运行或者直接使用代码去调整控件都会发上一些不尽人意的结果,后来发现iOS在引入了Au ...

  7. IOS学习笔记之关键词@dynamic

    IOS学习笔记之关键词@dynamic @dynamic这个关键词,通常是用不到的. 它与@synthesize的区别在于: 使用@synthesize编译器会确实的产生getter和setter方法 ...

  8. iOS学习笔记-精华整理

    iOS学习笔记总结整理 一.内存管理情况 1- autorelease,当用户的代码在持续运行时,自动释放池是不会被销毁的,这段时间内用户可以安全地使用自动释放的对象.当用户的代码运行告一段 落,开始 ...

  9. iOS学习笔记10-UIView动画

    上次学习了iOS学习笔记09-核心动画CoreAnimation,这次继续学习动画,上次使用的CoreAnimation很多人感觉使用起来很繁琐,有没有更加方便的动画效果实现呢?答案是有的,那就是UI ...

随机推荐

  1. java中final修饰符的使用

    1.final修饰符的用法: final可以修饰变量,被final修饰的变量被赋初始值之后,不能对它重新赋值. final可以修饰方法,被final修饰的方法不能被重写. final可以修饰类,被fi ...

  2. 前端读者 | 分分钟让你理解HTTPS

    本文来自@Keely袁庆玲:来源:https://juejin.im/post/5ad6ad575188255c272273c4 目前来看大多数网站都从HTTP转向HTTPS,不在支持HTTP,所以了 ...

  3. HDU 2824.The Euler function-筛选法求欧拉函数

    欧拉函数: φ(n)=n*(1-1/p1)(1-1/p2)....(1-1/pk),其中p1.p2…pk为n的所有素因子.比如:φ(12)=12*(1-1/2)(1-1/3)=4.可以用类似求素数的筛 ...

  4. HDU 1233.还是畅通工程-最小生成树(Prime)

    还是畅通工程 Time Limit: 4000/2000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)Total Subm ...

  5. Ubuntu 14.04 安装JDK 8

    1.安装JDK,参考 1.下载 JDK 8 从http://www.oracle.com/technetwork/java/javasebusiness/downloads/选择下载JDK的最新版本 ...

  6. codeforces Round #440 C Maximum splitting【数学/素数与合数/思维/贪心】

    C. Maximum splitting time limit per test 2 seconds memory limit per test 256 megabytes input standar ...

  7. CodeForces 669A

    链接:http://codeforces.com/problemset/problem/669/A 本文链接:http://www.cnblogs.com/Ash-ly/p/5442950.html ...

  8. 拓扑排序(Topological Order)UVa10305 Ordering Tasks

    2016/5/19 17:39:07 拓扑排序,是对有向无环图(Directed Acylic Graph , DAG )进行的一种操作,这种操作是将DAG中的所有顶点排成一个线性序列,使得图中的任意 ...

  9. 训练指南 UVA - 11324(双连通分量 + 缩点+ 基础DP)

    layout: post title: 训练指南 UVA - 11324(双连通分量 + 缩点+ 基础DP) author: "luowentaoaa" catalog: true ...

  10. noi题库 1.7 字符串

    前九题 01:统计数字字符个数 总时间限制: 1000ms 内存限制: 65536kB 描述 输入一行字符,统计出其中数字字符的个数. 输入 一行字符串,总长度不超过255. 输出 输出为1行,输出字 ...