@matter/nodejs-ble 0.12.0-alpha.0-20250103-ba0c01a01 → 0.12.0-alpha.0-20250107-af5a068c3
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/cjs/BleScanner.d.ts +2 -2
- package/dist/cjs/BleScanner.d.ts.map +1 -1
- package/dist/cjs/BleScanner.js +19 -13
- package/dist/cjs/BleScanner.js.map +1 -1
- package/dist/cjs/BlenoBleServer.d.ts.map +1 -1
- package/dist/cjs/BlenoBleServer.js +4 -4
- package/dist/cjs/BlenoBleServer.js.map +1 -1
- package/dist/cjs/NobleBleChannel.d.ts +3 -2
- package/dist/cjs/NobleBleChannel.d.ts.map +1 -1
- package/dist/cjs/NobleBleChannel.js +252 -101
- package/dist/cjs/NobleBleChannel.js.map +2 -2
- package/dist/cjs/NobleBleClient.d.ts.map +1 -1
- package/dist/cjs/NobleBleClient.js +15 -7
- package/dist/cjs/NobleBleClient.js.map +1 -1
- package/dist/cjs/NodeJsBle.d.ts +1 -2
- package/dist/cjs/NodeJsBle.d.ts.map +1 -1
- package/dist/cjs/NodeJsBle.js +30 -14
- package/dist/cjs/NodeJsBle.js.map +1 -1
- package/dist/esm/BleScanner.d.ts +2 -2
- package/dist/esm/BleScanner.d.ts.map +1 -1
- package/dist/esm/BleScanner.js +19 -13
- package/dist/esm/BleScanner.js.map +1 -1
- package/dist/esm/BlenoBleServer.d.ts.map +1 -1
- package/dist/esm/BlenoBleServer.js +4 -4
- package/dist/esm/BlenoBleServer.js.map +1 -1
- package/dist/esm/NobleBleChannel.d.ts +3 -2
- package/dist/esm/NobleBleChannel.d.ts.map +1 -1
- package/dist/esm/NobleBleChannel.js +253 -102
- package/dist/esm/NobleBleChannel.js.map +2 -2
- package/dist/esm/NobleBleClient.d.ts.map +1 -1
- package/dist/esm/NobleBleClient.js +15 -7
- package/dist/esm/NobleBleClient.js.map +1 -1
- package/dist/esm/NodeJsBle.d.ts +1 -2
- package/dist/esm/NodeJsBle.d.ts.map +1 -1
- package/dist/esm/NodeJsBle.js +30 -14
- package/dist/esm/NodeJsBle.js.map +1 -1
- package/package.json +5 -5
- package/src/BleScanner.ts +23 -13
- package/src/BlenoBleServer.ts +6 -4
- package/src/NobleBleChannel.ts +316 -126
- package/src/NobleBleClient.ts +17 -7
- package/src/NodeJsBle.ts +32 -14
|
@@ -7,6 +7,7 @@ import {
|
|
|
7
7
|
ChannelType,
|
|
8
8
|
InternalError,
|
|
9
9
|
Logger,
|
|
10
|
+
NetworkError,
|
|
10
11
|
Time,
|
|
11
12
|
createPromise
|
|
12
13
|
} from "@matter/general";
|
|
@@ -19,7 +20,6 @@ import {
|
|
|
19
20
|
BTP_CONN_RSP_TIMEOUT_MS,
|
|
20
21
|
BTP_MAXIMUM_WINDOW_SIZE,
|
|
21
22
|
BTP_SUPPORTED_VERSIONS,
|
|
22
|
-
Ble,
|
|
23
23
|
BleChannel,
|
|
24
24
|
BleError,
|
|
25
25
|
BtpCodec,
|
|
@@ -42,127 +42,251 @@ function nobleUuidToUuid(uuid) {
|
|
|
42
42
|
return parts.join("-");
|
|
43
43
|
}
|
|
44
44
|
class NobleBleCentralInterface {
|
|
45
|
-
|
|
46
|
-
|
|
45
|
+
#bleScanner;
|
|
46
|
+
#connectionsInProgress = /* @__PURE__ */ new Set();
|
|
47
|
+
#connectionGuards = /* @__PURE__ */ new Set();
|
|
48
|
+
#openChannels = /* @__PURE__ */ new Map();
|
|
49
|
+
#onMatterMessageListener;
|
|
50
|
+
#closed = false;
|
|
51
|
+
constructor(bleScanner) {
|
|
52
|
+
this.#bleScanner = bleScanner;
|
|
53
|
+
}
|
|
47
54
|
openChannel(address, tryCount = 1) {
|
|
55
|
+
if (this.#closed) {
|
|
56
|
+
throw new NetworkError("Network interface is closed");
|
|
57
|
+
}
|
|
48
58
|
return new Promise((resolve, reject) => {
|
|
49
|
-
if (this
|
|
50
|
-
reject(new InternalError(`Network Interface was not added to the system yet.`));
|
|
59
|
+
if (this.#onMatterMessageListener === void 0) {
|
|
60
|
+
reject(new InternalError(`Network Interface was not added to the system yet, so can not connect it.`));
|
|
51
61
|
return;
|
|
52
62
|
}
|
|
53
63
|
if (address.type !== "ble") {
|
|
54
64
|
reject(new InternalError(`Unsupported address type ${address.type}.`));
|
|
55
65
|
return;
|
|
56
66
|
}
|
|
57
|
-
const {
|
|
67
|
+
const { peripheralAddress } = address;
|
|
58
68
|
if (tryCount > 3) {
|
|
59
|
-
reject(new BleError(`Failed to connect to peripheral ${
|
|
69
|
+
reject(new BleError(`Failed to connect to peripheral ${peripheralAddress}`));
|
|
60
70
|
return;
|
|
61
71
|
}
|
|
62
|
-
|
|
63
|
-
if (
|
|
72
|
+
const { peripheral, hasAdditionalAdvertisementData } = this.#bleScanner.getDiscoveredDevice(peripheralAddress);
|
|
73
|
+
if (this.#openChannels.has(address)) {
|
|
64
74
|
reject(
|
|
65
75
|
new BleError(
|
|
66
|
-
`Peripheral ${
|
|
76
|
+
`Peripheral ${peripheralAddress} is already connected. Only one connection supported right now.`
|
|
67
77
|
)
|
|
68
78
|
);
|
|
69
79
|
return;
|
|
70
80
|
}
|
|
71
|
-
if (this.
|
|
81
|
+
if (this.#connectionsInProgress.has(address)) {
|
|
82
|
+
logger.debug(`Connection to peripheral ${peripheralAddress} is already in progress.`);
|
|
83
|
+
return;
|
|
84
|
+
}
|
|
85
|
+
if (peripheral.state === "error") {
|
|
72
86
|
reject(
|
|
73
87
|
new BleError(
|
|
74
|
-
`
|
|
88
|
+
`Can not connect to peripheral "${peripheralAddress}" because unexpected state "${peripheral.state}"`
|
|
75
89
|
)
|
|
76
90
|
);
|
|
77
91
|
return;
|
|
78
92
|
}
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
logger.debug(`
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
case BLE_MATTER_C2_CHARACTERISTIC_UUID:
|
|
105
|
-
logger.debug("found C2 characteristic");
|
|
106
|
-
characteristicC2ForSubscribe = characteristic;
|
|
107
|
-
break;
|
|
108
|
-
case BLE_MATTER_C3_CHARACTERISTIC_UUID:
|
|
109
|
-
logger.debug("found C3 characteristic");
|
|
110
|
-
if (hasAdditionalAdvertisementData) {
|
|
111
|
-
logger.debug("reading additional commissioning related data");
|
|
112
|
-
const data = await characteristic.readAsync();
|
|
113
|
-
additionalCommissioningRelatedData = new Uint8Array(data);
|
|
114
|
-
logger.debug("additional data", data);
|
|
115
|
-
}
|
|
116
|
-
}
|
|
93
|
+
const connectionGuard = {
|
|
94
|
+
// Timeout when trying to connect to the device because sometimes connect fails and noble does
|
|
95
|
+
// not emit an event. If device does not connect we do not try any longer and reject the promise
|
|
96
|
+
// because a re-discovery is the best option to get teh device into a good state again
|
|
97
|
+
connectTimeout: Time.getTimer("BLE connect timeout", 6e4, () => {
|
|
98
|
+
logger.debug(`Timeout while connecting to peripheral ${peripheralAddress}`);
|
|
99
|
+
peripheral.removeListener("connect", connectHandler);
|
|
100
|
+
peripheral.removeListener("disconnect", reTryHandler);
|
|
101
|
+
clearConnectionGuard();
|
|
102
|
+
reject(new BleError(`Timeout while connecting to peripheral ${peripheralAddress}`));
|
|
103
|
+
}),
|
|
104
|
+
disconnectTimeout: Time.getTimer("BLE disconnect timeout", 6e4, () => {
|
|
105
|
+
logger.debug(`Timeout while disconnecting to peripheral ${peripheralAddress}`);
|
|
106
|
+
peripheral.removeListener("disconnect", reTryHandler);
|
|
107
|
+
clearConnectionGuard();
|
|
108
|
+
reject(new BleError(`Timeout while disconnecting to peripheral ${peripheralAddress}`));
|
|
109
|
+
}),
|
|
110
|
+
// Timeout when trying to interview the device because sometimes when no response from device
|
|
111
|
+
// comes noble does not resolve promises
|
|
112
|
+
interviewTimeout: Time.getTimer("BLE interview timeout", 6e4, () => {
|
|
113
|
+
logger.debug(`Timeout while interviewing peripheral ${peripheralAddress}`);
|
|
114
|
+
peripheral.removeListener("disconnect", reTryHandler);
|
|
115
|
+
clearConnectionGuard();
|
|
116
|
+
if (peripheral.state === "connected") {
|
|
117
|
+
peripheral.disconnectAsync().catch((error) => logger.error(`Ignored error while disconnecting`, error));
|
|
117
118
|
}
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
}
|
|
135
|
-
peripheral.removeAllListeners("disconnect");
|
|
136
|
-
reject(new BleError(`Peripheral ${peripheral.address} does not have the required characteristics`));
|
|
137
|
-
});
|
|
138
|
-
const reTryHandler = async (error) => {
|
|
119
|
+
reject(new BleError(`Timeout while interviewing peripheral ${peripheralAddress}`));
|
|
120
|
+
})
|
|
121
|
+
};
|
|
122
|
+
this.#connectionGuards.add(connectionGuard);
|
|
123
|
+
const clearConnectionGuard = () => {
|
|
124
|
+
const { connectTimeout, interviewTimeout, disconnectTimeout } = connectionGuard;
|
|
125
|
+
connectTimeout?.stop();
|
|
126
|
+
interviewTimeout?.stop();
|
|
127
|
+
disconnectTimeout?.stop();
|
|
128
|
+
this.#connectionGuards.delete(connectionGuard);
|
|
129
|
+
};
|
|
130
|
+
const reTryHandler = (error) => {
|
|
131
|
+
clearConnectionGuard();
|
|
132
|
+
this.#connectionsInProgress.delete(address);
|
|
133
|
+
peripheral.removeListener("connect", connectHandler);
|
|
134
|
+
peripheral.removeListener("disconnect", reTryHandler);
|
|
139
135
|
if (error) {
|
|
140
136
|
logger.error(
|
|
141
|
-
`Peripheral ${
|
|
137
|
+
`Peripheral ${peripheralAddress} disconnected while trying to connect, try again`,
|
|
142
138
|
error
|
|
143
139
|
);
|
|
144
140
|
} else {
|
|
145
|
-
logger.info(`Peripheral ${
|
|
141
|
+
logger.info(`Peripheral ${peripheralAddress} disconnected while trying to connect, try again`);
|
|
146
142
|
}
|
|
147
|
-
peripheral.removeAllListeners("disconnect");
|
|
148
|
-
peripheral.removeAllListeners("connect");
|
|
149
143
|
this.openChannel(address, tryCount + 1).then(resolve).catch(reject);
|
|
150
144
|
};
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
|
|
145
|
+
const connectHandler = async (error) => {
|
|
146
|
+
connectionGuard.connectTimeout.stop();
|
|
147
|
+
if (!this.#connectionGuards.has(connectionGuard)) {
|
|
148
|
+
return;
|
|
149
|
+
}
|
|
150
|
+
if (error) {
|
|
151
|
+
clearConnectionGuard();
|
|
152
|
+
reject(new BleError(`Error while connecting to peripheral ${peripheralAddress}`, error));
|
|
153
|
+
return;
|
|
154
|
+
}
|
|
155
|
+
if (this.#onMatterMessageListener === void 0) {
|
|
156
|
+
clearConnectionGuard();
|
|
157
|
+
reject(new InternalError(`Network Interface was not added to the system yet or was cleared.`));
|
|
158
|
+
return;
|
|
159
|
+
}
|
|
160
|
+
if (this.#connectionsInProgress.has(address)) {
|
|
161
|
+
return;
|
|
162
|
+
}
|
|
163
|
+
this.#connectionsInProgress.add(address);
|
|
164
|
+
try {
|
|
165
|
+
connectionGuard.interviewTimeout.start();
|
|
166
|
+
const services = await peripheral.discoverServicesAsync([BLE_MATTER_SERVICE_UUID]);
|
|
167
|
+
if (!this.#connectionGuards.has(connectionGuard)) {
|
|
168
|
+
return;
|
|
169
|
+
}
|
|
170
|
+
logger.debug(
|
|
171
|
+
`Peripheral ${peripheralAddress}: Found services: ${services.map((s) => s.uuid).join(", ")}`
|
|
172
|
+
);
|
|
173
|
+
for (const service of services) {
|
|
174
|
+
logger.debug(`Peripheral ${peripheralAddress}: Handle service: ${service.uuid}`);
|
|
175
|
+
if (service.uuid !== BLE_MATTER_SERVICE_UUID) continue;
|
|
176
|
+
const characteristics = await service.discoverCharacteristicsAsync();
|
|
177
|
+
if (!this.#connectionGuards.has(connectionGuard)) {
|
|
178
|
+
return;
|
|
179
|
+
}
|
|
180
|
+
let characteristicC1ForWrite;
|
|
181
|
+
let characteristicC2ForSubscribe;
|
|
182
|
+
let additionalCommissioningRelatedData;
|
|
183
|
+
for (const characteristic of characteristics) {
|
|
184
|
+
logger.debug(
|
|
185
|
+
`Peripheral ${peripheralAddress}: Handle characteristic:`,
|
|
186
|
+
characteristic.uuid,
|
|
187
|
+
characteristic.properties
|
|
188
|
+
);
|
|
189
|
+
switch (nobleUuidToUuid(characteristic.uuid)) {
|
|
190
|
+
case BLE_MATTER_C1_CHARACTERISTIC_UUID:
|
|
191
|
+
logger.debug(`Peripheral ${peripheralAddress}: Found C1 characteristic`);
|
|
192
|
+
characteristicC1ForWrite = characteristic;
|
|
193
|
+
break;
|
|
194
|
+
case BLE_MATTER_C2_CHARACTERISTIC_UUID:
|
|
195
|
+
logger.debug(`Peripheral ${peripheralAddress}: Found C2 characteristic`);
|
|
196
|
+
characteristicC2ForSubscribe = characteristic;
|
|
197
|
+
break;
|
|
198
|
+
case BLE_MATTER_C3_CHARACTERISTIC_UUID:
|
|
199
|
+
logger.debug(`Peripheral ${peripheralAddress}: Found C3 characteristic`);
|
|
200
|
+
if (hasAdditionalAdvertisementData) {
|
|
201
|
+
logger.debug(
|
|
202
|
+
`Peripheral ${peripheralAddress}: Reading additional commissioning related data`
|
|
203
|
+
);
|
|
204
|
+
const data = await characteristic.readAsync();
|
|
205
|
+
if (!this.#connectionGuards.has(connectionGuard)) {
|
|
206
|
+
return;
|
|
207
|
+
}
|
|
208
|
+
additionalCommissioningRelatedData = new Uint8Array(data);
|
|
209
|
+
logger.debug(`Peripheral ${peripheralAddress}: Additional data:`, data);
|
|
210
|
+
}
|
|
211
|
+
}
|
|
212
|
+
}
|
|
213
|
+
if (!characteristicC1ForWrite || !characteristicC2ForSubscribe) {
|
|
214
|
+
logger.debug(
|
|
215
|
+
`Peripheral ${peripheralAddress}: Missing required Matter characteristics. Ignore.`
|
|
216
|
+
);
|
|
217
|
+
continue;
|
|
218
|
+
}
|
|
219
|
+
connectionGuard.interviewTimeout.stop();
|
|
220
|
+
peripheral.removeListener("disconnect", reTryHandler);
|
|
221
|
+
this.#openChannels.set(address, peripheral);
|
|
222
|
+
try {
|
|
223
|
+
resolve(
|
|
224
|
+
await NobleBleChannel.create(
|
|
225
|
+
peripheral,
|
|
226
|
+
characteristicC1ForWrite,
|
|
227
|
+
characteristicC2ForSubscribe,
|
|
228
|
+
this.#onMatterMessageListener,
|
|
229
|
+
additionalCommissioningRelatedData
|
|
230
|
+
)
|
|
231
|
+
);
|
|
232
|
+
clearConnectionGuard();
|
|
233
|
+
this.#connectionsInProgress.delete(address);
|
|
234
|
+
} catch (error2) {
|
|
235
|
+
this.#connectionsInProgress.delete(address);
|
|
236
|
+
this.#openChannels.delete(address);
|
|
237
|
+
await peripheral.disconnectAsync();
|
|
238
|
+
reTryHandler(error2);
|
|
239
|
+
return;
|
|
240
|
+
}
|
|
241
|
+
}
|
|
242
|
+
} finally {
|
|
243
|
+
this.#connectionsInProgress.delete(address);
|
|
244
|
+
clearConnectionGuard();
|
|
245
|
+
}
|
|
246
|
+
peripheral.removeListener("disconnect", reTryHandler);
|
|
247
|
+
reject(
|
|
248
|
+
new BleError(`Peripheral ${peripheralAddress} does not have the required Matter characteristics`)
|
|
249
|
+
);
|
|
250
|
+
};
|
|
251
|
+
if (peripheral.state === "connected") {
|
|
252
|
+
logger.debug(`Peripheral ${peripheralAddress}: Already connected`);
|
|
253
|
+
connectHandler().catch((error) => logger.warn(`Error while connecting`, error));
|
|
254
|
+
} else if (peripheral.state === "disconnecting") {
|
|
255
|
+
logger.debug(`Peripheral ${peripheralAddress}: Disconnect in progress`);
|
|
256
|
+
connectionGuard.disconnectTimeout.start();
|
|
257
|
+
tryCount--;
|
|
258
|
+
peripheral.once("disconnect", reTryHandler);
|
|
259
|
+
} else {
|
|
260
|
+
if (peripheral.state === "connecting") {
|
|
261
|
+
peripheral.cancelConnect();
|
|
262
|
+
peripheral.state = "disconnected";
|
|
263
|
+
}
|
|
264
|
+
connectionGuard.connectTimeout.start();
|
|
265
|
+
peripheral.once("connect", connectHandler);
|
|
266
|
+
peripheral.once("disconnect", reTryHandler);
|
|
267
|
+
logger.debug(`Peripheral ${peripheralAddress}: Connect to Peripheral now (try ${tryCount})`);
|
|
268
|
+
peripheral.connectAsync().catch((error) => {
|
|
269
|
+
if (!this.#connectionGuards.has(connectionGuard)) {
|
|
270
|
+
return;
|
|
271
|
+
}
|
|
272
|
+
logger.info(`Peripheral ${peripheralAddress}: Error while connecting to peripheral`, error);
|
|
273
|
+
reTryHandler(error);
|
|
274
|
+
});
|
|
275
|
+
}
|
|
154
276
|
});
|
|
155
277
|
}
|
|
156
278
|
onData(listener) {
|
|
157
|
-
this
|
|
279
|
+
this.#onMatterMessageListener = listener;
|
|
158
280
|
return {
|
|
159
281
|
close: async () => await this.close()
|
|
160
282
|
};
|
|
161
283
|
}
|
|
162
284
|
async close() {
|
|
163
|
-
|
|
164
|
-
|
|
285
|
+
this.#closed = true;
|
|
286
|
+
for (const peripheral of this.#openChannels.values()) {
|
|
287
|
+
peripheral.disconnectAsync().catch((error) => logger.error(`Peripheral ${peripheral.address}: Error while disconnecting`, error));
|
|
165
288
|
}
|
|
289
|
+
this.#openChannels.clear();
|
|
166
290
|
}
|
|
167
291
|
supports(type, _address) {
|
|
168
292
|
if (type !== ChannelType.BLE) {
|
|
@@ -183,33 +307,52 @@ class NobleBleChannel extends BleChannel {
|
|
|
183
307
|
});
|
|
184
308
|
}
|
|
185
309
|
static async create(peripheral, characteristicC1ForWrite, characteristicC2ForSubscribe, onMatterMessageListener, _additionalCommissioningRelatedData) {
|
|
310
|
+
const { address: peripheralAddress } = peripheral;
|
|
186
311
|
let mtu = peripheral.mtu ?? 0;
|
|
187
312
|
if (mtu > BLE_MAXIMUM_BTP_MTU) {
|
|
188
313
|
mtu = BLE_MAXIMUM_BTP_MTU;
|
|
189
314
|
}
|
|
190
|
-
logger.debug(
|
|
315
|
+
logger.debug(
|
|
316
|
+
`Peripheral ${peripheralAddress}: Using MTU=${mtu} bytes (Peripheral supports up to ${peripheral.mtu} bytes)`
|
|
317
|
+
);
|
|
318
|
+
const {
|
|
319
|
+
promise: handshakeResponseReceivedPromise,
|
|
320
|
+
resolver: handshakeResolver,
|
|
321
|
+
rejecter: handshakeRejecter
|
|
322
|
+
} = createPromise();
|
|
323
|
+
const handshakeHandler = (data, isNotification) => {
|
|
324
|
+
if (data[0] === 101 && data[1] === 108 && data.length === 6) {
|
|
325
|
+
logger.info(
|
|
326
|
+
`Peripheral ${peripheralAddress}: Received Matter handshake response: ${data.toString("hex")}.`
|
|
327
|
+
);
|
|
328
|
+
btpHandshakeTimeout.stop();
|
|
329
|
+
handshakeResolver(data);
|
|
330
|
+
} else {
|
|
331
|
+
logger.debug(
|
|
332
|
+
`Peripheral ${peripheralAddress}: Received first data on C2: ${data.toString("hex")} (isNotification: ${isNotification}) - No handshake response, inforing`
|
|
333
|
+
);
|
|
334
|
+
}
|
|
335
|
+
};
|
|
336
|
+
const btpHandshakeTimeout = Time.getTimer("BLE handshake timeout", BTP_CONN_RSP_TIMEOUT_MS, async () => {
|
|
337
|
+
characteristicC2ForSubscribe.removeListener("data", handshakeHandler);
|
|
338
|
+
characteristicC2ForSubscribe.unsubscribeAsync().catch((error) => logger.error(`Peripheral ${peripheralAddress}: Error while unsubscribing`, error));
|
|
339
|
+
logger.debug(
|
|
340
|
+
`Peripheral ${peripheralAddress}: Handshake Response not received. Disconnected from peripheral`
|
|
341
|
+
);
|
|
342
|
+
handshakeRejecter(new BleError(`Peripheral ${peripheralAddress}: Handshake Response not received`));
|
|
343
|
+
}).start();
|
|
191
344
|
const btpHandshakeRequest = BtpCodec.encodeBtpHandshakeRequest({
|
|
192
345
|
versions: BTP_SUPPORTED_VERSIONS,
|
|
193
346
|
attMtu: mtu,
|
|
194
347
|
clientWindowSize: BTP_MAXIMUM_WINDOW_SIZE
|
|
195
348
|
});
|
|
196
|
-
logger.debug(
|
|
349
|
+
logger.debug(
|
|
350
|
+
`Peripheral ${peripheralAddress}: Sending BTP handshake request: ${Logger.toJSON(btpHandshakeRequest)}`
|
|
351
|
+
);
|
|
197
352
|
await characteristicC1ForWrite.writeAsync(Buffer.from(btpHandshakeRequest.buffer), false);
|
|
198
|
-
|
|
199
|
-
await peripheral.disconnectAsync();
|
|
200
|
-
logger.debug("Handshake Response not received. Disconnected from peripheral");
|
|
201
|
-
}).start();
|
|
202
|
-
logger.debug("subscribing to C2 characteristic");
|
|
353
|
+
logger.debug(`Peripheral ${peripheralAddress}: Subscribing to C2 characteristic`);
|
|
203
354
|
await characteristicC2ForSubscribe.subscribeAsync();
|
|
204
|
-
|
|
205
|
-
characteristicC2ForSubscribe.once("data", (data, isNotification) => {
|
|
206
|
-
logger.debug(`received first data on C2: ${data.toString("hex")} (isNotification: ${isNotification})`);
|
|
207
|
-
if (data[0] === 101 && data[1] === 108 && data.length === 6) {
|
|
208
|
-
logger.info(`Received Matter handshake response: ${data.toString("hex")}.`);
|
|
209
|
-
btpHandshakeTimeout.stop();
|
|
210
|
-
resolver(data);
|
|
211
|
-
}
|
|
212
|
-
});
|
|
355
|
+
characteristicC2ForSubscribe.once("data", handshakeHandler);
|
|
213
356
|
const handshakeResponse = await handshakeResponseReceivedPromise;
|
|
214
357
|
const btpSession = await BtpSessionHandler.createAsCentral(
|
|
215
358
|
new Uint8Array(handshakeResponse),
|
|
@@ -218,7 +361,9 @@ class NobleBleChannel extends BleChannel {
|
|
|
218
361
|
return await characteristicC1ForWrite.writeAsync(Buffer.from(data.buffer), false);
|
|
219
362
|
},
|
|
220
363
|
// callback to disconnect the BLE connection
|
|
221
|
-
async () => void characteristicC2ForSubscribe.unsubscribeAsync().then(
|
|
364
|
+
async () => void characteristicC2ForSubscribe.unsubscribeAsync().then(
|
|
365
|
+
() => peripheral.disconnectAsync().then(() => logger.debug(`Peripheral ${peripheralAddress}: Disconnected from peripheral`))
|
|
366
|
+
),
|
|
222
367
|
// callback to forward decoded and de-assembled Matter messages to ExchangeManager
|
|
223
368
|
async (data) => {
|
|
224
369
|
if (onMatterMessageListener === void 0) {
|
|
@@ -228,7 +373,9 @@ class NobleBleChannel extends BleChannel {
|
|
|
228
373
|
}
|
|
229
374
|
);
|
|
230
375
|
characteristicC2ForSubscribe.on("data", (data, isNotification) => {
|
|
231
|
-
logger.debug(
|
|
376
|
+
logger.debug(
|
|
377
|
+
`Peripheral ${peripheralAddress}: received data on C2: ${data.toString("hex")} (isNotification: ${isNotification})`
|
|
378
|
+
);
|
|
232
379
|
void btpSession.handleIncomingBleData(new Uint8Array(data));
|
|
233
380
|
});
|
|
234
381
|
const nobleChannel = new NobleBleChannel(peripheral, btpSession);
|
|
@@ -242,11 +389,15 @@ class NobleBleChannel extends BleChannel {
|
|
|
242
389
|
*/
|
|
243
390
|
async send(data) {
|
|
244
391
|
if (!this.connected) {
|
|
245
|
-
logger.debug(
|
|
392
|
+
logger.debug(
|
|
393
|
+
`Peripheral ${this.peripheral.address}: Cannot send data because not connected to peripheral.`
|
|
394
|
+
);
|
|
246
395
|
return;
|
|
247
396
|
}
|
|
248
397
|
if (this.btpSession === void 0) {
|
|
249
|
-
throw new BtpFlowError(
|
|
398
|
+
throw new BtpFlowError(
|
|
399
|
+
`Peripheral ${this.peripheral.address}: Cannot send data, no BTP session initialized`
|
|
400
|
+
);
|
|
250
401
|
}
|
|
251
402
|
await this.btpSession.sendMatterMessage(data);
|
|
252
403
|
}
|
|
@@ -256,7 +407,7 @@ class NobleBleChannel extends BleChannel {
|
|
|
256
407
|
}
|
|
257
408
|
async close() {
|
|
258
409
|
await this.btpSession.close();
|
|
259
|
-
|
|
410
|
+
this.peripheral.disconnectAsync().catch((error) => logger.error(`Peripheral ${this.peripheral.address}: Error while disconnecting`, error));
|
|
260
411
|
}
|
|
261
412
|
}
|
|
262
413
|
export {
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../../src/NobleBleChannel.ts"],
|
|
4
|
-
"mappings": "AAAA;AAAA;AAAA;AAAA;AAAA;AAMA;AAAA,EAEI;AAAA,EACA;AAAA,EACA;AAAA,
|
|
5
|
-
"names": []
|
|
4
|
+
"mappings": "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",
|
|
5
|
+
"names": ["error"]
|
|
6
6
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"NobleBleClient.d.ts","sourceRoot":"","sources":["../../src/NobleBleClient.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAKH,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAC;AACpD,OAAO,EAAE,UAAU,EAAE,MAAM,gBAAgB,CAAC;AAkB5C,qBAAa,cAAc;IACvB,OAAO,CAAC,QAAQ,CAAC,qBAAqB,CAGlC;IACJ,OAAO,CAAC,UAAU,CAAS;IAC3B,OAAO,CAAC,UAAU,CAAS;IAC3B,OAAO,CAAC,UAAU,CAAa;IAC/B,OAAO,CAAC,wBAAwB,CAA+E;gBAEnG,OAAO,CAAC,EAAE,UAAU;
|
|
1
|
+
{"version":3,"file":"NobleBleClient.d.ts","sourceRoot":"","sources":["../../src/NobleBleClient.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAKH,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAC;AACpD,OAAO,EAAE,UAAU,EAAE,MAAM,gBAAgB,CAAC;AAkB5C,qBAAa,cAAc;IACvB,OAAO,CAAC,QAAQ,CAAC,qBAAqB,CAGlC;IACJ,OAAO,CAAC,UAAU,CAAS;IAC3B,OAAO,CAAC,UAAU,CAAS;IAC3B,OAAO,CAAC,UAAU,CAAa;IAC/B,OAAO,CAAC,wBAAwB,CAA+E;gBAEnG,OAAO,CAAC,EAAE,UAAU;IAkCzB,oBAAoB,CAAC,QAAQ,EAAE,CAAC,UAAU,EAAE,UAAU,EAAE,gBAAgB,EAAE,UAAU,KAAK,IAAI;IAOvF,aAAa;IAcb,YAAY;IAQzB,OAAO,CAAC,sBAAsB;CA2BjC"}
|
|
@@ -37,7 +37,12 @@ class NobleBleClient {
|
|
|
37
37
|
}
|
|
38
38
|
});
|
|
39
39
|
noble.on("discover", (peripheral) => this.handleDiscoveredDevice(peripheral));
|
|
40
|
-
noble.on("scanStart", () =>
|
|
40
|
+
noble.on("scanStart", () => {
|
|
41
|
+
if (!this.shouldScan) {
|
|
42
|
+
return;
|
|
43
|
+
}
|
|
44
|
+
this.isScanning = true;
|
|
45
|
+
});
|
|
41
46
|
noble.on("scanStop", () => this.isScanning = false);
|
|
42
47
|
}
|
|
43
48
|
setDiscoveryCallback(callback) {
|
|
@@ -47,11 +52,13 @@ class NobleBleClient {
|
|
|
47
52
|
}
|
|
48
53
|
}
|
|
49
54
|
async startScanning() {
|
|
50
|
-
if (this.isScanning)
|
|
55
|
+
if (this.isScanning) {
|
|
56
|
+
return;
|
|
57
|
+
}
|
|
51
58
|
this.shouldScan = true;
|
|
52
59
|
if (this.nobleState === "poweredOn") {
|
|
53
60
|
logger.debug("Start BLE scanning for Matter Services ...");
|
|
54
|
-
await noble.startScanningAsync([BLE_MATTER_SERVICE_UUID],
|
|
61
|
+
await noble.startScanningAsync([BLE_MATTER_SERVICE_UUID], true);
|
|
55
62
|
} else {
|
|
56
63
|
logger.debug("noble state is not poweredOn ... delay scanning till poweredOn");
|
|
57
64
|
}
|
|
@@ -64,23 +71,24 @@ class NobleBleClient {
|
|
|
64
71
|
}
|
|
65
72
|
}
|
|
66
73
|
handleDiscoveredDevice(peripheral) {
|
|
74
|
+
const address = peripheral.address;
|
|
67
75
|
logger.debug(
|
|
68
|
-
`Found peripheral ${
|
|
76
|
+
`Found peripheral ${address} (${peripheral.advertisement.localName}): ${Logger.toJSON(
|
|
69
77
|
peripheral.advertisement
|
|
70
78
|
)}`
|
|
71
79
|
);
|
|
72
80
|
if (!peripheral.connectable) {
|
|
73
|
-
logger.info(`Peripheral ${
|
|
81
|
+
logger.info(`Peripheral ${address} is not connectable ... ignoring`);
|
|
74
82
|
return;
|
|
75
83
|
}
|
|
76
84
|
const matterServiceData = peripheral.advertisement.serviceData.find(
|
|
77
85
|
(serviceData) => serviceData.uuid === BLE_MATTER_SERVICE_UUID
|
|
78
86
|
);
|
|
79
87
|
if (matterServiceData === void 0 || matterServiceData.data.length !== 8) {
|
|
80
|
-
logger.info(`Peripheral ${
|
|
88
|
+
logger.info(`Peripheral ${address} does not advertise Matter Service ... ignoring`);
|
|
81
89
|
return;
|
|
82
90
|
}
|
|
83
|
-
this.discoveredPeripherals.set(
|
|
91
|
+
this.discoveredPeripherals.set(address, { peripheral, matterServiceData: matterServiceData.data });
|
|
84
92
|
this.deviceDiscoveredCallback?.(peripheral, matterServiceData.data);
|
|
85
93
|
}
|
|
86
94
|
}
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../../src/NobleBleClient.ts"],
|
|
4
|
-
"mappings": "AAAA;AAAA;AAAA;AAAA;AAAA;AAMA,SAAS,cAAc;AACvB,SAAS,WAAAA,gBAAe;AACxB,SAAS,+BAA+B;AAIxC,MAAM,SAAS,OAAO,IAAI,gBAAgB;AAC1C,IAAI;AAEJ,SAAS,UAAU,OAAgB;AAE/B,MAAI,UAAU,QAAW;AACrB,YAAQ,IAAI,sBAAsB,MAAM,SAAS;AAAA,EACrD;AACA,UAAQA,SAAQ,mBAAmB;AACnC,MAAI,OAAO,MAAM,OAAO,YAAY;AAGhC,YAAS,MAAc,EAAE,UAAU,MAAM,CAAC;AAAA,EAC9C;AACJ;AAEO,MAAM,eAAe;AAAA,EACP,wBAAwB,oBAAI,IAG3C;AAAA,EACM,aAAa;AAAA,EACb,aAAa;AAAA,EACb,aAAa;AAAA,EACb;AAAA,EAER,YAAY,SAAsB;AAC9B,cAAU,SAAS,KAAK;AAUxB,UAAM,GAAG,eAAe,WAAS;AAC7B,WAAK,aAAa;AAClB,aAAO,MAAM,0BAA0B,KAAK,EAAE;AAC9C,UAAI,UAAU,aAAa;AACvB,YAAI,KAAK,YAAY;AACjB,eAAK,KAAK,cAAc;AAAA,QAC5B;AAAA,MACJ,OAAO;AACH,aAAK,KAAK,aAAa;AAAA,MAC3B;AAAA,IACJ,CAAC;AACD,UAAM,GAAG,YAAY,gBAAc,KAAK,uBAAuB,UAAU,CAAC;AAC1E,UAAM,GAAG,aAAa,
|
|
4
|
+
"mappings": "AAAA;AAAA;AAAA;AAAA;AAAA;AAMA,SAAS,cAAc;AACvB,SAAS,WAAAA,gBAAe;AACxB,SAAS,+BAA+B;AAIxC,MAAM,SAAS,OAAO,IAAI,gBAAgB;AAC1C,IAAI;AAEJ,SAAS,UAAU,OAAgB;AAE/B,MAAI,UAAU,QAAW;AACrB,YAAQ,IAAI,sBAAsB,MAAM,SAAS;AAAA,EACrD;AACA,UAAQA,SAAQ,mBAAmB;AACnC,MAAI,OAAO,MAAM,OAAO,YAAY;AAGhC,YAAS,MAAc,EAAE,UAAU,MAAM,CAAC;AAAA,EAC9C;AACJ;AAEO,MAAM,eAAe;AAAA,EACP,wBAAwB,oBAAI,IAG3C;AAAA,EACM,aAAa;AAAA,EACb,aAAa;AAAA,EACb,aAAa;AAAA,EACb;AAAA,EAER,YAAY,SAAsB;AAC9B,cAAU,SAAS,KAAK;AAUxB,UAAM,GAAG,eAAe,WAAS;AAC7B,WAAK,aAAa;AAClB,aAAO,MAAM,0BAA0B,KAAK,EAAE;AAC9C,UAAI,UAAU,aAAa;AACvB,YAAI,KAAK,YAAY;AACjB,eAAK,KAAK,cAAc;AAAA,QAC5B;AAAA,MACJ,OAAO;AACH,aAAK,KAAK,aAAa;AAAA,MAC3B;AAAA,IACJ,CAAC;AACD,UAAM,GAAG,YAAY,gBAAc,KAAK,uBAAuB,UAAU,CAAC;AAC1E,UAAM,GAAG,aAAa,MAAM;AACxB,UAAI,CAAC,KAAK,YAAY;AAGlB;AAAA,MACJ;AACA,WAAK,aAAa;AAAA,IACtB,CAAC;AACD,UAAM,GAAG,YAAY,MAAO,KAAK,aAAa,KAAM;AAAA,EACxD;AAAA,EAEO,qBAAqB,UAA0E;AAClG,SAAK,2BAA2B;AAChC,eAAW,EAAE,YAAY,kBAAkB,KAAK,KAAK,sBAAsB,OAAO,GAAG;AACjF,WAAK,yBAAyB,YAAY,iBAAiB;AAAA,IAC/D;AAAA,EACJ;AAAA,EAEA,MAAa,gBAAgB;AACzB,QAAI,KAAK,YAAY;AACjB;AAAA,IACJ;AAEA,SAAK,aAAa;AAClB,QAAI,KAAK,eAAe,aAAa;AACjC,aAAO,MAAM,4CAA4C;AACzD,YAAM,MAAM,mBAAmB,CAAC,uBAAuB,GAAG,IAAI;AAAA,IAClE,OAAO;AACH,aAAO,MAAM,gEAAgE;AAAA,IACjF;AAAA,EACJ;AAAA,EAEA,MAAa,eAAe;AACxB,SAAK,aAAa;AAClB,QAAI,KAAK,YAAY;AACjB,aAAO,MAAM,2CAA2C;AACxD,YAAM,MAAM,kBAAkB;AAAA,IAClC;AAAA,EACJ;AAAA,EAEQ,uBAAuB,YAAwB;AAInD,UAAM,UAAU,WAAW;AAC3B,WAAO;AAAA,MACH,oBAAoB,OAAO,KAAK,WAAW,cAAc,SAAS,MAAM,OAAO;AAAA,QAC3E,WAAW;AAAA,MACf,CAAC;AAAA,IACL;AAEA,QAAI,CAAC,WAAW,aAAa;AACzB,aAAO,KAAK,cAAc,OAAO,kCAAkC;AACnE;AAAA,IACJ;AACA,UAAM,oBAAoB,WAAW,cAAc,YAAY;AAAA,MAC3D,iBAAe,YAAY,SAAS;AAAA,IACxC;AACA,QAAI,sBAAsB,UAAa,kBAAkB,KAAK,WAAW,GAAG;AACxE,aAAO,KAAK,cAAc,OAAO,iDAAiD;AAClF;AAAA,IACJ;AAEA,SAAK,sBAAsB,IAAI,SAAS,EAAE,YAAY,mBAAmB,kBAAkB,KAAK,CAAC;AAEjG,SAAK,2BAA2B,YAAY,kBAAkB,IAAI;AAAA,EACtE;AACJ;",
|
|
5
5
|
"names": ["require"]
|
|
6
6
|
}
|
package/dist/esm/NodeJsBle.d.ts
CHANGED
|
@@ -9,9 +9,8 @@ export type BleOptions = {
|
|
|
9
9
|
hciId?: number;
|
|
10
10
|
};
|
|
11
11
|
export declare class NodeJsBle extends Ble {
|
|
12
|
+
#private;
|
|
12
13
|
private readonly options?;
|
|
13
|
-
private blePeripheral;
|
|
14
|
-
private bleCentral;
|
|
15
14
|
constructor(options?: BleOptions | undefined);
|
|
16
15
|
getBlePeripheralInterface(): TransportInterface;
|
|
17
16
|
getBleCentralInterface(): NetInterface;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"NodeJsBle.d.ts","sourceRoot":"","sources":["../../src/NodeJsBle.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAAE,YAAY,EAAE,kBAAkB,EAAE,MAAM,iBAAiB,CAAC;AACnE,OAAO,EAAE,GAAG,EAAE,mBAAmB,EAAE,OAAO,EAAE,MAAM,kBAAkB,CAAC;AAQrE,MAAM,MAAM,UAAU,GAAG;IACrB,KAAK,CAAC,EAAE,MAAM,CAAC;CAClB,CAAC;AAEF,qBAAa,SAAU,SAAQ,GAAG
|
|
1
|
+
{"version":3,"file":"NodeJsBle.d.ts","sourceRoot":"","sources":["../../src/NodeJsBle.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAAE,YAAY,EAAE,kBAAkB,EAAE,MAAM,iBAAiB,CAAC;AACnE,OAAO,EAAE,GAAG,EAAE,mBAAmB,EAAE,OAAO,EAAE,MAAM,kBAAkB,CAAC;AAQrE,MAAM,MAAM,UAAU,GAAG;IACrB,KAAK,CAAC,EAAE,MAAM,CAAC;CAClB,CAAC;AAEF,qBAAa,SAAU,SAAQ,GAAG;;IAQlB,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAC;gBAAR,OAAO,CAAC,EAAE,UAAU,YAAA;IAkBjD,yBAAyB,IAAI,kBAAkB;IAO/C,sBAAsB,IAAI,YAAY;IAOtC,iBAAiB,CAAC,2BAA2B,CAAC,EAAE,UAAU,GAAG,mBAAmB;IAOhF,aAAa,IAAI,OAAO;CAM3B"}
|