【iOS】Core Bluetooth
本文介绍蓝牙4.0的一些基本知识。
基本概念、服务器、客户端
蓝牙LE是一个基于点对点的通信系统,其中一台设备作为服务器,另一台设备作为客户端。拥有数据的设备作为服务器,消费数据的设备作为客户端。
比如,心率监测器、温控器、手环等,都可以是服务器。服务器通过广播确定自己产生什么类型的数据并把数据发送给连接上的客户端。
客户端是对数据感兴趣的设备,客户端必须自己发现感兴趣的设备。客户端负责初始化对服务器的连接然后开始读取数据。
类与协议
在iOS中,服务器叫做外围设备(Peripheral),客户端叫做中心设备(Central)。iOS 系统允许iOS设备从一个蓝牙设备读取数据。在CoreBluetooth.framework中,读取设备对应CBCentralManager这个类,外围设备用CBPeripheral这个类来表示。CBPeripheralManager和CBCentral这两个类处理客户端设备。
| 类名 | 介绍 | 
|---|---|
| CBCentralManager | 该类的对象用于管理发现的或者连接的外围设备。在调用该类的方法前,你需要确定蓝牙设备是可用的。 | 
| CBPeripheral | 代表外围设备,每个外围设备通过 UUID 来标识。外围设备可以包含一个或者多个服务、或者提供关于连接的信号强度的信息。 | 
| CBCentral | 代表中心设备。 | 
How
通过扫描寻找服务
外围设备是提供数据的服务器,在提供数据之前,必须广播自己能够提供的服务。中心设备扫描这些包来探测附近的外围设备。一个服务器使用全局唯一的UUID来标识自己。
self.centralManager = [[CBCentralManager alloc] initWithDelegate:self queue:nil];
    if (self.centralManager.state == CBManagerStatePoweredOn) {
        [self.centralManager scanForPeripheralsWithServices:nil options:nil];
    }
找到之后会回调- (void)centralManager:didDiscoverPeripheral:advertisementData:RSSI:方法,这这个方法内部你可以做连接外围设备等操作。
连接设备
- (void)centralManager:(CBCentralManager *)central didDiscoverPeripheral:(CBPeripheral *)peripheral advertisementData:(NSDictionary<NSString *,id> *)advertisementData RSSI:(NSNumber *)RSSI {
    if (![self.peripherals containsObject:peripheral]) {
        peripheral.delegate = self;
        [self.peripherals addObject:peripheral];
        [self.centralManager connectPeripheral:peripheral options:nil];
    }
}
当然,如果你知道外围设备的 UUID ,那么根据 UUID 直接获取外围设备来连接也是可以的,我也建议你这么做(因为省电又快速)。
NSArray<CBPeripheral *> *peripheral = [self.centralManager retrievePeripheralsWithIdentifiers:@[[CBUUID UUIDWithString:@"设备的uuid"]]];
注意UUID的格式一定要写对,是这样的
XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX,其中每一个X代表一个十六进制字符。在终端中输入uuidgen可以生成一个,你可以观察一下。
发现服务
如果连接成功外围设备,就会回调- (void)centralManager:didConnectPeripheral:方法,可以在这里发现外围设备设备提供的服务。如果发现服务,会回调CBPeripheralDelegate中的- (void)peripheral:didDiscoverServices:方法。
- (void)centralManager:(CBCentralManager *)central didConnectPeripheral:(CBPeripheral *)peripheral {
    [peripheral discoverServices:nil];
}
发现特性
- (void)peripheral:(CBPeripheral *)peripheral didDiscoverServices:(nullable NSError *)error {
    [peripheral.services enumerateObjectsUsingBlock:^(CBService * _Nonnull obj, NSUInteger idx, BOOL * _Nonnull stop) {
        NSLog(@"%@", obj.peripheral.name);
        [peripheral discoverCharacteristics:nil forService:obj];
    }];
}
针对特性写数据
发现特性之后,就可以针对特性做数据处理了。
- (void)peripheral:(CBPeripheral *)peripheral
didDiscoverCharacteristicsForService:(CBService *)service
             error:(NSError *)error {
}
以上就是作为Central时,需要用到的基本的API。作为Peripheral时,需要的东西以后再总结。
【iOS】Core Bluetooth的更多相关文章
- 【转】Core Bluetooth框架之一:Central与Peripheral
		
原文网址:http://southpeak.github.io/blog/2014/07/29/core-bluetoothkuang-jia-zhi-%5B%3F%5D-:centralyu-per ...
 - 【转】Core Bluetooth框架之二:后台处理
		
原文网址:http://southpeak.github.io/blog/2014/07/31/core-bluetoothkuang-jia-zhi-er-:hou-tai-chu-li/ 在开发B ...
 - 【IOS】将一组包含中文的数据按照#ABC...Z✿分组
		
