蓝牙4.0以低功耗著称,一般也叫BLE(Bluetooth Low Energy)。

目前主要应用的场景有:智能家居、运动手环和室内导航等。

利用core Bluetooth框架可以实现苹果设备与第三方蓝牙设备进行数据的交互。在CoreBluetooth框架中,有两个主要的角色:周边和中央 ,整个框架都是围绕这两个主要角色设计的,他俩之间有一系列的回调交换数据。core Bluetooth的核心框架图如下:

其中左边是中心,其中CBService 类代表服务,CBCharacteristic 类代表特征。右边是周边,其中CBMutableService 类代表服务,CBMutableCharacteristic 类代表特征。

注意一点就是:设备中包含服务,服务中包含特征。我们可以根据服务的唯一标示(UUID)找出设备中的服务,然后根据特征的唯一标示(UIID)从相应的服务中找出对应的特征,然后执行相应的操作。(就像中国包含省份,省份中有包含城市,我们可以根据省份的名称(类似于服务的UUID)来找到对应的省份,根据城市名称(类似于特征的UUID)从对应省份中找出正确的城市)。

core Bluetooth的主要开发步骤:

1. 建立中心设备,并成为自己的代理;
//1创建中心管理者
CBCentralManager *mgr = [[CBCentralManager alloc] init];
//成为自己的代理
mgr.delegate = self;
2. 使用中心设备扫描外设,并将扫描到的外设保存;
//2利用中心设备扫描(数组指定)外部设备(若数组为空,表示扫描所有的)
[mgr scanForPeripheralsWithServices:(NSArray *) options:nil];
3. 根据外设的唯一标示,从保存的外设中连接外设;
//3根据外设的标示,连接外设
[self.mgr connectPeripheral:(CBPeripheral *) options:nil];
4. 如果连接外设成功,则扫描外设中的服务;
/** 连接外设成功调用 */
- (void)centralManager:(CBCentralManager *)central didConnectPeripheral:(CBPeripheral *)peripheral{
// 扫描外设中得服务
[peripheral discoverServices:nil];
} /** 连接外设失败调用 */
- (void)centralManager:(CBCentralManager *)central didDisconnectPeripheral:(CBPeripheral *)peripheral error:(NSError *)error{}
5. 实现外设的代理,如果找到正确的服务,则扫描服务中的特征;
/** 只要扫描到服务就会调用 */
- (void)peripheral:(CBPeripheral *)peripheral didDiscoverServices:(NSError *)error{
// 获取外设中所有扫描到得服务
NSArray *services = peripheral.services;
  遍历服务:
if (正确的服务){
// 从需要的服务中查找需要的特征
[peripheral discoverCharacteristics:nil forService:service];
}
}
6. 根据特征的UUID从服务中所有特征中正确的特征;
/** 只要扫描到特征就会调用 */
- (void)peripheral:(CBPeripheral *)peripheral didDiscoverCharacteristicsForService:(CBService *)service error:(NSError *)error
{
// 拿到服务中所有的特诊
NSArray *characteristics = service.characteristics; 遍历特征:
if (正确的特征) {
与外设交互代码;
}
}
7. 利用特征与外设做数据交互;
8. 断开连接。
 
具体代码实现:
 /*存储所有的外设*/
@property (nonatomic, strong) NSMutableArray *peripherals;
/*中心服务管理者*/
@property (nonatomic, strong) CBCentralManager *mgr; /*懒加载数组*/
- (NSMutableArray *)peripherals{
if (_peripherals == nil) {
_peripherals = [NSMutableArray array];
}
return _peripherals;
} - (void)viewDidLoad {
[super viewDidLoad]; //1创建中心管理者
self.mgr = [[CBCentralManager alloc] init]; //成为自己的代理
mgr.delegate = self; //2利用中心设备扫描(数组指定的)外部设备
/* 如果指定数组为空表示扫描所有的设备 */
[mgr scanForPeripheralsWithServices:nil options:nil];
} #pragma mark - CBCentralManagerDelegate代理方法
/*发现外设的时候调用*/
- (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];
}
} /** 模拟连接所有的外设 */
- (void)connect{
//从保存的外设中取出所有的外设连接(也可以连接指定的外设)
for (CBPeripheral *peripheral in self.peripherals) {
/** 连接外设 */
[self.mgr connectPeripheral:peripheral options:nil];
}
} /**
* 连接外设成功调用
*/
- (void)centralManager:(CBCentralManager *)central didConnectPeripheral:(CBPeripheral *)peripheral{
// 扫描外设中得服务
[peripheral discoverServices:nil];
} /**
* 连接外设失败调用
*/
- (void)centralManager:(CBCentralManager *)central didDisconnectPeripheral:(CBPeripheral *)peripheral error:(NSError *)error{
} #pragma mark - CBPeripheralDelegate代理方法
/**
* 只要扫描到外设的服务就会调用
*
* @param peripheral 服务所在的外设
*/
- (void)peripheral:(CBPeripheral *)peripheral didDiscoverServices:(NSError *)error{
// 获取外设中所有扫描到得服务
NSArray *services = peripheral.services;
for (CBService *service in services) {
// 拿到需要的服务
if ([service.UUID.UUIDString isEqualToString:@"123456789abc"]) {
// 从需要的服务中查找需要的特征
// 从peripheral中得service中扫描特征
[peripheral discoverCharacteristics:nil forService:service];
}
}
}
/**
* 只要扫描到特征就会调用
*
* @param peripheral 特征所属的外设
* @param service 特征所属的服务
*/
- (void)peripheral:(CBPeripheral *)peripheral didDiscoverCharacteristicsForService:(CBService *)service error:(NSError *)error
{
// 拿到服务中所有的特诊
NSArray *characteristics = service.characteristics;
// 遍历特征, 拿到需要的特征处理
for (CBCharacteristic *characteristic in characteristics) {
if ([characteristic.UUID.UUIDString isEqualToString:@"edg"]) {
与外设的做数据交互的部分代码
}
}
}

