iOS设置作为蓝牙外设

文章目录

  • [一、 说明](#一、 说明)
  • 二、设置蓝牙外设
    • [1. 初始化外设中心](#1. 初始化外设中心)
    • [2. 创建外设服务](#2. 创建外设服务)
    • [3. 获取外设蓝牙状态](#3. 获取外设蓝牙状态)
    • [4. 发送蓝牙数据](#4. 发送蓝牙数据)
  • 三、外设代理
    • [1. 状态变更回调](#1. 状态变更回调)
    • [2. 中心设备读取数据的时候回调](#2. 中心设备读取数据的时候回调)
    • [3. 中心设备写入数据的时候回调](#3. 中心设备写入数据的时候回调)
    • [4. 订阅提示](#4. 订阅提示)
  • 四、发送广播数据
    • [1. 发送不同广播](#1. 发送不同广播)
    • [2. beacon广播](#2. beacon广播)
    • [3. 停止广播](#3. 停止广播)

一、 说明

任意苹果设备都可以作为蓝牙外设进行设置。

苹果蓝牙后台的限制,原本广播会有两个段分别是localName和serviceUUID这两块,但现在后台广播时,是不发送在这两段的。

二、设置蓝牙外设

1. 初始化外设中心

复制代码
let peripheralManager = CBPeripheralManager.init(delegate: self, queue: DispatchQueue.main)

2. 创建外设服务

复制代码
public func setupServiceAndCharacteristics() {
        // 创建服务
        let serviceID = CBUUID(string: kServiceUUID)
        let service = CBMutableService(type: serviceID, primary: true)
        // 创建服务中的特征
        let characteristicID = CBUUID(string: kChARACTERISTICUUID)
        let characteristic = CBMutableCharacteristic(type: characteristicID, properties: [.read, .write, .notify], value: nil, permissions: [.readable, .writeable])
        // 特征添加进服务
        service.characteristics = [characteristic]
        // 服务加入管理
        self.peripheralManager?.add(service)
    }

3. 获取外设蓝牙状态

复制代码
let tempState = self.peripheralManager?.state ?? .unknown

4. 发送蓝牙数据

复制代码
let sendSuccess: Bool = self.peripheralManager.updateValue(self.textField.text.data(using: NSUTF8StringEncoding), forCharacteristic: self.characteristic, onSubscribedCentrals: nil)

三、外设代理

CBPeripheralManagerDelegate

1. 状态变更回调

复制代码
    func peripheralManagerDidUpdateState(_ peripheral: CBPeripheralManager) {
        print(peripheral.state)
        delegate?.peripheralUpdateState(peripheral)
    }

2. 中心设备读取数据的时候回调

复制代码
    func peripheralManager(_ peripheral: CBPeripheralManager, didReceiveRead request: CBATTRequest) {
        // 请求中的数据,这里把文本框中的数据发给中心设备
//        request.value = self.textField.text.data(using: NSUTF8StringEncoding)
        // 成功响应请求
//        peripheral.respondToRequest(request, withResult: CBATTErrorSuccess)
    }

3. 中心设备写入数据的时候回调

复制代码
    func peripheralManager(_ peripheral: CBPeripheralManager, didReceiveWrite requests: [CBATTRequest]) {
        // 写入数据的请求
        let request = requests.last
        
        let data = request?.value
        delegate?.peripheralDidReceiveWrite(data)
    }

4. 订阅提示

复制代码
    func peripheralManager(_ peripheral: CBPeripheralManager, central: CBCentral, didSubscribeTo characteristic: CBCharacteristic) {
        print(#function)
    }
    
    // 取消订阅回调
    func peripheralManager(_ peripheral: CBPeripheralManager, central: CBCentral, didUnsubscribeFrom characteristic: CBCharacteristic) {
        print(#function)
    }
}

四、发送广播数据

1. 发送不同广播

复制代码
self.peripheralManager?.startAdvertising(periData)

2. beacon广播

注意⚠️:测试时beacon广播CLBeacon未检测到iPhone设备。 即使使用 Turning an iOS device into an iBeacon device 也没有结果(如果帮助不胜感激)

复制代码
/// 开始发送广播
    public func startBroadcasting(major: UInt16 = 0, minor: UInt16 = 0, peripheralData: [String: Any]? = nil) {
        // 为beacon基站创建一个唯一标示
        guard let myUUID = UUID(uuidString: kBeaconUUIDString) else {
            return
        }
        
        let constraint = CLBeaconIdentityConstraint(uuid: myUUID, major: major, minor: minor)
        let myBeaconRegion = CLBeaconRegion.init(beaconIdentityConstraint: constraint, identifier: kBeaconidentifier)
        
        // 获取该Beacon区域的信号信息
        var periData = myBeaconRegion.peripheralData(withMeasuredPower: nil) as? [String: Any]
        peripheralData?.forEach { (key: String, value: Any) in
            periData?[key] = value
        }
        // 创建并广播Beacon信号
        self.peripheralManager?.startAdvertising(periData)
    }

3. 停止广播

复制代码
self.peripheralManager?.stopAdvertising()
相关推荐
K成长日志21 小时前
BLE链路层--比特流处理
网络·物联网·网络协议·蓝牙·iot·ble·无线
嵌入式学习_force2 天前
BES2810ZP深度解析
ai·蓝牙·bes2810
byte轻骑兵7 天前
【BlueZ 】核心设计理念:模块化 + DBus 通信的底层逻辑
linux·蓝牙·bluez·电脑蓝牙·嵌入式蓝牙
K成长日志16 天前
BLE链路层空口包--数据物理信道PDU
网络·物联网·网络协议·嵌入式·蓝牙·iot·ble
byte轻骑兵16 天前
如何定制BlueZ编译:开启/关闭BLE/音频模块的编译参数配置
linux·arm开发·蓝牙·bluez·电脑蓝牙
byte轻骑兵17 天前
蓝牙PBP公共广播协议:解锁LE Audio的公共音频新生态
音视频·蓝牙·蓝牙耳机·le audio·低功耗蓝牙音频
byte轻骑兵23 天前
BlueZ源码编译环境配置全指南:Linux桌面原生编译 + 嵌入式ARM交叉编译 + 定制裁剪与调试实战
linux·arm开发·蓝牙·bluez·电脑蓝牙
piaoyiren25 天前
基于 STM32F103 蓝牙遥控云台超声波避障小车
stm32·单片机·嵌入式硬件·蓝牙·超声波测距·直流电机
K成长日志1 个月前
BLE链路层空口包--LE Uncoded PHY
物联网·嵌入式·蓝牙·iot·ble·无线·通信
TengTaiTech1 个月前
打破ANC的“静默牢笼”:基于QCC3095实现主动降噪与侧音共存的音频方案
蓝牙·qcc·混音