小米手环iOS开发实战(一):iOS蓝牙框架CoreBluetooth

本项目为对小米手环进行二次开发,利用了小米手环蓝牙连接并不安全的特性,连接后可以获取手环数据,并可修改数据。
本实例使用Swift3.0语言,Objective-C的蓝牙模块处理有略微不同,具体可见文档。
本节首先介绍iOS蓝牙框架CoreBluetooth,在此仅介绍本实例涉及到的蓝牙操作内容,如果大家有需要,可以专开一贴介绍CoreBluetooth的使用。


章节目录

  • iOS蓝牙框架介绍
  • CoreBluetooth.framework导入
  • CoreBluetooth的基础使用

iOS蓝牙框架介绍

CoreBluetooth介绍

在iOS开发中,实现蓝牙通信的方法有两种。分别是GameKit.framework以及CoreBluetooth.framework,前者在iOS5后基本被淘汰。

在苹果文档中,写了Communicate with Bluetooth 4.0 low-energy devices,也就是说仅支持蓝牙4.0低功耗协议(BLE)。

对于iOS10以上的设备,苹果注明以下信息:

An iOS app linked on or after iOS 10.0 must include in its Info.plist file the usage description keys for the types of data it needs to access or it will crash. To access Bluetooth peripheral data specifically, it must include NSBluetoothPeripheralUsageDescription.

也就是说需要声明并注册蓝牙权限的使用。

CoreBluetooth协议
首先提及蓝牙使用,在此引入两个概念:中心设备和外围设备。

  • 中心设备(客服端):作为中央管理器的设备,也就是本实例中的iOS设备。
  • 外围设备(服务器):也就是外部设备,扮演者产生数据的角色。许多传感器、蓝牙服务设备均是外围设备。本实例中小米手环就是外围设备。

同时数据传输还涉及到以下几个值:

  • UUID:相当与使用这个模块对映的应用的标识。
  • RSSI:信号强度,利用此信息可进行蓝牙测距,后面将进行讲解。

CoreBluetooth中涉及以下对象类:

  • CBCentralManager:中心设备类
  • CBPeripheral:外围设备类
  • CBCharacteristic:设备特征类

接下来就看一下如何导入蓝牙框架。

CoreBluetooth.framework导入

  1. 首先新建Xcode项目
  2. 在General->TARGETS->Linked Framworks and Libraries中点击添加并选择CoreBluetooth.framework导入。
  3. 在代码中导入CoreBluetooth.framework
    Swift:import CoreBluetooth
    Objective-C:#import <CoreBluetooth/CoreBluetooth.h>
  4. 声明协议:使用CoreBluetooth需要支持CBCentralManagerDelegate, CBPeripheralDelegate协议,即前面所说的中心设备和外围设备,并实现相应方法

CoreBluetooth的基础使用

导入框架并声明协议后,即可开始实现必要方法。
下面通过展示整个流程所需要的方法

  • 初始化
var manager = CBCentralManager.init(delegate: self as? CBCentralManagerDelegate, queue: nil)
  • 扫描设备
switch manager.state {case .poweredOn:NSLog("正在扫描")manager.scanForPeripherals(withServices: nil, options: nil)default:break}

注:这里为什么一定要用switch语法?
因为CBCentralManager的State属性在之前是CBCentralManagerState,但是现在变成了CBManagerState,而需要iOS10以上才支持后者(23333)。这一波强制升级我是拒绝的,找了很多方法之后,发现这样写可以被Xcode接受而不去检查

  • 处理当前中心设备蓝牙状态
func centralManagerDidUpdateState(_ central: CBCentralManager) {switch central.state {case .poweredOn:NSLog("蓝牙已开启")default:NSLog("蓝牙未开启")}}
  • 扫描到外围设备的处理
