-
Notifications
You must be signed in to change notification settings - Fork 65
/
Copy pathiBeaconActiveListenerExample.agent.nut
86 lines (72 loc) · 2.39 KB
/
iBeaconActiveListenerExample.agent.nut
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
// iBeacon Active Listener Application
class IBeaconTracker {
beacons = null;
loopTime = null;
expTime = null;
constructor(checkInInterval, beaconExpire) {
beacons = {};
loopTime = checkInInterval;
expTime = beaconExpire;
// Register listener for iBeacons and responses collected on device
device.on("iBeacon", onIBeacon.bindenv(this));
device.on("iBeaconResp", onIBeaconResp.bindenv(this));
// Start Loop
loop();
}
function loop() {
removeInactive();
logActive();
imp.wakeup(loopTime, loop.bindenv(this));
}
function onIBeacon(iBeacon) {
if ("mac" in iBeacon) {
if (iBeacon.mac in beacons) {
local beacon = beacons[iBeacon.mac];
foreach(k, v in iBeacon) {
beacon[k] <- v;
}
} else {
beacons[iBeacon.mac] <- iBeacon;
}
}
}
function onIBeaconResp(resp) {
if ("mac" in resp && resp.mac in beacons) {
beacons[resp.mac]["devState"] <- resp;
}
}
function removeInactive() {
local now = time();
foreach(mac, iBeacon in beacons) {
local lastSeen = now - iBeacon.ts;
if (lastSeen >= expTime) {
beacons.rawdelete(mac);
}
}
}
function logActive() {
server.log("Number of matching BLE devices found: " + beacons.len());
server.log("---------------------------------------------");
foreach(mac, iBeacon in beacons) {
server.log("UUID: " );
server.log(iBeacon.uuid);
server.log("Major: ");
server.log(iBeacon.major);
server.log("Minor: ");
server.log(iBeacon.minor);
if ("devState" in iBeacon) {
server.log("Device State: ");
server.log(http.jsonencode(iBeacon.devState));
}
}
server.log("---------------------------------------------");
}
}
// RUNTIME
// -------------------------------------------------------------------------------
server.log("Agent running...");
// How often to log active beacon list
const CHECK_IN_INTERVAL_SEC = 5;
// Delete beacon from active list if it has not been seen in
const BEACON_EXPIRE_SEC = 30;
IBeaconTracker(CHECK_IN_INTERVAL_SEC, BEACON_EXPIRE_SEC);