蓝牙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. 简单的例子 关于Java内存管理的讲解

    我想做的是,逐行读取文件,然后用该行的电影名去获取电影信息.因为源文件较大,readlines()不能完全读取所有电影名,所以我们逐行读取. 就这段代码,我想要在位置二处使用base64,然后结果呢? ...

  2. Jquery想说爱你不容易

    JQuery是一套跨浏览器的JavaScript库,简化HTML与JavaScript之间的操作.由John Resig在2006年1月的BarCamp NYC上发布第一个版本.目前是由 Dave M ...

  3. 前端面试题2016--HTML

    本文由我收集总结了一些前端面试题,初学者阅后也要用心钻研其中的原理,重要知识需要系统学习.透彻学习,形成自己的知识链.万不可投机取巧,临时抱佛脚只求面试侥幸混过关是错误的!也是不可能的!不可能的!不可 ...

  4. 全端开发必备!10个最好的 Node.js MVC 框架

      Node.js 是最流行的 JavaScript 服务端平台,它允许建立可扩展的 Web 应用程序.Node.js 包含不同类型的框架,如 MVC 框架.全栈框架.REST API  以及大量的服 ...

  5. PDF 补丁丁 0.5.0.1816 测试版发布:新界面新体验

    新的测试版简化了界面,操作更直观,同时修复了旧版本的一些错误. 欢迎各位下载测试文件试用,并提出宝贵意见.

  6. Linux用sendmail发信失败,提示Connection refused by [127.0.0.1]

    现象: Linux用sendmail发信失败,提示Connection refused by [127.0.0.1] 29 14:10:44 iZ257p7xxilZ sendmail[3395]: ...

  7. Scala 高级编程练习

    定义自己的控制结构,使它语言内置的用法一样 package exp object Main { def enableCustomerIF = false; def main(args: Array[S ...

  8. android模块混淆打包时,泛型丢失

    现象:lib模块中写了一个泛型接口,在混淆之后泛型消失,提示"Error:(67, 79) 错误: 类型 ******* 不带有参数" 解决:混淆时把泛型给混淆掉了,在progua ...

  9. Visual Studio 2015 新建MVC项目 Package Manager Console不能使用 (HRESULT: 0x80131500)

    Visual studio 2015 突然新建不了MVC项目,报出错误: HRESULT: 0x80131500 在折腾了很长时间,最后在Github上看到这样一个贴 地址:https://githu ...

  10. Fibonacci(斐波那契)递归实现。容易看懂

    #include<iostream>using namespace std;int fibonacci(int n){if(n<=0) return 0; else if(n==1) ...