蓝牙是一个标准的无线通讯协议,具有设备成本低、传输距离近和功耗低等特点,被广泛的应用在多种场合。蓝牙一般分为传统蓝牙和BLE两种模式:传统蓝牙可以传输音频等较大数据量,距离近、功耗相对大;而BLE则用来传输节点数据,传输数据量十分小,多数情况处于休眠状态,因而功耗十分低,被广泛的应用于智能穿戴设备。

蓝牙BLE简介

本文主要介绍iOS的蓝牙BLE开发流程,在介绍具体开发流程之前,有必要了解一下蓝牙BLE的特点。BLE通过属性(attribute)在clientserver之间进行数据交互,GATT定义了属性协议(Profile)来进行发现设备、读写数据和获取状态等功能。其中,在iOS蓝牙BLE开发过程中,App应用属于Central设备,BLE产品属于外设PeripheralProfile的结构图如下:

其中,ServiceCharacteristic 都有一个UUID来相互区分,类似心跳、血糖等的ServiceUUID由蓝牙SIG统一设定,同时也允许自定义服务,但仍需要用不同的UUID来标识。

针对客户端蓝牙BLE开发,一般不需要深入了解蓝牙协议栈,如果有兴趣,可以参考如下资料(本资料来自TI):

TI_BLE_Description

BLE开发流程

1. 创建CBCentralManager

创建一个队列,然后在这个队列里面进行BLE的各种操作

	//创建CBCentralManager对象
dispatch_queue_t queue = dispatch_queue_create("bluetooth", DISPATCH_QUEUE_SERIAL);
CBCentralManager *mgr = [[CBCentralManager alloc] initWithDelegate:self queue:queue];

2. 扫描外设

参数介绍:

  • serviceUUIDs: 指定扫描包含特点服务的外设,传nil表明是所有服务
  • options: 扫描时的设置,是一个字典
	//CBCentralManagerScanOptionAllowDuplicatesKey值为 No,表示不重复扫描已发现的设备
NSDictionary *optionDic = [NSDictionary dictionaryWithObject:[NSNumber numberWithBool:NO] forKey:CBCentralManagerScanOptionAllowDuplicatesKey];
[_mgr scanForPeripheralsWithServices:nil options:optionDic];

3. 停止扫描

	[_mgr stopScan];

4. 连接外设

遍历扫描到的外设,然后连接外设

	for (CBPeripheral *peripheral in self.peripherals) {
[_mgr connectPeripheral:peripheral options:nil];
}

5. 扫描外设中的服务和特征

获取服务

	[peripheral discoverServices:nil];

获取特征

	[peripheral discoverCharacteristics:nil forService:service];

获取描述

	[peripheral discoverDescriptorsForCharacteristic:characteristic]

改写特征数据

	[_peripheral writeValue:data forCharacteristic:characteristic type:CBCharacteristicWriteWithResponse];

6. 部分CBCentralManagerDelegate方法简介

代理方法:centralManagerDidUpdateState

Central已经更新状态,要在CBManagerStatePoweredOn里扫描外设,因为这是蓝牙初始化工作已完成

- (void)centralManagerDidUpdateState:(CBCentralManager *)central
{
switch (central.state) {
case CBManagerStatePoweredOn:
{
NSLog(@"开启蓝牙, 开始扫描"); [_mgr scanForPeripheralsWithServices:nil options:nil];
}
break;
case CBManagerStateUnsupported:
NSLog(@"不支持蓝牙");
break;
case CBManagerStatePoweredOff:
NSLog(@"蓝牙未打开");
break; default:
NSLog(@"蓝牙打开失败");
break;
}
}

代理方法: centralManager:didDiscoverPeripheral:advertisementData:RSSI:

扫描到外设

	- (void)centralManager:(CBCentralManager *)central didDiscoverPeripheral:(CBPeripheral *)peripheral advertisementData:(NSDictionary<NSString *,id> *)advertisementData RSSI:(NSNumber *)RSSI

代理方法: centralManager:didConnectPeripheral:

连接到外设

	- (void)centralManager:(CBCentralManager *)central didConnectPeripheral:(CBPeripheral *)peripheral

7. 部分CBPeripheralDelegate方法简介

代理方法: peripheral:didDiscoverServices:

发现服务

	- (void)peripheral:(CBPeripheral *)peripheral didDiscoverServices:(NSError *)error

代理方法: peripheral:didDiscoverCharacteristicsForService:error:

发现服务的特征

	- (void)peripheral:(CBPeripheral *)peripheral didDiscoverCharacteristicsForService:(CBService *)service error:(NSError *)error

代理方法: peripheral:didUpdateValueForCharacteristic:error:

已经更新特征的值

	- (void)peripheral:(CBPeripheral *)peripheral didUpdateValueForCharacteristic:(CBCharacteristic *)characteristic error:(NSError *)error

代理方法: peripheral:didWriteValueForCharacteristic:error:

已经写入特征的值

	-(void)peripheral:(CBPeripheral *)peripheral didWriteValueForCharacteristic:(CBCharacteristic *)characteristic error:(NSError *)error

