iOS学习笔记之蓝牙(有关蓝牙设备mac地址处理) 2
1.创建中心设备,并设置代理
CBCentralManagerDelegate,CBPeripheralDelegate。
一般情况下,手机是中心设备,蓝牙设备是外围设备。
self.centralManager = [[CBCentralManager alloc] initWithDelegate:self queue:nil];
1.创建之后,会进入到改变蓝牙状态的代理方法中。
- (void)centralManagerDidUpdateState:(CBCentralManager *)central;
在这个方法中,可以判断蓝牙的状态,进行相应的操作。
CBCentralManagerStateUnknown = CBManagerStateUnknown,
CBCentralManagerStateResetting = CBManagerStateResetting,
CBCentralManagerStateUnsupported = CBManagerStateUnsupported,
CBCentralManagerStateUnauthorized = CBManagerStateUnauthorized,
CBCentralManagerStatePoweredOff = CBManagerStatePoweredOff,
CBCentralManagerStatePoweredOn = CBManagerStatePoweredOn,
2.当蓝牙的状态是开启的时候,开始扫描外围设备。如果蓝牙支持后台模式,那么要指定服务的UUID,否则在后台断开之后,连接不上蓝牙,不支持后台的话,就设置成nil。option:CBCentralManagerScanOptionAllowDuplicatesKey 如果为YES,会让中心设备不断的监听外部设备的消息,NO则不能。如果为YES可能会很耗电,根据需求设置就好。
if (central.state == CBCentralManagerStatePoweredOn) {
[self.centralManager scanForPeripheralsWithServices:@[[CBUUID UUIDWithString:kServiceUUID]] options:nil];
}
3.当扫描到外围设备的时候,就会进入下面方法。
- (void)centralManager:(CBCentralManager *)central didDiscoverPeripheral:(CBPeripheral *)peripheral advertisementData:(NSDictionary<<span style="color: #00b1ff">NSString *,id> *)advertisementData RSSI:(NSNumber *)RSSI;
在这个方法中,我们可以根据不同的条件来筛选我们需要连接的外围设备,我这边是根据名字来筛选的。匹配到你需要的设备之后,就开始连接这个设备了。
if ([peripheral.name isEqualToString:kPeripheralName]) {
peripheral.delegate = self;
self.selectedPeripheral = peripheral;
// 开始连接设备
[self.centralManager connectPeripheral:self.selectedPeripheral options:nil];
}
4.连接成功和失败都会进入代理方法。
- (void)centralManager:(CBCentralManager *)central didFailToConnectPeripheral:(CBPeripheral *)peripheral error:(NSError *)error ;
- (void)centralManager:(CBCentralManager *)central didConnectPeripheral:(CBPeripheral *)peripheral;
这里暂停一下,
如果你附近就一个需要连接的蓝牙,那么直接判断名字来连接就好了,但是如果像蓝牙锁这种,附近可能名字一样的蓝牙有很多,那么你怎么知道你要连接的是哪一个蓝牙呢?那么,在这个时候,就要根据蓝牙的mac地址来区分了。因为iOS7之后,苹果就无法获取设备的mac地址,所以现在的蓝牙大部分是将蓝牙的mac地址写在蓝牙设备系统的sevrice里面,一般UUID是180A(Device Information),而特征的UUID 是2A23(System ID)。根据你需要连接的蓝牙的mac地址,来连接。
好了继续刚才说的,扫描相应的特征。
for (CBService *service in peripheral.services) {
if ([service.UUID isEqual:[CBUUID UUIDWithString:@"180A"]]) {
[self.selectedPeripheral discoverCharacteristics:nil forService:service];
}
}
5.扫描到特征之后,进入代理方法
- (void)peripheral:(CBPeripheral *)peripheral didDiscoverCharacteristicsForService:(CBService *)service error:(NSError *)error;```
在这里就可以进行读写的操作了。读数据有两种方式,一种是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];
}
}
6.读取到数据的时候,进入代理方法。
- (void)peripheral:(CBPeripheral *)peripheral didUpdateValueForCharacteristic:(CBCharacteristic *)characteristic error:(NSError *)error;
在这里根据公司定下的数据规则来解析数据就好了。
我这边把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]];
}
7.写入数据
iOS学习笔记之蓝牙(有关蓝牙设备mac地址处理) 2的更多相关文章
- iOS学习笔记之蓝牙(有关蓝牙设备mac地址处理)
原文: http://blog.sina.com.cn/s/blog_6f2f0bed0102xn0e.html
- iOS学习笔记-自己动手写RESideMenu
代码地址如下:http://www.demodashi.com/demo/11683.html 很多app都实现了类似RESideMenu的效果,RESideMenu是Github上面一个stars数 ...
- iOS 学习笔记七 【博爱手把手教你使用2016年gitHub Mac客户端】
iOS 学习笔记七 [博爱手把手教你使用gitHub客户端] 第一步:首先下载git客户端 链接:https://desktop.github.com 第二步:fork 大神的代码[这里以我的代码为例 ...
- IOS学习笔记25—HTTP操作之ASIHTTPRequest
IOS学习笔记25—HTTP操作之ASIHTTPRequest 分类: iOS2012-08-12 10:04 7734人阅读 评论(3) 收藏 举报 iosios5网络wrapper框架新浪微博 A ...
- iOS学习笔记22-推送通知
一.推送通知 推送通知就是向用户推送一条信息来通知用户某件事件,可以在应用退到后台后,或者关闭后,能够通过推送一条消息通知用户某件事情,比如版本更新等等. 推送通知的常用应用场景: 一些任务管理APP ...
- iOS学习笔记——AutoLayout的约束
iOS学习笔记——AutoLayout约束 之前在开发iOS app时一直以为苹果的布局是绝对布局,在IB中拖拉控件运行或者直接使用代码去调整控件都会发上一些不尽人意的结果,后来发现iOS在引入了Au ...
- IOS学习笔记之关键词@dynamic
IOS学习笔记之关键词@dynamic @dynamic这个关键词,通常是用不到的. 它与@synthesize的区别在于: 使用@synthesize编译器会确实的产生getter和setter方法 ...
- iOS学习笔记-精华整理
iOS学习笔记总结整理 一.内存管理情况 1- autorelease,当用户的代码在持续运行时,自动释放池是不会被销毁的,这段时间内用户可以安全地使用自动释放的对象.当用户的代码运行告一段 落,开始 ...
- iOS学习笔记10-UIView动画
上次学习了iOS学习笔记09-核心动画CoreAnimation,这次继续学习动画,上次使用的CoreAnimation很多人感觉使用起来很繁琐,有没有更加方便的动画效果实现呢?答案是有的,那就是UI ...
随机推荐
- 【python】python2.x 与 python3.x区别对照+缩进错误解决方法
仅仅列出我用到的,不全. 划重点: 1. urllib2 用 urllib.request 代替 2. urllib.urlencode 用 urllib.parse.urlencode 代替 3. ...
- Centos 7 设置 DNS
1:nmcli con mod eno1 ipv4.dns "114.114.114.114 8.8.8.8" eno1:为网卡名 2:nmcli con up eno1 激活网卡
- MySQL数据库中的Date,DateTime,int,TimeStamp和Time类型的对比
DATETIME 用在你需要同时包含日期和时间信息的值时.MySQL检索并且以'YYYY-MM-DD HH:MM:SS'格式显示DATETIME值,支持的范围是'1000-01-01 00:00:00 ...
- 手工安装kubernetes
参考的URL是 http://www.cnblogs.com/zhenyuyaodidiao/p/6500830.html 安装kubernets本身比较顺利,只是作dashboard时,老是日文版, ...
- 基于percona-monitoring-plugins实现Zabbix的MySQL多端口自动发现监控
https://blog.csdn.net/u013820054/article/details/50931793
- Joomla!网站扫描工具joomscan
Joomla!网站扫描工具joomscan Joomla!是一款知名的PHP语言编写的CMS系统.很多网站都使用Joomla!搭建而成.Kali Linux集成了一款Joomla!网站扫描工具jo ...
- [Contest20180325]序列
Hogura有一个序列$a$,她希望你帮她维护下面的这些操作. $1\ l\ r\ x$对$l\leq i\leq r$的$a_i$执行$a_i=a_i+x$ $2\ l\ r\ x$对$l\leq ...
- 【置换群】Codeforces Round #393 (Div. 1) A. Pavel and barbecue
就是先看排列p,必须满足其是一个环,才满足题意.就处理出有几个环,然后把它们合起来,答案就是多少. 然后再看序列b,自己稍微画一画就会发现,如果有偶数个1肯定是不行哒,否则,它就会再置换一圈回到它自己 ...
- 【函数式权值分块】【块状链表】bzoj3065 带插入区间K小值
显然是块状链表的经典题.但是经典做法的复杂度是O(n*sqrt(n)*log^2(n))的,出题人明确说了会卡掉. 于是我们考虑每个块内记录前n个块的权值分块. 查询的时候差分什么的,复杂度就是O(n ...
- 通过python的logging模块输出日志文件
import logging import sys #获取logger实例 logger = logging.getLogger("baseSpider") # 括号后面填运行的文 ...