Loading...
Searching...
No Matches
MeasurementManagerExample.swift
Go to the documentation of this file.
1import Foundation
2
3/**
4 * MeasurementManager usage example for Swift
5 * Demonstrates working with sensor and signal measurements, generators, and measurement management
6 */
7class MeasurementManagerExample: NSObject {
8 private var sdk: NavigineSdk?
9 private var locationManager: LocationManager?
10 private var measurementManager: MeasurementManager?
11 private var measurementListener: MeasurementListener?
12
13 override init() {
14 super.init()
15 initializeSdk()
16 setupMeasurementListener()
17 }
18
19 /**
20 * Initialize SDK and get managers
21 */
22 private func initializeSdk() {
23 do {
24 // [swift_NavigineSdk_getInstance]
25 // Get SDK instance
26 sdk = NavigineSdk.getInstance()
27 // [swift_NavigineSdk_getInstance]
28
29 // [swift_NavigineSdk_setUserHash]
30 // Set user hash
31 sdk?.setUserHash("USER-HASH-HERE")
32 // [swift_NavigineSdk_setUserHash]
33
34 // [swift_NavigineSdk_setServer]
35 // Set server URL (optional)
36 sdk?.setServer("https://custom.navigine.com")
37 // [swift_NavigineSdk_setServer]
38
39 // [swift_NavigineSdk_getLocationManager]
40 // Get LocationManager for working with locations
41 locationManager = sdk?.getLocationManager()
42 // [swift_NavigineSdk_getLocationManager]
43
44 // [swift_NavigineSdk_getMeasurementManager]
45 // Get MeasurementManager for working with measurements
46 measurementManager = sdk?.getMeasurementManager(locationManager)
47 // [swift_NavigineSdk_getMeasurementManager]
48
49 if let locationManager = locationManager, let measurementManager = measurementManager {
50 print("LocationManager and MeasurementManager successfully initialized")
51 }
52 } catch {
53 print("Error initializing SDK: \‍(error)")
54 }
55 }
56
57 /**
58 * Setup measurement listener
59 */
60 private func setupMeasurementListener() {
61 measurementListener = MeasurementListenerImpl(example: self)
62 }
63
64 /**
65 * Demonstrate MeasurementManager methods
66 */
67 func demonstrateMeasurementManagerMethods() {
68 guard let manager = measurementManager, let listener = measurementListener else {
69 print("MeasurementManager not initialized")
70 return
71 }
72
73 // [swift_MeasurementManager_addMeasurementListener]
74 // Add measurement listener
75 manager.addMeasurementListener(listener)
76 print("Added measurement listener")
77 // [swift_MeasurementManager_addMeasurementListener]
78
79 // Demonstrate beacon generators
80 demonstrateBeaconGenerators()
81
82 // Demonstrate Eddystone generators
83 demonstrateEddystoneGenerators()
84
85 // Demonstrate Wi-Fi generators
86 demonstrateWifiGenerators()
87
88 // Demonstrate Wi-Fi RTT generators
89 demonstrateWifiRttGenerators()
90
91 // Demonstrate location generators
92 demonstrateLocationGenerators()
93
94 // Simulate some time passing for measurements
95 DispatchQueue.main.asyncAfter(deadline: .now() + 2.0) {
96 // [swift_MeasurementManager_removeMeasurementListener]
97 // Remove measurement listener
98 manager.removeMeasurementListener(listener)
99 print("Removed measurement listener")
100 // [swift_MeasurementManager_removeMeasurementListener]
101 }
102 }
103
104 /**
105 * Demonstrate beacon generators
106 */
107 private func demonstrateBeaconGenerators() {
108 guard let manager = measurementManager else { return }
109
110 // [swift_MeasurementManager_addBeaconGenerator]
111 // Add beacon generator
112 let beaconId = manager.addBeaconGenerator(
113 uuid: "12345678-1234-1234-1234-123456789012",
114 major: 100,
115 minor: 200,
116 power: -60,
117 timeout: 5000,
118 rssiMin: -80,
119 rssiMax: -40
120 )
121 print("Added beacon generator with ID: \‍(beaconId)")
122 // [swift_MeasurementManager_addBeaconGenerator]
123
124 // [swift_MeasurementManager_removeBleGenerator]
125 // Remove specific BLE generator
126 manager.removeBleGenerator(id: beaconId)
127 print("Removed BLE generator: \‍(beaconId)")
128 // [swift_MeasurementManager_removeBleGenerator]
129
130 // [swift_MeasurementManager_removeBleGenerators]
131 // Remove all BLE generators
132 manager.removeBleGenerators()
133 print("Removed all BLE generators")
134 // [swift_MeasurementManager_removeBleGenerators]
135 }
136
137 /**
138 * Demonstrate Eddystone generators
139 */
140 private func demonstrateEddystoneGenerators() {
141 guard let manager = measurementManager else { return }
142
143 // [swift_MeasurementManager_addEddystoneGenerator]
144 // Add Eddystone generator
145 let eddystoneId = manager.addEddystoneGenerator(
146 namespaceId: "12345678901234567890",
147 instanceId: "1234567890123456",
148 power: -65,
149 timeout: 3000,
150 rssiMin: -85,
151 rssiMax: -45
152 )
153 print("Added Eddystone generator with ID: \‍(eddystoneId)")
154 // [swift_MeasurementManager_addEddystoneGenerator]
155
156 // Remove Eddystone generator (uses same method as BLE)
157 manager.removeBleGenerator(id: eddystoneId)
158 print("Removed Eddystone generator: \‍(eddystoneId)")
159 }
160
161 /**
162 * Demonstrate Wi-Fi generators
163 */
164 private func demonstrateWifiGenerators() {
165 guard let manager = measurementManager else { return }
166
167 // [swift_MeasurementManager_addWifiGenerator]
168 // Add Wi-Fi generator
169 let wifiId = manager.addWifiGenerator(
170 mac: "AA:BB:CC:DD:EE:FF",
171 timeout: 4000,
172 rssiMin: -90,
173 rssiMax: -50
174 )
175 print("Added Wi-Fi generator with ID: \‍(wifiId)")
176 // [swift_MeasurementManager_addWifiGenerator]
177
178 // [swift_MeasurementManager_removeWifiGenerator]
179 // Remove specific Wi-Fi generator
180 manager.removeWifiGenerator(id: wifiId)
181 print("Removed Wi-Fi generator: \‍(wifiId)")
182 // [swift_MeasurementManager_removeWifiGenerator]
183
184 // [swift_MeasurementManager_removeWifiGenerators]
185 // Remove all Wi-Fi generators
186 manager.removeWifiGenerators()
187 print("Removed all Wi-Fi generators")
188 // [swift_MeasurementManager_removeWifiGenerators]
189 }
190
191 /**
192 * Demonstrate Wi-Fi RTT generators
193 */
194 private func demonstrateWifiRttGenerators() {
195 guard let manager = measurementManager else { return }
196
197 // [swift_MeasurementManager_addWifiRttGenerator]
198 // Add Wi-Fi RTT generator
199 let wifiRttId = manager.addWifiRttGenerator(
200 mac: "11:22:33:44:55:66",
201 timeout: 6000,
202 distMin: 1,
203 distMax: 10,
204 stdDevMin: 0,
205 stdDevMax: 2,
206 rssiMin: -70,
207 rssiMax: -30
208 )
209 print("Added Wi-Fi RTT generator with ID: \‍(wifiRttId)")
210 // [swift_MeasurementManager_addWifiRttGenerator]
211
212 // [swift_MeasurementManager_removeWifiRttGenerator]
213 // Remove specific Wi-Fi RTT generator
214 manager.removeWifiRttGenerator(hash: wifiRttId)
215 print("Removed Wi-Fi RTT generator: \‍(wifiRttId)")
216 // [swift_MeasurementManager_removeWifiRttGenerator]
217
218 // [swift_MeasurementManager_removeWifiRttGenerators]
219 // Remove all Wi-Fi RTT generators
220 manager.removeWifiRttGenerators()
221 print("Removed all Wi-Fi RTT generators")
222 // [swift_MeasurementManager_removeWifiRttGenerators]
223 }
224
225 /**
226 * Demonstrate location generators
227 */
228 private func demonstrateLocationGenerators() {
229 guard let manager = measurementManager else { return }
230
231 // [swift_MeasurementManager_addLocationGenerator]
232 // Add location generator
233 let locationId = manager.addLocationGenerator(
234 latMin: 55.7558,
235 latMax: 55.7559,
236 lonMin: 37.6176,
237 lonMax: 37.6177,
238 accMin: 1.0,
239 accMax: 5.0,
240 timeout: 7000
241 )
242 print("Added location generator with ID: \‍(locationId)")
243 // [swift_MeasurementManager_addLocationGenerator]
244
245 // [swift_MeasurementManager_removeLocationGenerator]
246 // Remove specific location generator
247 manager.removeLocationGenerator(id: locationId)
248 print("Removed location generator: \‍(locationId)")
249 // [swift_MeasurementManager_removeLocationGenerator]
250
251 // [swift_MeasurementManager_removeLocationGenerators]
252 // Remove all location generators
253 manager.removeLocationGenerators()
254 print("Removed all location generators")
255 // [swift_MeasurementManager_removeLocationGenerators]
256 }
257
258 /**
259 * Demonstrate sensor measurements
260 */
261 func demonstrateSensorMeasurements(_ sensors: [SensorType: SensorMeasurement]) {
262 sensors.forEach { (sensorType, measurement) in
263 // [swift_SensorMeasurement_getType]
264 // Get sensor type
265 let type = measurement.type
266 print("Sensor type: \‍(type)")
267 // [swift_SensorMeasurement_getType]
268
269 // [swift_SensorMeasurement_getValues]
270 // Get sensor values
271 let values = measurement.values
272 print("Sensor values - X: \‍(values.x), Y: \‍(values.y), Z: \‍(values.z)")
273 // [swift_SensorMeasurement_getValues]
274
275 // [swift_SensorMeasurement_getTime]
276 // Get measurement timestamp
277 let time = measurement.time
278 print("Measurement time: \‍(time) ms")
279 // [swift_SensorMeasurement_getTime]
280
281 // Demonstrate Vector3d properties
282 demonstrateVector3d(values)
283 }
284 }
285
286 /**
287 * Demonstrate signal measurements
288 */
289 func demonstrateSignalMeasurements(_ signals: [String: SignalMeasurement]) {
290 signals.forEach { (signalId, measurement) in
291 // [swift_SignalMeasurement_getType]
292 // Get signal type
293 let type = measurement.type
294 print("Signal type: \‍(type)")
295 // [swift_SignalMeasurement_getType]
296
297 // [swift_SignalMeasurement_getId]
298 // Get signal identifier
299 let id = measurement.id
300 print("Signal ID: \‍(id)")
301 // [swift_SignalMeasurement_getId]
302
303 // [swift_SignalMeasurement_getRssi]
304 // Get RSSI value
305 let rssi = measurement.rssi
306 print("Signal RSSI: \‍(rssi) dBm")
307 // [swift_SignalMeasurement_getRssi]
308
309 // [swift_SignalMeasurement_getDistance]
310 // Get estimated distance
311 let distance = measurement.distance
312 print("Signal distance: \‍(distance) meters")
313 // [swift_SignalMeasurement_getDistance]
314
315 // [swift_SignalMeasurement_getTime]
316 // Get measurement timestamp
317 let time = measurement.time
318 print("Signal measurement time: \‍(time) ms")
319 // [swift_SignalMeasurement_getTime]
320 }
321 }
322
323 /**
324 * Demonstrate Vector3d properties
325 */
326 private func demonstrateVector3d(_ vector: Vector3d) {
327 // [swift_Vector3d_getX]
328 // Get X coordinate
329 let x = vector.x
330 print("Vector X: \‍(x)")
331 // [swift_Vector3d_getX]
332
333 // [swift_Vector3d_getY]
334 // Get Y coordinate
335 let y = vector.y
336 print("Vector Y: \‍(y)")
337 // [swift_Vector3d_getY]
338
339 // [swift_Vector3d_getZ]
340 // Get Z coordinate
341 let z = vector.z
342 print("Vector Z: \‍(z)")
343 // [swift_Vector3d_getZ]
344 }
345
346 /**
347 * Main demonstration method
348 */
349 func runExample() {
350 print("=== MeasurementManager Example ===")
351
352 demonstrateMeasurementManagerMethods()
353
354 // Wait a bit for measurements
355 DispatchQueue.main.asyncAfter(deadline: .now() + 5.0) {
356 print("=== Example completed ===")
357 }
358 }
359}
360
361/**
362 * MeasurementListener implementation
363 */
364class MeasurementListenerImpl: NSObject, MeasurementListener {
365 private weak var example: MeasurementManagerExample?
366
367 init(example: MeasurementManagerExample) {
368 self.example = example
369 super.init()
370 }
371
372 // [swift_MeasurementListener_onSensorMeasurementDetected]
373 func onSensorMeasurementDetected(_ sensors: [SensorType: SensorMeasurement]) {
374 print("Sensor measurements detected")
375 example?.demonstrateSensorMeasurements(sensors)
376 }
377 // [swift_MeasurementListener_onSensorMeasurementDetected]
378
379 // [swift_MeasurementListener_onSignalMeasurementDetected]
380 func onSignalMeasurementDetected(_ signals: [String: SignalMeasurement]) {
381 print("Signal measurements detected")
382 example?.demonstrateSignalMeasurements(signals)
383 }
384 // [swift_MeasurementListener_onSignalMeasurementDetected]
385}
386
387/**
388 * Function to run the example
389 */
390func main() {
391 let example = MeasurementManagerExample()
392 example.runExample()
393
394 // Keep the app running for a while to see the output
395 RunLoop.main.run(until: Date().addingTimeInterval(10.0))
396}
397
398// Run the example
399main()