蓝牙使用
距离上次博客更新已经过去了好几个月 这段时间一直在忙公司项目的重构和整体UI重做 一直抽不出时间来对做的东西做一个归纳和整理 前几天项目成功上线了 现在对这段时间项目重构中遇到的问题和使用的技术做一些简单的整理 首先介绍项目中用的的占比较重的东西 蓝牙的使用及蓝牙交互逻辑的优化
iOS 蓝牙简介
- 蓝牙模式简介
蓝牙开发分为两种模式,中心模式(central),和外设模式(peripheral)。一般来讲,我们需要在软件内连接硬件,通过连接硬件给硬件发送指令以完成一些动作的蓝牙开发都是基于中心模式(central)模式的开发,也就是说我们开发的app是中心,我们要连接的硬件是外设。如果需要其他设备连接手机蓝牙,并对手机进行一些操作,那就是基于外设模式(peripheral)的开发。 本次我们主要介绍的就是中心模式的蓝牙开发 - 设备简介
- 中心设备(CBCentralManager):iOS系统的手机等设备
- 外围设备(CBPeripheral):手环等第三方设备
- 蓝牙数据传输简介
将外围设备(车辆)的数据传送给中心设备(手机)时, 数据是经过两层包装的
第一层是 Service(服务) , 可以是一个或多个, 比如车辆数据(服务)
第二层是 Characteristic(特征) , 他提供了更多关于Service(服务)的数据, 例如车辆数据(服务)中包含了两个数据, 分别是里程数据和续航数据, 这两个就是车辆数据(服务)的具体数据(特征) - 具体操作简介
读(read) , 写(write) , 订阅(notify)
我们的目的是读取设备中的数据(read) , 或者给设备写入一定的数据(write)。有时候我们还想设备的数据变化的时候不需要我们手动去读取这个值,需要设备自动通知我们它的值变化了,值是多少。把值告诉app,这个时候就需要订阅这个特征了(notify)
具体使用步骤
- 数据读写步骤
- 创建中心设备(CBCentralManager)
- 中心设备开始扫描(scanForPeripherals)
- 扫描到外围设备之后, 自动调用中心设备的代理方法(didDiscoverPeripheral)
- 如果设备过多, 可以将扫描到的外围设备添加到数组
- 开始连接, 从数组中过滤出自己想要的设备, 进行连接(connectPeripheral)
- 连接上之后, 自动调用中心设备的代理方法(didConnectPeripheral), 在代理中, 进行查找外围设备的服务(peripheral.discoverServices)
- 查找到服务之后, 自动调用外围设备的代理(didDiscoverServices), 可通过UUID,查找具体的服务,查找服务(discoverCharacteristics)
- 查找到特征之后, 自动调用外围设备的代理(didDiscoverCharacteristics), 通过UUID找到自己想要的特征, 读取特征(readValueForCharacteristic)
- 读取到特征之后, 自动调用外设的代理方法(didUpdateValueForCharacteristic),在这里打印或者解析自己想要的特征值.
代码拆解实现
//创建中心设备(CBCentralManager)
import Foundation
import CoreBluetooth
//用于看发送数据是否成功!
class LLBlueTooth:NSObject {
//单例对象
internal static let instance = LLBlueTooth()
//中心对象
var central : CBCentralManager?
//中心扫描到的设备都可以保存起来,
//扫描到新设备后可以通过通知的方式发送出去,连接设备界面可以接收通知,实时刷新设备列表
var deviceList: NSMutableArray?
// 当前连接的设备
var peripheral:CBPeripheral!
//发送数据特征(连接到设备之后可以把需要用到的特征保存起来,方便使用)
var sendCharacteristic:CBCharacteristic?
override init() {
super.init()
self.central = CBCentralManager.init(delegate:self, queue:nil, options:[CBCentralManagerOptionShowPowerAlertKey:false])
self.deviceList = NSMutableArray()
}
// MARK: 扫描设备的方法
func scanForPeripheralsWithServices(_ serviceUUIDS:[CBUUID