Add service-data in advertisements (#207)
* Add service-data in advertisements * Fix windows serviceData parsing * Resolve Ai comments * Resolve Ai comments and validate service data * Cleanup and Update changelog
This commit is contained in:
@@ -213,6 +213,7 @@ struct UniversalBleScanResult: Hashable {
|
||||
var isPaired: Bool? = nil
|
||||
var rssi: Int64? = nil
|
||||
var manufacturerDataList: [UniversalManufacturerData]? = nil
|
||||
var serviceData: [String: FlutterStandardTypedData]? = nil
|
||||
var services: [String]? = nil
|
||||
var timestamp: Int64? = nil
|
||||
|
||||
@@ -224,8 +225,9 @@ struct UniversalBleScanResult: Hashable {
|
||||
let isPaired: Bool? = nilOrValue(pigeonVar_list[2])
|
||||
let rssi: Int64? = nilOrValue(pigeonVar_list[3])
|
||||
let manufacturerDataList: [UniversalManufacturerData]? = nilOrValue(pigeonVar_list[4])
|
||||
let services: [String]? = nilOrValue(pigeonVar_list[5])
|
||||
let timestamp: Int64? = nilOrValue(pigeonVar_list[6])
|
||||
let serviceData: [String: FlutterStandardTypedData]? = nilOrValue(pigeonVar_list[5])
|
||||
let services: [String]? = nilOrValue(pigeonVar_list[6])
|
||||
let timestamp: Int64? = nilOrValue(pigeonVar_list[7])
|
||||
|
||||
return UniversalBleScanResult(
|
||||
deviceId: deviceId,
|
||||
@@ -233,6 +235,7 @@ struct UniversalBleScanResult: Hashable {
|
||||
isPaired: isPaired,
|
||||
rssi: rssi,
|
||||
manufacturerDataList: manufacturerDataList,
|
||||
serviceData: serviceData,
|
||||
services: services,
|
||||
timestamp: timestamp
|
||||
)
|
||||
@@ -244,6 +247,7 @@ struct UniversalBleScanResult: Hashable {
|
||||
isPaired,
|
||||
rssi,
|
||||
manufacturerDataList,
|
||||
serviceData,
|
||||
services,
|
||||
timestamp,
|
||||
]
|
||||
|
||||
@@ -134,7 +134,7 @@ private class BleCentralDarwin: NSObject, UniversalBlePlatformChannel, CBCentral
|
||||
let peripheral = try deviceId.getPeripheral(manager: manager)
|
||||
peripheral.delegate = self
|
||||
let shouldAutoConnect = autoConnect ?? false
|
||||
|
||||
|
||||
if shouldAutoConnect {
|
||||
autoConnectDevices.insert(deviceId)
|
||||
if #available(iOS 17.0, macOS 14.0, watchOS 10.0, tvOS 17.0, *) {
|
||||
@@ -148,9 +148,9 @@ private class BleCentralDarwin: NSObject, UniversalBlePlatformChannel, CBCentral
|
||||
// (e.g., in central manager delegate callbacks).
|
||||
UniversalBleLogger.shared.logInfo(
|
||||
"autoConnect requested for device \(deviceId), " +
|
||||
"but automatic reconnection via CBConnectPeripheralOptionEnableAutoReconnect " +
|
||||
"is only available on iOS 17+/macOS 14+/watchOS 10+/tvOS 17+. " +
|
||||
"On this OS version, reconnections must be handled manually."
|
||||
"but automatic reconnection via CBConnectPeripheralOptionEnableAutoReconnect " +
|
||||
"is only available on iOS 17+/macOS 14+/watchOS 10+/tvOS 17+. " +
|
||||
"On this OS version, reconnections must be handled manually."
|
||||
)
|
||||
manager.connect(peripheral)
|
||||
}
|
||||
@@ -410,6 +410,7 @@ private class BleCentralDarwin: NSObject, UniversalBlePlatformChannel, CBCentral
|
||||
return UniversalBleScanResult(
|
||||
deviceId: id,
|
||||
name: name,
|
||||
serviceData: nil,
|
||||
timestamp: Int64(Date().timeIntervalSince1970 * 1000)
|
||||
)
|
||||
}))
|
||||
@@ -437,6 +438,7 @@ private class BleCentralDarwin: NSObject, UniversalBlePlatformChannel, CBCentral
|
||||
// Extract manufacturer data and service UUIDs from the advertisement data
|
||||
let manufacturerData = advertisementData[CBAdvertisementDataManufacturerDataKey] as? Data
|
||||
let services = (advertisementData[CBAdvertisementDataServiceUUIDsKey] as? [CBUUID])
|
||||
let serviceDataDict = advertisementData[CBAdvertisementDataServiceDataKey] as? [CBUUID: Data]
|
||||
|
||||
var manufacturerDataList: [UniversalManufacturerData] = []
|
||||
var universalManufacturerData: UniversalManufacturerData? = nil
|
||||
@@ -448,6 +450,13 @@ private class BleCentralDarwin: NSObject, UniversalBlePlatformChannel, CBCentral
|
||||
manufacturerDataList.append(universalManufacturerData!)
|
||||
}
|
||||
|
||||
var serviceData: [String: FlutterStandardTypedData]? = nil
|
||||
if let serviceDataDict = serviceDataDict {
|
||||
serviceData = Dictionary(uniqueKeysWithValues: serviceDataDict.map { uuid, data in
|
||||
(uuid.uuidStr, FlutterStandardTypedData(bytes: data))
|
||||
})
|
||||
}
|
||||
|
||||
let advertisedName = advertisementData[CBAdvertisementDataLocalNameKey] as? String
|
||||
let displayName = advertisedName ?? peripheral.name
|
||||
advertisementNameCache[peripheral.uuid.uuidString] = displayName
|
||||
@@ -463,6 +472,7 @@ private class BleCentralDarwin: NSObject, UniversalBlePlatformChannel, CBCentral
|
||||
isPaired: nil,
|
||||
rssi: RSSI as? Int64,
|
||||
manufacturerDataList: manufacturerDataList,
|
||||
serviceData: serviceData,
|
||||
services: services?.map { $0.uuidStr },
|
||||
timestamp: Int64(Date().timeIntervalSince1970 * 1000)
|
||||
)) { _ in }
|
||||
@@ -481,18 +491,18 @@ private class BleCentralDarwin: NSObject, UniversalBlePlatformChannel, CBCentral
|
||||
public func centralManager(
|
||||
_: CBCentralManager,
|
||||
didDisconnectPeripheral peripheral: CBPeripheral,
|
||||
timestamp: CFAbsoluteTime,
|
||||
timestamp _: CFAbsoluteTime,
|
||||
isReconnecting: Bool,
|
||||
error: Error?
|
||||
) {
|
||||
let deviceId = peripheral.uuid.uuidString
|
||||
|
||||
|
||||
if #available(iOS 17.0, macOS 14.0, watchOS 10.0, tvOS 17.0, *) {
|
||||
if isReconnecting {
|
||||
return
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
handlePeripheralDisconnection(deviceId: deviceId, error: error)
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user