本文介绍蓝牙4.0的一些基本知识。

基本概念、服务器、客户端

蓝牙LE是一个基于点对点的通信系统,其中一台设备作为服务器,另一台设备作为客户端。拥有数据的设备作为服务器,消费数据的设备作为客户端。

比如,心率监测器、温控器、手环等,都可以是服务器。服务器通过广播确定自己产生什么类型的数据并把数据发送给连接上的客户端。

客户端是对数据感兴趣的设备,客户端必须自己发现感兴趣的设备。客户端负责初始化对服务器的连接然后开始读取数据。

类与协议

在iOS中,服务器叫做外围设备(Peripheral),客户端叫做中心设备(Central)。iOS 系统允许iOS设备从一个蓝牙设备读取数据。在CoreBluetooth.framework中,读取设备对应CBCentralManager这个类,外围设备用CBPeripheral这个类来表示。CBPeripheralManagerCBCentral这两个类处理客户端设备。

类名 介绍
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的更多相关文章

  1. 【转】Core Bluetooth框架之一:Central与Peripheral

    原文网址:http://southpeak.github.io/blog/2014/07/29/core-bluetoothkuang-jia-zhi-%5B%3F%5D-:centralyu-per ...

  2. 【转】Core Bluetooth框架之二:后台处理

    原文网址:http://southpeak.github.io/blog/2014/07/31/core-bluetoothkuang-jia-zhi-er-:hou-tai-chu-li/ 在开发B ...

  3. 【IOS】将一组包含中文的数据按照#ABC...Z✿分组

    上一篇文章[IOS]模仿windowsphone列表索引控件YFMetroListBox里面 我们一步步的实现了WindowsPhone风格的索引. 但是有没有发现,如果你要实现按照字母排序,你还得自 ...

  4. 【IOS】模仿windowsphone列表索引控件YFMetroListBox

    有没有觉得UITableView自带的右侧索引很难用,我一直觉得WindowsPhone中的列表索引非常好用. 所以呢,我们来实现类似Windows Phone中的列表索引(这就是信仰). 最终实现效 ...

  5. 【IOS】自定义可点击的多文本跑马灯YFRollingLabel

    需求 项目中需要用到跑马灯来仅展示一条消息,长度合适则不滚动,过长则循环滚动. 虽然不是我写的,但看了看代码,是在一个UIView里面放入两个UILabel, 在前一个快结束的时候,另一个显示.然而点 ...

  6. 【iOS】在Swift中使用JSONModel

    前言 首先所有的Model还是使用oc来写——看到这一句是不是想关网页了- - #,在swift里面直接写一直报错所以就将就用oc来写了,这里主要是分享一下搭配Alamofire使用的经验. 声明 欢 ...

  7. 【iOS】使用safari对webview进行调试

    [iOS]使用safari对webview进行调试 在web开发的过程中,抓包.调试页面样式.查看请求头是很常用的技巧.其实在iOS开发中,这些技巧也能用(无论是模拟器还是真机),不过我们需要用到ma ...

  8. 【iOS】7.4 定位服务->2.1.1 定位 - 官方框架CoreLocation: 请求用户授权

    本文并非最终版本,如果想要关注更新或更正的内容请关注文集,联系方式详见文末,如有疏忽和遗漏,欢迎指正. 本文相关目录: ================== 所属文集:[iOS]07 设备工具 === ...

  9. 【iOS】7.4 定位服务->2.1.2 定位 - 官方框架CoreLocation: CLLocationManager(位置管理器)

    本文并非最终版本,如果想要关注更新或更正的内容请关注文集,联系方式详见文末,如有疏忽和遗漏,欢迎指正. 本文相关目录: ================== 所属文集:[iOS]07 设备工具 === ...

随机推荐

  1. 情景linux--shell如何实现多线程?

    情景linux--shell如何实现多线程? 情景 shell脚本的执行效率虽高,但当任务量巨大时仍然需要较长的时间,尤其是需要执行一大批的命令时.因为默认情况下,shell脚本中的命令是串行执行的. ...

  2. ThinkPad W500 清灰记录

    转载请注明出处:HateMath归来(http://www.cnblogs.com/hatemath/) 看型号就知道,这是一台英雄迟暮型的老电脑.到了夏天,启动后啥事不做,通风口都烫手.心情好,一时 ...

  3. Java并发编程-线程可见性&线程封闭&指令重排序

    一.指令重排序 例子如下: public class Visibility1 { public static boolean ready; public static int number; } pu ...

  4. ARM-LINUX自动采集温湿度传感器数据

    开机root自动登录 如果想在超级终端输入回车,登录后执行,则可以在/etc/profile中加入命令: 如果实现开机自动登录,在/etc/inittab中修改,每个开发板修改的方式可能都不同. ht ...

  5. hadoop/storm以及hive/hbase/pig区别整理

    STORM与HADOOP的比较 对于一堆时刻在增长的数据,如果要统计,可以采取什么方法呢? 等数据增长到一定程度的时候,跑一个统计程序进行统计.适用于实时性要求不高的场景.如将数据导到HDFS,再运行 ...

  6. python函数式编程之迭代器

    什么是迭代器 顾名思义,就是更新换代的意思 python中的迭代器就是根据上一个结果生成下一个结果,一直循环往复不断重复的过程 迭代器有两个特点: 1.不断重复同一个过程 2.根据上一个结果生成下一个 ...

  7. WIN7下PS/2等键盘失灵无法使用的解决办法

    WIN7下PS/2等键盘失灵无法使用的解决办法 装了win7,无意中一天开机,发现键盘不能用了.开始以为键盘坏了,重启看机,一看能进bios,各键正常.然后再重启,进系统,看设备管理器,发现键盘为黄色 ...

  8. R语言︱缺失值处理

    #缺失值 an=c(1,2,NA) is.na(an) #会形成一个布尔向量 布尔向量就是一群像(FALSE,FALSE,TURE)这样的向量. 关于缺失值还有一个函数:complete.cases函 ...

  9. freemarker中的split字符串分割

    freemarker中的split字符串分割 1.简易说明 split分割:用来根据另外一个字符串的出现将原字符串分割成字符串序列 2.举例说明 <#--freemarker中的split字符串 ...

  10. (十六)java中的String

    String:字符串类型,是java中最常用的引用类型,String是不可变的,java.lang.String是由final修饰,此类不可被继承.     String是不可变的,指的是字符串一旦创 ...