蓝牙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. C++中的const和指针组合

    在C++里,const修饰指针有以下三种情况 (1)指针常量:即指向常量的指针 const  int *p或者int const *p const在*前,,可以这样理解它的功能,因为const在*前, ...

  2. js动态替换数据的点击事件

    做项目时遇到的,具体是界面如下图:当点击X号时,出现删除.取消按钮,当点击删除时,这一行删除,当点击取消时又恢复到初始状态. 需要关注的问题是,js动态添加的删除.取消按钮的点击事件.当点击取消时恢复 ...

  3. python 执行execute遇到的问题

    1.如下方式去查询无法查询出结果,但直接在数据库查询中去查询是能查询到结果的,郁闷中,花了很久的时间才知道原来是双引号导致的 把:name="%s" 中的%s前后的双引号去掉就对了 ...

  4. php crc32,md5,sha1,mhash测试结果

    总结:php  自带hash mhash 用于散列只能加密   扩展mcrypt 用于加解密 对文件加密有的文件会隐藏换行,或者读取方式等影响导致结果不一致. 1.crc32 php: a.系统crc ...

  5. sql sever读取Excel总结【转】

    主要用到openrowset,opendatasource系统函数,这两个函数任意一个都能完成任务 用这种方法可以实现Excel和sqlserver表之间的相互导入导出. openrowset的写法 ...

  6. POJ 3126 Prime Path

    给定两个四位素数a  b,要求把a变换到b 变换的过程要保证  每次变换出来的数都是一个 四位素数,而且当前这步的变换所得的素数  与  前一步得到的素数  只能有一个位不同,而且每步得到的素数都不能 ...

  7. 微信JS SDK Demo 官方案例[转]

    摘要: 微信JS-SDK是微信公众平台面向网页开发者提供的基于微信内的网页开发工具包. 通过使用微信JS-SDK,网页开发者可借助微信高效地使用拍照.选图.语音.位置等手机系统的能力,同时可以直接使用 ...

  8. uploadify参数

    $(document).ready(function() { $("#file_upload").uploadify({ //开启调试 'debug' : false, //是否自 ...

  9. LeetCode Spiral Matrix

    class Solution { public: vector<int> spiralOrder(vector<vector<int> > &matrix) ...

  10. Java系列笔记(2) - Java RTTI和反射机制

    目录 前言 传统的RTTI 反射 反射的实现方式 反射的性能 反射与设计模式 前言 并不是所有的Class都能在编译时明确,因此在某些情况下需要在运行时再发现和确定类型信息(比如:基于构建编程,),这 ...