尧图建网站 尧图建网站 YAOTU WEB BUILD 免费咨询
ARTICLE DETAIL

资讯详情

深耕网站建设与建站编程的一线实战洞察。

【IOS】CoreBluetooth

【IOS】CoreBluetooth 文章目录 核心概念你需要了解的四个关键词 开发实战如何用你的iPhone连接一个BLE设备1. 前期准备导入框架与申请权限2. 初始化中心管理器并检查蓝牙状态3. 扫描外围设备4. 连接外围设备5. 发现服务与特征6. 读写数据与订阅通知 总结与最佳实践学习 iOS 的CoreBluetooth框架主要是为了开发能与蓝牙低功耗BLE设备通信的 App。它不支持经典蓝牙的详细开发比如连接蓝牙耳机。下面是一份学习教程会从核心概念讲起再通过一个中心设备的完整开发流程带你一步步上手。 核心概念你需要了解的四个关键词在开始编码前先理解CoreBluetooth框架中的四个核心角色这是后续开发的基础。CBCentralManager (中心设备)你的 iPhone作为“中心”主动扫描和连接其他蓝牙设备。CBPeripheral (外围设备)你连接的蓝牙设备如心率手环、智能灯泡作为“外围”提供数据或服务。CBService (服务)外围设备能提供的某种功能比如“心率监测服务”。CBCharacteristic (特征)服务里的具体数据点比如“心率数值”这个特征数据就是通过读写特征来完成的。 开发实战如何用你的iPhone连接一个BLE设备下面以最常见的中心模式Central为例展示如何让 iPhone 扫描、连接并读取一个 BLE 设备的数据。1. 前期准备导入框架与申请权限导入框架在需要用到蓝牙的 Swift 文件顶部加入import CoreBluetooth。申请权限在Info.plist文件中添加NSBluetoothAlwaysUsageDescription键并填写向用户申请蓝牙权限时的提示语。2. 初始化中心管理器并检查蓝牙状态创建一个类通常命名为BluetoothManager并遵循CBCentralManagerDelegate协议。importCoreBluetoothclassBluetoothManager:NSObject,CBCentralManagerDelegate{varcentralManager:CBCentralManager!overrideinit(){super.init()// 初始化中心管理器代理设置为 self队列设为 nil 表示在主线程回调centralManagerCBCentralManager(delegate:self,queue:nil)}// 必须实现的代理方法用于检查蓝牙状态funccentralManagerDidUpdateState(_central:CBCentralManager){switchcentral.state{case.poweredOn:print(蓝牙已开启可以开始扫描)// 在这里可以调用开始扫描的方法case.poweredOff:print(蓝牙未开启请打开蓝牙)case.unsupported:print(设备不支持蓝牙)default:print(蓝牙状态未知)}}}3. 扫描外围设备在蓝牙状态确认为.poweredOn后调用scanForPeripherals方法开始扫描。funcstartScanning(){// withServices: nil 表示扫描所有设备传入特定服务的 UUID 数组可以过滤结果// CBCentralManagerScanOptionAllowDuplicatesKey: false 表示不重复发现同一设备centralManager.scanForPeripherals(withServices:nil,options:[CBCentralManagerScanOptionAllowDuplicatesKey:false])}当扫描到设备时会触发代理方法didDiscover。funccentralManager(_central:CBCentralManager,didDiscover peripheral:CBPeripheral,advertisementData:[String:Any],rssiRSSI:NSNumber){print(发现设备:\(peripheral.name??未知设备), 信号强度:\(RSSI))// 假设我们想连接名为 MyDevice 的设备ifperipheral.nameMyDevice{// 找到目标设备后停止扫描以节省电量centralManager.stopScan()// 发起连接centralManager.connect(peripheral,options:nil)}}4. 连接外围设备连接的结果会通过以下代理方法反馈。// 连接成功funccentralManager(_central:CBCentralManager,didConnect peripheral:CBPeripheral){print(成功连接设备:\(peripheral.name??未知设备))// 设置外围设备的代理以便接收其服务、特征等信息peripheral.delegateself// 开始发现设备提供的所有服务传入 nil 表示发现所有服务peripheral.discoverServices(nil)}// 连接失败funccentralManager(_central:CBCentralManager,didFailToConnect peripheral:CBPeripheral,error:Error?){print(连接设备失败:\(error?.localizedDescription??未知错误))}5. 发现服务与特征连接成功后需要发现设备提供的服务以及每个服务下的特征。这一步需要遵循CBPeripheralDelegate协议。extensionBluetoothManager:CBPeripheralDelegate{// 发现服务funcperipheral(_peripheral:CBPeripheral,didDiscoverServices error:Error?){guardletservicesperipheral.serviceselse{return}forserviceinservices{print(发现服务:\(service.uuid))// 发现该服务下的所有特征传入 nil 表示发现所有特征peripheral.discoverCharacteristics(nil,for:service)}}// 发现特征funcperipheral(_peripheral:CBPeripheral,didDiscoverCharacteristicsFor service:CBService,error:Error?){guardletcharacteristicsservice.characteristicselse{return}forcharacteristicincharacteristics{print(发现特征:\(characteristic.uuid))// 在这里可以对感兴趣的特征进行读取、写入或订阅通知}}}6. 读写数据与订阅通知发现特征后就可以进行数据交互了。读取数据peripheral.readValue(for: characteristic)写入数据peripheral.writeValue(data, for: characteristic, type: .withResponse)。withResponse表示需要设备确认。订阅通知peripheral.setNotifyValue(true, for: characteristic)。当特征值发生变化时设备会主动发送通知并在peripheral(_:didUpdateValueFor:error:)代理方法中接收。 总结与最佳实践注意线程安全确保 UI 更新在主线程可使用DispatchQueue.main.async {}。实现错误处理和重试蓝牙通信不稳定代码要有重试和错误处理机制。优化扫描策略找到目标设备后立即停止扫描并通过withServices:参数过滤设备。处理大数据传输BLE 单次数据包有限制大数据需分包发送和重组。处理后台模式若需后台使用蓝牙需在 Capabilities 中开启Uses Bluetooth LE accessories。总的来说学习CoreBluetooth最好的方法就是动手实践。可以从一个简单的“设备扫描器”开始逐步加入连接、读写功能。遇到问题多查阅官方文档和社区资料祝你学习顺利
返回列表