@matter/nodejs-ble 0.12.0-alpha.0-20250101-22e7c1044 → 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
|
@@ -45,127 +45,251 @@ function nobleUuidToUuid(uuid) {
|
|
|
45
45
|
return parts.join("-");
|
|
46
46
|
}
|
|
47
47
|
class NobleBleCentralInterface {
|
|
48
|
-
|
|
49
|
-
|
|
48
|
+
#bleScanner;
|
|
49
|
+
#connectionsInProgress = /* @__PURE__ */ new Set();
|
|
50
|
+
#connectionGuards = /* @__PURE__ */ new Set();
|
|
51
|
+
#openChannels = /* @__PURE__ */ new Map();
|
|
52
|
+
#onMatterMessageListener;
|
|
53
|
+
#closed = false;
|
|
54
|
+
constructor(bleScanner) {
|
|
55
|
+
this.#bleScanner = bleScanner;
|
|
56
|
+
}
|
|
50
57
|
openChannel(address, tryCount = 1) {
|
|
58
|
+
if (this.#closed) {
|
|
59
|
+
throw new import_general.NetworkError("Network interface is closed");
|
|
60
|
+
}
|
|
51
61
|
return new Promise((resolve, reject) => {
|
|
52
|
-
if (this
|
|
53
|
-
reject(new import_general.InternalError(`Network Interface was not added to the system yet.`));
|
|
62
|
+
if (this.#onMatterMessageListener === void 0) {
|
|
63
|
+
reject(new import_general.InternalError(`Network Interface was not added to the system yet, so can not connect it.`));
|
|
54
64
|
return;
|
|
55
65
|
}
|
|
56
66
|
if (address.type !== "ble") {
|
|
57
67
|
reject(new import_general.InternalError(`Unsupported address type ${address.type}.`));
|
|
58
68
|
return;
|
|
59
69
|
}
|
|
60
|
-
const {
|
|
70
|
+
const { peripheralAddress } = address;
|
|
61
71
|
if (tryCount > 3) {
|
|
62
|
-
reject(new import_protocol.BleError(`Failed to connect to peripheral ${
|
|
72
|
+
reject(new import_protocol.BleError(`Failed to connect to peripheral ${peripheralAddress}`));
|
|
63
73
|
return;
|
|
64
74
|
}
|
|
65
|
-
|
|
66
|
-
if (
|
|
75
|
+
const { peripheral, hasAdditionalAdvertisementData } = this.#bleScanner.getDiscoveredDevice(peripheralAddress);
|
|
76
|
+
if (this.#openChannels.has(address)) {
|
|
67
77
|
reject(
|
|
68
78
|
new import_protocol.BleError(
|
|
69
|
-
`Peripheral ${
|
|
79
|
+
`Peripheral ${peripheralAddress} is already connected. Only one connection supported right now.`
|
|
70
80
|
)
|
|
71
81
|
);
|
|
72
82
|
return;
|
|
73
83
|
}
|
|
74
|
-
if (this.
|
|
84
|
+
if (this.#connectionsInProgress.has(address)) {
|
|
85
|
+
logger.debug(`Connection to peripheral ${peripheralAddress} is already in progress.`);
|
|
86
|
+
return;
|
|
87
|
+
}
|
|
88
|
+
if (peripheral.state === "error") {
|
|
75
89
|
reject(
|
|
76
90
|
new import_protocol.BleError(
|
|
77
|
-
`
|
|
91
|
+
`Can not connect to peripheral "${peripheralAddress}" because unexpected state "${peripheral.state}"`
|
|
78
92
|
)
|
|
79
93
|
);
|
|
80
94
|
return;
|
|
81
95
|
}
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
logger.debug(`
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
case import_protocol.BLE_MATTER_C2_CHARACTERISTIC_UUID:
|
|
108
|
-
logger.debug("found C2 characteristic");
|
|
109
|
-
characteristicC2ForSubscribe = characteristic;
|
|
110
|
-
break;
|
|
111
|
-
case import_protocol.BLE_MATTER_C3_CHARACTERISTIC_UUID:
|
|
112
|
-
logger.debug("found C3 characteristic");
|
|
113
|
-
if (hasAdditionalAdvertisementData) {
|
|
114
|
-
logger.debug("reading additional commissioning related data");
|
|
115
|
-
const data = await characteristic.readAsync();
|
|
116
|
-
additionalCommissioningRelatedData = new Uint8Array(data);
|
|
117
|
-
logger.debug("additional data", data);
|
|
118
|
-
}
|
|
119
|
-
}
|
|
96
|
+
const connectionGuard = {
|
|
97
|
+
// Timeout when trying to connect to the device because sometimes connect fails and noble does
|
|
98
|
+
// not emit an event. If device does not connect we do not try any longer and reject the promise
|
|
99
|
+
// because a re-discovery is the best option to get teh device into a good state again
|
|
100
|
+
connectTimeout: import_general.Time.getTimer("BLE connect timeout", 6e4, () => {
|
|
101
|
+
logger.debug(`Timeout while connecting to peripheral ${peripheralAddress}`);
|
|
102
|
+
peripheral.removeListener("connect", connectHandler);
|
|
103
|
+
peripheral.removeListener("disconnect", reTryHandler);
|
|
104
|
+
clearConnectionGuard();
|
|
105
|
+
reject(new import_protocol.BleError(`Timeout while connecting to peripheral ${peripheralAddress}`));
|
|
106
|
+
}),
|
|
107
|
+
disconnectTimeout: import_general.Time.getTimer("BLE disconnect timeout", 6e4, () => {
|
|
108
|
+
logger.debug(`Timeout while disconnecting to peripheral ${peripheralAddress}`);
|
|
109
|
+
peripheral.removeListener("disconnect", reTryHandler);
|
|
110
|
+
clearConnectionGuard();
|
|
111
|
+
reject(new import_protocol.BleError(`Timeout while disconnecting to peripheral ${peripheralAddress}`));
|
|
112
|
+
}),
|
|
113
|
+
// Timeout when trying to interview the device because sometimes when no response from device
|
|
114
|
+
// comes noble does not resolve promises
|
|
115
|
+
interviewTimeout: import_general.Time.getTimer("BLE interview timeout", 6e4, () => {
|
|
116
|
+
logger.debug(`Timeout while interviewing peripheral ${peripheralAddress}`);
|
|
117
|
+
peripheral.removeListener("disconnect", reTryHandler);
|
|
118
|
+
clearConnectionGuard();
|
|
119
|
+
if (peripheral.state === "connected") {
|
|
120
|
+
peripheral.disconnectAsync().catch((error) => logger.error(`Ignored error while disconnecting`, error));
|
|
120
121
|
}
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
}
|
|
138
|
-
peripheral.removeAllListeners("disconnect");
|
|
139
|
-
reject(new import_protocol.BleError(`Peripheral ${peripheral.address} does not have the required characteristics`));
|
|
140
|
-
});
|
|
141
|
-
const reTryHandler = async (error) => {
|
|
122
|
+
reject(new import_protocol.BleError(`Timeout while interviewing peripheral ${peripheralAddress}`));
|
|
123
|
+
})
|
|
124
|
+
};
|
|
125
|
+
this.#connectionGuards.add(connectionGuard);
|
|
126
|
+
const clearConnectionGuard = () => {
|
|
127
|
+
const { connectTimeout, interviewTimeout, disconnectTimeout } = connectionGuard;
|
|
128
|
+
connectTimeout?.stop();
|
|
129
|
+
interviewTimeout?.stop();
|
|
130
|
+
disconnectTimeout?.stop();
|
|
131
|
+
this.#connectionGuards.delete(connectionGuard);
|
|
132
|
+
};
|
|
133
|
+
const reTryHandler = (error) => {
|
|
134
|
+
clearConnectionGuard();
|
|
135
|
+
this.#connectionsInProgress.delete(address);
|
|
136
|
+
peripheral.removeListener("connect", connectHandler);
|
|
137
|
+
peripheral.removeListener("disconnect", reTryHandler);
|
|
142
138
|
if (error) {
|
|
143
139
|
logger.error(
|
|
144
|
-
`Peripheral ${
|
|
140
|
+
`Peripheral ${peripheralAddress} disconnected while trying to connect, try again`,
|
|
145
141
|
error
|
|
146
142
|
);
|
|
147
143
|
} else {
|
|
148
|
-
logger.info(`Peripheral ${
|
|
144
|
+
logger.info(`Peripheral ${peripheralAddress} disconnected while trying to connect, try again`);
|
|
149
145
|
}
|
|
150
|
-
peripheral.removeAllListeners("disconnect");
|
|
151
|
-
peripheral.removeAllListeners("connect");
|
|
152
146
|
this.openChannel(address, tryCount + 1).then(resolve).catch(reject);
|
|
153
147
|
};
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
|
|
148
|
+
const connectHandler = async (error) => {
|
|
149
|
+
connectionGuard.connectTimeout.stop();
|
|
150
|
+
if (!this.#connectionGuards.has(connectionGuard)) {
|
|
151
|
+
return;
|
|
152
|
+
}
|
|
153
|
+
if (error) {
|
|
154
|
+
clearConnectionGuard();
|
|
155
|
+
reject(new import_protocol.BleError(`Error while connecting to peripheral ${peripheralAddress}`, error));
|
|
156
|
+
return;
|
|
157
|
+
}
|
|
158
|
+
if (this.#onMatterMessageListener === void 0) {
|
|
159
|
+
clearConnectionGuard();
|
|
160
|
+
reject(new import_general.InternalError(`Network Interface was not added to the system yet or was cleared.`));
|
|
161
|
+
return;
|
|
162
|
+
}
|
|
163
|
+
if (this.#connectionsInProgress.has(address)) {
|
|
164
|
+
return;
|
|
165
|
+
}
|
|
166
|
+
this.#connectionsInProgress.add(address);
|
|
167
|
+
try {
|
|
168
|
+
connectionGuard.interviewTimeout.start();
|
|
169
|
+
const services = await peripheral.discoverServicesAsync([import_protocol.BLE_MATTER_SERVICE_UUID]);
|
|
170
|
+
if (!this.#connectionGuards.has(connectionGuard)) {
|
|
171
|
+
return;
|
|
172
|
+
}
|
|
173
|
+
logger.debug(
|
|
174
|
+
`Peripheral ${peripheralAddress}: Found services: ${services.map((s) => s.uuid).join(", ")}`
|
|
175
|
+
);
|
|
176
|
+
for (const service of services) {
|
|
177
|
+
logger.debug(`Peripheral ${peripheralAddress}: Handle service: ${service.uuid}`);
|
|
178
|
+
if (service.uuid !== import_protocol.BLE_MATTER_SERVICE_UUID) continue;
|
|
179
|
+
const characteristics = await service.discoverCharacteristicsAsync();
|
|
180
|
+
if (!this.#connectionGuards.has(connectionGuard)) {
|
|
181
|
+
return;
|
|
182
|
+
}
|
|
183
|
+
let characteristicC1ForWrite;
|
|
184
|
+
let characteristicC2ForSubscribe;
|
|
185
|
+
let additionalCommissioningRelatedData;
|
|
186
|
+
for (const characteristic of characteristics) {
|
|
187
|
+
logger.debug(
|
|
188
|
+
`Peripheral ${peripheralAddress}: Handle characteristic:`,
|
|
189
|
+
characteristic.uuid,
|
|
190
|
+
characteristic.properties
|
|
191
|
+
);
|
|
192
|
+
switch (nobleUuidToUuid(characteristic.uuid)) {
|
|
193
|
+
case import_protocol.BLE_MATTER_C1_CHARACTERISTIC_UUID:
|
|
194
|
+
logger.debug(`Peripheral ${peripheralAddress}: Found C1 characteristic`);
|
|
195
|
+
characteristicC1ForWrite = characteristic;
|
|
196
|
+
break;
|
|
197
|
+
case import_protocol.BLE_MATTER_C2_CHARACTERISTIC_UUID:
|
|
198
|
+
logger.debug(`Peripheral ${peripheralAddress}: Found C2 characteristic`);
|
|
199
|
+
characteristicC2ForSubscribe = characteristic;
|
|
200
|
+
break;
|
|
201
|
+
case import_protocol.BLE_MATTER_C3_CHARACTERISTIC_UUID:
|
|
202
|
+
logger.debug(`Peripheral ${peripheralAddress}: Found C3 characteristic`);
|
|
203
|
+
if (hasAdditionalAdvertisementData) {
|
|
204
|
+
logger.debug(
|
|
205
|
+
`Peripheral ${peripheralAddress}: Reading additional commissioning related data`
|
|
206
|
+
);
|
|
207
|
+
const data = await characteristic.readAsync();
|
|
208
|
+
if (!this.#connectionGuards.has(connectionGuard)) {
|
|
209
|
+
return;
|
|
210
|
+
}
|
|
211
|
+
additionalCommissioningRelatedData = new Uint8Array(data);
|
|
212
|
+
logger.debug(`Peripheral ${peripheralAddress}: Additional data:`, data);
|
|
213
|
+
}
|
|
214
|
+
}
|
|
215
|
+
}
|
|
216
|
+
if (!characteristicC1ForWrite || !characteristicC2ForSubscribe) {
|
|
217
|
+
logger.debug(
|
|
218
|
+
`Peripheral ${peripheralAddress}: Missing required Matter characteristics. Ignore.`
|
|
219
|
+
);
|
|
220
|
+
continue;
|
|
221
|
+
}
|
|
222
|
+
connectionGuard.interviewTimeout.stop();
|
|
223
|
+
peripheral.removeListener("disconnect", reTryHandler);
|
|
224
|
+
this.#openChannels.set(address, peripheral);
|
|
225
|
+
try {
|
|
226
|
+
resolve(
|
|
227
|
+
await NobleBleChannel.create(
|
|
228
|
+
peripheral,
|
|
229
|
+
characteristicC1ForWrite,
|
|
230
|
+
characteristicC2ForSubscribe,
|
|
231
|
+
this.#onMatterMessageListener,
|
|
232
|
+
additionalCommissioningRelatedData
|
|
233
|
+
)
|
|
234
|
+
);
|
|
235
|
+
clearConnectionGuard();
|
|
236
|
+
this.#connectionsInProgress.delete(address);
|
|
237
|
+
} catch (error2) {
|
|
238
|
+
this.#connectionsInProgress.delete(address);
|
|
239
|
+
this.#openChannels.delete(address);
|
|
240
|
+
await peripheral.disconnectAsync();
|
|
241
|
+
reTryHandler(error2);
|
|
242
|
+
return;
|
|
243
|
+
}
|
|
244
|
+
}
|
|
245
|
+
} finally {
|
|
246
|
+
this.#connectionsInProgress.delete(address);
|
|
247
|
+
clearConnectionGuard();
|
|
248
|
+
}
|
|
249
|
+
peripheral.removeListener("disconnect", reTryHandler);
|
|
250
|
+
reject(
|
|
251
|
+
new import_protocol.BleError(`Peripheral ${peripheralAddress} does not have the required Matter characteristics`)
|
|
252
|
+
);
|
|
253
|
+
};
|
|
254
|
+
if (peripheral.state === "connected") {
|
|
255
|
+
logger.debug(`Peripheral ${peripheralAddress}: Already connected`);
|
|
256
|
+
connectHandler().catch((error) => logger.warn(`Error while connecting`, error));
|
|
257
|
+
} else if (peripheral.state === "disconnecting") {
|
|
258
|
+
logger.debug(`Peripheral ${peripheralAddress}: Disconnect in progress`);
|
|
259
|
+
connectionGuard.disconnectTimeout.start();
|
|
260
|
+
tryCount--;
|
|
261
|
+
peripheral.once("disconnect", reTryHandler);
|
|
262
|
+
} else {
|
|
263
|
+
if (peripheral.state === "connecting") {
|
|
264
|
+
peripheral.cancelConnect();
|
|
265
|
+
peripheral.state = "disconnected";
|
|
266
|
+
}
|
|
267
|
+
connectionGuard.connectTimeout.start();
|
|
268
|
+
peripheral.once("connect", connectHandler);
|
|
269
|
+
peripheral.once("disconnect", reTryHandler);
|
|
270
|
+
logger.debug(`Peripheral ${peripheralAddress}: Connect to Peripheral now (try ${tryCount})`);
|
|
271
|
+
peripheral.connectAsync().catch((error) => {
|
|
272
|
+
if (!this.#connectionGuards.has(connectionGuard)) {
|
|
273
|
+
return;
|
|
274
|
+
}
|
|
275
|
+
logger.info(`Peripheral ${peripheralAddress}: Error while connecting to peripheral`, error);
|
|
276
|
+
reTryHandler(error);
|
|
277
|
+
});
|
|
278
|
+
}
|
|
157
279
|
});
|
|
158
280
|
}
|
|
159
281
|
onData(listener) {
|
|
160
|
-
this
|
|
282
|
+
this.#onMatterMessageListener = listener;
|
|
161
283
|
return {
|
|
162
284
|
close: async () => await this.close()
|
|
163
285
|
};
|
|
164
286
|
}
|
|
165
287
|
async close() {
|
|
166
|
-
|
|
167
|
-
|
|
288
|
+
this.#closed = true;
|
|
289
|
+
for (const peripheral of this.#openChannels.values()) {
|
|
290
|
+
peripheral.disconnectAsync().catch((error) => logger.error(`Peripheral ${peripheral.address}: Error while disconnecting`, error));
|
|
168
291
|
}
|
|
292
|
+
this.#openChannels.clear();
|
|
169
293
|
}
|
|
170
294
|
supports(type, _address) {
|
|
171
295
|
if (type !== import_general.ChannelType.BLE) {
|
|
@@ -186,33 +310,52 @@ class NobleBleChannel extends import_protocol.BleChannel {
|
|
|
186
310
|
});
|
|
187
311
|
}
|
|
188
312
|
static async create(peripheral, characteristicC1ForWrite, characteristicC2ForSubscribe, onMatterMessageListener, _additionalCommissioningRelatedData) {
|
|
313
|
+
const { address: peripheralAddress } = peripheral;
|
|
189
314
|
let mtu = peripheral.mtu ?? 0;
|
|
190
315
|
if (mtu > import_protocol.BLE_MAXIMUM_BTP_MTU) {
|
|
191
316
|
mtu = import_protocol.BLE_MAXIMUM_BTP_MTU;
|
|
192
317
|
}
|
|
193
|
-
logger.debug(
|
|
318
|
+
logger.debug(
|
|
319
|
+
`Peripheral ${peripheralAddress}: Using MTU=${mtu} bytes (Peripheral supports up to ${peripheral.mtu} bytes)`
|
|
320
|
+
);
|
|
321
|
+
const {
|
|
322
|
+
promise: handshakeResponseReceivedPromise,
|
|
323
|
+
resolver: handshakeResolver,
|
|
324
|
+
rejecter: handshakeRejecter
|
|
325
|
+
} = (0, import_general.createPromise)();
|
|
326
|
+
const handshakeHandler = (data, isNotification) => {
|
|
327
|
+
if (data[0] === 101 && data[1] === 108 && data.length === 6) {
|
|
328
|
+
logger.info(
|
|
329
|
+
`Peripheral ${peripheralAddress}: Received Matter handshake response: ${data.toString("hex")}.`
|
|
330
|
+
);
|
|
331
|
+
btpHandshakeTimeout.stop();
|
|
332
|
+
handshakeResolver(data);
|
|
333
|
+
} else {
|
|
334
|
+
logger.debug(
|
|
335
|
+
`Peripheral ${peripheralAddress}: Received first data on C2: ${data.toString("hex")} (isNotification: ${isNotification}) - No handshake response, inforing`
|
|
336
|
+
);
|
|
337
|
+
}
|
|
338
|
+
};
|
|
339
|
+
const btpHandshakeTimeout = import_general.Time.getTimer("BLE handshake timeout", import_protocol.BTP_CONN_RSP_TIMEOUT_MS, async () => {
|
|
340
|
+
characteristicC2ForSubscribe.removeListener("data", handshakeHandler);
|
|
341
|
+
characteristicC2ForSubscribe.unsubscribeAsync().catch((error) => logger.error(`Peripheral ${peripheralAddress}: Error while unsubscribing`, error));
|
|
342
|
+
logger.debug(
|
|
343
|
+
`Peripheral ${peripheralAddress}: Handshake Response not received. Disconnected from peripheral`
|
|
344
|
+
);
|
|
345
|
+
handshakeRejecter(new import_protocol.BleError(`Peripheral ${peripheralAddress}: Handshake Response not received`));
|
|
346
|
+
}).start();
|
|
194
347
|
const btpHandshakeRequest = import_protocol.BtpCodec.encodeBtpHandshakeRequest({
|
|
195
348
|
versions: import_protocol.BTP_SUPPORTED_VERSIONS,
|
|
196
349
|
attMtu: mtu,
|
|
197
350
|
clientWindowSize: import_protocol.BTP_MAXIMUM_WINDOW_SIZE
|
|
198
351
|
});
|
|
199
|
-
logger.debug(
|
|
352
|
+
logger.debug(
|
|
353
|
+
`Peripheral ${peripheralAddress}: Sending BTP handshake request: ${import_general.Logger.toJSON(btpHandshakeRequest)}`
|
|
354
|
+
);
|
|
200
355
|
await characteristicC1ForWrite.writeAsync(Buffer.from(btpHandshakeRequest.buffer), false);
|
|
201
|
-
|
|
202
|
-
await peripheral.disconnectAsync();
|
|
203
|
-
logger.debug("Handshake Response not received. Disconnected from peripheral");
|
|
204
|
-
}).start();
|
|
205
|
-
logger.debug("subscribing to C2 characteristic");
|
|
356
|
+
logger.debug(`Peripheral ${peripheralAddress}: Subscribing to C2 characteristic`);
|
|
206
357
|
await characteristicC2ForSubscribe.subscribeAsync();
|
|
207
|
-
|
|
208
|
-
characteristicC2ForSubscribe.once("data", (data, isNotification) => {
|
|
209
|
-
logger.debug(`received first data on C2: ${data.toString("hex")} (isNotification: ${isNotification})`);
|
|
210
|
-
if (data[0] === 101 && data[1] === 108 && data.length === 6) {
|
|
211
|
-
logger.info(`Received Matter handshake response: ${data.toString("hex")}.`);
|
|
212
|
-
btpHandshakeTimeout.stop();
|
|
213
|
-
resolver(data);
|
|
214
|
-
}
|
|
215
|
-
});
|
|
358
|
+
characteristicC2ForSubscribe.once("data", handshakeHandler);
|
|
216
359
|
const handshakeResponse = await handshakeResponseReceivedPromise;
|
|
217
360
|
const btpSession = await import_protocol.BtpSessionHandler.createAsCentral(
|
|
218
361
|
new Uint8Array(handshakeResponse),
|
|
@@ -221,7 +364,9 @@ class NobleBleChannel extends import_protocol.BleChannel {
|
|
|
221
364
|
return await characteristicC1ForWrite.writeAsync(Buffer.from(data.buffer), false);
|
|
222
365
|
},
|
|
223
366
|
// callback to disconnect the BLE connection
|
|
224
|
-
async () => void characteristicC2ForSubscribe.unsubscribeAsync().then(
|
|
367
|
+
async () => void characteristicC2ForSubscribe.unsubscribeAsync().then(
|
|
368
|
+
() => peripheral.disconnectAsync().then(() => logger.debug(`Peripheral ${peripheralAddress}: Disconnected from peripheral`))
|
|
369
|
+
),
|
|
225
370
|
// callback to forward decoded and de-assembled Matter messages to ExchangeManager
|
|
226
371
|
async (data) => {
|
|
227
372
|
if (onMatterMessageListener === void 0) {
|
|
@@ -231,7 +376,9 @@ class NobleBleChannel extends import_protocol.BleChannel {
|
|
|
231
376
|
}
|
|
232
377
|
);
|
|
233
378
|
characteristicC2ForSubscribe.on("data", (data, isNotification) => {
|
|
234
|
-
logger.debug(
|
|
379
|
+
logger.debug(
|
|
380
|
+
`Peripheral ${peripheralAddress}: received data on C2: ${data.toString("hex")} (isNotification: ${isNotification})`
|
|
381
|
+
);
|
|
235
382
|
void btpSession.handleIncomingBleData(new Uint8Array(data));
|
|
236
383
|
});
|
|
237
384
|
const nobleChannel = new NobleBleChannel(peripheral, btpSession);
|
|
@@ -245,11 +392,15 @@ class NobleBleChannel extends import_protocol.BleChannel {
|
|
|
245
392
|
*/
|
|
246
393
|
async send(data) {
|
|
247
394
|
if (!this.connected) {
|
|
248
|
-
logger.debug(
|
|
395
|
+
logger.debug(
|
|
396
|
+
`Peripheral ${this.peripheral.address}: Cannot send data because not connected to peripheral.`
|
|
397
|
+
);
|
|
249
398
|
return;
|
|
250
399
|
}
|
|
251
400
|
if (this.btpSession === void 0) {
|
|
252
|
-
throw new import_protocol.BtpFlowError(
|
|
401
|
+
throw new import_protocol.BtpFlowError(
|
|
402
|
+
`Peripheral ${this.peripheral.address}: Cannot send data, no BTP session initialized`
|
|
403
|
+
);
|
|
253
404
|
}
|
|
254
405
|
await this.btpSession.sendMatterMessage(data);
|
|
255
406
|
}
|
|
@@ -259,7 +410,7 @@ class NobleBleChannel extends import_protocol.BleChannel {
|
|
|
259
410
|
}
|
|
260
411
|
async close() {
|
|
261
412
|
await this.btpSession.close();
|
|
262
|
-
|
|
413
|
+
this.peripheral.disconnectAsync().catch((error) => logger.error(`Peripheral ${this.peripheral.address}: Error while disconnecting`, error));
|
|
263
414
|
}
|
|
264
415
|
}
|
|
265
416
|
//# sourceMappingURL=NobleBleChannel.js.map
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../../src/NobleBleChannel.ts"],
|
|
4
|
-
"mappings": ";;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAMA,
|
|
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"}
|
|
@@ -60,7 +60,12 @@ class NobleBleClient {
|
|
|
60
60
|
}
|
|
61
61
|
});
|
|
62
62
|
noble.on("discover", (peripheral) => this.handleDiscoveredDevice(peripheral));
|
|
63
|
-
noble.on("scanStart", () =>
|
|
63
|
+
noble.on("scanStart", () => {
|
|
64
|
+
if (!this.shouldScan) {
|
|
65
|
+
return;
|
|
66
|
+
}
|
|
67
|
+
this.isScanning = true;
|
|
68
|
+
});
|
|
64
69
|
noble.on("scanStop", () => this.isScanning = false);
|
|
65
70
|
}
|
|
66
71
|
setDiscoveryCallback(callback) {
|
|
@@ -70,11 +75,13 @@ class NobleBleClient {
|
|
|
70
75
|
}
|
|
71
76
|
}
|
|
72
77
|
async startScanning() {
|
|
73
|
-
if (this.isScanning)
|
|
78
|
+
if (this.isScanning) {
|
|
79
|
+
return;
|
|
80
|
+
}
|
|
74
81
|
this.shouldScan = true;
|
|
75
82
|
if (this.nobleState === "poweredOn") {
|
|
76
83
|
logger.debug("Start BLE scanning for Matter Services ...");
|
|
77
|
-
await noble.startScanningAsync([import_protocol.BLE_MATTER_SERVICE_UUID],
|
|
84
|
+
await noble.startScanningAsync([import_protocol.BLE_MATTER_SERVICE_UUID], true);
|
|
78
85
|
} else {
|
|
79
86
|
logger.debug("noble state is not poweredOn ... delay scanning till poweredOn");
|
|
80
87
|
}
|
|
@@ -87,23 +94,24 @@ class NobleBleClient {
|
|
|
87
94
|
}
|
|
88
95
|
}
|
|
89
96
|
handleDiscoveredDevice(peripheral) {
|
|
97
|
+
const address = peripheral.address;
|
|
90
98
|
logger.debug(
|
|
91
|
-
`Found peripheral ${
|
|
99
|
+
`Found peripheral ${address} (${peripheral.advertisement.localName}): ${import_general.Logger.toJSON(
|
|
92
100
|
peripheral.advertisement
|
|
93
101
|
)}`
|
|
94
102
|
);
|
|
95
103
|
if (!peripheral.connectable) {
|
|
96
|
-
logger.info(`Peripheral ${
|
|
104
|
+
logger.info(`Peripheral ${address} is not connectable ... ignoring`);
|
|
97
105
|
return;
|
|
98
106
|
}
|
|
99
107
|
const matterServiceData = peripheral.advertisement.serviceData.find(
|
|
100
108
|
(serviceData) => serviceData.uuid === import_protocol.BLE_MATTER_SERVICE_UUID
|
|
101
109
|
);
|
|
102
110
|
if (matterServiceData === void 0 || matterServiceData.data.length !== 8) {
|
|
103
|
-
logger.info(`Peripheral ${
|
|
111
|
+
logger.info(`Peripheral ${address} does not advertise Matter Service ... ignoring`);
|
|
104
112
|
return;
|
|
105
113
|
}
|
|
106
|
-
this.discoveredPeripherals.set(
|
|
114
|
+
this.discoveredPeripherals.set(address, { peripheral, matterServiceData: matterServiceData.data });
|
|
107
115
|
this.deviceDiscoveredCallback?.(peripheral, matterServiceData.data);
|
|
108
116
|
}
|
|
109
117
|
}
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../../src/NobleBleClient.ts"],
|
|
4
|
-
"mappings": ";;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAMA,qBAAuB;AACvB,qBAAwB;AACxB,sBAAwC;AARxC;AAAA;AAAA;AAAA;AAAA;AAYA,MAAM,SAAS,sBAAO,IAAI,gBAAgB;AAC1C,IAAI;AAEJ,SAAS,UAAU,OAAgB;AAE/B,MAAI,UAAU,QAAW;AACrB,YAAQ,IAAI,sBAAsB,MAAM,SAAS;AAAA,EACrD;AACA,cAAQ,wBAAQ,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,qBAAuB;AACvB,qBAAwB;AACxB,sBAAwC;AARxC;AAAA;AAAA;AAAA;AAAA;AAYA,MAAM,SAAS,sBAAO,IAAI,gBAAgB;AAC1C,IAAI;AAEJ,SAAS,UAAU,OAAgB;AAE/B,MAAI,UAAU,QAAW;AACrB,YAAQ,IAAI,sBAAsB,MAAM,SAAS;AAAA,EACrD;AACA,cAAQ,wBAAQ,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,uCAAuB,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,sBAAO;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": []
|
|
6
6
|
}
|
package/dist/cjs/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"}
|