章节连接

iOS Core Bluetooth_1 概述
iOS Core Bluetooth_2 基础知识
iOS Core Bluetooth_3 用作中央设备的常用方法(1/2)[swift实现]
iOS Core Bluetooth_4 用作中央设备的常用方法(2/2)[swift实现]

写在前面

在蓝牙低功耗通信中发挥核心作用的设备执行许多常见任务,例如,发现并连接到可用的外围设备,以及探索外围设备所提供的数据并与之交互。实现外围角色的设备还执行许多常见的其他任务,例如发布和广告服务,以及响应来自连接的中心的读取,写入和订阅请求。

在本章中,您将从中央学习如何使用Core Bluetooth框架执行最常见的Bluetooth低能耗任务。以下基于代码的示例将帮助您开发应用程序,以在本地设备上实现核心角色。具体来说,您将学习如何:

  • 实例化中央管理器对象
  • 发现并连接到正在广播的外围设备
  • 在连接到外围设备后浏览其数据
  • 发送读写请求到外围服务的特征值
  • 订阅特征值以在更新时被通知

在本文中找到的代码示例是简单抽象的。您可能需要进行适当的更改以将其合并到您的真实应用中。

1 实例化中央设备管理器

由于CBCentralManager对象是本地中央设备的核心蓝牙面向对象的表示形式,因此您可以在执行任何蓝牙低能耗事务之前分配和初始化中央管理器实例。您可以通过调用中央管理器的initWithDelegate:queue:options:方法来初始化中央管理器,代码如下:

var centralManager = CBCentralManager(delegate: self, queue: nil, options: [CBCentralManagerOptionShowPowerAlertKey: true])

注意:在此示例中,self被设置为接收任何外围角色事件的委托。当您将调度队列指定为时nil,外围设备管理器使用主队列调度外围设备角色事件。

创建外围设备管理器时,外围设备管理器将调用peripheralManagerDidUpdateState:其代理对象的方法。您必须实现此代理方法,以确保支持低功耗蓝牙并可以在本地外围设备上使用。通常可以在用extension来实现,实现代码如下:(完整版本)

