Coreblutooth蓝牙

//

// BLEManager.swift

// coreblutooth

//

// Created by admin on 2025/12/4.

//

import CoreBluetooth

class BLEManager: NSObject, CBCentralManagerDelegate {

var centralManager: CBCentralManager!

// 必须强引用peripheral,否则会被释放

var discoveredPeripheral: CBPeripheral?

var connectedPeripherals: [CBPeripheral] = []

override init() {

super.init()

centralManager = CBCentralManager(delegate: self , queue: nil)

}

// 检查蓝牙状态

func centralManagerDidUpdateState(_ central: CBCentralManager) {

switch central.state {

case .poweredOn:

print("蓝牙已开启,可以扫描")

startScanning()

case .poweredOff:

print("蓝牙已关闭")

case .unauthorized:

print("蓝牙未授权")

default:

break

}

}

// 2. 扫描设备

func startScanning() {

// 扫描所有设备

centralManager.scanForPeripherals(withServices: nil , options: nil)

// 或只扫描特定服务的设备

let serviceUUID = CBUUID(string: "180D") // 心率服务

centralManager.scanForPeripherals(withServices: [serviceUUID], options: nil)

}

// 发现设备回调

func centralManager(_ central: CBCentralManager,

didDiscover peripheral: CBPeripheral,

advertisementData: [String : Any],

rssi RSSI: NSNumber) {

print("发现设备: \(peripheral.name ?? "未命名")")

print("信号强度: \(RSSI)")

// 保存设备引用(重要!)

self.discoveredPeripheral = peripheral

// 连接设备

centralManager.connect(peripheral, options: nil)

// 停止扫描以节省电量

centralManager.stopScan()

}

// 3. 连接设备

func centralManager(_ central: CBCentralManager,

didConnect peripheral: CBPeripheral) {

print("连接成功")

peripheral.delegate = self

// 发现服务

peripheral.discoverServices(nil) // 发现所有服务

// 或指定服务

// peripheral.discoverServices([CBUUID(string: "180D")])

}

func centralManager(_ central: CBCentralManager,

didFailToConnect peripheral: CBPeripheral,

error: Error?) {

print("连接失败: \(error?.localizedDescription ?? "")")

}

}

//4. 发现服务和特征

extension BLEManager: CBPeripheralDelegate {

// 发现服务

func peripheral(_ peripheral: CBPeripheral,

didDiscoverServices error: Error?) {

guard let services = peripheral.services else { return }

for service in services {

print("发现服务: \(service.uuid)")

// 发现特征

peripheral.discoverCharacteristics(nil, for: service)

}

}

// 发现特征

func peripheral(_ peripheral: CBPeripheral,

didDiscoverCharacteristicsFor service: CBService,

error: Error?) {

guard let characteristics = service.characteristics else { return }

for characteristic in characteristics {

print("发现特征: \(characteristic.uuid)")

print("属性: \(characteristic.properties)")

// 根据属性进行操作

if characteristic.properties.contains(.read) {

peripheral.readValue(for: characteristic)

}

if characteristic.properties.contains(.notify) {

peripheral.setNotifyValue(true, for: characteristic)

}

}

}

// 5. 读写数据

// 读取数据

func peripheral(_ peripheral: CBPeripheral,

didUpdateValueFor characteristic: CBCharacteristic,

error: Error?) {

guard let data = characteristic.value else { return }

print("收到数据: \(data)")

// 解析数据

let bytes = [UInt8](data)

print("字节: \(bytes)")

}

// 写入数据

func writeData(to characteristic: CBCharacteristic, peripheral: CBPeripheral) {

let data = Data([0x01, 0x02, 0x03])

if characteristic.properties.contains(.write) {

peripheral.writeValue(data, for: characteristic, type: .withResponse)

} else if characteristic.properties.contains(.writeWithoutResponse) {

peripheral.writeValue(data, for: characteristic, type: .withoutResponse)

}

}

// 写入完成回调

func peripheral(_ peripheral: CBPeripheral,

didWriteValueFor characteristic: CBCharacteristic,

error: Error?) {

if let error = error {

print("写入失败: \(error)")

} else {

print("写入成功")

}

}

// 断开连接方法

func disconnect() {

if let peripheral = discoveredPeripheral {

centralManager.cancelPeripheralConnection(peripheral)

}

}

//如果你需要断开所有已连接的设备,可以改成:

func disconnect1() {

// 断开当前设备

if let peripheral = discoveredPeripheral {

centralManager.cancelPeripheralConnection(peripheral)

}

// 断开所有已连接设备

for peripheral in connectedPeripherals {

centralManager.cancelPeripheralConnection(peripheral)

}

}

//或者断开指定设备:

func disconnect2(peripheral: CBPeripheral) {

centralManager.cancelPeripheralConnection(peripheral)

}

}

相关推荐
十二测试录1 小时前
Android和iOS测试区别
android·经验分享·ios·职场发展·ab测试
张飞签名上架4 小时前
深耕全球市场:App上架iOS与Google Play全流程指南
macos·ios·cocoa·ios上架·上架·谷歌上架
Digitally5 小时前
iPhone 无法向安卓设备发送图片:轻松解决
android·ios·iphone
阿里云云原生6 小时前
RUM 助力 iOS 应用稳定性:从异常捕获到堆栈还原的全流程分析
人工智能·阿里云·ios·云原生·rum
初级代码游戏15 小时前
iOS只剩美工了吗?时间都被遮盖看不清了
ios·界面设计·美工
2501_915918411 天前
iOS 开发中证书创建与管理中的常见问题
android·ios·小程序·https·uni-app·iphone·webview
00后程序员张1 天前
IOScer 开发环境证书包括哪些,证书、描述文件与 App ID 的协同管理实践
android·ios·小程序·https·uni-app·iphone·webview
江东小bug王1 天前
深入理解 UITabBarController:代理方法与 ViewController 生命周期的执行顺序(含 UINavigationController 场景)
ios
阿里云云原生1 天前
RUM 赋能 iOS App 稳定:从异常体系到监控方案的全方位解析!
ios·云原生
Zfox_1 天前
无缝穿越系统边界:节点小宝4.0如何让我的Mac/iOS像访问本地盘一样操控Windows
windows·macos·ios·节点小宝