上一篇文章[IOS]模仿windowsphone列表索引控件YFMetroListBox里面 我们一步步的实现了WindowsPhone风格的索引. 但是有没有发现,如果你要实现按照字母排序,你还得自 ...
 - 【IOS】模仿windowsphone列表索引控件YFMetroListBox
		
有没有觉得UITableView自带的右侧索引很难用,我一直觉得WindowsPhone中的列表索引非常好用. 所以呢,我们来实现类似Windows Phone中的列表索引(这就是信仰). 最终实现效 ...
 - 【IOS】自定义可点击的多文本跑马灯YFRollingLabel
		
需求 项目中需要用到跑马灯来仅展示一条消息,长度合适则不滚动,过长则循环滚动. 虽然不是我写的,但看了看代码,是在一个UIView里面放入两个UILabel, 在前一个快结束的时候,另一个显示.然而点 ...
 - 【iOS】在Swift中使用JSONModel
		
前言 首先所有的Model还是使用oc来写——看到这一句是不是想关网页了- - #,在swift里面直接写一直报错所以就将就用oc来写了,这里主要是分享一下搭配Alamofire使用的经验. 声明 欢 ...
 - 【iOS】使用safari对webview进行调试
		
[iOS]使用safari对webview进行调试 在web开发的过程中,抓包.调试页面样式.查看请求头是很常用的技巧.其实在iOS开发中,这些技巧也能用(无论是模拟器还是真机),不过我们需要用到ma ...
 - 【iOS】7.4 定位服务->2.1.1 定位 - 官方框架CoreLocation: 请求用户授权
		
本文并非最终版本,如果想要关注更新或更正的内容请关注文集,联系方式详见文末,如有疏忽和遗漏,欢迎指正. 本文相关目录: ================== 所属文集:[iOS]07 设备工具 === ...
 - 【iOS】7.4 定位服务->2.1.2 定位 - 官方框架CoreLocation: CLLocationManager(位置管理器)
		
本文并非最终版本,如果想要关注更新或更正的内容请关注文集,联系方式详见文末,如有疏忽和遗漏,欢迎指正. 本文相关目录: ================== 所属文集:[iOS]07 设备工具 === ...
 
随机推荐
- SpringBoot application.yml logback.xml,多环境配置,支持 java -jar --spring.profiles.active
			
趁今天有时间整理了一下 启动命令为 //开发环境 java -jar app.jar --spring.profiles.active=dev--server.port=8060 //测试环境 jav ...
 - 转 Caffe学习系列(4):激活层(Activiation Layers)及参数
			
在激活层中,对输入数据进行激活操作(实际上就是一种函数变换),是逐元素进行运算的.从bottom得到一个blob数据输入,运算后,从top输入一个blob数据.在运算过程中,没有改变数据的大小,即输入 ...
 - Http协议规范及格式
			
HTTP(HyperTextTransferProtocol)是超文本传输协议的缩写,它用于传送WWW方式的数据,关于HTTP协议的详细内容请参考RFC2616.HTTP协议采用了请求/响应模型.客户 ...
 - 云计算基础 (redhat7介绍及相关配置)
			
redhat7简介 新版本的rhel7不再对32位架构的支持 引导程序: GRUB2,比之前的GRUB更强大,GRUB2支持bios,efi和openfiremware GRUB2支持mbr分区表和g ...
 - ffmpeg结构体以及函数介绍(三)
			
1 AVPacket typedef struct AVPacket { /** * Presentation timestamp in AVStream->time_base units; t ...
 - Netty的并发编程实践1:正确使用锁
			
很多刚接触多线程编程的开发者,虽然意识到了并发访问可变变量需要加锁,但是对于锁的范围.加锁的时机和锁的协同缺乏认识,往往会导致出现一些问题.下面笔者就结合Netty的代码来讲解下这方面的知识. 打开F ...
 - hi3531 SDK 编译 uboot, 修改PHY地址, 修改 uboot 参数 .
			
一,编译uboot SDK文档写得比较清楚了,写一下需要注意的地方吧. 1. 之前用SDK里和别人给的已经编译好的uboot,使用fastboot工具都刷不到板子上.最后自己用SDK里uboot源码编 ...
 - 获取JSON对象的属性值
			
1.问题背景 有一个json对象,其中有键值对,那怎样获取json对象中属性值 2.实现源码 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 ...
 - Django学习-22-Form
			
Form是Django的功能较强的验证组件,负责各种表单验证 input中的name属性值要和form中的字段名相同 from django import forms from django.form ...
 - java 的几种引用
			
从JDK1.2版本开始,把对象的引用分为四种级别,从而使程序能更加灵活的控制对象的生命周期.这四种级别由高到低依次为:强引用.软引用.弱引用和虚引用. 1.强引用 本章前文介绍的引用实际上都是强引用, ...