func centralManager(_ central: CBCentralManager, didDiscover peripheral: CBPeripheral, advertisementData: [String : Any], rssi RSSI: NSNumber) {//peripheral.name为设备名称//可以调用CBCentralManager的stopScan停止扫描central.stopScan()//可以调用CBCentralManager的connect连接设备central.connect(peripheral, options: nil)}}
  • 成功连接到外围设备的处理
unc centralManager(_ central: CBCentralManager, didConnect peripheral: CBPeripheral) {NSLog("成功连接")//设置代理peripheral.delegate = self//连接成功后接下来该扫描服务peripheral.discoverServices(nil)}
  • 连接失败的处理
func centralManager(_ central: CBCentralManager, didFailToConnect peripheral: CBPeripheral, error: Error?) {NSLog("连接设备失败")}
  • 扫描已连接外围设备服务
func peripheral(_ peripheral: CBPeripheral, didDiscoverServices error: Error?) {if ((error) != nil) {NSLog("查找服务失败")return}else {for service in peripheral.services! {//扫描到服务后对服务逐个扫描特征值peripheral.discoverCharacteristics(nil, for: service)}}}
  • 扫描到特征值后的操作
func peripheral(_ peripheral: CBPeripheral, didDiscoverCharacteristicsFor service: CBService, error: Error?) {if ((error) != nil) {NSLog("扫描特征值失败")}else {for characteristic in service.characteristics! {//设置特征值只要有更新就获取peripheral.setNotifyValue(true, for: characteristic)if (characteristic.uuid.uuidString == "你想匹配的字符串") {peripheral.readValue(for: characteristic)//或characSaver = characteristic}}}}

解释一下原理:方法对每个服务进行扫描,获取特征值。辨别是否是你想要的功能的特征值就要用到UUID,用UUID去匹配。匹配到后你可以选择保存他的特征值从而在后面自行操作,或者用readValue读取它的值,并由系统自动调用下面介绍的方法

  • 获取具体值之后的操作
func peripheral(_ peripheral: CBPeripheral, didUpdateValueFor characteristic: CBCharacteristic, error: Error?) {if ((error) != nil) {statusLabel.text = "从设备获取值失败"return}else {if(characteristic.uuid.uuidString == "特定值") {var infoBytes = [UInt8](characteristic.value!)var infoVal:Int = Int.init(infoBytes[0])NSLog("获取的值为:%d\n", infoVal)}}}

这里展示了一个示例操作,获取到手环的数据,由于手环的数据是最后8位Byte,所以取Byte值。但是由于Swift3.0已经取消了Byte,所以在此使用UInt8的类型转换来操作。对于你的蓝牙设备,根据数据的不同选择读取对应的位数。

这样,我们就完成了CoreBluetooth的方法,以及对应的处理。


对蓝牙框架CoreBluetooth的操作就告一段落,接下来将通过demo演示对控制小米手环进行讲解。如果对于蓝牙框架还有问题,欢迎提问或讨论。

写文章不易,如果觉得满意,欢迎大家粉一下我的GitHub,以及动动手指Star一下我的项目,持续更新需要你的支持!
本人GitHub:https://github.com/Minecodecraft
本项目链接:https://github.com/Minecodecraft/MiBandDemo

“小米手环iOS开发实战”系列
小米手环iOS开发实战(一):iOS蓝牙框架CoreBluetooth
小米手环iOS开发实战(二):开发Demo让你的手环振动起来

小米手环iOS开发实战(一):iOS蓝牙框架CoreBluetooth相关推荐

  1. 小米手环iOS开发实战(二):开发Demo让你的手环振动起来

    小米手环iOS开发实战(二):开发Demo让你的手环振动起来 上一节讲了CoreBluetooth的使用,理论知识很枯燥,那么现在先利用上一节讲的内容,做一个简易手环应用,实现连接/断开手环,查看手环 ...

  2. Xamarin iOS开发实战(内部资料)

    Xamarin iOS开发实战 (内部资料) 介绍:本教程是国内Xamarin针对iOS 9开发的唯一教程.本教程针对Mac OS X10.11/Windows 10两种系统平台,讲解如何使用Xama ...

  3. Xamarin iOS开发实战1.1.3Xamarin版本

    Xamarin iOS开发实战1.1.3Xamarin版本 Xamarin提供了免费版和付费版.免费版本包含Xamarin Studio服务.付费版本分为普通版299美元/年.商业版999美元/年和企 ...

  4. Xamarin iOS开发实战第1章使用C#编写第一个iOS应用程序

    Xamarin iOS开发实战第1章使用C#编写第一个iOS应用程序 C#原本是用来编写Windows以及Windows Phone的应用程序.自从Xamarin问世后,C#的作用就发生了很大的变化. ...

  5. Xamarin iOS开发实战中册 (内部资料)C#苹果应用开发

    Xamarin iOS开发实战中册 (内部资料)C#苹果应用开发 Xamarin iOS开发实战中册 (内部资料)C#苹果应用开发 试读样章下载地址:http://pan.baidu.com/s/1j ...

  6. Xamarin iOS开发实战上册-----2.2.2 使用代码添加视图

    Xamarin iOS开发实战上册-----2.2.2  使用代码添加视图 如果开发者想要使用代码为主视图添加视图,该怎么办呢.以下将为开发者解决这一问题.要使用代码为主视图添加视图需要实现3个步骤. ...

  7. Xamarin iOS开发实战上册(内部资料daxueba.net)

    Xamarin iOS开发实战上册(内部资料daxueba.net) 试读样章下载地址:http://pan.baidu.com/s/1mgqQIxE 第2章  用户界面--视图 在iPhone或者i ...

  8. iOS开发系列--通讯录、蓝牙、内购、GameCenter、iCloud、Passbook详解

    代码改变世界 Posts - 69, Articles - 0, Comments - 812 Cnblogs Dashboard Login Home Contact Gallery RSS Ken ...

  9. iOS开发系列--通讯录、蓝牙、内购、GameCenter、iCloud、Passbook系统服务开发汇总

    iOS开发系列--通讯录.蓝牙.内购.GameCenter.iCloud.Passbook系统服务开发汇总 --系统应用与系统服务 iOS开发过程中有时候难免会使用iOS内置的一些应用软件和服务,例如 ...

最新文章

  1. 操作SQLite数据库
  2. c语言是字符串123变112233,Objective C学习第四节:OC里面的字符串和数值
  3. Android相机的实现
  4. 消息人士:苹果正与比亚迪宁德时代洽谈电动汽车电池供应事宜
  5. java共享内存_Java共享内存
  6. 美国专家声讨物联网安全 面对攻击如纸糊
  7. 安装IIS以及配置ASP.NET流程
  8. 黑马程序员_java基础一
  9. 视频教程-思科CCNP专题系列⑨:交换机安全-思科认证
  10. 白杨SEO:你知道SEO这个工作被误解或夸大有哪些吗?SEO不是万能的
  11. 瑞克和莫蒂 第三季6集
  12. RDIFramework.NET ━ .NET快速信息化系统开发框架 V3.2版本正式发布
  13. 前端批量下载七牛云文件
  14. 今日头条广告_API对接文档学习-1
  15. 信创办公--基于WPS的Word最佳实践系列(目录的插入及更新)
  16. Win10 家庭版 升级至 专业版
  17. 【腾讯云原生降本增效大讲堂】云原生混部技术标准解读
  18. 幸福温馨抑或婚姻枷锁——戴尔与EMC的蜜月期究竟进展如何?
  19. 游戏项目和开源项目调研
  20. plant simulation 建模案例分析

热门文章

  1. word批量删除中英文间的多个空格
  2. 拓嘉辰丰:在拼多多上面开店,一个人可以开多家吗
  3. VueRouter快速上手
  4. 深圳市中基鸿业实业有限公司工薪族如何安全理财
  5. 跟着鬼哥学so改动,三,作业篇
  6. dmbj.top(代码笔记) 上线啦
  7. android usb采集卡,安卓添加USB外置UVC摄像头
  8. 国服吃鸡一直服务器维护,吃鸡将关闭欧洲服务器 国服新内容优先测试
  9. static 关键字用法总结
  10. 图片坐标提取软件/图片坐标点和像素点颜色提取软件/图片坐标获取工具/Python图片坐标获取源码/图片像素坐标获取软件/python tkinter 图片显示(完全开源)