Loading...
Searching...
No Matches
MeasurementManagerExample.m
Go to the documentation of this file.
2
7@implementation MeasurementManagerExample
8
9- (instancetype)init {
10 self = [super init];
11 if (self) {
12 [self initializeSdk];
13 [self setupMeasurementListener];
14 }
15 return self;
16}
17
21- (void)initializeSdk {
22 @try {
23 // [objc_NavigineSdk_getInstance]
24 // Get SDK instance
25 self.sdk = [NCNavigineSdk getInstance];
26 // [objc_NavigineSdk_getInstance]
27
28 // [objc_NavigineSdk_setUserHash]
29 // Set user hash
30 [self.sdk setUserHash:@"USER-HASH-HERE"];
31 // [objc_NavigineSdk_setUserHash]
32
33 // [objc_NavigineSdk_setServer]
34 // Set server URL (optional)
35 [self.sdk setServer:@"https://custom.navigine.com"];
36 // [objc_NavigineSdk_setServer]
37
38 // [objc_NavigineSdk_getLocationManager]
39 // Get LocationManager for working with locations
40 self.locationManager = [self.sdk getLocationManager];
41 // [objc_NavigineSdk_getLocationManager]
42
43 // [objc_NavigineSdk_getMeasurementManager]
44 // Get MeasurementManager for working with measurements
45 self.measurementManager = [self.sdk getMeasurementManager:self.locationManager];
46 // [objc_NavigineSdk_getMeasurementManager]
47
48 // [objc_MeasurementManager_setPublishIntervalMs]
49 // Optional: interval between measurement batches sent to listeners (ms)
50 [self.measurementManager setPublishIntervalMs:1000];
51 // [objc_MeasurementManager_setPublishIntervalMs]
52
53 if (self.locationManager != nil && self.measurementManager != nil) {
54 NSLog(@"LocationManager and MeasurementManager successfully initialized");
55 }
56 } @catch (NSException *exception) {
57 NSLog(@"Error initializing SDK: %@", exception.reason);
58 }
59}
60
64- (void)setupMeasurementListener {
65 self.measurementListener = [[MeasurementListenerImpl alloc] initWithExample:self];
66}
67
72 if (self.measurementManager == nil) {
73 NSLog(@"MeasurementManager not initialized");
74 return;
75 }
76
77 // [objc_MeasurementManager_addMeasurementListener]
78 // Add measurement listener
79 [self.measurementManager addMeasurementListener:self.measurementListener];
80 NSLog(@"Added measurement listener");
81 // [objc_MeasurementManager_addMeasurementListener]
82
83 // Demonstrate beacon generators
84 [self demonstrateBeaconGenerators];
85
86 // Demonstrate Eddystone generators
87 [self demonstrateEddystoneGenerators];
88
89 // Demonstrate Wi-Fi generators
90 [self demonstrateWifiGenerators];
91
92 // Demonstrate Wi-Fi RTT generators
93 [self demonstrateWifiRttGenerators];
94
95 // Demonstrate location generators
96 [self demonstrateLocationGenerators];
97
98 // Simulate some time passing for measurements
99 dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(2.0 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{
100 // [objc_MeasurementManager_removeMeasurementListener]
101 // Remove measurement listener
102 [self.measurementManager removeMeasurementListener:self.measurementListener];
103 NSLog(@"Removed measurement listener");
104 // [objc_MeasurementManager_removeMeasurementListener]
105 });
106}
107
111- (void)demonstrateBeaconGenerators {
112 // [objc_MeasurementManager_addBeaconGenerator]
113 // Add beacon generator
114 NSString *beaconId = [self.measurementManager addBeaconGeneratorWithUuid:@"12345678-1234-1234-1234-123456789012"
115 major:100
116 minor:200
117 power:-60
118 timeout:5000
119 rssiMin:-80
120 rssiMax:-40];
121 NSLog(@"Added beacon generator with ID: %@", beaconId);
122 // [objc_MeasurementManager_addBeaconGenerator]
123
124 // [objc_MeasurementManager_removeBleGenerator]
125 // Remove specific BLE generator
126 [self.measurementManager removeBleGeneratorWithId:beaconId];
127 NSLog(@"Removed BLE generator: %@", beaconId);
128 // [objc_MeasurementManager_removeBleGenerator]
129
130 // [objc_MeasurementManager_removeBleGenerators]
131 // Remove all BLE generators
132 [self.measurementManager removeBleGenerators];
133 NSLog(@"Removed all BLE generators");
134 // [objc_MeasurementManager_removeBleGenerators]
135}
136
140- (void)demonstrateEddystoneGenerators {
141 // [objc_MeasurementManager_addEddystoneGenerator]
142 // Add Eddystone generator
143 NSString *eddystoneId = [self.measurementManager addEddystoneGeneratorWithNamespaceId:@"12345678901234567890"
144 instanceId:@"1234567890123456"
145 power:-65
146 timeout:3000
147 rssiMin:-85
148 rssiMax:-45];
149 NSLog(@"Added Eddystone generator with ID: %@", eddystoneId);
150 // [objc_MeasurementManager_addEddystoneGenerator]
151
152 // Remove Eddystone generator (uses same method as BLE)
153 [self.measurementManager removeBleGeneratorWithId:eddystoneId];
154 NSLog(@"Removed Eddystone generator: %@", eddystoneId);
155}
156
160- (void)demonstrateWifiGenerators {
161 // [objc_MeasurementManager_addWifiGenerator]
162 // Add Wi-Fi generator
163 NSString *wifiId = [self.measurementManager addWifiGeneratorWithMac:@"AA:BB:CC:DD:EE:FF"
164 timeout:4000
165 rssiMin:-90
166 rssiMax:-50];
167 NSLog(@"Added Wi-Fi generator with ID: %@", wifiId);
168 // [objc_MeasurementManager_addWifiGenerator]
169
170 // [objc_MeasurementManager_removeWifiGenerator]
171 // Remove specific Wi-Fi generator
172 [self.measurementManager removeWifiGeneratorWithId:wifiId];
173 NSLog(@"Removed Wi-Fi generator: %@", wifiId);
174 // [objc_MeasurementManager_removeWifiGenerator]
175
176 // [objc_MeasurementManager_removeWifiGenerators]
177 // Remove all Wi-Fi generators
178 [self.measurementManager removeWifiGenerators];
179 NSLog(@"Removed all Wi-Fi generators");
180 // [objc_MeasurementManager_removeWifiGenerators]
181}
182
186- (void)demonstrateWifiRttGenerators {
187 // [objc_MeasurementManager_addWifiRttGenerator]
188 // Add Wi-Fi RTT generator
189 NSString *wifiRttId = [self.measurementManager addWifiRttGeneratorWithMac:@"11:22:33:44:55:66"
190 timeout:6000
191 distMin:1
192 distMax:10
193 stdDevMin:0
194 stdDevMax:2
195 rssiMin:-70
196 rssiMax:-30];
197 NSLog(@"Added Wi-Fi RTT generator with ID: %@", wifiRttId);
198 // [objc_MeasurementManager_addWifiRttGenerator]
199
200 // [objc_MeasurementManager_removeWifiRttGenerator]
201 // Remove specific Wi-Fi RTT generator
202 [self.measurementManager removeWifiRttGeneratorWithHash:wifiRttId];
203 NSLog(@"Removed Wi-Fi RTT generator: %@", wifiRttId);
204 // [objc_MeasurementManager_removeWifiRttGenerator]
205
206 // [objc_MeasurementManager_removeWifiRttGenerators]
207 // Remove all Wi-Fi RTT generators
208 [self.measurementManager removeWifiRttGenerators];
209 NSLog(@"Removed all Wi-Fi RTT generators");
210 // [objc_MeasurementManager_removeWifiRttGenerators]
211}
212
216- (void)demonstrateLocationGenerators {
217 // [objc_MeasurementManager_addLocationGenerator]
218 // Add location generator
219 NSString *locationId = [self.measurementManager addLocationGeneratorWithLatMin:55.7558
220 latMax:55.7559
221 lonMin:37.6176
222 lonMax:37.6177
223 accMin:1.0
224 accMax:5.0
225 timeout:7000];
226 NSLog(@"Added location generator with ID: %@", locationId);
227 // [objc_MeasurementManager_addLocationGenerator]
228
229 // [objc_MeasurementManager_removeLocationGenerator]
230 // Remove specific location generator
231 [self.measurementManager removeLocationGeneratorWithId:locationId];
232 NSLog(@"Removed location generator: %@", locationId);
233 // [objc_MeasurementManager_removeLocationGenerator]
234
235 // [objc_MeasurementManager_removeLocationGenerators]
236 // Remove all location generators
237 [self.measurementManager removeLocationGenerators];
238 NSLog(@"Removed all location generators");
239 // [objc_MeasurementManager_removeLocationGenerators]
240}
241
245- (void)demonstrateSensorMeasurements:(NSDictionary<NSNumber *, NCSensorMeasurement *> *)sensors {
246 [sensors enumerateKeysAndObjectsUsingBlock:^(NSNumber *sensorTypeKey, NCSensorMeasurement *measurement, BOOL *stop) {
247 // [objc_SensorMeasurement_getType]
248 // Get sensor type
249 NCSensorType type = measurement.type;
250 NSLog(@"Sensor type: %ld", (long)type);
251 // [objc_SensorMeasurement_getType]
252
253 // [objc_SensorMeasurement_getValues]
254 // Get sensor values
255 NCVector3d *values = measurement.values;
256 NSLog(@"Sensor values - X: %f, Y: %f, Z: %f", values.x, values.y, values.z);
257 // [objc_SensorMeasurement_getValues]
258
259 // [objc_SensorMeasurement_getTime]
260 // Get measurement timestamp
261 long long time = measurement.time;
262 NSLog(@"Measurement time: %lld ms", time);
263 // [objc_SensorMeasurement_getTime]
264
265 // Demonstrate Vector3d properties
266 [self demonstrateVector3d:values];
267 }];
268}
269
273- (void)demonstrateSignalMeasurements:(NSDictionary<NSString *, NCSignalMeasurement *> *)signals {
274 [signals enumerateKeysAndObjectsUsingBlock:^(NSString *signalId, NCSignalMeasurement *measurement, BOOL *stop) {
275 // [objc_SignalMeasurement_getType]
276 // Get signal type
277 NCSignalType type = measurement.type;
278 NSLog(@"Signal type: %ld", (long)type);
279 // [objc_SignalMeasurement_getType]
280
281 // [objc_SignalMeasurement_getId]
282 // Get signal identifier
283 NSString *id = measurement.id;
284 NSLog(@"Signal ID: %@", id);
285 // [objc_SignalMeasurement_getId]
286
287 // [objc_SignalMeasurement_getRssi]
288 // Get RSSI value
289 double rssi = measurement.rssi;
290 NSLog(@"Signal RSSI: %f dBm", rssi);
291 // [objc_SignalMeasurement_getRssi]
292
293 // [objc_SignalMeasurement_getDistance]
294 // Get estimated distance
295 double distance = measurement.distance;
296 NSLog(@"Signal distance: %f meters", distance);
297 // [objc_SignalMeasurement_getDistance]
298
299 // [objc_SignalMeasurement_getTime]
300 // Get measurement timestamp
301 long long time = measurement.time;
302 NSLog(@"Signal measurement time: %lld ms", time);
303 // [objc_SignalMeasurement_getTime]
304 }];
305}
306
310- (void)demonstrateVector3d:(NCVector3d *)vector {
311 // [objc_Vector3d_getX]
312 // Get X coordinate
313 double x = vector.x;
314 NSLog(@"Vector X: %f", x);
315 // [objc_Vector3d_getX]
316
317 // [objc_Vector3d_getY]
318 // Get Y coordinate
319 double y = vector.y;
320 NSLog(@"Vector Y: %f", y);
321 // [objc_Vector3d_getY]
322
323 // [objc_Vector3d_getZ]
324 // Get Z coordinate
325 double z = vector.z;
326 NSLog(@"Vector Z: %f", z);
327 // [objc_Vector3d_getZ]
328}
329
333- (void)runExample {
334 NSLog(@"=== MeasurementManager Example ===");
335
336 [self demonstrateMeasurementManagerMethods];
337
338 // Wait a bit for measurements
339 dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(5.0 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{
340 NSLog(@"=== Example completed ===");
341 });
342}
343
344@end
345
349@interface MeasurementListenerImpl : NSObject <NCMeasurementListener>
350
351@property (nonatomic, weak) MeasurementManagerExample *example;
352
353- (instancetype)initWithExample:(MeasurementManagerExample *)example;
354
355@end
356
357@implementation MeasurementListenerImpl
358
359- (instancetype)initWithExample:(MeasurementManagerExample *)example {
360 self = [super init];
361 if (self) {
362 self.example = example;
363 }
364 return self;
365}
366
367// [objc_MeasurementListener_onSensorMeasurementDetected]
368- (void)onSensorMeasurementDetected:(NSDictionary<NSNumber *, NCSensorMeasurement *> *)sensors {
369 NSLog(@"Sensor measurements detected");
370 [self.example demonstrateSensorMeasurements:sensors];
371}
372// [objc_MeasurementListener_onSensorMeasurementDetected]
373
374// [objc_MeasurementListener_onSignalMeasurementDetected]
375- (void)onSignalMeasurementDetected:(NSDictionary<NSString *, NCSignalMeasurement *> *)signals {
376 NSLog(@"Signal measurements detected");
377 [self.example demonstrateSignalMeasurements:signals];
378}
379// [objc_MeasurementListener_onSignalMeasurementDetected]
380
381@end
382
386int main(int argc, const char * argv[]) {
387 @autoreleasepool {
389 [example runExample];
390
391 // Keep the app running for a while to see the output
392 [[NSRunLoop currentRunLoop] runUntilDate:[NSDate dateWithTimeIntervalSinceNow:10.0]];
393 }
394 return 0;
395}