core Bluetooth(蓝牙4.0)的更多相关文章

  1. iOS 上的蓝牙框架 - Core Bluetooth for iOS

    原文: Core Bluetooth for iOS 6 Core Bluetooth 是在iOS5首次引入的,它允许iOS设备可以使用健康,运动,安全,自动化,娱乐,附近等外设数据.在iOS 6 中 ...

  2. IOS 蓝牙(GameKit、Core Bluetooth)

    GameKit的蓝牙开发注意 ● 只能用于iOS设备之间的连接 ● 只能用于同一个应用程序之间的连接 ● 最好别利用蓝牙发送比较大的数据 /* 关于蓝牙的数据传输  1. 一次性传送,没有中间方法,所 ...

  3. 基于蓝牙4.0(Bluetooth Low Energy)胎压监测方案设计

    基于一种新的蓝牙技术——蓝牙4.0(Bluetooth Low Energy)新型的胎压监测系统(TPMS)的设计方案.鉴于蓝牙4.0(Bluetooth Low Energy)的低成本.低功耗.高稳 ...

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

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

  5. Core Bluetooth【官方文档翻译】【02】

    1.中心设备和外围设备以及它们在蓝牙通讯中的角色. 在所有的BLE( Bluetooth low energy,下文简称蓝牙4.0 )通讯中都涉及2个主要的角色:中心设备和外围设备.它是基于传统的客户 ...

  6. Core Bluetooth 概述 【官方文档翻译】

    Core Bluetooth 框架在Mac和iOS平台,为配备了低功耗蓝牙无线技术的设备提供了进行通信所需要的类.例如,您的应用程序可以发现,探索,和低功耗的外围设备进行交互,如心率监视器.数字温控器 ...

  7. iOS - Bluetooth 蓝牙

    1.蓝牙介绍 具体讲解见 蓝牙 技术信息 蓝牙协议栈 2.iBeacon 具体讲解见 Beacon iBeacon 是苹果公司 2013 年 9 月发布的移动设备用 OS(iOS7)上配备的新功能.其 ...

  8. Android 蓝牙4.0 BLE

    Android ble (Bluetooth Low Energy) 蓝牙4.0,也就是说API level >= 18,且支持蓝牙4.0的手机才可以使用. BLE是蓝牙4.0的核心Profil ...

  9. android 蓝牙4.0多通道

    很久没记录东西了,前段时间研究了一哈android4.0控制多个外设的情况,注意,需要使用android版本4.3以上,蓝牙4.0及以上. 我这里使用的控制蓝牙灯泡,使用android4.3的手机,手 ...

随机推荐

  1. sphinx索引分析续

    4.10 同义词文件/Synonym 同义词文件格式 from => to AT &T => AT&T AT & T => AT & T standa ...

  2. shell 转义字符的写法

    在链接中,往往会遇到含有‘&'字符的情形,需要转义方能使用. 以下是它的写法样例,错误的写法勿要再犯!! 链接样例: http://my.example.cn/show/details/htd ...

  3. kendo模板 Uncaught Error: Invalid template:' 报错

    I was having a problem with a grid toolbar template because of a # in a hrefWorked out that I needed ...

  4. .net 附加W3wp进程

    步骤:1.鼠标右键点击application项目中的web,找到属性 2.修改web服务器地址(如果使用localhost报错,则http://电脑IP/): 3.在本地iis中找到你部署的网站,点击 ...

  5. Imagick 缩放图片和实现模糊

    Imagick功能相当的多,只是还不稳定,我下面的程序能够运行,但是会出现内存错误,但我们要的图片还是能够得到. 弄这个的原因是,一个客户要求在一个appcan的应用里面实现一个页面的背景图的缩放.调 ...

  6. nodejs 转发websocket (websocket proxy)

    const http = require('http') const server = http.createServer((req, res) =>{ res.end('hello world ...

  7. CentOS 7 64位的安装流程

    若出现以下不支持虚拟机的问题: 表示虚拟机检测到CPU支不支持虚拟化,要去BIOS里设置虚拟化技术设置为enabled:重启电脑-按"F1或Fn+F1"-进入BIOS主界面-移至S ...

  8. SpringMVC 处理数据模型

    处理模型数据 Spring MVC 提供了以下几种途径输出模型数据: ModelAndView: 处理方法返回值类型为 ModelAndView 时, 方法体即可通过该对象添加模型数据 Map 及 M ...

  9. AnyCAD.NET C#开发CAD软件实践(一)

    免费的AnyCAD.NET发布了!俺喜欢的C#有了大展前途的机会了. 打算用这个框架搭建一套实用的CAD系统,目标是能买出去10套以上. 先看看AnyCAD.NET的自我介绍. http://www. ...

  10. 使用expect脚本语言写一键发布服务(代码发布、所有服务重启)

    互联网服务有很多台服务,但是在上线的时候需要将这些服务版本都更新与个个都重启,下面的脚本语言,就是一键发布服务~ 1.在/home/weihu/deploy/ 目录下建下publish .publis ...