CoreBlueTooth

简介:

可用于第三方的蓝牙交互设备 设备必须支持蓝牙4.0

iPhone的设备必须是4S或者更新

iPad设备必须是iPad mini或者更新

iOS的系统必须是iOS 6或者更新

蓝牙4.0以低功耗著称,所以一般被称为BLE(bluetooth low energy)

核心概念

CBCenterManager:中心设备(用来连接到外部设备的管家)

CBPeripheralManager:外部设备(第三方的蓝牙4.0设备 用来扫描服务和服务特征)

开发步骤

1.建立中心管家

#import <CoreBluetooth/CoreBluetooth.h>

@interface ViewController ()<CBCentralManagerDelegate,CBPeripheralDelegate>
//中心管家
@property (nonatomic,strong) CBCentralManager *manager;
//存储扫描到的外部设备
@property (nonatomic,strong) CBPeripheral *peripheral; @end
/*
1.建立中心管家
2.扫描外部设备
3.连接外部设备
4.扫描服务和特征
5.数据交互
6.断开连接
*/
@implementation ViewController - (void)viewDidLoad {
[super viewDidLoad];
//建立中心管家 queue 填空 默认为主线程
CBCentralManager *manager = [[CBCentralManager alloc] initWithDelegate:self queue:nil];
self.manager = manager;
}

2.扫描外设

//在代理方法中扫描外部设备
- (void)centralManagerDidUpdateState:(CBCentralManager *)central {
//在开机状态下才能扫描外部设备
if (central.state == CBManagerStatePoweredOn) {
//扫描外部设备的哪些服务
//scanForPeripheralsWithServices 传空的话 可以扫描外部所有可以发现的设备 否则只扫描传入的相应ID的设备
[self.manager scanForPeripheralsWithServices:nil options:nil];
}
}

3.连接外设

//已经找到了外部设备 连接外部设备 我们也可以保存这些外部设备到一个数组 这里不做操作 也可以在这里对外部设备进行筛选
- (void)centralManager:(CBCentralManager *)central didDiscoverPeripheral:(CBPeripheral *)peripheral advertisementData:(NSDictionary<NSString *,id> *)advertisementData RSSI:(NSNumber *)RSSI { NSLog(@"peripheral = %@",peripheral);
//保存外部设备
self.peripheral = peripheral;
self.peripheral.delegate = self;
//连接外部设备
[self.manager connectPeripheral:peripheral options:nil];
}

外设连接成功

//已经连接到了外部设备  开始扫描该设备服务
- (void)centralManager:(CBCentralManager *)central didConnectPeripheral:(CBPeripheral *)peripheral { //扫描设备的服务 调用CBPeripheralDelegate
[self.peripheral discoverServices:nil];
}

4.扫描外设服务和特征

每个蓝牙4.0的设备都是通过服务和特征来展示自己的,一个设备必然包含一个或多个服务 一个服务包含一个或多个特征。

#pragma mark - CBPeripheralDelegate
- (void)peripheral:(CBPeripheral *)peripheral didDiscoverServices:(NSError *)error {
//扫描到的服务
NSLog(@"扫描到的服务:%@",peripheral.services); for (CBService *service in peripheral.services) {
//由于有很多服务 我们可以去特定的服务 做特定的功能
// if ([service.UUID.UUIDString isEqualToString:@"Battery"]) {
// [self.peripheral discoverCharacteristics:nil forService:service];
// }
//扫描服务特征
[self.peripheral discoverCharacteristics:nil forService:service];
}
}

发现服务对应的特征

/**
* 发现服务对应的特征
*/
- (void)peripheral:(CBPeripheral *)peripheral didDiscoverCharacteristicsForService:(CBService *)service error:(NSError *)error
{
// 服务对应的特征
NSArray *ctcs = service.characteristics;
// 遍历所有的特征
for (CBCharacteristic *character in ctcs) {
// 根据特征的唯一标示过滤
if ([character.UUID.UUIDString isEqualToString:@"XMG"]) {
NSLog(@"可以吃饭了");
}
}
}

特征描述

- (void)peripheral:(CBPeripheral *)peripheral didDiscoverDescriptorsForCharacteristic:(CBCharacteristic *)characteristic error:(NSError *)error {
NSLog(@"descriptor = %@",characteristic.descriptors);
for (CBDescriptor *descriptor in characteristic.descriptors) {
//读取特征描述
[self.peripheral readValueForDescriptor:descriptor];
}
}

5.与外设做数据的交互 读或写

- (void)peripheral:(CBPeripheral *)peripheral didUpdateValueForCharacteristic:(CBCharacteristic *)characteristic error:(NSError *)error {
if (error) {
NSLog(@"更新特征值%@时发生错误:%@", characteristic.UUID, [error localizedDescription]);
return;
}
// 收到数据
[delegate didGetDataForString:[self hexadecimalString:characteristic.value]];
// NSLog(@"%@",[self hexadecimalString:characteristic.value]);
}

数据的转换

我们接收到的数据,正是characteristic.value,这是一个NSData类数据,我们可以通过UTF8StringEncoding来转化为NSString,为了代码结构清晰,我专门把NSData和NSString互转写成了两个方法:

