-
Notifications
You must be signed in to change notification settings - Fork 0
/
index.js
115 lines (87 loc) · 2.1 KB
/
index.js
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
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
'use strict';
const debug = require('debug')('th:bluetooth');
const th = require('tinkerhub');
const noble = require('noble');
const { ExpiringDiscovery, addService, removeService, refService, unrefService } = require('tinkerhub-discovery');
const BLE = require('./lib/ble');
if(! module.parent) {
process.on('warning', e => console.warn(e.stack));
process.on('error', e => console.error(e.stack));
}
/*
setInterval(() => {
if(noble.state === 'poweredOn') {
noble.startScanning([], true);
}
}, 60000);
*/
const hasSeen = Symbol('hasSeen');
class NobleDiscovery extends ExpiringDiscovery {
static get type() {
return 'bluetooth';
}
constructor() {
super({
maxStaleTime: 60 * 1000
});
}
start() {
super.start();
const startScan = () => {
noble.startScanning([], true);
if(! this.scanner) {
this.scanner = setInterval(() => {
noble.startScanning([], true);
}, 60000);
setInterval(() => noble.stopScanning(), 5 * 60000);
}
};
/*
* Listen for state changes and start scanning when ready.
*/
noble.on('stateChange', state => {
debug('State is now', state);
if(state === 'poweredOn') {
startScan();
} else {
noble.stopScanning();
}
});
noble.on('scanStart', () => {
debug('Scanning started');
});
/*
* Scanning is restarted whenever it stops.
*/
noble.on('scanStop', () => {
debug('Scanning stopped');
});
noble.on('discover', peripheral => {
if(! peripheral[hasSeen]) {
peripheral.on('connect', () => {
this[refService](peripheral);
});
peripheral.on('disconnect', () => {
debug('Disconnected from ' + peripheral.id);
this[unrefService](peripheral);
setTimeout(() => peripheral.connect(), 10000);
});
peripheral[hasSeen] = true;
}
this[addService](peripheral);
});
/*
* Start scanning if powered on.
*/
if(noble.state === 'poweredOn') {
startScan();
}
}
stop() {
super.stop();
// TODO: Remove all listeners that have been added to `noble`
}
}
const discovery = new NobleDiscovery()
.map(p => new BLE(p).init());
th.registerDiscovery(discovery);