internal func centralManagerDidUpdateState(_ central: CBCentralManager) {switch central.state {case .poweredOn:// ... so start working with the peripheralos_log("CBManager is powered on")retrievePeripheral()case .poweredOff:os_log("CBManager is not powered on")// In a real app, you'd deal with all the states accordinglyreturncase .resetting:os_log("CBManager is resetting")// In a real app, you'd deal with all the states accordinglyreturncase .unauthorized:// In a real app, you'd deal with all the states accordinglyif #available(iOS 13.0, *) {switch central.authorization {case .denied:os_log("You are not authorized to use Bluetooth")case .restricted:os_log("Bluetooth is restricted")default:os_log("Unexpected authorization")}} else {// Fallback on earlier versions}returncase .unknown:os_log("CBManager state is unknown")// In a real app, you'd deal with all the states accordinglyreturncase .unsupported:os_log("Bluetooth is not supported on this device")// In a real app, you'd deal with all the states accordinglyreturn@unknown default:os_log("A previously unknown central manager state occurred")// In a real app, you'd deal with yet unknown cases that might occur in the futurereturn}}

2 发现正在广播的外围设备

实例化后,中央管理器的第一项任务是发现外围设备。外围设备通过广播来告知其存在。您的应用通过调用中央管理器的scanForPeripheralsWithServices:options:方法来发现附近正在做广告的外围设备:

centralManager.scanForPeripherals(withServices: [TransferService.serviceUUID],options: [CBCentralManagerScanOptionAllowDuplicatesKey: true])

注意:如果nil为第一个参数指定,则中央管理器将返回所有发现的外围设备,而不管其支持的服务如何。在真实应用中,通常需要指定一个CBUUID对象数组,每个对象代表外围设备正在广播的服务的通用唯一标识符(UUID)。当您指定服务UUID的数组时,中央管理器仅返回广播这些服务的外围设备,从而使您仅扫描到您可能希望扫描的设备。CBUUID的声明方法在后文中涉及。

中央管理器每次发现外围设备时,都会调用centralManager:didDiscoverPeripheral:advertisementData:RSSI:其代理对象的方法。新发现的外围设备作为CBPeripheral对象返回。如果您打算连接到发现的外围设备,请对其进行强引用,以使系统不会取消分配它。以下示例显示了一个使用类属性来维护对发现的外围设备的引用的方案,仍通常在extension中进行实现:

func centralManager(_ central: CBCentralManager, didDiscover peripheral: CBPeripheral, advertisementData: [String: Any], rssi RSSI: NSNumber) {// Reject if the signal strength is too low to attempt data transfer.// Change the minimum RSSI value depending on your app’s use case.guard RSSI.intValue >= -50else {os_log("Discovered perhiperal not in expected range, at %d", RSSI.intValue)return}os_log("Discovered %s at %d", String(describing: peripheral.name), RSSI.intValue)// Device is in range - have we already seen it?if discoveredPeripheral != peripheral {// Save a local copy of the peripheral, so CoreBluetooth doesn't get rid of it.discoveredPeripheral = peripheral// And finally, connect to the peripheral.os_log("Connecting to perhiperal %@", peripheral)centralManager.connect(peripheral, options: nil)}}

如果您希望连接到多个设备,则可以保留一个Array发现的外围设备。无论如何,一旦找到了要连接的所有外围设备,就停止扫描其他设备以节省电量,代码如下:

centralManager.stopScan()

3 扫描后连接发现的外围设备

在发现您感兴趣的外围设备广告服务之后,您可以通过调用中央管理器的connectPeripheral:options:方法来请求与外围设备的连接。代码如下:

centralManager.connect(peripheral, options: nil)

如果连接请求成功,则中央管理器将调用centralManager:didConnectPeripheral:其代理对象的方法。在开始与外围设备进行交互之前,请设置其代理以确保该委托收到适当的回调,通常也使用extension进行实现,代码如下:

 func centralManager(_ central: CBCentralManager, didConnect peripheral: CBPeripheral){// 设置代理peripheral.delegate = self// 开始发现服务peripheral.discoverServices(nil)// 保存当前连接设备self.peripheral = peripheral// 这里可以发通知出去告诉设备连接界面连接成功}

如果连接失败,也需要调用对应的 central: CBCentralManager, didFailToConnect peripheral: CBPeripheral, error: Error? 代理方法进行回调,实现如下:

func centralManager(_ central: CBCentralManager, didFailToConnect peripheral: CBPeripheral, error: Error?) {os_log("Failed to connect to %@. %s", peripheral, String(describing: error))cleanup()}

其他发现服务与特征,读取,订阅与编写特征值的方法将在下文中实现。

iOS Core Bluetooth_3 用作中央设备的常用方法(1/2)[swift实现]相关推荐

  1. iOS Core Bluetooth_4 用作中央设备的常用方法(2/2)[swift实现]

    章节连接 iOS Core Bluetooth_1 概述 iOS Core Bluetooth_2 基础知识 iOS Core Bluetooth_3 用作中央设备的常用方法(1/2)[swift实现 ...

  2. iOS 蓝牙 Bluetooth 外围设备 中央设备

    今天项目中的蓝牙功能已经开发完毕,总结一下. CoreBluetooth.framework:功能强大的蓝牙框架,只要该设备支持蓝牙4.0,就可以进行蓝牙传输,只要该设备支持蓝牙4.0. CoreBl ...

  3. iOS Core Bluetooth_1 概述

    章节连接 iOS Core Bluetooth_1 概述 iOS Core Bluetooth_2 基础知识 iOS Core Bluetooth_3 用作中央设备的常用方法(1/2)[swift实现 ...

  4. iOS Core Bluetooth_2 基础知识

    章节连接 iOS Core Bluetooth_1 概述 iOS Core Bluetooth_2 基础知识 iOS Core Bluetooth_3 用作中央设备的常用方法(1/2)[swift实现 ...

  5. 图层几何学 -- iOS Core Animation 系列二

    <图层树和寄宿图 -- iOS Core Animation 系列一>介绍了图层的基础知识和一些属性方法.这篇主要内容是学习下图层在父图层上怎么控制位置和尺寸的. 1.布局 首先看一张例图 ...

  6. 国内用户ios android比例,国内iOS、Android系统的设备总量已达到了2亿

    首先,在2012年第三季度时,国内iOS.Android系统的设备总量已达到了2亿.在今年3月的时候,这一指标只有8700万,也就是说设备在半年内增长了125%.而在设备量大增的同时,用户也变得依赖移 ...

  7. IOS Core Image之二

    在上篇博客IOS Core Image之一中了解了下CIImage.CIFilter.CIContext三个类的使用,这篇了解下滤镜链(多滤镜)和人脸检测(不是人脸识别). 一.多滤镜 1.有些效果不 ...

  8. iOS - Core Animation 核心动画

    1.UIView 动画 具体讲解见 iOS - UIView 动画 2.UIImageView 动画 具体讲解见 iOS - UIImageView 动画 3.CADisplayLink 定时器 具体 ...

  9. iOS Core ML与Vision初识

    代码地址如下: http://www.demodashi.com/demo/11715.html 教之道 贵以专 昔孟母 择邻处 子不学 断机杼 随着苹果新品iPhone x的发布,正式版iOS 11 ...

最新文章

  1. 写代码日常 | 每日趣闻
  2. 转:AOP 的利器:ASM 3.0 介绍
  3. 生成 PDF 全攻略【1】初体验
  4. Tomcat在修改代码后不会自动reload解决办法
  5. JavaSE(二十四)——冒泡排序、选择排序、直接插入排序以及二分查找
  6. 在PyPI上发布自己的python包
  7. 也谈大公司病1——正确是最大的错误
  8. 修改Jupyter的工作空间
  9. 别在被骗了!!!!!!
  10. 消息队列重要机制讲解以及MQ设计思路(kafka、rabbitmq、rocketmq)
  11. 基于Verilog的4-PAM
  12. java自己写不出来_java学习中,能看懂代码,但是自己写不出来怎么处理?
  13. 改进的协同过滤推荐算法
  14. 如何实现电脑端和手机端数据传输与共享
  15. 编码的奥秘:布莱叶盲文与二元编码
  16. 三方协议服务器不填,三方协议档案转寄地址可以不填吗
  17. 2021年春季ACM训练赛第4场
  18. python爬虫天气实例_Python爬虫实例扒取2345天气预报
  19. 多方合作!上海交大成立两个人工智能相关研究机构
  20. Consider defining a bean of type ‘com.nclg.mall.service.AdminService‘ in your configuration.

热门文章

  1. 全球第二!食在爱尔兰,安全感满满!
  2. mysql忘记密码(无秘登录)for Linux
  3. JAVA--AI编程助手【代码智能补全工具】盘点,让AI提高你的编程效率
  4. python使用matplotlib可视化、自定义设置X轴刻度标签字体的大小( setting axis ticks size in matplotlib x axis)
  5. pandas数据分析京东评论者衣服购买情况pyecharts生成可视化图表
  6. barrnap:预测基因组上的核糖体RNA
  7. 20221128-20221202周总结
  8. 使用Guardium大数据智能解决方案释放Guardium数据的价值
  9. InfoSphere Guardium应用程序用户翻译
  10. 《公共管理学》考试重点及答案