//将传入的NSData类型转换成NSString并返回
- (NSString*)hexadecimalString:(NSData *)data{
NSString *result = [[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding];
return result;
}
//将传入的NSString类型转换成NSData并返回
- (NSData*)dataWithHexstring:(NSString *)hexstring{
NSData *aData;
return aData = [hexstring dataUsingEncoding: NSASCIIStringEncoding];
}

写的比较基础,另附大神写的比较全面的蓝牙博客地址

http://liuyanwei.jumppo.com/2015/07/17/ios-BLE-0.html

iOS 蓝牙开发之(CoreBlueTooth)的更多相关文章

  1. iOS蓝牙开发(二)蓝牙相关基础知识

    原文链接: http://liuyanwei.jumppo.com/2015/07/17/ios-BLE-1.html iOS蓝牙开发(一)蓝牙相关基础知识: 蓝牙常见名称和缩写 MFI ====== ...

  2. iOS 蓝牙开发资料记录

    一.蓝牙基础认识:   1.iOS蓝牙开发:  iOS蓝牙开发:蓝牙连接和数据读写   iOS蓝牙后台运行  iOS关于app连接已配对设备的问题(ancs协议的锅)          iOS蓝牙空中 ...

  3. iOS蓝牙开发(一)蓝牙相关基础知识(转)

    转载自:http://www.cocoachina.com/ios/20150915/13454.html 原文作者:刘彦玮 蓝牙常见名称和缩写 MFI ======= make for ipad , ...

  4. iOS蓝牙开发

    蓝牙常见名称和缩写 MFI ======= make for ipad ,iphone, itouch 专们为苹果设备制作的设备 BLE ==== buletouch low energy,蓝牙4.0 ...

  5. iOS蓝牙开发(4.0)详解

    最近由于项目需要, 一直在研究蓝牙4.0,在这儿分享给大家, 望共同进步. 一.关于蓝牙开发的一些重要的理论概念: 1.当前ios中开发蓝牙所运用的系统库是<CoreBluetooth/Core ...

  6. iOS 蓝牙开发详解

    目前iOS智能硬件的开发交互方式主要分为两种,一种是基于低功耗的蓝牙4.0技术(由于耗电低,也称作为BLE(Bluetooth Low Energy))对应iOS的框架为CoreBluetooth,另 ...

  7. ios蓝牙开发(一)蓝牙相关基础知识

    蓝牙常见名称和缩写 MFI ======= make for ipad ,iphone, itouch 专们为苹果设备制作的设备 BLE ==== buletouch low energy,蓝牙4.0 ...

  8. iOS蓝牙开发总结-4

    蓝牙开发总结 只要熟悉蓝牙的流程,和蓝牙中每一个角色的作用,其实蓝牙通讯并没有想象中的难 1.蓝牙中心CBCentralManager:一般指得是iPhone手机 2.设备(外设)CBPeripher ...

  9. iOS蓝牙开发CoreBluetooth快速入门

    在iOS开发中,实现蓝牙通信有两种方式,一种是使用传统的GameKit.framework,另一种就是使用在iOS 5中加入的CoreBluetooth.framework. 利用CoreBlueto ...

  10. ios蓝牙开发(三)ios连接外设的代码实现:手机app去读写蓝牙设备。

    手机app去读写蓝牙设备....... 代码下载: 原文博客主提供Github代码连接,地址是:https://github.com/coolnameismy/demo ios连接外设的代码实现流程: ...

随机推荐

  1. 2017.6.29 java读取.properties配置文件的几种方法

    参考来自:http://www.cnblogs.com/s3189454231s/p/5626557.html 关于路径的解释:http://blog.csdn.net/bluishglc/artic ...

  2. 转:阿里 Weex 思路与实战(web相关)

    Weex——关于移动端动态性的思考.实现和未来 2016-04-05 勾股.伊耆 移动开发前线 本文由手机淘宝技术团队赵锦江(勾股).黄金涌(伊耆)等专家创作.手淘作为电商应用,对客户端/前端的动态性 ...

  3. DevExpress控件之popupMenu

    一.首次创建 1.可直接从工具栏拉一个PopupMenu出来, 2.右键Customize,Yes(提示是否自动创建BarManager,并为popupmenu绑定这个BarManager): 3.编 ...

  4. 倍福TwinCAT(贝福Beckhoff)基础教程2.2 TwinCAT常见类型使用和转换_枚举

    在Duts的文件夹上右击,可以声明一个枚举类型,按照格式填写所有类型(注意枚举的元素前面都是逗号,最后一个不需要符号)   在正常使用的时候,枚举的单词可以当全局变量来用     更多教学视频和资料下 ...

  5. iOS音乐后台播放及锁屏信息显示

    实现音乐的后台播放.以及播放时,能够控制其暂停,下一首等操作,以及锁屏图片歌曲名等的显示 此实例须要真机调试.效果图例如以下: project下载:githubproject下载 实现步骤: 1.首先 ...

  6. S1:适配器 Adapter

    将一个类的接口转换为用户期望的另外一个接口.适配器使得原本由于接口不兼容而不能一起工作的类可以一起工作   UML: 一.类适配器: class A { public function methodA ...

  7. 设计模式——浅复制VS深复制

    背景 在学习原型模式的时候,採用了一个差别与其它模式的新方法.採用了"克隆(Clone)方法.通过实现ICloneable接口中的Clone()方法来达到克隆的目的. 代码实现过程中,存在了 ...

  8. 【原创】Loadrunner使用json格式请求数据并参数化

    (2015-04-10 16:10:41) 转载▼ 标签: loadrunner json 参数化 web_custom_request 分类: 性能测试 请求自定义的http文件用函数:web_cu ...

  9. Windows2008RC2 IIS配置php执行环境

    1:下载一个php manager,安装.打开IIS管理器后,点击计算机,就能够看到右边PHPManager 静静地躺在那儿了.双击PHPManager    后我们就能够開始对PHP进行配置了. 2 ...

  10. js 元素Dom新建并插入页面createElement

    纯js var o = document.createElement('script'); o.type = 'text/template'; o.id = 'demo'; document.docu ...