iOS之蓝牙开发—CoreBluetooth详解
CoreBluetooth的API是基于BLE4.0的标准的。这个框架涵盖了BLE标准的所有细节。仅仅只有新的iOS设备和Mac是和BLE标准兼容.在CoreBluetooth框架中,有两个主要的角色:周边和中央(Peripheral and Central) ,整个框架都是围绕这两个主要角色设计的,他俩之间有一系列的回调交换数据。下图1展示了周边和中央(Peripheral and Central),还有他俩之间的关系。
开发蓝牙这块,有两种模式,一个是中心模式,还有一个是外设模式。这里主要讲的是中心模式,中心模式的流程主要分为以下几步:1、建立中心设备 2、扫描外部设备 3、连接外部设备 4、扫描外部设备中的服务和特征 5、利用相关的特征与外部设备收发数据。进行讲解之前,我们得知道一个中心设备可以连接多个外部设备,一个外部设备包含一个或多个服务,一个服务包含一个或多个特征。
下面根据我初学蓝牙的角度来讲解一下:
1、首先是导入框架#import<CoreBluetooth/CoreBluetooth.h>,
然后创建中心设备并设置代理(不要忘记签订协议):
CBCentralManager *manager = [[CBCentralManageralloc]init];
self.manager = manager;
一旦设置代理在运行程序的时候,就会调用协议里一个必须要完成的方法:
- (void)centralManagerDidUpdateState:(CBCentralManager *)central;
这个方法是查看中心设备是否打开蓝牙。
2、利用中心设备扫描外部设备:
[manager scanForPeripheralsWithServices:niloptions:nil];
第一个参数那里表示扫描带有相关服务的外部设备,例如填写@[[CBUUIDUUIDWithString:@"需要连接的外部设备的服务的UUID"]],即表示带有需要连接的外部设备的服务的UUID的外部设备,nil表示扫描全部设备;
options处以后细讲,暂时可以写一个@{CBCentralManagerScanOptionAllowDuplicatesKey :@YES}这样的参数,YES表示会让中心设备不断地监听外部设备的消息,NO就是不能。
一旦扫描到外部设备,就会进入协议中的
- (void)centralManager:(CBCentralManager *)central didDiscoverPeripheral:(CBPeripheral *)peripheral advertisementData:(NSDictionary *)advertisementData RSSI:(NSNumber *)RSSI;
在这个方法里,我们可以根据我们获取到的硬件的某些条件进行筛选,然后连接我们需要连接的外部设备,例如连接名字带有A的外部设备:
if ([peripheral.namehasPrefix:@"A"] ) {
//连接设备
[manager connectPeripheral:peripheraloptions:nil];
}
3、刚刚的if判断中的语句就是在进行中心设备和外部设备的连接。连接成功或者失败会分别进入
- (void)centralManager:(CBCentralManager *)central didConnectPeripheral:(CBPeripheral *)peripheral;(连接成功)
- (void)centralManager:(CBCentralManager *)central didFailToConnectPeripheral:(CBPeripheral *)peripheral error:(nullableNSError *)error;(连接失败)
4、我们在连接成功的方法中开始扫描外部设备的服务:
[peripheral discoverServices:nil];
接着就会跳入发现服务的代理方法中去:
- (void)peripheral:(CBPeripheral *)peripheral didDiscoverServices:(NSError *)error;
我们在这个方法里面开始扫描服务中的特征:
[peripheral discoverCharacteristics:nilforService:service];
当我们扫描到特征的时候,就会跳入发现特征的协议方法里去:
- (void)peripheral:(CBPeripheral *)peripheral didDiscoverCharacteristicsForService:(CBService *)service error:(NSError *)error;
5、扫描到特征之后,我们就可以拿到相应的特征进行读写操作。
例如进行读取数据的操作:
if ([characteristics.UUID.UUIDStringisEqualToString:@"你需要的特征的UUID"]){
//读取特征数据
[peripheral readValueForCharacteristic:characteristics];
}
这就读取了特征包含的相关信息,只要读取就会进入另外一个方法:
- (void)peripheral:(CBPeripheral *)peripheral didUpdateValueForCharacteristic:(CBCharacteristic*)characteristic error:(NSError *)error;
在这个方法里,我们就可以拿到我们需要的数据了。进行写的操作是
[peripheralwriteValue:data类型的数据 forCharacteristic:使用到的特征 type:CBCharacteristicWriteWithResponse];
最后的type类型有两个,分别是CBCharacteristicWriteWithResponse和 CBCharacteristicWriteWithoutResponse;
选择第一个,每往硬件写入一次数据都会进入
- (void)peripheral:(CBPeripheral *)peripheral didWriteValueForCharacteristic:(CBCharacteristic*)characteristic error:(NSError *)error;
这个方法会告诉我们这次的写入是否成功,但是如果我们不用考虑往硬件写入的数据成功与否的话,选择第二个类型就ok。
以上就是简单的介绍了一下iOS中蓝牙的开发流程,便于初学者理解和认知,当然项目中的蓝牙开发没有这么的简单,需要结合实际情况综合考虑,但是一切都得从最简单的开始。本人也是刚开始学习蓝牙模块,有写的不对的地方,请大家指出,有理解不了的地方可以同我交流。
iOS之蓝牙开发—CoreBluetooth详解的更多相关文章
- 《iOS 7 应用开发实战详解》
<iOS 7 应用开发实战详解> 基本信息 作者: 朱元波 管蕾 出版社:人民邮电出版社 ISBN:9787115343697 上架时间:2014-4-25 出版日期:2014 年5 ...
- iOS中 蓝牙2.0详解/ios蓝牙设备详解 韩俊强的博客
每日更新关注:http://weibo.com/hanjunqiang 新浪微博 整体布局如下: 程序结构如右图: 每日更新关注:http://weibo.com/hanjunqiang ...
- iOS开发——Block详解
iOS开发--Block详解 1. Block是什么 代码块 匿名函数 闭包--能够读取其他函数内部变量的函数 函数变量 实现基于指针和函数指针 实现回调的机制 Block是一个非常有特色的语法,它可 ...
- iOS开发:详解Objective-C runTime
Objective-C总Runtime的那点事儿(一)消息机制 最近在找工作,Objective-C中的Runtime是经常被问到的一个问题,几乎是面试大公司必问的一个问题.当然还有一些其他问题也几乎 ...
- iOS开发-Runtime详解
iOS开发-Runtime详解 简介 Runtime 又叫运行时,是一套底层的 C 语言 API,其为 iOS 内部的核心之一,我们平时编写的 OC 代码,底层都是基于它来实现的.比如: [recei ...
- Cocos2d-x 3.X手游开发实例详解
Cocos2d-x 3.X手游开发实例详解(最新最简Cocos2d-x手机游戏开发学习方法,以热门游戏2048.卡牌为例,完整再现手游的开发过程,实例丰富,代码完备,Cocos2d-x作者之一林顺和泰 ...
- iOS中MVC等设计模式详解
iOS中MVC等设计模式详解 在iOS编程,利用设计模式可以大大提高你的开发效率,虽然在编写代码之初你需要花费较大时间把各种业务逻辑封装起来.(事实证明这是值得的!) 模型-视图-控制器(MVC)设计 ...
- iOS 证书与签名 解惑详解
iOS 证书与签名 解惑详解 分类: iPhone2012-06-06 19:57 9426人阅读 评论(1) 收藏 举报 iosxcodecryptographyappleiphone测试 目录 ...
- iOS,蓝牙开发!!--By帮雷
iOS的蓝牙开发大致有以下几种方式. 1 GameKit.framework [只能存在于iOS设备之间,多用于游戏 能搜索到的demo比较多,不确切说名字了,code4app里面就有] 2 Core ...
随机推荐
- Session&Cookie 简介及使用
Cookie cookie 是存储于访问者的计算机中的变量.每当同一台计算机通过浏览器请求某个页面时,就会发送这个 cookie.你可以使用 JavaScript 或其它语言来创建和取回 cookie ...
- Java ConcurrentHashMap的小测试
今天正式开始自己的分布式学习,在第一章介绍多线程工作模式时,作者抛出了一段关于ConcurrentHashMap代码让我很是疑惑,代码如下: public class TestClass { priv ...
- C#学习笔记11
1.List.BinarySearch():BinarySearch()采用的是二分搜索算法,要求元素已经排好序,其特点是假如元素没有找到,会返回一个负整数,该值的按位取反(~)结果是“大于被查找元素 ...
- 从零开始编译属于你的FFmpeg
一.前提: 编译FFmpeg可以是初学者,尤其是对C语言项目,Linux编译不熟悉的的初学者的一道门槛. 我曾经找过很多博客,文章,有些能编译成功,有些则不能.编译通过,能够运行也是云里雾里的.其实最 ...
- Drupal中hook_theme函数用法
在开发的时候不免要使用到drupal theme 定义.举个简单的例子: 复制代码 代码如下: <?phpfunction modulename_theme() { //开始定义自己的theme ...
- vuejs+axios发送请求
Vue 原本有一个官方推荐的 ajax 插件 vue-resource,但是自从 Vue 更新到 2.0 之后,官方就不再更新 vue-resource 目前主流的 Vue 项目,都选择 axios ...
- js添加、修改、删除xml节点例子
version="1.0" encoding="gb2312"?> . <bookstore> . <book genre=" ...
- stateless函数里面的参数问题
UI组件文件: function Selector({ status1, status2, status3 }){ return (<div><span>demo</sp ...
- EBS登陆界面IE显示异常
使用在IE浏览登陆EBS时: 在登陆界面,登录和取消的按钮显示异常: 在进入HOME界面时,显示的职责全为undefined. 原因: 由于IE版本的兼容性. 解决方法: 浏览器 菜单->工具- ...
- Siebel Tools client安装假死在92%问题解决
Solution to this error: This issue happens incase of installation is on unsupported operating system ...