react-native-ble-nitro 1.0.0-beta.9 → 1.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/BleNitro.podspec +39 -0
- package/LICENSE +1 -1
- package/README.md +273 -77
- package/ios/BleNitroBleManager.swift +426 -458
- package/ios/BlePeripheralDelegate.swift +174 -0
- package/lib/commonjs/index.d.ts +174 -10
- package/lib/commonjs/index.d.ts.map +1 -1
- package/lib/commonjs/index.js +461 -38
- package/lib/commonjs/index.js.map +1 -1
- package/lib/commonjs/specs/NativeBleNitro.d.ts +5 -0
- package/lib/commonjs/specs/NativeBleNitro.d.ts.map +1 -0
- package/lib/commonjs/{utils/index.js → specs/NativeBleNitro.js} +6 -3
- package/lib/commonjs/specs/NativeBleNitro.js.map +1 -0
- package/lib/commonjs/specs/NativeBleNitro.nitro.d.ts +69 -0
- package/lib/commonjs/specs/NativeBleNitro.nitro.d.ts.map +1 -0
- package/lib/commonjs/specs/NativeBleNitro.nitro.js +14 -0
- package/lib/commonjs/specs/NativeBleNitro.nitro.js.map +1 -0
- package/lib/index.d.ts +174 -10
- package/lib/index.js +456 -16
- package/lib/specs/NativeBleNitro.d.ts +4 -0
- package/lib/specs/NativeBleNitro.js +5 -0
- package/lib/specs/NativeBleNitro.nitro.d.ts +68 -0
- package/lib/specs/NativeBleNitro.nitro.js +10 -0
- package/nitro.json +1 -1
- package/nitrogen/generated/android/BleNitro+autolinking.cmake +2 -10
- package/nitrogen/generated/android/BleNitroOnLoad.cpp +25 -22
- package/nitrogen/generated/android/c++/JBLEDevice.hpp +95 -0
- package/nitrogen/generated/android/c++/{JState.hpp → JBLEState.hpp} +22 -22
- package/nitrogen/generated/android/c++/JFunc_void_BLEDevice.hpp +82 -0
- package/nitrogen/generated/android/c++/JFunc_void_BLEState.hpp +76 -0
- package/nitrogen/generated/android/c++/JFunc_void_bool.hpp +74 -0
- package/nitrogen/generated/android/c++/JFunc_void_bool_std__string.hpp +75 -0
- package/nitrogen/generated/android/c++/JFunc_void_bool_std__string_std__string.hpp +75 -0
- package/nitrogen/generated/android/c++/JFunc_void_bool_std__vector_double__std__string.hpp +86 -0
- package/nitrogen/generated/android/c++/JFunc_void_std__string_bool_std__string.hpp +75 -0
- package/nitrogen/generated/android/c++/JFunc_void_std__string_std__vector_double_.hpp +86 -0
- package/nitrogen/generated/android/c++/JFunc_void_std__vector_BLEDevice_.hpp +99 -0
- package/nitrogen/generated/android/c++/JFunc_void_std__vector_std__string_.hpp +93 -0
- package/nitrogen/generated/android/c++/JHybridNativeBleNitroSpec.cpp +171 -0
- package/nitrogen/generated/android/c++/JHybridNativeBleNitroSpec.hpp +83 -0
- package/nitrogen/generated/android/c++/JManufacturerData.hpp +73 -0
- package/nitrogen/generated/android/c++/JManufacturerDataEntry.hpp +68 -0
- package/nitrogen/generated/android/c++/JScanFilter.hpp +79 -0
- package/nitrogen/generated/android/kotlin/com/margelo/nitro/co/zyke/ble/BLEDevice.kt +44 -0
- package/nitrogen/generated/android/kotlin/com/margelo/nitro/co/zyke/ble/{LogLevel.kt → BLEState.kt} +9 -13
- package/nitrogen/generated/android/kotlin/com/margelo/nitro/co/zyke/ble/{Func_void_std__optional_NativeBleError__std__optional_NativeDevice_.kt → Func_void_BLEDevice.kt} +15 -14
- package/nitrogen/generated/android/kotlin/com/margelo/nitro/co/zyke/ble/{Func_void.kt → Func_void_BLEState.kt} +15 -14
- package/nitrogen/generated/android/kotlin/com/margelo/nitro/co/zyke/ble/{Func_void_State.kt → Func_void_bool.kt} +15 -14
- package/nitrogen/generated/android/kotlin/com/margelo/nitro/co/zyke/ble/{Func_void_std__optional_NativeBleError__std__optional_NativeCharacteristic_.kt → Func_void_bool_std__string.kt} +15 -14
- package/nitrogen/generated/android/kotlin/com/margelo/nitro/co/zyke/ble/Func_void_bool_std__string_std__string.kt +81 -0
- package/nitrogen/generated/android/kotlin/com/margelo/nitro/co/zyke/ble/Func_void_bool_std__vector_double__std__string.kt +81 -0
- package/nitrogen/generated/android/kotlin/com/margelo/nitro/co/zyke/ble/Func_void_std__string_bool_std__string.kt +81 -0
- package/nitrogen/generated/android/kotlin/com/margelo/nitro/co/zyke/ble/Func_void_std__string_std__vector_double_.kt +81 -0
- package/nitrogen/generated/android/kotlin/com/margelo/nitro/co/zyke/ble/Func_void_std__vector_BLEDevice_.kt +81 -0
- package/nitrogen/generated/android/kotlin/com/margelo/nitro/co/zyke/ble/Func_void_std__vector_std__string_.kt +81 -0
- package/nitrogen/generated/android/kotlin/com/margelo/nitro/co/zyke/ble/HybridNativeBleNitroSpec.kt +223 -0
- package/nitrogen/generated/android/kotlin/com/margelo/nitro/co/zyke/ble/{ServiceDataEntry.kt → ManufacturerData.kt} +7 -5
- package/nitrogen/generated/android/kotlin/com/margelo/nitro/co/zyke/ble/{ConnectionOptions.kt → ManufacturerDataEntry.kt} +10 -6
- package/nitrogen/generated/android/kotlin/com/margelo/nitro/co/zyke/ble/{NativeService.kt → ScanFilter.kt} +13 -7
- package/nitrogen/generated/ios/BleNitro-Swift-Cxx-Bridge.cpp +67 -175
- package/nitrogen/generated/ios/BleNitro-Swift-Cxx-Bridge.hpp +205 -867
- package/nitrogen/generated/ios/BleNitro-Swift-Cxx-Umbrella.hpp +20 -88
- package/nitrogen/generated/ios/BleNitroAutolinking.mm +3 -3
- package/nitrogen/generated/ios/BleNitroAutolinking.swift +4 -4
- package/nitrogen/generated/ios/c++/{HybridCharacteristicSpecSwift.cpp → HybridNativeBleNitroSpecSwift.cpp} +2 -2
- package/nitrogen/generated/ios/c++/HybridNativeBleNitroSpecSwift.hpp +205 -0
- package/nitrogen/generated/ios/swift/BLEDevice.swift +102 -0
- package/nitrogen/generated/ios/swift/{State.swift → BLEState.swift} +6 -6
- package/nitrogen/generated/ios/swift/Func_void.swift +1 -0
- package/nitrogen/generated/ios/swift/{Func_void_State.swift → Func_void_BLEDevice.swift} +12 -11
- package/nitrogen/generated/ios/swift/{Func_void_LogLevel.swift → Func_void_BLEState.swift} +12 -11
- package/nitrogen/generated/ios/swift/Func_void_bool.swift +6 -5
- package/nitrogen/generated/ios/swift/{Func_void_NativeDescriptor.swift → Func_void_bool_std__string.swift} +12 -11
- package/nitrogen/generated/ios/swift/{Func_void_std__vector_NativeCharacteristic_.swift → Func_void_bool_std__string_std__string.swift} +12 -11
- package/nitrogen/generated/ios/swift/Func_void_bool_std__vector_double__std__string.swift +47 -0
- package/nitrogen/generated/ios/swift/Func_void_std__exception_ptr.swift +1 -0
- package/nitrogen/generated/ios/swift/{Func_void_NativeDevice.swift → Func_void_std__string_bool_std__string.swift} +12 -11
- package/nitrogen/generated/ios/swift/{Func_void_std__optional_BleRestoredState_.swift → Func_void_std__string_std__vector_double_.swift} +12 -17
- package/nitrogen/generated/ios/swift/{Func_void_NativeCharacteristic.swift → Func_void_std__vector_BLEDevice_.swift} +12 -11
- package/nitrogen/generated/ios/swift/{Func_void_std__vector_NativeDevice_.swift → Func_void_std__vector_std__string_.swift} +12 -11
- package/nitrogen/generated/ios/swift/HybridNativeBleNitroSpec.swift +68 -0
- package/nitrogen/generated/ios/swift/HybridNativeBleNitroSpec_cxx.swift +485 -0
- package/nitrogen/generated/ios/swift/ManufacturerData.swift +47 -0
- package/nitrogen/generated/ios/swift/ManufacturerDataEntry.swift +58 -0
- package/nitrogen/generated/ios/swift/ScanFilter.swift +69 -0
- package/nitrogen/generated/shared/c++/BLEDevice.hpp +90 -0
- package/nitrogen/generated/shared/c++/{State.hpp → BLEState.hpp} +13 -15
- package/nitrogen/generated/shared/c++/HybridNativeBleNitroSpec.cpp +40 -0
- package/nitrogen/generated/shared/c++/HybridNativeBleNitroSpec.hpp +93 -0
- package/nitrogen/generated/shared/c++/ManufacturerData.hpp +69 -0
- package/nitrogen/generated/shared/c++/{ServiceDataEntry.hpp → ManufacturerDataEntry.hpp} +19 -20
- package/nitrogen/generated/shared/c++/ScanFilter.hpp +76 -0
- package/package.json +9 -11
- package/react-native.config.js +2 -7
- package/src/__tests__/index.test.ts +188 -0
- package/src/index.ts +604 -45
- package/src/specs/NativeBleNitro.nitro.ts +84 -0
- package/src/specs/NativeBleNitro.ts +8 -0
- package/android/build.gradle +0 -58
- package/android/src/main/AndroidManifest.xml +0 -23
- package/android/src/main/kotlin/com/margelo/nitro/co/zyke/ble/BleNitroBleManager.kt +0 -760
- package/ios/BleNitro.podspec +0 -44
- package/ios/BleNitroModule.swift +0 -24
- package/lib/BleManagerCompatFactory.d.ts +0 -55
- package/lib/BleManagerCompatFactory.js +0 -194
- package/lib/BleManagerFactory.d.ts +0 -30
- package/lib/BleManagerFactory.js +0 -73
- package/lib/commonjs/BleManagerCompatFactory.d.ts +0 -56
- package/lib/commonjs/BleManagerCompatFactory.d.ts.map +0 -1
- package/lib/commonjs/BleManagerCompatFactory.js +0 -201
- package/lib/commonjs/BleManagerCompatFactory.js.map +0 -1
- package/lib/commonjs/BleManagerFactory.d.ts +0 -31
- package/lib/commonjs/BleManagerFactory.d.ts.map +0 -1
- package/lib/commonjs/BleManagerFactory.js +0 -81
- package/lib/commonjs/BleManagerFactory.js.map +0 -1
- package/lib/commonjs/compatibility/constants.d.ts +0 -50
- package/lib/commonjs/compatibility/constants.d.ts.map +0 -1
- package/lib/commonjs/compatibility/constants.js +0 -58
- package/lib/commonjs/compatibility/constants.js.map +0 -1
- package/lib/commonjs/compatibility/deviceWrapper.d.ts +0 -100
- package/lib/commonjs/compatibility/deviceWrapper.d.ts.map +0 -1
- package/lib/commonjs/compatibility/deviceWrapper.js +0 -268
- package/lib/commonjs/compatibility/deviceWrapper.js.map +0 -1
- package/lib/commonjs/compatibility/enums.d.ts +0 -39
- package/lib/commonjs/compatibility/enums.d.ts.map +0 -1
- package/lib/commonjs/compatibility/enums.js +0 -179
- package/lib/commonjs/compatibility/enums.js.map +0 -1
- package/lib/commonjs/compatibility/index.d.ts +0 -13
- package/lib/commonjs/compatibility/index.d.ts.map +0 -1
- package/lib/commonjs/compatibility/index.js +0 -41
- package/lib/commonjs/compatibility/index.js.map +0 -1
- package/lib/commonjs/compatibility/serviceData.d.ts +0 -52
- package/lib/commonjs/compatibility/serviceData.d.ts.map +0 -1
- package/lib/commonjs/compatibility/serviceData.js +0 -80
- package/lib/commonjs/compatibility/serviceData.js.map +0 -1
- package/lib/commonjs/errors/BleError.d.ts +0 -60
- package/lib/commonjs/errors/BleError.d.ts.map +0 -1
- package/lib/commonjs/errors/BleError.js +0 -125
- package/lib/commonjs/errors/BleError.js.map +0 -1
- package/lib/commonjs/specs/BleManager.nitro.d.ts +0 -45
- package/lib/commonjs/specs/BleManager.nitro.d.ts.map +0 -1
- package/lib/commonjs/specs/BleManager.nitro.js +0 -3
- package/lib/commonjs/specs/BleManager.nitro.js.map +0 -1
- package/lib/commonjs/specs/Characteristic.nitro.d.ts +0 -27
- package/lib/commonjs/specs/Characteristic.nitro.d.ts.map +0 -1
- package/lib/commonjs/specs/Characteristic.nitro.js +0 -3
- package/lib/commonjs/specs/Characteristic.nitro.js.map +0 -1
- package/lib/commonjs/specs/Descriptor.nitro.d.ts +0 -18
- package/lib/commonjs/specs/Descriptor.nitro.d.ts.map +0 -1
- package/lib/commonjs/specs/Descriptor.nitro.js +0 -3
- package/lib/commonjs/specs/Descriptor.nitro.js.map +0 -1
- package/lib/commonjs/specs/Device.nitro.d.ts +0 -38
- package/lib/commonjs/specs/Device.nitro.d.ts.map +0 -1
- package/lib/commonjs/specs/Device.nitro.js +0 -3
- package/lib/commonjs/specs/Device.nitro.js.map +0 -1
- package/lib/commonjs/specs/Service.nitro.d.ts +0 -20
- package/lib/commonjs/specs/Service.nitro.d.ts.map +0 -1
- package/lib/commonjs/specs/Service.nitro.js +0 -3
- package/lib/commonjs/specs/Service.nitro.js.map +0 -1
- package/lib/commonjs/specs/types.d.ts +0 -229
- package/lib/commonjs/specs/types.d.ts.map +0 -1
- package/lib/commonjs/specs/types.js +0 -150
- package/lib/commonjs/specs/types.js.map +0 -1
- package/lib/commonjs/utils/base64.d.ts +0 -26
- package/lib/commonjs/utils/base64.d.ts.map +0 -1
- package/lib/commonjs/utils/base64.js +0 -88
- package/lib/commonjs/utils/base64.js.map +0 -1
- package/lib/commonjs/utils/index.d.ts +0 -3
- package/lib/commonjs/utils/index.d.ts.map +0 -1
- package/lib/commonjs/utils/index.js.map +0 -1
- package/lib/commonjs/utils/uuid.d.ts +0 -10
- package/lib/commonjs/utils/uuid.d.ts.map +0 -1
- package/lib/commonjs/utils/uuid.js +0 -41
- package/lib/commonjs/utils/uuid.js.map +0 -1
- package/lib/compatibility/constants.d.ts +0 -49
- package/lib/compatibility/constants.js +0 -50
- package/lib/compatibility/deviceWrapper.d.ts +0 -99
- package/lib/compatibility/deviceWrapper.js +0 -259
- package/lib/compatibility/enums.d.ts +0 -38
- package/lib/compatibility/enums.js +0 -159
- package/lib/compatibility/index.d.ts +0 -12
- package/lib/compatibility/index.js +0 -12
- package/lib/compatibility/serviceData.d.ts +0 -51
- package/lib/compatibility/serviceData.js +0 -70
- package/lib/errors/BleError.d.ts +0 -59
- package/lib/errors/BleError.js +0 -120
- package/lib/specs/BleManager.nitro.d.ts +0 -44
- package/lib/specs/BleManager.nitro.js +0 -1
- package/lib/specs/Characteristic.nitro.d.ts +0 -26
- package/lib/specs/Characteristic.nitro.js +0 -1
- package/lib/specs/Descriptor.nitro.d.ts +0 -17
- package/lib/specs/Descriptor.nitro.js +0 -1
- package/lib/specs/Device.nitro.d.ts +0 -37
- package/lib/specs/Device.nitro.js +0 -1
- package/lib/specs/Service.nitro.d.ts +0 -19
- package/lib/specs/Service.nitro.js +0 -1
- package/lib/specs/types.d.ts +0 -228
- package/lib/specs/types.js +0 -146
- package/lib/utils/base64.d.ts +0 -25
- package/lib/utils/base64.js +0 -80
- package/lib/utils/index.d.ts +0 -2
- package/lib/utils/index.js +0 -2
- package/lib/utils/uuid.d.ts +0 -9
- package/lib/utils/uuid.js +0 -37
- package/nitrogen/generated/android/c++/JBleATTErrorCode.hpp +0 -107
- package/nitrogen/generated/android/c++/JBleAndroidErrorCode.hpp +0 -101
- package/nitrogen/generated/android/c++/JBleErrorCode.hpp +0 -170
- package/nitrogen/generated/android/c++/JBleIOSErrorCode.hpp +0 -92
- package/nitrogen/generated/android/c++/JBleManagerNitroOptions.hpp +0 -54
- package/nitrogen/generated/android/c++/JBleRestoredState.hpp +0 -76
- package/nitrogen/generated/android/c++/JCharacteristicSubscriptionType.hpp +0 -59
- package/nitrogen/generated/android/c++/JConnectionOptions.hpp +0 -61
- package/nitrogen/generated/android/c++/JConnectionPriority.hpp +0 -62
- package/nitrogen/generated/android/c++/JFunc_void.hpp +0 -74
- package/nitrogen/generated/android/c++/JFunc_void_State.hpp +0 -76
- package/nitrogen/generated/android/c++/JFunc_void_std__optional_NativeBleError__std__optional_NativeCharacteristic_.hpp +0 -88
- package/nitrogen/generated/android/c++/JFunc_void_std__optional_NativeBleError__std__optional_NativeDevice_.hpp +0 -91
- package/nitrogen/generated/android/c++/JHybridBleManagerSpec.cpp +0 -653
- package/nitrogen/generated/android/c++/JHybridBleManagerSpec.hpp +0 -92
- package/nitrogen/generated/android/c++/JHybridCharacteristicSpec.cpp +0 -253
- package/nitrogen/generated/android/c++/JHybridCharacteristicSpec.hpp +0 -79
- package/nitrogen/generated/android/c++/JHybridDescriptorSpec.cpp +0 -115
- package/nitrogen/generated/android/c++/JHybridDescriptorSpec.hpp +0 -70
- package/nitrogen/generated/android/c++/JHybridDeviceSpec.cpp +0 -476
- package/nitrogen/generated/android/c++/JHybridDeviceSpec.hpp +0 -90
- package/nitrogen/generated/android/c++/JHybridServiceSpec.cpp +0 -232
- package/nitrogen/generated/android/c++/JHybridServiceSpec.hpp +0 -72
- package/nitrogen/generated/android/c++/JLogLevel.hpp +0 -71
- package/nitrogen/generated/android/c++/JNativeBleError.hpp +0 -98
- package/nitrogen/generated/android/c++/JNativeCharacteristic.hpp +0 -98
- package/nitrogen/generated/android/c++/JNativeDescriptor.hpp +0 -82
- package/nitrogen/generated/android/c++/JNativeDevice.hpp +0 -173
- package/nitrogen/generated/android/c++/JNativeService.hpp +0 -65
- package/nitrogen/generated/android/c++/JScanCallbackType.hpp +0 -62
- package/nitrogen/generated/android/c++/JScanMode.hpp +0 -65
- package/nitrogen/generated/android/c++/JScanOptions.hpp +0 -69
- package/nitrogen/generated/android/c++/JServiceDataEntry.hpp +0 -57
- package/nitrogen/generated/android/c++/JSubscription.hpp +0 -64
- package/nitrogen/generated/android/kotlin/com/margelo/nitro/co/zyke/ble/BleATTErrorCode.kt +0 -41
- package/nitrogen/generated/android/kotlin/com/margelo/nitro/co/zyke/ble/BleAndroidErrorCode.kt +0 -39
- package/nitrogen/generated/android/kotlin/com/margelo/nitro/co/zyke/ble/BleErrorCode.kt +0 -62
- package/nitrogen/generated/android/kotlin/com/margelo/nitro/co/zyke/ble/BleIOSErrorCode.kt +0 -36
- package/nitrogen/generated/android/kotlin/com/margelo/nitro/co/zyke/ble/BleManagerNitroOptions.kt +0 -26
- package/nitrogen/generated/android/kotlin/com/margelo/nitro/co/zyke/ble/BleRestoredState.kt +0 -26
- package/nitrogen/generated/android/kotlin/com/margelo/nitro/co/zyke/ble/CharacteristicSubscriptionType.kt +0 -25
- package/nitrogen/generated/android/kotlin/com/margelo/nitro/co/zyke/ble/ConnectionPriority.kt +0 -26
- package/nitrogen/generated/android/kotlin/com/margelo/nitro/co/zyke/ble/HybridBleManagerSpec.kt +0 -192
- package/nitrogen/generated/android/kotlin/com/margelo/nitro/co/zyke/ble/HybridCharacteristicSpec.kt +0 -127
- package/nitrogen/generated/android/kotlin/com/margelo/nitro/co/zyke/ble/HybridDescriptorSpec.kt +0 -86
- package/nitrogen/generated/android/kotlin/com/margelo/nitro/co/zyke/ble/HybridDeviceSpec.kt +0 -176
- package/nitrogen/generated/android/kotlin/com/margelo/nitro/co/zyke/ble/HybridServiceSpec.kt +0 -99
- package/nitrogen/generated/android/kotlin/com/margelo/nitro/co/zyke/ble/NativeBleError.kt +0 -35
- package/nitrogen/generated/android/kotlin/com/margelo/nitro/co/zyke/ble/NativeCharacteristic.kt +0 -37
- package/nitrogen/generated/android/kotlin/com/margelo/nitro/co/zyke/ble/NativeDescriptor.kt +0 -33
- package/nitrogen/generated/android/kotlin/com/margelo/nitro/co/zyke/ble/NativeDevice.kt +0 -38
- package/nitrogen/generated/android/kotlin/com/margelo/nitro/co/zyke/ble/ScanCallbackType.kt +0 -26
- package/nitrogen/generated/android/kotlin/com/margelo/nitro/co/zyke/ble/ScanMode.kt +0 -27
- package/nitrogen/generated/android/kotlin/com/margelo/nitro/co/zyke/ble/ScanOptions.kt +0 -29
- package/nitrogen/generated/android/kotlin/com/margelo/nitro/co/zyke/ble/State.kt +0 -29
- package/nitrogen/generated/android/kotlin/com/margelo/nitro/co/zyke/ble/Subscription.kt +0 -30
- package/nitrogen/generated/ios/c++/HybridBleManagerSpecSwift.cpp +0 -11
- package/nitrogen/generated/ios/c++/HybridBleManagerSpecSwift.hpp +0 -377
- package/nitrogen/generated/ios/c++/HybridCharacteristicSpecSwift.hpp +0 -192
- package/nitrogen/generated/ios/c++/HybridDescriptorSpecSwift.cpp +0 -11
- package/nitrogen/generated/ios/c++/HybridDescriptorSpecSwift.hpp +0 -112
- package/nitrogen/generated/ios/c++/HybridDeviceSpecSwift.cpp +0 -11
- package/nitrogen/generated/ios/c++/HybridDeviceSpecSwift.hpp +0 -294
- package/nitrogen/generated/ios/c++/HybridServiceSpecSwift.cpp +0 -11
- package/nitrogen/generated/ios/c++/HybridServiceSpecSwift.hpp +0 -170
- package/nitrogen/generated/ios/swift/BleATTErrorCode.swift +0 -104
- package/nitrogen/generated/ios/swift/BleAndroidErrorCode.swift +0 -96
- package/nitrogen/generated/ios/swift/BleErrorCode.swift +0 -188
- package/nitrogen/generated/ios/swift/BleIOSErrorCode.swift +0 -84
- package/nitrogen/generated/ios/swift/BleManagerNitroOptions.swift +0 -53
- package/nitrogen/generated/ios/swift/BleRestoredState.swift +0 -47
- package/nitrogen/generated/ios/swift/CharacteristicSubscriptionType.swift +0 -40
- package/nitrogen/generated/ios/swift/ConnectionOptions.swift +0 -57
- package/nitrogen/generated/ios/swift/ConnectionPriority.swift +0 -44
- package/nitrogen/generated/ios/swift/Func_void_std__optional_NativeBleError__std__optional_NativeCharacteristic_.swift +0 -58
- package/nitrogen/generated/ios/swift/Func_void_std__optional_NativeBleError__std__optional_NativeDevice_.swift +0 -58
- package/nitrogen/generated/ios/swift/Func_void_std__shared_ptr_margelo__nitro__co__zyke__ble__HybridCharacteristicSpec_.swift +0 -50
- package/nitrogen/generated/ios/swift/Func_void_std__shared_ptr_margelo__nitro__co__zyke__ble__HybridDescriptorSpec_.swift +0 -50
- package/nitrogen/generated/ios/swift/Func_void_std__vector_NativeDescriptor_.swift +0 -46
- package/nitrogen/generated/ios/swift/Func_void_std__vector_NativeService_.swift +0 -46
- package/nitrogen/generated/ios/swift/HybridBleManagerSpec.swift +0 -78
- package/nitrogen/generated/ios/swift/HybridBleManagerSpec_cxx.swift +0 -852
- package/nitrogen/generated/ios/swift/HybridCharacteristicSpec.swift +0 -65
- package/nitrogen/generated/ios/swift/HybridCharacteristicSpec_cxx.swift +0 -384
- package/nitrogen/generated/ios/swift/HybridDescriptorSpec.swift +0 -56
- package/nitrogen/generated/ios/swift/HybridDescriptorSpec_cxx.swift +0 -218
- package/nitrogen/generated/ios/swift/HybridDeviceSpec.swift +0 -76
- package/nitrogen/generated/ios/swift/HybridDeviceSpec_cxx.swift +0 -702
- package/nitrogen/generated/ios/swift/HybridServiceSpec.swift +0 -58
- package/nitrogen/generated/ios/swift/HybridServiceSpec_cxx.swift +0 -338
- package/nitrogen/generated/ios/swift/LogLevel.swift +0 -56
- package/nitrogen/generated/ios/swift/NativeBleError.swift +0 -278
- package/nitrogen/generated/ios/swift/NativeCharacteristic.swift +0 -174
- package/nitrogen/generated/ios/swift/NativeDescriptor.swift +0 -130
- package/nitrogen/generated/ios/swift/NativeDevice.swift +0 -377
- package/nitrogen/generated/ios/swift/NativeService.swift +0 -68
- package/nitrogen/generated/ios/swift/ScanCallbackType.swift +0 -44
- package/nitrogen/generated/ios/swift/ScanMode.swift +0 -48
- package/nitrogen/generated/ios/swift/ScanOptions.swift +0 -116
- package/nitrogen/generated/ios/swift/ServiceDataEntry.swift +0 -46
- package/nitrogen/generated/ios/swift/Subscription.swift +0 -46
- package/nitrogen/generated/shared/c++/BleATTErrorCode.hpp +0 -80
- package/nitrogen/generated/shared/c++/BleAndroidErrorCode.hpp +0 -78
- package/nitrogen/generated/shared/c++/BleErrorCode.hpp +0 -101
- package/nitrogen/generated/shared/c++/BleIOSErrorCode.hpp +0 -75
- package/nitrogen/generated/shared/c++/BleManagerNitroOptions.hpp +0 -70
- package/nitrogen/generated/shared/c++/BleRestoredState.hpp +0 -71
- package/nitrogen/generated/shared/c++/CharacteristicSubscriptionType.hpp +0 -64
- package/nitrogen/generated/shared/c++/ConnectionOptions.hpp +0 -77
- package/nitrogen/generated/shared/c++/ConnectionPriority.hpp +0 -65
- package/nitrogen/generated/shared/c++/HybridBleManagerSpec.cpp +0 -51
- package/nitrogen/generated/shared/c++/HybridBleManagerSpec.hpp +0 -137
- package/nitrogen/generated/shared/c++/HybridCharacteristicSpec.cpp +0 -39
- package/nitrogen/generated/shared/c++/HybridCharacteristicSpec.hpp +0 -101
- package/nitrogen/generated/shared/c++/HybridDescriptorSpec.cpp +0 -30
- package/nitrogen/generated/shared/c++/HybridDescriptorSpec.hpp +0 -75
- package/nitrogen/generated/shared/c++/HybridDeviceSpec.cpp +0 -50
- package/nitrogen/generated/shared/c++/HybridDeviceSpec.hpp +0 -123
- package/nitrogen/generated/shared/c++/HybridServiceSpec.cpp +0 -32
- package/nitrogen/generated/shared/c++/HybridServiceSpec.hpp +0 -90
- package/nitrogen/generated/shared/c++/LogLevel.hpp +0 -68
- package/nitrogen/generated/shared/c++/NativeBleError.hpp +0 -117
- package/nitrogen/generated/shared/c++/NativeCharacteristic.hpp +0 -114
- package/nitrogen/generated/shared/c++/NativeDescriptor.hpp +0 -98
- package/nitrogen/generated/shared/c++/NativeDevice.hpp +0 -121
- package/nitrogen/generated/shared/c++/NativeService.hpp +0 -81
- package/nitrogen/generated/shared/c++/ScanCallbackType.hpp +0 -65
- package/nitrogen/generated/shared/c++/ScanMode.hpp +0 -66
- package/nitrogen/generated/shared/c++/ScanOptions.hpp +0 -86
- package/nitrogen/generated/shared/c++/Subscription.hpp +0 -69
- package/src/BleManagerCompatFactory.ts +0 -371
- package/src/BleManagerFactory.ts +0 -93
- package/src/__tests__/BleManager.test.ts +0 -327
- package/src/__tests__/compatibility/deviceWrapper.test.ts +0 -563
- package/src/__tests__/compatibility/enums.test.ts +0 -264
- package/src/compatibility/constants.ts +0 -71
- package/src/compatibility/deviceWrapper.ts +0 -427
- package/src/compatibility/enums.ts +0 -190
- package/src/compatibility/index.ts +0 -32
- package/src/compatibility/serviceData.ts +0 -85
- package/src/errors/BleError.ts +0 -193
- package/src/specs/BleManager.nitro.ts +0 -165
- package/src/specs/Characteristic.nitro.ts +0 -61
- package/src/specs/Descriptor.nitro.ts +0 -28
- package/src/specs/Device.nitro.ts +0 -104
- package/src/specs/Service.nitro.ts +0 -64
- package/src/specs/types.ts +0 -259
- package/src/utils/base64.ts +0 -80
- package/src/utils/index.ts +0 -2
- package/src/utils/uuid.ts +0 -45
|
@@ -1,575 +1,543 @@
|
|
|
1
|
-
///
|
|
2
|
-
/// BleNitroBleManager.swift
|
|
3
|
-
/// React Native BLE Nitro - iOS Implementation
|
|
4
|
-
/// Copyright © 2025 Zyke (https://zyke.co)
|
|
5
|
-
///
|
|
6
|
-
|
|
7
1
|
import Foundation
|
|
8
2
|
import CoreBluetooth
|
|
9
3
|
import NitroModules
|
|
10
4
|
|
|
11
5
|
/**
|
|
12
|
-
*
|
|
13
|
-
* Implements the
|
|
6
|
+
* iOS implementation of the BLE Nitro Manager
|
|
7
|
+
* Implements the HybridNativeBleNitroSpec protocol for Core Bluetooth operations
|
|
14
8
|
*/
|
|
15
|
-
public class BleNitroBleManager:
|
|
9
|
+
public class BleNitroBleManager: HybridNativeBleNitroSpec {
|
|
16
10
|
|
|
17
|
-
// MARK: - Properties
|
|
11
|
+
// MARK: - Private Properties
|
|
18
12
|
private var centralManager: CBCentralManager!
|
|
19
|
-
private var
|
|
20
|
-
private var
|
|
21
|
-
private var
|
|
22
|
-
private var
|
|
23
|
-
private var
|
|
24
|
-
private var
|
|
25
|
-
private var
|
|
26
|
-
private var
|
|
27
|
-
private var
|
|
28
|
-
|
|
29
|
-
// State restoration
|
|
30
|
-
private var restoreIdentifier: String?
|
|
31
|
-
private var isInitialized = false
|
|
32
|
-
private var restoredState: BleRestoredState?
|
|
13
|
+
private var connectedPeripherals: [String: CBPeripheral] = [:]
|
|
14
|
+
private var discoveredPeripherals: [String: CBPeripheral] = [:]
|
|
15
|
+
private var peripheralDelegates: [String: BlePeripheralDelegate] = [:]
|
|
16
|
+
private var intentionalDisconnections: Set<String> = []
|
|
17
|
+
private var scanCallback: ((BLEDevice) -> Void)?
|
|
18
|
+
private var stateChangeCallback: ((BLEState) -> Void)?
|
|
19
|
+
private var isCurrentlyScanning = false
|
|
20
|
+
private var currentScanFilter: ScanFilter?
|
|
21
|
+
private var centralManagerDelegate: BleCentralManagerDelegate!
|
|
33
22
|
|
|
34
23
|
// MARK: - Initialization
|
|
35
24
|
public override init() {
|
|
36
25
|
super.init()
|
|
37
|
-
|
|
38
|
-
self.centralManager = CBCentralManager(delegate: self, queue: nil)
|
|
26
|
+
setupCentralManager()
|
|
39
27
|
}
|
|
40
28
|
|
|
41
|
-
private func
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
if let restoreId = restoreIdentifier {
|
|
45
|
-
options[CBCentralManagerOptionRestoreIdentifierKey] = restoreId
|
|
46
|
-
}
|
|
47
|
-
|
|
48
|
-
self.centralManager = CBCentralManager(delegate: self, queue: nil, options: options.isEmpty ? nil : options)
|
|
29
|
+
private func setupCentralManager() {
|
|
30
|
+
centralManagerDelegate = BleCentralManagerDelegate(manager: self)
|
|
31
|
+
centralManager = CBCentralManager(delegate: centralManagerDelegate, queue: DispatchQueue.main)
|
|
49
32
|
}
|
|
50
33
|
|
|
51
|
-
|
|
52
|
-
|
|
34
|
+
// MARK: - State Management
|
|
35
|
+
public func state(callback: @escaping (BLEState) -> Void) throws {
|
|
36
|
+
let bleState = mapCBManagerStateToBLEState(centralManager.state)
|
|
37
|
+
callback(bleState)
|
|
53
38
|
}
|
|
54
39
|
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
return Promise.async { resolve, reject in
|
|
59
|
-
self.stopDeviceScan()
|
|
60
|
-
self.centralManager.delegate = nil
|
|
61
|
-
self.connectedDevices.removeAll()
|
|
62
|
-
self.discoveredDevices.removeAll()
|
|
63
|
-
self.deviceDisconnectListeners.removeAll()
|
|
64
|
-
self.characteristicMonitors.removeAll()
|
|
65
|
-
self.pendingOperations.removeAll()
|
|
66
|
-
resolve(())
|
|
67
|
-
}
|
|
40
|
+
public func isBluetoothEnabled(callback: @escaping (Bool) -> Void) throws {
|
|
41
|
+
let isEnabled = centralManager.state == .poweredOn
|
|
42
|
+
callback(isEnabled)
|
|
68
43
|
}
|
|
69
44
|
|
|
70
|
-
public func
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
print("BleNitro: Initialized with restore state identifier: \(restoreId)")
|
|
80
|
-
}
|
|
81
|
-
|
|
82
|
-
self.isInitialized = true
|
|
83
|
-
print("BleNitro: BLE Manager initialized")
|
|
84
|
-
})
|
|
85
|
-
}
|
|
86
|
-
|
|
87
|
-
public func getRestoredState() throws -> Promise<BleRestoredState?> {
|
|
88
|
-
return Promise.resolve(withBlock: {
|
|
89
|
-
return self.restoredState
|
|
90
|
-
})
|
|
91
|
-
}
|
|
92
|
-
|
|
93
|
-
public func setLogLevel(logLevel: LogLevel) throws -> Promise<LogLevel> {
|
|
94
|
-
return Promise.resolve(withBlock: {
|
|
95
|
-
self.logLevel = logLevel
|
|
96
|
-
return logLevel
|
|
97
|
-
})
|
|
45
|
+
public func requestBluetoothEnable(callback: @escaping (Bool, String) -> Void) throws {
|
|
46
|
+
// iOS doesn't allow programmatic Bluetooth enabling
|
|
47
|
+
// We can only check the current state
|
|
48
|
+
if centralManager.state == .poweredOn {
|
|
49
|
+
callback(true, "")
|
|
50
|
+
} else {
|
|
51
|
+
callback(false, "Bluetooth must be enabled manually in Settings")
|
|
52
|
+
}
|
|
98
53
|
}
|
|
99
54
|
|
|
100
|
-
public func
|
|
101
|
-
|
|
55
|
+
public func subscribeToStateChange(
|
|
56
|
+
stateCallback: @escaping (BLEState) -> Void,
|
|
57
|
+
resultCallback: @escaping (Bool, String) -> Void
|
|
58
|
+
) throws {
|
|
59
|
+
self.stateChangeCallback = stateCallback
|
|
60
|
+
resultCallback(true, "")
|
|
102
61
|
}
|
|
103
|
-
|
|
104
|
-
public func
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
62
|
+
|
|
63
|
+
public func unsubscribeFromStateChange(
|
|
64
|
+
resultCallback: @escaping (Bool, String) -> Void
|
|
65
|
+
) throws {
|
|
66
|
+
self.stateChangeCallback = nil
|
|
67
|
+
resultCallback(true, "")
|
|
68
|
+
}
|
|
69
|
+
|
|
70
|
+
// MARK: - Scanning Operations
|
|
71
|
+
public func startScan(filter: ScanFilter, callback: @escaping (BLEDevice) -> Void) throws {
|
|
72
|
+
guard centralManager.state == .poweredOn else {
|
|
73
|
+
throw NSError(domain: "BleNitroError", code: 1, userInfo: [
|
|
74
|
+
NSLocalizedDescriptionKey: "Bluetooth is not powered on"
|
|
75
|
+
])
|
|
108
76
|
}
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
77
|
+
|
|
78
|
+
self.scanCallback = callback
|
|
79
|
+
self.currentScanFilter = filter
|
|
80
|
+
self.isCurrentlyScanning = true
|
|
81
|
+
|
|
82
|
+
// Convert service UUIDs to CBUUIDs
|
|
83
|
+
let serviceUUIDs = filter.serviceUUIDs.isEmpty ? nil : filter.serviceUUIDs.compactMap { CBUUID(string: $0) }
|
|
84
|
+
|
|
85
|
+
// Configure scan options
|
|
86
|
+
var options: [String: Any] = [:]
|
|
87
|
+
if filter.allowDuplicates {
|
|
88
|
+
options[CBCentralManagerScanOptionAllowDuplicatesKey] = true
|
|
121
89
|
}
|
|
90
|
+
|
|
91
|
+
centralManager.scanForPeripherals(withServices: serviceUUIDs, options: options)
|
|
122
92
|
}
|
|
123
93
|
|
|
124
|
-
public func
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
94
|
+
public func stopScan(callback: @escaping (Bool, String) -> Void) throws {
|
|
95
|
+
centralManager.stopScan()
|
|
96
|
+
isCurrentlyScanning = false
|
|
97
|
+
scanCallback = nil
|
|
98
|
+
currentScanFilter = nil
|
|
99
|
+
// Keep discovered peripherals for potential connections
|
|
100
|
+
callback(true, "")
|
|
130
101
|
}
|
|
131
102
|
|
|
132
|
-
public func
|
|
133
|
-
|
|
103
|
+
public func isScanning(callback: @escaping (Bool) -> Void) throws {
|
|
104
|
+
callback(isCurrentlyScanning)
|
|
134
105
|
}
|
|
135
106
|
|
|
136
|
-
|
|
137
|
-
|
|
107
|
+
// MARK: - Device Discovery
|
|
108
|
+
public func getConnectedDevices(callback: @escaping ([BLEDevice]) -> Void) throws {
|
|
109
|
+
var connectedDevices: [BLEDevice] = []
|
|
138
110
|
|
|
139
|
-
|
|
140
|
-
|
|
111
|
+
for (deviceId, peripheral) in connectedPeripherals {
|
|
112
|
+
// Create BLEDevice from connected peripheral
|
|
113
|
+
let device = BLEDevice(
|
|
114
|
+
id: deviceId,
|
|
115
|
+
name: peripheral.name ?? "Unknown Device",
|
|
116
|
+
rssi: 0, // RSSI not available for connected devices without explicit read
|
|
117
|
+
manufacturerData: ManufacturerData(companyIdentifiers: []), // Not available for connected devices
|
|
118
|
+
serviceUUIDs: peripheral.services?.map { $0.uuid.uuidString } ?? [],
|
|
119
|
+
isConnectable: true // Already connected, so it was connectable
|
|
120
|
+
)
|
|
121
|
+
connectedDevices.append(device)
|
|
141
122
|
}
|
|
142
123
|
|
|
143
|
-
|
|
144
|
-
self.stateChangeListener = nil
|
|
145
|
-
}
|
|
124
|
+
callback(connectedDevices)
|
|
146
125
|
}
|
|
147
126
|
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
|
|
154
|
-
}
|
|
155
|
-
|
|
156
|
-
self.scanListener = listener
|
|
157
|
-
self.isScanning = true
|
|
158
|
-
|
|
159
|
-
var serviceUUIDs: [CBUUID]? = nil
|
|
160
|
-
if let uuids = uuids {
|
|
161
|
-
serviceUUIDs = uuids.compactMap { CBUUID(string: $0) }
|
|
162
|
-
}
|
|
163
|
-
|
|
164
|
-
var scanOptions: [String: Any] = [:]
|
|
165
|
-
if let options = options {
|
|
166
|
-
if options.allowDuplicates == true {
|
|
167
|
-
scanOptions[CBCentralManagerScanOptionAllowDuplicatesKey] = true
|
|
168
|
-
}
|
|
169
|
-
}
|
|
170
|
-
|
|
171
|
-
self.centralManager.scanForPeripherals(withServices: serviceUUIDs, options: scanOptions)
|
|
172
|
-
resolve(())
|
|
127
|
+
// MARK: - Connection Management
|
|
128
|
+
public func connect(deviceId: String, callback: @escaping (Bool, String, String) -> Void, disconnectCallback: ((String, Bool, String) -> Void)?) throws {
|
|
129
|
+
// Find peripheral by identifier
|
|
130
|
+
guard let peripheral = findPeripheral(by: deviceId) else {
|
|
131
|
+
callback(false, "", "Peripheral not found")
|
|
132
|
+
return
|
|
173
133
|
}
|
|
174
|
-
|
|
175
|
-
|
|
176
|
-
|
|
177
|
-
|
|
178
|
-
|
|
179
|
-
self.centralManager.stopScan()
|
|
180
|
-
self.isScanning = false
|
|
181
|
-
self.scanListener = nil
|
|
182
|
-
}
|
|
183
|
-
})
|
|
184
|
-
}
|
|
185
|
-
|
|
186
|
-
public func requestConnectionPriorityForDevice(deviceIdentifier: String, connectionPriority: ConnectionPriority, transactionId: String?) throws -> Promise<NativeDevice> {
|
|
187
|
-
return Promise.async { resolve, reject in
|
|
188
|
-
// iOS doesn't have direct connection priority control like Android
|
|
189
|
-
// Return the device as-is since this is mostly an Android feature
|
|
190
|
-
if let peripheral = self.connectedDevices[deviceIdentifier] {
|
|
191
|
-
let device = self.createNativeDevice(from: peripheral)
|
|
192
|
-
resolve(device)
|
|
193
|
-
} else {
|
|
194
|
-
let error = self.createBleError(.DeviceNotFound, message: "Device not found: \(deviceIdentifier)")
|
|
195
|
-
reject(error)
|
|
196
|
-
}
|
|
134
|
+
|
|
135
|
+
// Check if already connected
|
|
136
|
+
if peripheral.state == .connected {
|
|
137
|
+
callback(true, deviceId, "")
|
|
138
|
+
return
|
|
197
139
|
}
|
|
140
|
+
|
|
141
|
+
// Store connection callback and disconnect callback
|
|
142
|
+
let delegate = BlePeripheralDelegate(deviceId: deviceId, manager: self)
|
|
143
|
+
delegate.connectionCallback = callback
|
|
144
|
+
delegate.disconnectEventCallback = disconnectCallback
|
|
145
|
+
peripheralDelegates[deviceId] = delegate
|
|
146
|
+
peripheral.delegate = delegate
|
|
147
|
+
|
|
148
|
+
// Connect to peripheral
|
|
149
|
+
centralManager.connect(peripheral, options: nil)
|
|
198
150
|
}
|
|
199
151
|
|
|
200
|
-
public func
|
|
201
|
-
|
|
202
|
-
|
|
203
|
-
|
|
204
|
-
reject(error)
|
|
205
|
-
return
|
|
206
|
-
}
|
|
207
|
-
|
|
208
|
-
if let transactionId = transactionId {
|
|
209
|
-
self.pendingOperations[transactionId] = resolve
|
|
210
|
-
}
|
|
211
|
-
|
|
212
|
-
peripheral.readRSSI()
|
|
152
|
+
public func disconnect(deviceId: String, callback: @escaping (Bool, String) -> Void) throws {
|
|
153
|
+
guard let peripheral = connectedPeripherals[deviceId] else {
|
|
154
|
+
callback(false, "Peripheral not connected")
|
|
155
|
+
return
|
|
213
156
|
}
|
|
157
|
+
|
|
158
|
+
// Store disconnect callback in delegate
|
|
159
|
+
peripheralDelegates[deviceId]?.disconnectionCallback = callback
|
|
160
|
+
|
|
161
|
+
// Mark this as an intentional disconnection
|
|
162
|
+
intentionalDisconnections.insert(deviceId)
|
|
163
|
+
|
|
164
|
+
centralManager.cancelPeripheralConnection(peripheral)
|
|
214
165
|
}
|
|
215
166
|
|
|
216
|
-
public func
|
|
217
|
-
|
|
218
|
-
|
|
219
|
-
|
|
220
|
-
|
|
221
|
-
resolve(device)
|
|
222
|
-
} else {
|
|
223
|
-
let error = self.createBleError(.DeviceNotFound, message: "Device not found: \(deviceIdentifier)")
|
|
224
|
-
reject(error)
|
|
225
|
-
}
|
|
167
|
+
public func isConnected(deviceId: String, callback: @escaping (Bool) -> Void) throws {
|
|
168
|
+
if let peripheral = connectedPeripherals[deviceId] {
|
|
169
|
+
callback(peripheral.state == .connected)
|
|
170
|
+
} else {
|
|
171
|
+
callback(false)
|
|
226
172
|
}
|
|
227
173
|
}
|
|
228
174
|
|
|
229
|
-
|
|
230
|
-
|
|
231
|
-
|
|
232
|
-
|
|
233
|
-
|
|
234
|
-
}
|
|
235
|
-
return nil
|
|
236
|
-
}
|
|
237
|
-
})
|
|
238
|
-
}
|
|
239
|
-
|
|
240
|
-
public func connectedDevices(serviceUUIDs: [String]) throws -> Promise<[NativeDevice]> {
|
|
241
|
-
return Promise.resolve(withBlock: {
|
|
242
|
-
let serviceUUIDs = serviceUUIDs.compactMap { CBUUID(string: $0) }
|
|
243
|
-
let peripherals = self.centralManager.retrieveConnectedPeripherals(withServices: serviceUUIDs)
|
|
244
|
-
return peripherals.map { self.createNativeDevice(from: $0) }
|
|
245
|
-
})
|
|
246
|
-
}
|
|
247
|
-
|
|
248
|
-
public func connectToDevice(deviceIdentifier: String, options: ConnectionOptions?) throws -> Promise<NativeDevice> {
|
|
249
|
-
return Promise.async { resolve, reject in
|
|
250
|
-
guard let peripheral = self.discoveredDevices[deviceIdentifier] else {
|
|
251
|
-
let error = self.createBleError(.DeviceNotFound, message: "Device not found: \(deviceIdentifier)")
|
|
252
|
-
reject(error)
|
|
253
|
-
return
|
|
254
|
-
}
|
|
255
|
-
|
|
256
|
-
var connectOptions: [String: Any] = [:]
|
|
257
|
-
if let options = options {
|
|
258
|
-
connectOptions[CBConnectPeripheralOptionNotifyOnConnectionKey] = true
|
|
259
|
-
connectOptions[CBConnectPeripheralOptionNotifyOnDisconnectionKey] = true
|
|
260
|
-
connectOptions[CBConnectPeripheralOptionNotifyOnNotificationKey] = true
|
|
261
|
-
}
|
|
262
|
-
|
|
263
|
-
self.pendingOperations[deviceIdentifier] = resolve
|
|
264
|
-
self.centralManager.connect(peripheral, options: connectOptions)
|
|
175
|
+
// MARK: - Service Discovery
|
|
176
|
+
public func discoverServices(deviceId: String, callback: @escaping (Bool, String) -> Void) throws {
|
|
177
|
+
guard let peripheral = connectedPeripherals[deviceId] else {
|
|
178
|
+
callback(false, "Peripheral not connected")
|
|
179
|
+
return
|
|
265
180
|
}
|
|
181
|
+
|
|
182
|
+
peripheralDelegates[deviceId]?.serviceDiscoveryCallback = callback
|
|
183
|
+
peripheral.discoverServices(nil)
|
|
266
184
|
}
|
|
267
185
|
|
|
268
|
-
public func
|
|
269
|
-
|
|
270
|
-
|
|
271
|
-
|
|
272
|
-
reject(error)
|
|
273
|
-
return
|
|
274
|
-
}
|
|
275
|
-
|
|
276
|
-
self.pendingOperations[deviceIdentifier] = resolve
|
|
277
|
-
self.centralManager.cancelPeripheralConnection(peripheral)
|
|
186
|
+
public func getServices(deviceId: String, callback: @escaping ([String]) -> Void) throws {
|
|
187
|
+
guard let peripheral = connectedPeripherals[deviceId] else {
|
|
188
|
+
callback([])
|
|
189
|
+
return
|
|
278
190
|
}
|
|
191
|
+
|
|
192
|
+
let serviceUUIDs = peripheral.services?.map { $0.uuid.uuidString } ?? []
|
|
193
|
+
callback(serviceUUIDs)
|
|
279
194
|
}
|
|
280
195
|
|
|
281
|
-
public func
|
|
282
|
-
|
|
196
|
+
public func getCharacteristics(
|
|
197
|
+
deviceId: String,
|
|
198
|
+
serviceId: String,
|
|
199
|
+
callback: @escaping ([String]) -> Void
|
|
200
|
+
) throws {
|
|
201
|
+
guard let peripheral = connectedPeripherals[deviceId] else {
|
|
202
|
+
callback([])
|
|
203
|
+
return
|
|
204
|
+
}
|
|
283
205
|
|
|
284
|
-
|
|
285
|
-
|
|
206
|
+
// Find service using CBUUID comparison
|
|
207
|
+
let serviceUUID = CBUUID(string: serviceId)
|
|
208
|
+
guard let service = peripheral.services?.first(where: { $0.uuid == serviceUUID }) else {
|
|
209
|
+
callback([])
|
|
210
|
+
return
|
|
286
211
|
}
|
|
287
|
-
|
|
288
|
-
|
|
289
|
-
|
|
290
|
-
|
|
291
|
-
|
|
292
|
-
|
|
293
|
-
|
|
294
|
-
|
|
295
|
-
|
|
296
|
-
|
|
297
|
-
|
|
298
|
-
|
|
299
|
-
|
|
300
|
-
|
|
301
|
-
|
|
302
|
-
|
|
303
|
-
|
|
212
|
+
|
|
213
|
+
let characteristicUUIDs = service.characteristics?.map { $0.uuid.uuidString } ?? []
|
|
214
|
+
callback(characteristicUUIDs)
|
|
215
|
+
}
|
|
216
|
+
|
|
217
|
+
// MARK: - Characteristic Operations
|
|
218
|
+
public func readCharacteristic(
|
|
219
|
+
deviceId: String,
|
|
220
|
+
serviceId: String,
|
|
221
|
+
characteristicId: String,
|
|
222
|
+
callback: @escaping (Bool, [Double], String) -> Void
|
|
223
|
+
) throws {
|
|
224
|
+
guard let characteristic = findCharacteristic(deviceId: deviceId, serviceId: serviceId, characteristicId: characteristicId) else {
|
|
225
|
+
callback(false, [], "Characteristic not found")
|
|
226
|
+
return
|
|
227
|
+
}
|
|
228
|
+
|
|
229
|
+
// Ensure peripheral delegate exists
|
|
230
|
+
guard let delegate = peripheralDelegates[deviceId] else {
|
|
231
|
+
callback(false, [], "Device not properly connected or delegate not found")
|
|
232
|
+
return
|
|
233
|
+
}
|
|
234
|
+
|
|
235
|
+
// Store callback in delegate using CBUUID for reliable matching
|
|
236
|
+
delegate.readCallbacks[characteristic.uuid] = callback
|
|
237
|
+
|
|
238
|
+
// Read characteristic value - the delegate will handle the response
|
|
239
|
+
characteristic.service?.peripheral?.readValue(for: characteristic)
|
|
240
|
+
}
|
|
241
|
+
|
|
242
|
+
public func writeCharacteristic(
|
|
243
|
+
deviceId: String,
|
|
244
|
+
serviceId: String,
|
|
245
|
+
characteristicId: String,
|
|
246
|
+
data: [Double],
|
|
247
|
+
withResponse: Bool,
|
|
248
|
+
callback: @escaping (Bool, String) -> Void
|
|
249
|
+
) throws {
|
|
250
|
+
guard let characteristic = findCharacteristic(deviceId: deviceId, serviceId: serviceId, characteristicId: characteristicId) else {
|
|
251
|
+
callback(false, "Characteristic not found")
|
|
252
|
+
return
|
|
253
|
+
}
|
|
254
|
+
|
|
255
|
+
let writeData = Data(data.map { UInt8($0) })
|
|
256
|
+
let writeType: CBCharacteristicWriteType = withResponse ? .withResponse : .withoutResponse
|
|
257
|
+
|
|
258
|
+
if withResponse {
|
|
259
|
+
// Ensure peripheral delegate exists for response handling
|
|
260
|
+
guard let delegate = peripheralDelegates[deviceId] else {
|
|
261
|
+
callback(false, "Device not properly connected or delegate not found")
|
|
304
262
|
return
|
|
305
263
|
}
|
|
306
|
-
|
|
307
|
-
if let transactionId = transactionId {
|
|
308
|
-
self.pendingOperations[transactionId] = resolve
|
|
309
|
-
}
|
|
310
|
-
|
|
311
|
-
peripheral.discoverServices(nil)
|
|
264
|
+
delegate.writeCallbacks[characteristic.uuid] = callback
|
|
312
265
|
}
|
|
313
|
-
}
|
|
314
|
-
|
|
315
|
-
public func servicesForDevice(deviceIdentifier: String) throws -> Promise<[NativeService]> {
|
|
316
|
-
return Promise.resolve(withBlock: {
|
|
317
|
-
guard let peripheral = self.connectedDevices[deviceIdentifier],
|
|
318
|
-
let services = peripheral.services else {
|
|
319
|
-
return []
|
|
320
|
-
}
|
|
321
|
-
|
|
322
|
-
return services.enumerated().map { index, service in
|
|
323
|
-
return NativeService(
|
|
324
|
-
id: Double(index),
|
|
325
|
-
uuid: service.uuid.uuidString,
|
|
326
|
-
deviceID: deviceIdentifier,
|
|
327
|
-
isPrimary: service.isPrimary
|
|
328
|
-
)
|
|
329
|
-
}
|
|
330
|
-
})
|
|
331
|
-
}
|
|
332
|
-
|
|
333
|
-
// MARK: - CBCentralManagerDelegate
|
|
334
|
-
|
|
335
|
-
public func centralManagerDidUpdateState(_ central: CBCentralManager) {
|
|
336
|
-
let state = mapCBManagerState(central.state)
|
|
337
|
-
stateChangeListener?(state)
|
|
338
|
-
print("BleNitro: Central manager state changed to: \(central.state.rawValue)")
|
|
339
|
-
}
|
|
340
|
-
|
|
341
|
-
public func centralManager(_ central: CBCentralManager, didDiscover peripheral: CBPeripheral, advertisementData: [String: Any], rssi RSSI: NSNumber) {
|
|
342
|
-
let deviceId = peripheral.identifier.uuidString
|
|
343
|
-
discoveredDevices[deviceId] = peripheral
|
|
344
266
|
|
|
345
|
-
|
|
346
|
-
|
|
267
|
+
characteristic.service?.peripheral?.writeValue(writeData, for: characteristic, type: writeType)
|
|
268
|
+
|
|
269
|
+
if !withResponse {
|
|
270
|
+
callback(true, "")
|
|
271
|
+
}
|
|
347
272
|
}
|
|
348
273
|
|
|
349
|
-
public func
|
|
350
|
-
|
|
351
|
-
|
|
352
|
-
|
|
274
|
+
public func subscribeToCharacteristic(
|
|
275
|
+
deviceId: String,
|
|
276
|
+
serviceId: String,
|
|
277
|
+
characteristicId: String,
|
|
278
|
+
updateCallback: @escaping (String, [Double]) -> Void,
|
|
279
|
+
resultCallback: @escaping (Bool, String) -> Void
|
|
280
|
+
) throws {
|
|
281
|
+
guard let characteristic = findCharacteristic(deviceId: deviceId, serviceId: serviceId, characteristicId: characteristicId) else {
|
|
282
|
+
resultCallback(false, "Characteristic not found")
|
|
283
|
+
return
|
|
284
|
+
}
|
|
353
285
|
|
|
354
|
-
|
|
355
|
-
|
|
356
|
-
|
|
357
|
-
|
|
286
|
+
// Ensure peripheral delegate exists
|
|
287
|
+
guard let delegate = peripheralDelegates[deviceId] else {
|
|
288
|
+
resultCallback(false, "Device not properly connected or delegate not found")
|
|
289
|
+
return
|
|
358
290
|
}
|
|
291
|
+
|
|
292
|
+
delegate.notificationCallbacks[characteristic.uuid] = updateCallback
|
|
293
|
+
delegate.subscriptionCallbacks[characteristic.uuid] = resultCallback
|
|
294
|
+
|
|
295
|
+
characteristic.service?.peripheral?.setNotifyValue(true, for: characteristic)
|
|
359
296
|
}
|
|
360
297
|
|
|
361
|
-
public func
|
|
362
|
-
|
|
363
|
-
|
|
298
|
+
public func unsubscribeFromCharacteristic(
|
|
299
|
+
deviceId: String,
|
|
300
|
+
serviceId: String,
|
|
301
|
+
characteristicId: String,
|
|
302
|
+
callback: @escaping (Bool, String) -> Void
|
|
303
|
+
) throws {
|
|
304
|
+
guard let characteristic = findCharacteristic(deviceId: deviceId, serviceId: serviceId, characteristicId: characteristicId) else {
|
|
305
|
+
callback(false, "Characteristic not found")
|
|
306
|
+
return
|
|
307
|
+
}
|
|
364
308
|
|
|
365
|
-
|
|
366
|
-
let
|
|
309
|
+
// Ensure peripheral delegate exists
|
|
310
|
+
guard let delegate = peripheralDelegates[deviceId] else {
|
|
311
|
+
callback(false, "Device not properly connected or delegate not found")
|
|
312
|
+
return
|
|
313
|
+
}
|
|
367
314
|
|
|
368
|
-
|
|
369
|
-
|
|
315
|
+
delegate.notificationCallbacks.removeValue(forKey: characteristic.uuid)
|
|
316
|
+
delegate.unsubscriptionCallbacks[characteristic.uuid] = callback
|
|
370
317
|
|
|
371
|
-
|
|
372
|
-
resolve(device)
|
|
373
|
-
pendingOperations.removeValue(forKey: deviceId)
|
|
374
|
-
}
|
|
318
|
+
characteristic.service?.peripheral?.setNotifyValue(false, for: characteristic)
|
|
375
319
|
}
|
|
376
320
|
|
|
377
|
-
|
|
378
|
-
|
|
321
|
+
// MARK: - Helper Methods
|
|
322
|
+
private func findPeripheral(by deviceId: String) -> CBPeripheral? {
|
|
323
|
+
// Check connected peripherals first
|
|
324
|
+
if let peripheral = connectedPeripherals[deviceId] {
|
|
325
|
+
return peripheral
|
|
326
|
+
}
|
|
379
327
|
|
|
380
|
-
|
|
381
|
-
|
|
382
|
-
|
|
383
|
-
pendingOperations.removeValue(forKey: deviceId)
|
|
328
|
+
// Check discovered peripherals
|
|
329
|
+
if let peripheral = discoveredPeripherals[deviceId] {
|
|
330
|
+
return peripheral
|
|
384
331
|
}
|
|
332
|
+
|
|
333
|
+
// Try to retrieve by UUID as fallback
|
|
334
|
+
guard let uuid = UUID(uuidString: deviceId) else { return nil }
|
|
335
|
+
return centralManager.retrievePeripherals(withIdentifiers: [uuid]).first
|
|
385
336
|
}
|
|
386
337
|
|
|
387
|
-
|
|
338
|
+
private func findCharacteristic(deviceId: String, serviceId: String, characteristicId: String) -> CBCharacteristic? {
|
|
339
|
+
guard let peripheral = connectedPeripherals[deviceId] else {
|
|
340
|
+
return nil
|
|
341
|
+
}
|
|
342
|
+
|
|
343
|
+
let serviceUUID = CBUUID(string: serviceId)
|
|
344
|
+
let characteristicUUID = CBUUID(string: characteristicId)
|
|
345
|
+
|
|
346
|
+
guard let service = peripheral.services?.first(where: { $0.uuid == serviceUUID }),
|
|
347
|
+
let characteristic = service.characteristics?.first(where: { $0.uuid == characteristicUUID }) else {
|
|
348
|
+
return nil
|
|
349
|
+
}
|
|
350
|
+
return characteristic
|
|
351
|
+
}
|
|
388
352
|
|
|
389
|
-
|
|
353
|
+
internal func mapCBManagerStateToBLEState(_ state: CBManagerState) -> BLEState {
|
|
390
354
|
switch state {
|
|
391
355
|
case .unknown:
|
|
392
|
-
return .
|
|
356
|
+
return .unknown
|
|
393
357
|
case .resetting:
|
|
394
|
-
return .
|
|
358
|
+
return .resetting
|
|
395
359
|
case .unsupported:
|
|
396
|
-
return .
|
|
360
|
+
return .unsupported
|
|
397
361
|
case .unauthorized:
|
|
398
|
-
return .
|
|
362
|
+
return .unauthorized
|
|
399
363
|
case .poweredOff:
|
|
400
|
-
return .
|
|
364
|
+
return .poweredoff
|
|
401
365
|
case .poweredOn:
|
|
402
|
-
return .
|
|
366
|
+
return .poweredon
|
|
403
367
|
@unknown default:
|
|
404
|
-
return .
|
|
368
|
+
return .unknown
|
|
405
369
|
}
|
|
406
370
|
}
|
|
371
|
+
|
|
372
|
+
// MARK: - Helper Methods
|
|
407
373
|
|
|
408
|
-
|
|
409
|
-
|
|
410
|
-
var serviceUUIDs: [String] = []
|
|
411
|
-
var manufacturerData: String? = nil
|
|
412
|
-
var localName: String? = nil
|
|
413
|
-
var txPowerLevel: Double? = nil
|
|
414
|
-
var isConnectable: Bool? = nil
|
|
415
|
-
var solicitedServiceUUIDs: [String] = []
|
|
416
|
-
var overflowServiceUUIDs: [String] = []
|
|
417
|
-
|
|
418
|
-
if let adData = advertisementData {
|
|
419
|
-
// Parse advertisement data
|
|
420
|
-
if let services = adData[CBAdvertisementDataServiceUUIDsKey] as? [CBUUID] {
|
|
421
|
-
serviceUUIDs = services.map { $0.uuidString }
|
|
422
|
-
}
|
|
423
|
-
|
|
424
|
-
if let data = adData[CBAdvertisementDataManufacturerDataKey] as? Data {
|
|
425
|
-
manufacturerData = data.base64EncodedString()
|
|
426
|
-
}
|
|
427
|
-
|
|
428
|
-
localName = adData[CBAdvertisementDataLocalNameKey] as? String
|
|
429
|
-
txPowerLevel = adData[CBAdvertisementDataTxPowerLevelKey] as? Double
|
|
430
|
-
isConnectable = adData[CBAdvertisementDataIsConnectable] as? Bool
|
|
431
|
-
|
|
432
|
-
if let services = adData[CBAdvertisementDataSolicitedServiceUUIDsKey] as? [CBUUID] {
|
|
433
|
-
solicitedServiceUUIDs = services.map { $0.uuidString }
|
|
434
|
-
}
|
|
435
|
-
|
|
436
|
-
if let services = adData[CBAdvertisementDataOverflowServiceUUIDsKey] as? [CBUUID] {
|
|
437
|
-
overflowServiceUUIDs = services.map { $0.uuidString }
|
|
438
|
-
}
|
|
439
|
-
|
|
440
|
-
if let serviceDataDict = adData[CBAdvertisementDataServiceDataKey] as? [CBUUID: Data] {
|
|
441
|
-
serviceData = serviceDataDict.map { uuid, data in
|
|
442
|
-
ServiceDataEntry(uuid: uuid.uuidString, data: data.base64EncodedString())
|
|
443
|
-
}
|
|
444
|
-
}
|
|
445
|
-
}
|
|
446
|
-
|
|
447
|
-
return NativeDevice(
|
|
448
|
-
id: peripheral.identifier.uuidString,
|
|
449
|
-
deviceName: peripheral.name ?? localName,
|
|
450
|
-
rssi: rssi?.doubleValue,
|
|
451
|
-
mtu: 23.0, // Default MTU on iOS
|
|
452
|
-
manufacturerData: manufacturerData,
|
|
453
|
-
serviceData: serviceData,
|
|
454
|
-
serviceUUIDs: serviceUUIDs.isEmpty ? nil : serviceUUIDs,
|
|
455
|
-
localName: localName,
|
|
456
|
-
txPowerLevel: txPowerLevel,
|
|
457
|
-
solicitedServiceUUIDs: solicitedServiceUUIDs.isEmpty ? nil : solicitedServiceUUIDs,
|
|
458
|
-
isConnectable: isConnectable,
|
|
459
|
-
overflowServiceUUIDs: overflowServiceUUIDs.isEmpty ? nil : overflowServiceUUIDs,
|
|
460
|
-
rawScanRecord: "" // iOS doesn't provide raw scan record
|
|
461
|
-
)
|
|
374
|
+
internal func handleStateChange(_ state: BLEState) {
|
|
375
|
+
stateChangeCallback?(state)
|
|
462
376
|
}
|
|
463
377
|
|
|
464
|
-
|
|
465
|
-
|
|
466
|
-
|
|
467
|
-
|
|
468
|
-
|
|
469
|
-
|
|
470
|
-
|
|
471
|
-
|
|
472
|
-
|
|
473
|
-
|
|
474
|
-
|
|
475
|
-
|
|
378
|
+
internal func handleDeviceDiscovered(
|
|
379
|
+
_ peripheral: CBPeripheral,
|
|
380
|
+
advertisementData: [String: Any],
|
|
381
|
+
rssi: NSNumber
|
|
382
|
+
) {
|
|
383
|
+
// Apply RSSI filter if specified
|
|
384
|
+
if let filter = currentScanFilter, rssi.doubleValue < filter.rssiThreshold {
|
|
385
|
+
return
|
|
386
|
+
}
|
|
387
|
+
|
|
388
|
+
// Store discovered peripheral for future connections
|
|
389
|
+
let deviceId = peripheral.identifier.uuidString
|
|
390
|
+
discoveredPeripherals[deviceId] = peripheral
|
|
391
|
+
|
|
392
|
+
// Create BLE device
|
|
393
|
+
let device = createBLEDevice(
|
|
394
|
+
peripheral: peripheral,
|
|
395
|
+
advertisementData: advertisementData,
|
|
396
|
+
rssi: rssi.doubleValue
|
|
476
397
|
)
|
|
398
|
+
|
|
399
|
+
scanCallback?(device)
|
|
477
400
|
}
|
|
478
|
-
}
|
|
479
|
-
|
|
480
|
-
// MARK: - CBPeripheralDelegate Extension
|
|
481
|
-
|
|
482
|
-
extension BleNitroBleManager: CBPeripheralDelegate {
|
|
483
401
|
|
|
484
|
-
|
|
402
|
+
internal func handleDeviceConnected(_ peripheral: CBPeripheral) {
|
|
485
403
|
let deviceId = peripheral.identifier.uuidString
|
|
404
|
+
connectedPeripherals[deviceId] = peripheral
|
|
486
405
|
|
|
487
|
-
|
|
488
|
-
|
|
489
|
-
|
|
490
|
-
resolve(device)
|
|
491
|
-
pendingOperations.removeValue(forKey: transactionId)
|
|
492
|
-
break
|
|
493
|
-
}
|
|
406
|
+
if let delegate = peripheralDelegates[deviceId] {
|
|
407
|
+
delegate.connectionCallback?(true, deviceId, "")
|
|
408
|
+
delegate.connectionCallback = nil
|
|
494
409
|
}
|
|
495
410
|
}
|
|
496
411
|
|
|
497
|
-
|
|
498
|
-
|
|
499
|
-
|
|
500
|
-
return
|
|
501
|
-
}
|
|
412
|
+
internal func handleDeviceConnectionFailed(_ peripheral: CBPeripheral, error: Error?) {
|
|
413
|
+
let deviceId = peripheral.identifier.uuidString
|
|
414
|
+
let errorMessage = error?.localizedDescription ?? "Connection failed"
|
|
502
415
|
|
|
503
|
-
|
|
504
|
-
|
|
505
|
-
|
|
506
|
-
}
|
|
507
|
-
}
|
|
508
|
-
|
|
509
|
-
public func peripheral(_ peripheral: CBPeripheral, didDiscoverCharacteristicsFor service: CBService, error: Error?) {
|
|
510
|
-
if let error = error {
|
|
511
|
-
// Handle characteristic discovery error
|
|
512
|
-
return
|
|
416
|
+
if let delegate = peripheralDelegates[deviceId] {
|
|
417
|
+
delegate.connectionCallback?(false, "", errorMessage)
|
|
418
|
+
delegate.connectionCallback = nil
|
|
513
419
|
}
|
|
514
420
|
|
|
515
|
-
|
|
516
|
-
service.characteristics?.forEach { characteristic in
|
|
517
|
-
peripheral.discoverDescriptors(for: characteristic)
|
|
518
|
-
}
|
|
421
|
+
peripheralDelegates.removeValue(forKey: deviceId)
|
|
519
422
|
}
|
|
520
423
|
|
|
521
|
-
|
|
522
|
-
// Complete service discovery
|
|
424
|
+
internal func handleDeviceDisconnected(_ peripheral: CBPeripheral, error: Error?) {
|
|
523
425
|
let deviceId = peripheral.identifier.uuidString
|
|
426
|
+
connectedPeripherals.removeValue(forKey: deviceId)
|
|
524
427
|
|
|
525
|
-
|
|
526
|
-
|
|
527
|
-
|
|
528
|
-
|
|
529
|
-
|
|
530
|
-
|
|
428
|
+
// Determine if this was an intentional or interrupted disconnection
|
|
429
|
+
let wasIntentional = intentionalDisconnections.contains(deviceId)
|
|
430
|
+
let interrupted = !wasIntentional
|
|
431
|
+
intentionalDisconnections.remove(deviceId)
|
|
432
|
+
|
|
433
|
+
if let delegate = peripheralDelegates[deviceId] {
|
|
434
|
+
// Handle the disconnect() method callback (for intentional disconnections)
|
|
435
|
+
if let callback = delegate.disconnectionCallback {
|
|
436
|
+
callback(error == nil, error?.localizedDescription ?? "")
|
|
437
|
+
delegate.disconnectionCallback = nil
|
|
438
|
+
}
|
|
439
|
+
|
|
440
|
+
// Handle the disconnect event callback (for both intentional and interrupted)
|
|
441
|
+
if let disconnectEventCallback = delegate.disconnectEventCallback {
|
|
442
|
+
let errorMessage = error?.localizedDescription ?? ""
|
|
443
|
+
disconnectEventCallback(deviceId, interrupted, errorMessage)
|
|
531
444
|
}
|
|
532
445
|
}
|
|
446
|
+
|
|
447
|
+
peripheralDelegates.removeValue(forKey: deviceId)
|
|
533
448
|
}
|
|
534
449
|
|
|
535
|
-
|
|
450
|
+
private func createBLEDevice(
|
|
451
|
+
peripheral: CBPeripheral,
|
|
452
|
+
advertisementData: [String: Any],
|
|
453
|
+
rssi: Double
|
|
454
|
+
) -> BLEDevice {
|
|
455
|
+
let deviceId = peripheral.identifier.uuidString
|
|
456
|
+
let deviceName = peripheral.name ?? advertisementData[CBAdvertisementDataLocalNameKey] as? String ?? "Unknown"
|
|
457
|
+
|
|
458
|
+
// Extract service UUIDs
|
|
459
|
+
let serviceUUIDs = (advertisementData[CBAdvertisementDataServiceUUIDsKey] as? [CBUUID])?.map { $0.uuidString } ?? []
|
|
460
|
+
|
|
461
|
+
// Extract manufacturer data
|
|
462
|
+
let manufacturerData = extractManufacturerData(from: advertisementData)
|
|
463
|
+
|
|
464
|
+
// Check if connectable
|
|
465
|
+
let isConnectable = (advertisementData[CBAdvertisementDataIsConnectable] as? Bool) ?? true
|
|
466
|
+
|
|
467
|
+
return BLEDevice(
|
|
468
|
+
id: deviceId,
|
|
469
|
+
name: deviceName,
|
|
470
|
+
rssi: rssi,
|
|
471
|
+
manufacturerData: manufacturerData,
|
|
472
|
+
serviceUUIDs: serviceUUIDs,
|
|
473
|
+
isConnectable: isConnectable
|
|
474
|
+
)
|
|
475
|
+
}
|
|
536
476
|
|
|
537
|
-
|
|
538
|
-
|
|
539
|
-
|
|
540
|
-
|
|
541
|
-
|
|
542
|
-
|
|
543
|
-
|
|
544
|
-
|
|
545
|
-
|
|
546
|
-
|
|
547
|
-
|
|
548
|
-
|
|
549
|
-
|
|
550
|
-
|
|
551
|
-
|
|
552
|
-
|
|
553
|
-
|
|
554
|
-
|
|
555
|
-
|
|
477
|
+
private func extractManufacturerData(from advertisementData: [String: Any]) -> ManufacturerData {
|
|
478
|
+
guard let manufacturerDataRaw = advertisementData[CBAdvertisementDataManufacturerDataKey] as? Data else {
|
|
479
|
+
return ManufacturerData(companyIdentifiers: [])
|
|
480
|
+
}
|
|
481
|
+
|
|
482
|
+
// Parse manufacturer data (first 2 bytes are company identifier)
|
|
483
|
+
guard manufacturerDataRaw.count >= 2 else {
|
|
484
|
+
return ManufacturerData(companyIdentifiers: [])
|
|
485
|
+
}
|
|
486
|
+
|
|
487
|
+
let companyId = manufacturerDataRaw.prefix(2).withUnsafeBytes { $0.load(as: UInt16.self) }
|
|
488
|
+
let data = Array(manufacturerDataRaw.dropFirst(2)).map { Double($0) }
|
|
489
|
+
|
|
490
|
+
let entry = ManufacturerDataEntry(
|
|
491
|
+
id: String(companyId),
|
|
492
|
+
data: data
|
|
493
|
+
)
|
|
494
|
+
|
|
495
|
+
return ManufacturerData(companyIdentifiers: [entry])
|
|
496
|
+
}
|
|
497
|
+
|
|
498
|
+
public func openSettings() throws -> NitroModules.Promise<Void> {
|
|
499
|
+
return Promise.async {
|
|
500
|
+
if let url = URL(string: UIApplication.openSettingsURLString) {
|
|
501
|
+
// Ask the system to open that URL.
|
|
502
|
+
await UIApplication.shared.open(url)
|
|
556
503
|
}
|
|
557
504
|
}
|
|
558
505
|
}
|
|
559
|
-
|
|
560
506
|
}
|
|
561
507
|
|
|
562
|
-
|
|
563
|
-
|
|
564
|
-
|
|
565
|
-
|
|
566
|
-
|
|
508
|
+
// MARK: - CBCentralManagerDelegate Implementation
|
|
509
|
+
class BleCentralManagerDelegate: NSObject, CBCentralManagerDelegate {
|
|
510
|
+
weak var manager: BleNitroBleManager?
|
|
511
|
+
|
|
512
|
+
init(manager: BleNitroBleManager) {
|
|
513
|
+
self.manager = manager
|
|
514
|
+
super.init()
|
|
515
|
+
}
|
|
516
|
+
|
|
517
|
+
func centralManagerDidUpdateState(_ central: CBCentralManager) {
|
|
518
|
+
guard let manager = manager else { return }
|
|
519
|
+
let bleState = manager.mapCBManagerStateToBLEState(central.state)
|
|
520
|
+
manager.handleStateChange(bleState)
|
|
521
|
+
}
|
|
522
|
+
|
|
523
|
+
func centralManager(
|
|
524
|
+
_ central: CBCentralManager,
|
|
525
|
+
didDiscover peripheral: CBPeripheral,
|
|
526
|
+
advertisementData: [String: Any],
|
|
527
|
+
rssi RSSI: NSNumber
|
|
528
|
+
) {
|
|
529
|
+
manager?.handleDeviceDiscovered(peripheral, advertisementData: advertisementData, rssi: RSSI)
|
|
530
|
+
}
|
|
531
|
+
|
|
532
|
+
func centralManager(_ central: CBCentralManager, didConnect peripheral: CBPeripheral) {
|
|
533
|
+
manager?.handleDeviceConnected(peripheral)
|
|
534
|
+
}
|
|
567
535
|
|
|
568
|
-
|
|
569
|
-
|
|
536
|
+
func centralManager(_ central: CBCentralManager, didFailToConnect peripheral: CBPeripheral, error: Error?) {
|
|
537
|
+
manager?.handleDeviceConnectionFailed(peripheral, error: error)
|
|
570
538
|
}
|
|
571
539
|
|
|
572
|
-
|
|
573
|
-
|
|
540
|
+
func centralManager(_ central: CBCentralManager, didDisconnectPeripheral peripheral: CBPeripheral, error: Error?) {
|
|
541
|
+
manager?.handleDeviceDisconnected(peripheral, error: error)
|
|
574
542
|
}
|
|
575
543
|
}
|