ios app作为蓝牙外设

2019-12-18  本文已影响0人  liang1030
//
//  BLEPeripheralManager.swift
//  
//
//  Created by liang on 2019/1/17.
//  Copyright © 2019 liang. All rights reserved.
//

import UIKit
import CoreBluetooth

//可以使用命令生成128位的UUID
// liangdeMac-mini:~ liang$ uuidgen
// AC586E87-17F8-42D0-818D-E6B0ECA954C0

private let Service_UUID: String = ""
private let Characteristic_UUID: String = ""

class BLEPeripheralManager: NSObject {
    
    private var peripheralManager: CBPeripheralManager?
    private var characteristic: CBMutableCharacteristic?
    private(set) var BLEState:CBManagerState?
    
    //蓝牙状态变更回调
    typealias BLEStateBlock = () -> ()
    var staseCallback: BLEStateBlock?
    
    //单例
    static let shared = BLEPeripheralManager()
    
    private override init() {
        super.init()
        
        peripheralManager = CBPeripheralManager.init(delegate: self, queue: nil, options: [CBCentralManagerOptionShowPowerAlertKey:false])
    }

}

extension BLEPeripheralManager: CBPeripheralManagerDelegate {
    
    // 蓝牙状态
    func peripheralManagerDidUpdateState(_ peripheral: CBPeripheralManager) {
        BLEState = peripheral.state
        if staseCallback != nil {
            staseCallback!()
        }
        switch peripheral.state {
        case .unknown:
            print("未知的")
        case .resetting:
            print("重置中")
        case .unsupported:
            print("不支持")
        case .unauthorized:
            print("未验证")
        case .poweredOff:
            print("未启动")
        case .poweredOn:
            print("可用")
            // 创建Service(服务)和Characteristics(特征)
            setupServiceAndCharacteristics()
            // 根据服务的UUID开始广播
            self.peripheralManager?.startAdvertising([CBAdvertisementDataServiceUUIDsKey : [CBUUID.init(string: Service_UUID)],CBAdvertisementDataLocalNameKey:UIDevice.current.name])
        }
    }
    
    func writeValue(dataStr:String) {
        let data = dataStr.data(using: .utf8)!
        if let charcter = characteristic {
            self.peripheralManager?.updateValue(data, for: charcter, onSubscribedCentrals: nil)
        }
    }
    
    /** 创建服务和特征
     注意swift中枚举的按位运算 '|' 要用[.read, .write, .notify]这种形式
     */
    private func setupServiceAndCharacteristics() {
        let serviceID = CBUUID.init(string: Service_UUID)
        let service = CBMutableService.init(type: serviceID, primary: true)
        let characteristicID = CBUUID.init(string: Characteristic_UUID)
        let characteristic = CBMutableCharacteristic.init(type: characteristicID,
                                                          properties: [.read, .write, .notify],
                                                          value: nil,
                                                          permissions: [.readable, .writeable])
        service.characteristics = [characteristic]
        self.peripheralManager?.add(service)
        self.characteristic = characteristic
    }
    
    /** 中心设备读取数据的时候回调 */
    func peripheralManager(_ peripheral: CBPeripheralManager, didReceiveRead request: CBATTRequest) {
        // 请求中的数据,这里把文本框中的数据发给中心设备
        // 成功响应请求
        peripheral.respond(to: request, withResult: .success)
    }
    
    /** 中心设备写入数据 */
    func peripheralManager(_ peripheral: CBPeripheralManager, didReceiveWrite requests: [CBATTRequest]) {
        let request = requests.first!
        // 成功响应请求
        peripheral.respond(to: request, withResult: .success)
        
        if let data = request.value {
            recieveCommandFormCenter(data: data)
        }
    }
    
    /** 订阅成功回调 */
    func peripheralManager(_ peripheral: CBPeripheralManager, central: CBCentral, didSubscribeTo characteristic: CBCharacteristic) {
        print("\(#function) 订阅成功回调")
    }
    
    /** 取消订阅回调 */
    func peripheralManager(_ peripheral: CBPeripheralManager, central: CBCentral, didUnsubscribeFrom characteristic: CBCharacteristic) {
        print("\(#function) 取消订阅回调")
    }
    
    func recieveCommandFormCenter(data:Data) {
        let command:String = String.init(data: data, encoding: .utf8) ?? ""
    }
    
    //callBack
    func bleStateCallBackBlock(_ block: @escaping BLEStateBlock) {
        staseCallback = block
    }
  
}

上一篇 下一篇

猜你喜欢

热点阅读