113 lines
4.3 KiB
Swift
113 lines
4.3 KiB
Swift
import Flutter
|
|
import UIKit
|
|
import CoreBluetooth
|
|
|
|
public class SwiftBluetoothLowEnergyPlugin: NSObject, FlutterPlugin {
|
|
public static func register(with registrar: FlutterPluginRegistrar) {
|
|
let binaryMessenger = registrar.messenger()
|
|
|
|
PigeonCentralManagerHostApiSetup(binaryMessenger, centralHostApi)
|
|
PigeonPeripheralHostApiSetup(binaryMessenger, peripherialHostApi)
|
|
PigeonGattServiceHostApiSetup(binaryMessenger, serviceHostApi)
|
|
PigeonGattCharacteristicHostApiSetup(binaryMessenger, characteristicHostApi)
|
|
PigeonGattDescriptorHostApiSetup(binaryMessenger, descriptorHostApi)
|
|
|
|
instances[KEY_CENTRAL_MANAGER_FLUTTER_API] = PigeonCentralManagerFlutterApi(binaryMessenger: binaryMessenger)
|
|
instances[KEY_PERIPHERAL_FLUTTER_API] = PigeonPeripheralFlutterApi(binaryMessenger: binaryMessenger)
|
|
instances[KEY_GATT_CHARACTERISTIC_FLUTTER_API] = PigeonGattCharacteristicFlutterApi(binaryMessenger: binaryMessenger)
|
|
}
|
|
}
|
|
|
|
let BLUETOOTH_LOW_ENERGY_ERROR = "BLUETOOTH_LOW_ENERGY_ERROR"
|
|
let KEY_CENTRAL_MANAGER_FLUTTER_API = "KEY_CENTRAL_MANAGER_FLUTTER_API"
|
|
let KEY_PERIPHERAL_FLUTTER_API = "KEY_PERIPHERAL_FLUTTER_API"
|
|
let KEY_GATT_CHARACTERISTIC_FLUTTER_API = "KEY_GATT_CHARACTERISTIC_FLUTTER_API"
|
|
let KEY_STATE_NUMBER = "KEY_STATE_NUMBER"
|
|
let KEY_COUNT = "KEY_COUNT"
|
|
let KEY_PERIPHERAL = "KEY_PERIPHERAL"
|
|
let KEY_SERVICE = "KEY_SERVICE"
|
|
let KEY_CHARACTERISTIC = "KEY_CHARACTERISTIC"
|
|
let KEY_DESCRIPTOR = "KEY_DESCRIPTOR"
|
|
let KEY_AUTHORIZE_COMPLETION = "KEY_AUTHORIZE_COMPLETION"
|
|
let KEY_CONNECT_COMPLETION = "KEY_CONNECT_COMPLETION"
|
|
let KEY_DISCONNECT_COMPLETION = "KEY_DISCONNECT_COMPLETION"
|
|
let KEY_DISCOVER_SERVICES_COMPLETION = "KEY_DISCOVER_SERVICES_COMPLETION"
|
|
let KEY_DISCOVER_CHARACTERISTICS_COMPLETION = "KEY_DISCOVER_CHARACTERISTICS_COMPLETION"
|
|
let KEY_DISCOVER_DESCRIPTORS_COMPLETION = "KEY_DISCOVER_DESCRIPTORS_COMPLETION"
|
|
let KEY_READ_COMPLETION = "KEY_READ_COMPLETION"
|
|
let KEY_WRITE_COMPLETION = "KEY_WRITE_COMPLETION"
|
|
let KEY_SET_NOTIFY_COMPLETION = "KEY_SET_NOTIFY_COMPLETION"
|
|
|
|
var instances = [String: Any]()
|
|
|
|
let central = CBCentralManager(delegate: centralManagerDelegate, queue: nil)
|
|
let centralManagerDelegate = MyCentralManagerDelegate()
|
|
let peripheralDelegate = MyPeripheralDelegate()
|
|
|
|
let centralHostApi = MyCentralManagerHostApi()
|
|
let peripherialHostApi = MyPeripheralHostApi()
|
|
let serviceHostApi = MyGattServiceHostApi()
|
|
let characteristicHostApi = MyGattCharacteristicHostApi()
|
|
let descriptorHostApi = MyGattDescriptorHostApi()
|
|
|
|
var centralFlutterApi: PigeonCentralManagerFlutterApi { return instances[KEY_CENTRAL_MANAGER_FLUTTER_API] as! PigeonCentralManagerFlutterApi }
|
|
var peripheralFlutterApi: PigeonPeripheralFlutterApi { return instances[KEY_PERIPHERAL_FLUTTER_API] as! PigeonPeripheralFlutterApi }
|
|
var characteristicFlutterApi: PigeonGattCharacteristicFlutterApi { return instances[KEY_GATT_CHARACTERISTIC_FLUTTER_API] as! PigeonGattCharacteristicFlutterApi }
|
|
|
|
func register(_ id:String) -> [String:Any] {
|
|
var items = instances[id] as? [String: Any] ?? [String: Any]()
|
|
var count = items[KEY_COUNT] as? Int ?? 0
|
|
count += 1
|
|
items[KEY_COUNT] = count
|
|
// This is a copy on write.
|
|
instances[id] = items
|
|
debugPrint("register: \(id)")
|
|
return items
|
|
}
|
|
|
|
func unregister(_ id: String) {
|
|
var items = instances[id] as! [String: Any]
|
|
var count = items[KEY_COUNT] as! Int
|
|
count -= 1
|
|
items[KEY_COUNT] = count
|
|
if count < 1 {
|
|
instances.removeValue(forKey: id)
|
|
debugPrint("unregister: \(id)")
|
|
} else {
|
|
// This is a copy on write.
|
|
instances[id] = items
|
|
}
|
|
}
|
|
|
|
extension CBCentralManager {
|
|
var stateNumber: Int {
|
|
if state == .unsupported {
|
|
return Proto_BluetoothState.unsupported.rawValue
|
|
} else if state == .poweredOn {
|
|
return Proto_BluetoothState.poweredOn.rawValue
|
|
} else {
|
|
return Proto_BluetoothState.poweredOff.rawValue
|
|
}
|
|
}
|
|
}
|
|
|
|
extension NSNumber {
|
|
var data: Data {
|
|
var source = self
|
|
return Data(bytes: &source, count: MemoryLayout<NSNumber>.size)
|
|
}
|
|
}
|
|
|
|
extension String {
|
|
var data: Data {
|
|
return data(using: String.Encoding.utf8)!
|
|
}
|
|
}
|
|
|
|
extension UInt16 {
|
|
var data: Data {
|
|
var source = self
|
|
return Data(bytes: &source, count: MemoryLayout<UInt16>.size)
|
|
}
|
|
}
|