//
// 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
}
}
ios app作为蓝牙外设
最后编辑于 :
©著作权归作者所有,转载或内容合作请联系作者
- 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
- 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
- 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...