@@ -7,6 +7,12 @@ import CoreBluetooth
77let CONNECTION_TIMEOUT : Double = 10
88let DEFAULT_TIMEOUT : Double = 5
99
10+ struct ManufacturerDataFilter {
11+ let companyIdentifier : UInt16
12+ let dataPrefix : Data ?
13+ let mask : Data ?
14+ }
15+
1016@objc ( BluetoothLe)
1117public class BluetoothLe : CAPPlugin {
1218 typealias BleDevice = [ String : Any ]
@@ -110,15 +116,17 @@ public class BluetoothLe: CAPPlugin {
110116 let serviceUUIDs = self . getServiceUUIDs ( call)
111117 let name = call. getString ( " name " )
112118 let namePrefix = call. getString ( " namePrefix " )
119+ let manufacturerDataFilters = self . getManufacturerDataFilters ( call)
113120
114121 deviceManager. startScanning (
115122 serviceUUIDs,
116123 name,
117124 namePrefix,
125+ manufacturerDataFilters,
118126 false ,
119127 true ,
120- 30 , { ( success , message ) in
121- // selected a device
128+ 30 ,
129+ { ( success , message ) in
122130 if success {
123131 guard let device = deviceManager. getDevice ( message) else {
124132 call. reject ( " Device not found. " )
@@ -130,9 +138,8 @@ public class BluetoothLe: CAPPlugin {
130138 } else {
131139 call. reject ( message)
132140 }
133- } , { ( _, _, _) in
134-
135- }
141+ } ,
142+ { ( _, _, _) in }
136143 )
137144 }
138145
@@ -143,20 +150,23 @@ public class BluetoothLe: CAPPlugin {
143150 let name = call. getString ( " name " )
144151 let namePrefix = call. getString ( " namePrefix " )
145152 let allowDuplicates = call. getBool ( " allowDuplicates " , false )
153+ let manufacturerDataFilters = self . getManufacturerDataFilters ( call)
146154
147155 deviceManager. startScanning (
148156 serviceUUIDs,
149157 name,
150158 namePrefix,
159+ manufacturerDataFilters,
151160 allowDuplicates,
152161 false ,
153- nil , { ( success, message) in
162+ nil ,
163+ { ( success, message) in
154164 if success {
155165 call. resolve ( )
156166 } else {
157167 call. reject ( message)
158168 }
159- } , { ( device, advertisementData, rssi) in
169+ } , { ( device, advertisementData, rssi) in
160170 self . deviceMap [ device. getId ( ) ] = device
161171 let data = self . getScanResult ( device, advertisementData, rssi)
162172 self . notifyListeners ( " onScanResult " , data: data)
@@ -521,6 +531,42 @@ public class BluetoothLe: CAPPlugin {
521531 return serviceUUIDs
522532 }
523533
534+ private func getManufacturerDataFilters( _ call: CAPPluginCall ) -> [ ManufacturerDataFilter ] ? {
535+ guard let manufacturerDataArray = call. getArray ( " manufacturerData " ) else {
536+ return nil
537+ }
538+
539+ var manufacturerDataFilters : [ ManufacturerDataFilter ] = [ ]
540+
541+ for index in 0 ..< manufacturerDataArray. count {
542+ guard let dataObject = manufacturerDataArray [ index] as? JSObject ,
543+ let companyIdentifier = dataObject [ " companyIdentifier " ] as? UInt16 else {
544+ // Invalid or missing company identifier
545+ return nil
546+ }
547+
548+ let dataPrefix : Data ? = {
549+ guard let prefixArray = dataObject [ " dataPrefix " ] as? [ Int ] else { return nil }
550+ return Data ( prefixArray. map { UInt8 ( $0 & 0xFF ) } )
551+ } ( )
552+
553+ let mask : Data ? = {
554+ guard let maskArray = dataObject [ " mask " ] as? [ Int ] else { return nil }
555+ return Data ( maskArray. map { UInt8 ( $0 & 0xFF ) } )
556+ } ( )
557+
558+ let manufacturerFilter = ManufacturerDataFilter (
559+ companyIdentifier: companyIdentifier,
560+ dataPrefix: dataPrefix,
561+ mask: mask
562+ )
563+
564+ manufacturerDataFilters. append ( manufacturerFilter)
565+ }
566+
567+ return manufacturerDataFilters
568+ }
569+
524570 private func getDevice( _ call: CAPPluginCall , checkConnection: Bool = true ) -> Device ? {
525571 guard let deviceId = call. getString ( " deviceId " ) else {
526572 call. reject ( " deviceId required. " )
0 commit comments