8. 实例代码

下面的视图是基于小米手环2的测试数据,由于不是小米手环的开发者,没办法读取详细的数据,只把硬件、软件的版本信息等数据读出,以供需要开发蓝牙BLE之参考。




参考源码

https://github.com/BirdandLion/iOS-BLE.git

参考文档

http://www.jianshu.com/p/0a6c49922aad

http://www.jianshu.com/p/4df85eba6dab

http://www.jianshu.com/p/7ba443878e7d

iOS蓝牙BLE开发的更多相关文章

  1. Android蓝牙BLE开发,扫描、连接、发送和读取信息;

    1.BLE开发权限 Android蓝牙BLE开发须打开蓝牙权限和6.0位置权限: <uses-permission android:name="android.permission.B ...

  2. Android低功耗蓝牙(BLE)开发的一点感受

    最近一段时间,因为产品的需要我做了一个基于低功耗蓝牙设备的Android应用,其中碰到了一些困难,使我深深体会到Android开发的难处:不同品牌,不同型号和不同版本之间的差异使得Android应用适 ...

  3. Android 蓝牙 BLE 开发笔记

    最近公司头戴换了一块蓝牙4.0 BLE模块,所以我们Android组要适配 BLE.Android BLE 需要 4.3 以上系统,api 还是非常简单的, 第一步就是扫描, 扫描到设备后就可以连接了 ...

  4. Android 低功耗蓝牙BLE 开发注意事项

    基本概念和问题 1.蓝牙设计范式? 当手机通过扫描低功耗蓝牙设备并连接上后,手机与蓝牙设备构成了客户端-服务端架构.手机通过连接蓝牙设备,可以读取蓝牙设备上的信息.手机就是客户端,蓝牙设备是服务端. ...

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

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

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

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

  7. iOS蓝牙开发

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

  8. iOS蓝牙4.0开发

    文/starfox寒流(简书作者)原文链接:http://www.jianshu.com/p/974d165f78b5著作权归作者所有,转载请联系作者获得授权,并标注“简书作者”. iOS 蓝牙4.0 ...

  9. iOS 蓝牙开发详解

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

随机推荐

  1. JS运动框架的封装过程(一)

    给大家出一道题,从起点A走到目的地B,一共用了1000毫秒,每一次是30毫秒,请问你在这里面得到了哪些信息? 信息有哪些呢? 第一个,总时长是:1000毫秒 第二个,多久时间走一次?30毫秒 第三个, ...

  2. Java 泛型在实际开发中的应用

    java泛型是对Java语言的类型系统的一种扩展,泛型的本质就是将所操作的数据类型参数化.下面我会由浅入深地介绍Java的泛型. 一:泛型出现的背景 在java代码里,你会经常发现类似下边的代码: p ...

  3. vue2.0设置proxyTable使用axios进行跨域请求

    这里请求的是知乎日报的api,由@izzyleung这位大神提供的,这是github地址. 在vue-cli构建的项目中先安装axios npm install axios -S 这里暂不考虑用vue ...

  4. 网络爬虫——针对任意主题批量爬取PDF

    |本文为博主原创,转载请说明出处 任务需求:要求通过Google针对任意关键字爬取大量PDF文档,如K-means,KNN,SVM等. 环境:Anaconda3--Windows7-64位--Pyth ...

  5. 利用Python实现一个感知机学习算法

    本文主要参考英文教材Python Machine Learning第二章.pdf文档下载链接: https://pan.baidu.com/s/1nuS07Qp 密码: gcb9. 本文主要内容包括利 ...

  6. 有关各个版本的Visual Studio(VS)和SQL Server安装的顺序总结

    前几天从网上买了块三星的SSD,把原来的HDD放在了光驱位,然后重新安装了系统.想起来收集储存的好多源代码还是VS2008开发的,然后打算把之前用过的VS2008也装上,安装过程出了点问题.发现安装完 ...

  7. Luogu 1962 斐波那契数列(矩阵,递推)

    Luogu 1962 斐波那契数列(矩阵,递推) Description 大家都知道,斐波那契数列是满足如下性质的一个数列: f(1) = 1 f(2) = 1 f(n) = f(n-1) + f(n ...

  8. redhat系列linux系统 修改主机名的正确方法

    ##注:无特别说明,以下称呼的linux系统统一视为redhat系linux redhat系列linux系统 如果想修改主机名 很多人可能都会以为是: $hostname NEW-NAME 或者在 / ...

  9. SpringMVC配置实例

    一.SpringMVC概述 MVCII模式实现的框架技术 Model--业务模型(Biz,Dao...) View--jsp及相关的jquery框架技术(easyui) Contraller--Dis ...

  10. Spark ML下实现的多分类adaboost+naivebayes算法在文本分类上的应用

    1. Naive Bayes算法 朴素贝叶斯算法算是生成模型中一个最经典的分类算法之一了,常用的有Bernoulli和Multinomial两种.在文本分类上经常会用到这两种方法.在词袋模型中,对于一 ...