Я недавно немного экспериментировал с CoreBluetooth
, и теперь я хочу использовать каналы L2CAP.
Для этого я установил два приложения для iOS, одно из которых является периферийным, а другое - центральным.
На этом этапе, когда я запускаю их, вот что я вижу в консоли отладки Xcode
.
На периферийной стороне я получаю это:
peripheralManager(_:didAdd:error:)
peripheralManager(_:didPublishL2CAPChannel:error:)
PSM: 192
peripheralManagerDidStartAdvertising(_:error:)
На центральной стороне я получаю это:
centralManagerDidUpdateState
centralManager(_:didDiscover:advertisementData:rssi:)
centralManager(_:didConnect:)
peripheral(_:didOpen:error:)
2019-01-11 ....] [CoreBluetooth] WARNING: Unknown error: 431
Вопрос: Что я делаю не так, чтобы получить это плохо выглядящее сообщение?
И позже: что мне нужно добавить к этому коду для фактической передачи данных между центральным терминалом и терминалом. Например, отправьте сообщение: « Привет, мир! С новым годом. »
Я использую Xcode Version 10.1 с Swift 4.2.
И ниже соответствующий исходный код.
Для периферийных устройств:
import UIKit
import CoreBluetooth
class ViewController: UIViewController,CBPeripheralManagerDelegate {
let service_UUID = CBUUID(string:"9869B57E-2005-492B-8ED9-B5716886975F"),
svcCharac_UUID = CBUUID(string:"BC7E600D-1AE4-4B09-BAC2-ECC0E85247E0")
var cbPerifMngr:CBPeripheralManager!, mutaSRVC:CBMutableService!,
svcCharac:CBMutableCharacteristic!
override func viewDidLoad() {
super.viewDidLoad()
cbPerifMngr = CBPeripheralManager(delegate: self, queue: nil)
}
// CBPeripheralManagerDelegate protocol implementation.
func peripheralManagerDidUpdateState(_ peripheral: CBPeripheralManager) {
if peripheral.state == .poweredOn {
mutaSRVC = CBMutableService(type: service_UUID, primary: true)
svcCharac = CBMutableCharacteristic(type: svcCharac_UUID,
properties: [.read, .notify],
value: Data(base64Encoded: "Hello!"), permissions: .readable)
mutaSRVC.characteristics = [svcCharac]
cbPerifMngr?.add(mutaSRVC)
cbPerifMngr?.publishL2CAPChannel(withEncryption: false)
}
}
func peripheralManager(_ peripheral: CBPeripheralManager,
didPublishL2CAPChannel PSM: CBL2CAPPSM,
error: Error?) {
print(#function)
if error != nil {
print("Error in \(#function) :\n\(error!)")
return
}
print("PSM: \(PSM)")
}
func peripheralManager(_ peripheral: CBPeripheralManager, didAdd service: CBService, error: Error?) {
print(#function)
if error != nil {
print("Error in \(#function) :\n\(error!)")
return
}
cbPerifMngr.startAdvertising([CBAdvertisementDataServiceUUIDsKey:[service.uuid]])
}
func peripheralManagerDidStartAdvertising(_ peripheral: CBPeripheralManager, error: Error?) {
print(#function)
if error != nil {
print("Error in \(#function) :\n\(error!)")
return
}
}
}
Для центрального:
import UIKit
import CoreBluetooth
class ViewController: UIViewController,CBCentralManagerDelegate,CBPeripheralDelegate {
let service_UUID = CBUUID(string:"9869B57E-2005-492B-8ED9-B5716886975F")
var cbCenterMngr:CBCentralManager!, cbPerifHandle:CBPeripheral!,
cbL2CAPChan:CBL2CAPChannel!
override func viewDidLoad() {
super.viewDidLoad()
cbCenterMngr = CBCentralManager(delegate: self, queue: nil)
}
// CBCentralManagerDelegate protocol implementation.
func centralManagerDidUpdateState(_ central: CBCentralManager) {
print(#function)
if central.state == .poweredOn {
central.scanForPeripherals(withServices: [service_UUID],
options: nil)
}
}
func centralManager(_ central: CBCentralManager,
didDiscover peripheral: CBPeripheral,
advertisementData: [String : Any],
rssi RSSI: NSNumber) {
print(#function)
peripheral.delegate = self
cbPerifHandle = peripheral
central.connect(peripheral, options: nil)
}
func centralManager(_ central: CBCentralManager, didConnect peripheral: CBPeripheral) {
print(#function)
peripheral.openL2CAPChannel(192)
}
func peripheral(_ peripheral: CBPeripheral,
didOpen channel: CBL2CAPChannel?,
error: Error?) {
print(#function)
if error != nil {
print("Error in \(#function) :\n\(error!)")
return
}
cbL2CAPChan = channel
}
}