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