@bota-dev/react-native-sdk 0.0.2
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/README.md +279 -0
- package/lib/commonjs/BotaClient.js +223 -0
- package/lib/commonjs/BotaClient.js.map +1 -0
- package/lib/commonjs/ble/BleManager.js +494 -0
- package/lib/commonjs/ble/BleManager.js.map +1 -0
- package/lib/commonjs/ble/constants.js +166 -0
- package/lib/commonjs/ble/constants.js.map +1 -0
- package/lib/commonjs/ble/index.js +54 -0
- package/lib/commonjs/ble/index.js.map +1 -0
- package/lib/commonjs/ble/parsers.js +345 -0
- package/lib/commonjs/ble/parsers.js.map +1 -0
- package/lib/commonjs/index.js +81 -0
- package/lib/commonjs/index.js.map +1 -0
- package/lib/commonjs/managers/DeviceManager.js +437 -0
- package/lib/commonjs/managers/DeviceManager.js.map +1 -0
- package/lib/commonjs/managers/OTAManager.js +227 -0
- package/lib/commonjs/managers/OTAManager.js.map +1 -0
- package/lib/commonjs/managers/RecordingManager.js +384 -0
- package/lib/commonjs/managers/RecordingManager.js.map +1 -0
- package/lib/commonjs/managers/index.js +27 -0
- package/lib/commonjs/managers/index.js.map +1 -0
- package/lib/commonjs/models/Device.js +2 -0
- package/lib/commonjs/models/Device.js.map +1 -0
- package/lib/commonjs/models/Recording.js +2 -0
- package/lib/commonjs/models/Recording.js.map +1 -0
- package/lib/commonjs/models/Status.js +6 -0
- package/lib/commonjs/models/Status.js.map +1 -0
- package/lib/commonjs/models/index.js +39 -0
- package/lib/commonjs/models/index.js.map +1 -0
- package/lib/commonjs/protocol/ProtocolHandler.js +343 -0
- package/lib/commonjs/protocol/ProtocolHandler.js.map +1 -0
- package/lib/commonjs/protocol/index.js +13 -0
- package/lib/commonjs/protocol/index.js.map +1 -0
- package/lib/commonjs/storage/StorageManager.js +333 -0
- package/lib/commonjs/storage/StorageManager.js.map +1 -0
- package/lib/commonjs/storage/index.js +19 -0
- package/lib/commonjs/storage/index.js.map +1 -0
- package/lib/commonjs/upload/S3Uploader.js +133 -0
- package/lib/commonjs/upload/S3Uploader.js.map +1 -0
- package/lib/commonjs/upload/UploadQueue.js +280 -0
- package/lib/commonjs/upload/UploadQueue.js.map +1 -0
- package/lib/commonjs/upload/index.js +20 -0
- package/lib/commonjs/upload/index.js.map +1 -0
- package/lib/commonjs/utils/errors.js +187 -0
- package/lib/commonjs/utils/errors.js.map +1 -0
- package/lib/commonjs/utils/index.js +40 -0
- package/lib/commonjs/utils/index.js.map +1 -0
- package/lib/commonjs/utils/logger.js +135 -0
- package/lib/commonjs/utils/logger.js.map +1 -0
- package/lib/commonjs/utils/retry.js +160 -0
- package/lib/commonjs/utils/retry.js.map +1 -0
- package/lib/module/BotaClient.js +216 -0
- package/lib/module/BotaClient.js.map +1 -0
- package/lib/module/ble/BleManager.js +484 -0
- package/lib/module/ble/BleManager.js.map +1 -0
- package/lib/module/ble/constants.js +159 -0
- package/lib/module/ble/constants.js.map +1 -0
- package/lib/module/ble/index.js +8 -0
- package/lib/module/ble/index.js.map +1 -0
- package/lib/module/ble/parsers.js +328 -0
- package/lib/module/ble/parsers.js.map +1 -0
- package/lib/module/index.js +22 -0
- package/lib/module/index.js.map +1 -0
- package/lib/module/managers/DeviceManager.js +429 -0
- package/lib/module/managers/DeviceManager.js.map +1 -0
- package/lib/module/managers/OTAManager.js +219 -0
- package/lib/module/managers/OTAManager.js.map +1 -0
- package/lib/module/managers/RecordingManager.js +376 -0
- package/lib/module/managers/RecordingManager.js.map +1 -0
- package/lib/module/managers/index.js +8 -0
- package/lib/module/managers/index.js.map +1 -0
- package/lib/module/models/Device.js +2 -0
- package/lib/module/models/Device.js.map +1 -0
- package/lib/module/models/Recording.js +2 -0
- package/lib/module/models/Recording.js.map +1 -0
- package/lib/module/models/Status.js +2 -0
- package/lib/module/models/Status.js.map +1 -0
- package/lib/module/models/index.js +8 -0
- package/lib/module/models/index.js.map +1 -0
- package/lib/module/protocol/ProtocolHandler.js +336 -0
- package/lib/module/protocol/ProtocolHandler.js.map +1 -0
- package/lib/module/protocol/index.js +6 -0
- package/lib/module/protocol/index.js.map +1 -0
- package/lib/module/storage/StorageManager.js +324 -0
- package/lib/module/storage/StorageManager.js.map +1 -0
- package/lib/module/storage/index.js +6 -0
- package/lib/module/storage/index.js.map +1 -0
- package/lib/module/upload/S3Uploader.js +126 -0
- package/lib/module/upload/S3Uploader.js.map +1 -0
- package/lib/module/upload/UploadQueue.js +272 -0
- package/lib/module/upload/UploadQueue.js.map +1 -0
- package/lib/module/upload/index.js +7 -0
- package/lib/module/upload/index.js.map +1 -0
- package/lib/module/utils/errors.js +173 -0
- package/lib/module/utils/errors.js.map +1 -0
- package/lib/module/utils/index.js +8 -0
- package/lib/module/utils/index.js.map +1 -0
- package/lib/module/utils/logger.js +129 -0
- package/lib/module/utils/logger.js.map +1 -0
- package/lib/module/utils/retry.js +149 -0
- package/lib/module/utils/retry.js.map +1 -0
- package/lib/typescript/src/BotaClient.d.ts +77 -0
- package/lib/typescript/src/BotaClient.d.ts.map +1 -0
- package/lib/typescript/src/ble/BleManager.d.ts +111 -0
- package/lib/typescript/src/ble/BleManager.d.ts.map +1 -0
- package/lib/typescript/src/ble/constants.d.ts +111 -0
- package/lib/typescript/src/ble/constants.d.ts.map +1 -0
- package/lib/typescript/src/ble/index.d.ts +7 -0
- package/lib/typescript/src/ble/index.d.ts.map +1 -0
- package/lib/typescript/src/ble/parsers.d.ts +100 -0
- package/lib/typescript/src/ble/parsers.d.ts.map +1 -0
- package/lib/typescript/src/index.d.ts +16 -0
- package/lib/typescript/src/index.d.ts.map +1 -0
- package/lib/typescript/src/managers/DeviceManager.d.ts +84 -0
- package/lib/typescript/src/managers/DeviceManager.d.ts.map +1 -0
- package/lib/typescript/src/managers/OTAManager.d.ts +78 -0
- package/lib/typescript/src/managers/OTAManager.d.ts.map +1 -0
- package/lib/typescript/src/managers/RecordingManager.d.ts +90 -0
- package/lib/typescript/src/managers/RecordingManager.d.ts.map +1 -0
- package/lib/typescript/src/managers/index.d.ts +7 -0
- package/lib/typescript/src/managers/index.d.ts.map +1 -0
- package/lib/typescript/src/models/Device.d.ts +139 -0
- package/lib/typescript/src/models/Device.d.ts.map +1 -0
- package/lib/typescript/src/models/Recording.d.ts +110 -0
- package/lib/typescript/src/models/Recording.d.ts.map +1 -0
- package/lib/typescript/src/models/Status.d.ts +104 -0
- package/lib/typescript/src/models/Status.d.ts.map +1 -0
- package/lib/typescript/src/models/index.d.ts +7 -0
- package/lib/typescript/src/models/index.d.ts.map +1 -0
- package/lib/typescript/src/protocol/ProtocolHandler.d.ts +69 -0
- package/lib/typescript/src/protocol/ProtocolHandler.d.ts.map +1 -0
- package/lib/typescript/src/protocol/index.d.ts +5 -0
- package/lib/typescript/src/protocol/index.d.ts.map +1 -0
- package/lib/typescript/src/storage/StorageManager.d.ts +116 -0
- package/lib/typescript/src/storage/StorageManager.d.ts.map +1 -0
- package/lib/typescript/src/storage/index.d.ts +5 -0
- package/lib/typescript/src/storage/index.d.ts.map +1 -0
- package/lib/typescript/src/upload/S3Uploader.d.ts +38 -0
- package/lib/typescript/src/upload/S3Uploader.d.ts.map +1 -0
- package/lib/typescript/src/upload/UploadQueue.d.ts +95 -0
- package/lib/typescript/src/upload/UploadQueue.d.ts.map +1 -0
- package/lib/typescript/src/upload/index.d.ts +6 -0
- package/lib/typescript/src/upload/index.d.ts.map +1 -0
- package/lib/typescript/src/utils/errors.d.ts +82 -0
- package/lib/typescript/src/utils/errors.d.ts.map +1 -0
- package/lib/typescript/src/utils/index.d.ts +7 -0
- package/lib/typescript/src/utils/index.d.ts.map +1 -0
- package/lib/typescript/src/utils/logger.d.ts +68 -0
- package/lib/typescript/src/utils/logger.d.ts.map +1 -0
- package/lib/typescript/src/utils/retry.d.ts +53 -0
- package/lib/typescript/src/utils/retry.d.ts.map +1 -0
- package/package.json +95 -0
- package/src/BotaClient.ts +238 -0
- package/src/ble/BleManager.ts +573 -0
- package/src/ble/constants.ts +158 -0
- package/src/ble/index.ts +7 -0
- package/src/ble/parsers.ts +395 -0
- package/src/index.ts +64 -0
- package/src/managers/DeviceManager.ts +545 -0
- package/src/managers/OTAManager.ts +263 -0
- package/src/managers/RecordingManager.ts +434 -0
- package/src/managers/index.ts +12 -0
- package/src/models/Device.ts +164 -0
- package/src/models/Recording.ts +123 -0
- package/src/models/Status.ts +126 -0
- package/src/models/index.ts +7 -0
- package/src/protocol/ProtocolHandler.ts +459 -0
- package/src/protocol/index.ts +5 -0
- package/src/storage/StorageManager.ts +343 -0
- package/src/storage/index.ts +5 -0
- package/src/upload/S3Uploader.ts +164 -0
- package/src/upload/UploadQueue.ts +310 -0
- package/src/upload/index.ts +6 -0
- package/src/utils/errors.ts +310 -0
- package/src/utils/index.ts +7 -0
- package/src/utils/logger.ts +137 -0
- package/src/utils/retry.ts +177 -0
|
@@ -0,0 +1,484 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* BLE Manager - Abstraction layer over react-native-ble-plx
|
|
3
|
+
*/
|
|
4
|
+
|
|
5
|
+
import { BleManager as RNBleManager, State } from 'react-native-ble-plx';
|
|
6
|
+
import { Buffer } from 'buffer';
|
|
7
|
+
import EventEmitter from 'eventemitter3';
|
|
8
|
+
import { DEVICE_NAME_PREFIX, DEFAULT_MTU, MAX_MTU, CONNECTION_TIMEOUT, SCAN_TIMEOUT } from './constants';
|
|
9
|
+
import { BluetoothError, DeviceError } from '../utils/errors';
|
|
10
|
+
import { logger } from '../utils/logger';
|
|
11
|
+
import { parseDeviceType, parsePairingState, parseFirmwareVersion } from './parsers';
|
|
12
|
+
const log = logger.tag('BleManager');
|
|
13
|
+
|
|
14
|
+
/**
|
|
15
|
+
* Events emitted by BleManager
|
|
16
|
+
*/
|
|
17
|
+
|
|
18
|
+
/**
|
|
19
|
+
* BLE Manager class - singleton wrapper around react-native-ble-plx
|
|
20
|
+
*/
|
|
21
|
+
export class BleManager extends EventEmitter {
|
|
22
|
+
stateSubscription = null;
|
|
23
|
+
disconnectSubscriptions = new Map();
|
|
24
|
+
connectedDevices = new Map();
|
|
25
|
+
discoveredDevices = new Map();
|
|
26
|
+
isScanning = false;
|
|
27
|
+
cachedState = State.Unknown;
|
|
28
|
+
constructor() {
|
|
29
|
+
super();
|
|
30
|
+
this.manager = new RNBleManager();
|
|
31
|
+
this.setupStateListener();
|
|
32
|
+
}
|
|
33
|
+
|
|
34
|
+
/**
|
|
35
|
+
* Set up Bluetooth state change listener
|
|
36
|
+
*/
|
|
37
|
+
setupStateListener() {
|
|
38
|
+
this.stateSubscription = this.manager.onStateChange(state => {
|
|
39
|
+
log.debug('Bluetooth state changed', {
|
|
40
|
+
state
|
|
41
|
+
});
|
|
42
|
+
this.cachedState = state;
|
|
43
|
+
this.emit('stateChange', state);
|
|
44
|
+
}, true);
|
|
45
|
+
}
|
|
46
|
+
|
|
47
|
+
/**
|
|
48
|
+
* Get current Bluetooth state
|
|
49
|
+
*/
|
|
50
|
+
async getState() {
|
|
51
|
+
const state = await this.manager.state();
|
|
52
|
+
this.cachedState = state;
|
|
53
|
+
return state;
|
|
54
|
+
}
|
|
55
|
+
|
|
56
|
+
/**
|
|
57
|
+
* Get cached Bluetooth state (synchronous)
|
|
58
|
+
*/
|
|
59
|
+
getCachedState() {
|
|
60
|
+
return this.cachedState;
|
|
61
|
+
}
|
|
62
|
+
|
|
63
|
+
/**
|
|
64
|
+
* Check if Bluetooth is ready for operations
|
|
65
|
+
*/
|
|
66
|
+
async isReady() {
|
|
67
|
+
const state = await this.getState();
|
|
68
|
+
return state === State.PoweredOn;
|
|
69
|
+
}
|
|
70
|
+
|
|
71
|
+
/**
|
|
72
|
+
* Wait for Bluetooth to be ready
|
|
73
|
+
*/
|
|
74
|
+
async waitForReady(timeoutMs = 10000) {
|
|
75
|
+
const startTime = Date.now();
|
|
76
|
+
while (Date.now() - startTime < timeoutMs) {
|
|
77
|
+
const state = await this.getState();
|
|
78
|
+
if (state === State.PoweredOn) {
|
|
79
|
+
return;
|
|
80
|
+
}
|
|
81
|
+
if (state === State.Unsupported) {
|
|
82
|
+
throw BluetoothError.unavailable();
|
|
83
|
+
}
|
|
84
|
+
if (state === State.Unauthorized) {
|
|
85
|
+
throw BluetoothError.unauthorized();
|
|
86
|
+
}
|
|
87
|
+
if (state === State.PoweredOff) {
|
|
88
|
+
throw BluetoothError.poweredOff();
|
|
89
|
+
}
|
|
90
|
+
|
|
91
|
+
// Wait a bit before checking again
|
|
92
|
+
await new Promise(resolve => setTimeout(resolve, 100));
|
|
93
|
+
}
|
|
94
|
+
throw new BluetoothError('Bluetooth did not become ready in time', 'TIMEOUT');
|
|
95
|
+
}
|
|
96
|
+
|
|
97
|
+
/**
|
|
98
|
+
* Start scanning for Bota devices
|
|
99
|
+
*/
|
|
100
|
+
async startScan(options = {}) {
|
|
101
|
+
if (this.isScanning) {
|
|
102
|
+
log.warn('Scan already in progress');
|
|
103
|
+
return;
|
|
104
|
+
}
|
|
105
|
+
await this.waitForReady();
|
|
106
|
+
const {
|
|
107
|
+
timeout = SCAN_TIMEOUT,
|
|
108
|
+
deviceTypes,
|
|
109
|
+
pairingState,
|
|
110
|
+
minRssi,
|
|
111
|
+
allowDuplicates = false
|
|
112
|
+
} = options;
|
|
113
|
+
log.info('Starting BLE scan', {
|
|
114
|
+
timeout,
|
|
115
|
+
deviceTypes,
|
|
116
|
+
pairingState
|
|
117
|
+
});
|
|
118
|
+
this.discoveredDevices.clear();
|
|
119
|
+
this.isScanning = true;
|
|
120
|
+
|
|
121
|
+
// Set up timeout
|
|
122
|
+
const scanTimeout = setTimeout(() => {
|
|
123
|
+
this.stopScan();
|
|
124
|
+
}, timeout);
|
|
125
|
+
|
|
126
|
+
// Start scanning
|
|
127
|
+
this.manager.startDeviceScan(null,
|
|
128
|
+
// Scan all services
|
|
129
|
+
{
|
|
130
|
+
allowDuplicates
|
|
131
|
+
}, (error, device) => {
|
|
132
|
+
if (error) {
|
|
133
|
+
log.error('Scan error', error);
|
|
134
|
+
this.stopScan();
|
|
135
|
+
clearTimeout(scanTimeout);
|
|
136
|
+
return;
|
|
137
|
+
}
|
|
138
|
+
if (!device || !device.name?.startsWith(DEVICE_NAME_PREFIX)) {
|
|
139
|
+
return;
|
|
140
|
+
}
|
|
141
|
+
|
|
142
|
+
// Parse device information from advertisement
|
|
143
|
+
const discovered = this.parseDiscoveredDevice(device);
|
|
144
|
+
if (!discovered) {
|
|
145
|
+
return;
|
|
146
|
+
}
|
|
147
|
+
|
|
148
|
+
// Apply filters
|
|
149
|
+
if (deviceTypes && !deviceTypes.includes(discovered.deviceType)) {
|
|
150
|
+
return;
|
|
151
|
+
}
|
|
152
|
+
if (pairingState && discovered.pairingState !== pairingState) {
|
|
153
|
+
return;
|
|
154
|
+
}
|
|
155
|
+
if (minRssi !== undefined && discovered.rssi < minRssi) {
|
|
156
|
+
return;
|
|
157
|
+
}
|
|
158
|
+
|
|
159
|
+
// Check for duplicates
|
|
160
|
+
const existingDevice = this.discoveredDevices.get(device.id);
|
|
161
|
+
if (existingDevice && !allowDuplicates) {
|
|
162
|
+
// Update RSSI
|
|
163
|
+
existingDevice.rssi = discovered.rssi;
|
|
164
|
+
return;
|
|
165
|
+
}
|
|
166
|
+
|
|
167
|
+
// Store and emit
|
|
168
|
+
this.discoveredDevices.set(device.id, discovered);
|
|
169
|
+
log.debug('Device discovered', {
|
|
170
|
+
id: discovered.id,
|
|
171
|
+
name: discovered.name,
|
|
172
|
+
type: discovered.deviceType
|
|
173
|
+
});
|
|
174
|
+
this.emit('deviceDiscovered', discovered);
|
|
175
|
+
});
|
|
176
|
+
}
|
|
177
|
+
|
|
178
|
+
/**
|
|
179
|
+
* Stop scanning for devices
|
|
180
|
+
*/
|
|
181
|
+
stopScan() {
|
|
182
|
+
if (!this.isScanning) {
|
|
183
|
+
return;
|
|
184
|
+
}
|
|
185
|
+
log.info('Stopping BLE scan');
|
|
186
|
+
this.manager.stopDeviceScan();
|
|
187
|
+
this.isScanning = false;
|
|
188
|
+
}
|
|
189
|
+
|
|
190
|
+
/**
|
|
191
|
+
* Get list of discovered devices
|
|
192
|
+
*/
|
|
193
|
+
getDiscoveredDevices() {
|
|
194
|
+
return Array.from(this.discoveredDevices.values());
|
|
195
|
+
}
|
|
196
|
+
|
|
197
|
+
/**
|
|
198
|
+
* Parse a discovered device from BLE advertisement data
|
|
199
|
+
*/
|
|
200
|
+
parseDiscoveredDevice(device) {
|
|
201
|
+
if (!device.name) {
|
|
202
|
+
return null;
|
|
203
|
+
}
|
|
204
|
+
|
|
205
|
+
// Parse manufacturer data if available
|
|
206
|
+
let deviceType = 'bota_pin';
|
|
207
|
+
let firmwareVersion = '0.0.0';
|
|
208
|
+
let pairingState = 'unpaired';
|
|
209
|
+
let manufacturerData;
|
|
210
|
+
if (device.manufacturerData) {
|
|
211
|
+
try {
|
|
212
|
+
manufacturerData = Buffer.from(device.manufacturerData, 'base64');
|
|
213
|
+
if (manufacturerData.length >= 4) {
|
|
214
|
+
deviceType = parseDeviceType(manufacturerData[0]);
|
|
215
|
+
firmwareVersion = parseFirmwareVersion(manufacturerData[1], manufacturerData[2]);
|
|
216
|
+
pairingState = parsePairingState(manufacturerData[3]);
|
|
217
|
+
}
|
|
218
|
+
} catch (e) {
|
|
219
|
+
log.warn('Failed to parse manufacturer data', {
|
|
220
|
+
deviceId: device.id
|
|
221
|
+
});
|
|
222
|
+
}
|
|
223
|
+
} else {
|
|
224
|
+
// Infer device type from name
|
|
225
|
+
if (device.name.includes('Pin4G')) {
|
|
226
|
+
deviceType = 'bota_pin_4g';
|
|
227
|
+
} else if (device.name.includes('Note')) {
|
|
228
|
+
deviceType = 'bota_note';
|
|
229
|
+
} else if (device.name.includes('Pin')) {
|
|
230
|
+
deviceType = 'bota_pin';
|
|
231
|
+
}
|
|
232
|
+
}
|
|
233
|
+
return {
|
|
234
|
+
id: device.id,
|
|
235
|
+
name: device.name,
|
|
236
|
+
deviceType,
|
|
237
|
+
firmwareVersion,
|
|
238
|
+
pairingState,
|
|
239
|
+
rssi: device.rssi ?? -100,
|
|
240
|
+
manufacturerData,
|
|
241
|
+
discoveredAt: new Date()
|
|
242
|
+
};
|
|
243
|
+
}
|
|
244
|
+
|
|
245
|
+
/**
|
|
246
|
+
* Connect to a device
|
|
247
|
+
*/
|
|
248
|
+
async connect(deviceId) {
|
|
249
|
+
log.info('Connecting to device', {
|
|
250
|
+
deviceId
|
|
251
|
+
});
|
|
252
|
+
|
|
253
|
+
// Check if already connected
|
|
254
|
+
if (this.connectedDevices.has(deviceId)) {
|
|
255
|
+
log.debug('Device already connected', {
|
|
256
|
+
deviceId
|
|
257
|
+
});
|
|
258
|
+
return this.connectedDevices.get(deviceId);
|
|
259
|
+
}
|
|
260
|
+
try {
|
|
261
|
+
// Connect with timeout
|
|
262
|
+
const device = await this.manager.connectToDevice(deviceId, {
|
|
263
|
+
timeout: CONNECTION_TIMEOUT,
|
|
264
|
+
requestMTU: MAX_MTU
|
|
265
|
+
});
|
|
266
|
+
log.debug('Device connected, discovering services', {
|
|
267
|
+
deviceId
|
|
268
|
+
});
|
|
269
|
+
|
|
270
|
+
// Discover services and characteristics
|
|
271
|
+
await device.discoverAllServicesAndCharacteristics();
|
|
272
|
+
|
|
273
|
+
// Store connected device
|
|
274
|
+
this.connectedDevices.set(deviceId, device);
|
|
275
|
+
|
|
276
|
+
// Set up disconnect listener
|
|
277
|
+
const disconnectSub = device.onDisconnected((error, disconnectedDevice) => {
|
|
278
|
+
log.info('Device disconnected', {
|
|
279
|
+
deviceId: disconnectedDevice.id,
|
|
280
|
+
error: error?.message
|
|
281
|
+
});
|
|
282
|
+
this.connectedDevices.delete(disconnectedDevice.id);
|
|
283
|
+
this.disconnectSubscriptions.get(disconnectedDevice.id)?.remove();
|
|
284
|
+
this.disconnectSubscriptions.delete(disconnectedDevice.id);
|
|
285
|
+
this.emit('deviceDisconnected', disconnectedDevice.id, error ? new Error(error.message) : undefined);
|
|
286
|
+
});
|
|
287
|
+
this.disconnectSubscriptions.set(deviceId, disconnectSub);
|
|
288
|
+
this.emit('deviceConnected', deviceId);
|
|
289
|
+
return device;
|
|
290
|
+
} catch (error) {
|
|
291
|
+
const bleError = error;
|
|
292
|
+
log.error('Connection failed', new Error(bleError.message), {
|
|
293
|
+
deviceId
|
|
294
|
+
});
|
|
295
|
+
throw DeviceError.connectionFailed(deviceId, new Error(bleError.message));
|
|
296
|
+
}
|
|
297
|
+
}
|
|
298
|
+
|
|
299
|
+
/**
|
|
300
|
+
* Disconnect from a device
|
|
301
|
+
*/
|
|
302
|
+
async disconnect(deviceId) {
|
|
303
|
+
log.info('Disconnecting from device', {
|
|
304
|
+
deviceId
|
|
305
|
+
});
|
|
306
|
+
const device = this.connectedDevices.get(deviceId);
|
|
307
|
+
if (!device) {
|
|
308
|
+
log.warn('Device not found in connected devices', {
|
|
309
|
+
deviceId
|
|
310
|
+
});
|
|
311
|
+
return;
|
|
312
|
+
}
|
|
313
|
+
try {
|
|
314
|
+
await device.cancelConnection();
|
|
315
|
+
} catch (error) {
|
|
316
|
+
const bleError = error;
|
|
317
|
+
log.warn('Disconnect error (may be expected)', {
|
|
318
|
+
error: bleError.message
|
|
319
|
+
});
|
|
320
|
+
}
|
|
321
|
+
this.connectedDevices.delete(deviceId);
|
|
322
|
+
this.disconnectSubscriptions.get(deviceId)?.remove();
|
|
323
|
+
this.disconnectSubscriptions.delete(deviceId);
|
|
324
|
+
}
|
|
325
|
+
|
|
326
|
+
/**
|
|
327
|
+
* Check if a device is connected
|
|
328
|
+
*/
|
|
329
|
+
isConnected(deviceId) {
|
|
330
|
+
return this.connectedDevices.has(deviceId);
|
|
331
|
+
}
|
|
332
|
+
|
|
333
|
+
/**
|
|
334
|
+
* Get a connected device
|
|
335
|
+
*/
|
|
336
|
+
getConnectedDevice(deviceId) {
|
|
337
|
+
return this.connectedDevices.get(deviceId);
|
|
338
|
+
}
|
|
339
|
+
|
|
340
|
+
/**
|
|
341
|
+
* Get negotiated MTU for a device
|
|
342
|
+
*/
|
|
343
|
+
async getMtu(deviceId) {
|
|
344
|
+
const device = this.connectedDevices.get(deviceId);
|
|
345
|
+
if (!device) {
|
|
346
|
+
return DEFAULT_MTU;
|
|
347
|
+
}
|
|
348
|
+
try {
|
|
349
|
+
// mtu is a property, not a method in react-native-ble-plx
|
|
350
|
+
return device.mtu ?? DEFAULT_MTU;
|
|
351
|
+
} catch {
|
|
352
|
+
return DEFAULT_MTU;
|
|
353
|
+
}
|
|
354
|
+
}
|
|
355
|
+
|
|
356
|
+
/**
|
|
357
|
+
* Read a characteristic value
|
|
358
|
+
*/
|
|
359
|
+
async readCharacteristic(deviceId, serviceUuid, characteristicUuid) {
|
|
360
|
+
const device = this.connectedDevices.get(deviceId);
|
|
361
|
+
if (!device) {
|
|
362
|
+
throw DeviceError.notConnected(deviceId);
|
|
363
|
+
}
|
|
364
|
+
try {
|
|
365
|
+
const characteristic = await device.readCharacteristicForService(serviceUuid, characteristicUuid);
|
|
366
|
+
if (!characteristic.value) {
|
|
367
|
+
return Buffer.alloc(0);
|
|
368
|
+
}
|
|
369
|
+
return Buffer.from(characteristic.value, 'base64');
|
|
370
|
+
} catch (error) {
|
|
371
|
+
const bleError = error;
|
|
372
|
+
log.error('Read characteristic failed', new Error(bleError.message), {
|
|
373
|
+
deviceId,
|
|
374
|
+
serviceUuid,
|
|
375
|
+
characteristicUuid
|
|
376
|
+
});
|
|
377
|
+
throw new DeviceError(`Failed to read characteristic: ${bleError.message}`, 'READ_FAILED', deviceId, new Error(bleError.message));
|
|
378
|
+
}
|
|
379
|
+
}
|
|
380
|
+
|
|
381
|
+
/**
|
|
382
|
+
* Write a characteristic value
|
|
383
|
+
*/
|
|
384
|
+
async writeCharacteristic(deviceId, serviceUuid, characteristicUuid, data, withResponse = true) {
|
|
385
|
+
const device = this.connectedDevices.get(deviceId);
|
|
386
|
+
if (!device) {
|
|
387
|
+
throw DeviceError.notConnected(deviceId);
|
|
388
|
+
}
|
|
389
|
+
const base64Data = data.toString('base64');
|
|
390
|
+
try {
|
|
391
|
+
if (withResponse) {
|
|
392
|
+
await device.writeCharacteristicWithResponseForService(serviceUuid, characteristicUuid, base64Data);
|
|
393
|
+
} else {
|
|
394
|
+
await device.writeCharacteristicWithoutResponseForService(serviceUuid, characteristicUuid, base64Data);
|
|
395
|
+
}
|
|
396
|
+
} catch (error) {
|
|
397
|
+
const bleError = error;
|
|
398
|
+
log.error('Write characteristic failed', new Error(bleError.message), {
|
|
399
|
+
deviceId,
|
|
400
|
+
serviceUuid,
|
|
401
|
+
characteristicUuid
|
|
402
|
+
});
|
|
403
|
+
throw new DeviceError(`Failed to write characteristic: ${bleError.message}`, 'WRITE_FAILED', deviceId, new Error(bleError.message));
|
|
404
|
+
}
|
|
405
|
+
}
|
|
406
|
+
|
|
407
|
+
/**
|
|
408
|
+
* Subscribe to characteristic notifications
|
|
409
|
+
*/
|
|
410
|
+
subscribeToCharacteristic(deviceId, serviceUuid, characteristicUuid, onData, onError) {
|
|
411
|
+
const device = this.connectedDevices.get(deviceId);
|
|
412
|
+
if (!device) {
|
|
413
|
+
throw DeviceError.notConnected(deviceId);
|
|
414
|
+
}
|
|
415
|
+
return device.monitorCharacteristicForService(serviceUuid, characteristicUuid, (error, characteristic) => {
|
|
416
|
+
if (error) {
|
|
417
|
+
log.error('Notification error', new Error(error.message), {
|
|
418
|
+
deviceId,
|
|
419
|
+
characteristicUuid
|
|
420
|
+
});
|
|
421
|
+
onError?.(new Error(error.message));
|
|
422
|
+
return;
|
|
423
|
+
}
|
|
424
|
+
if (characteristic?.value) {
|
|
425
|
+
const data = Buffer.from(characteristic.value, 'base64');
|
|
426
|
+
onData(data);
|
|
427
|
+
}
|
|
428
|
+
});
|
|
429
|
+
}
|
|
430
|
+
|
|
431
|
+
/**
|
|
432
|
+
* Destroy the BLE manager and clean up resources
|
|
433
|
+
*/
|
|
434
|
+
destroy() {
|
|
435
|
+
log.info('Destroying BLE manager');
|
|
436
|
+
this.stopScan();
|
|
437
|
+
|
|
438
|
+
// Remove all disconnect subscriptions
|
|
439
|
+
for (const sub of this.disconnectSubscriptions.values()) {
|
|
440
|
+
sub.remove();
|
|
441
|
+
}
|
|
442
|
+
this.disconnectSubscriptions.clear();
|
|
443
|
+
|
|
444
|
+
// Disconnect all devices
|
|
445
|
+
for (const deviceId of this.connectedDevices.keys()) {
|
|
446
|
+
this.disconnect(deviceId).catch(() => {});
|
|
447
|
+
}
|
|
448
|
+
this.connectedDevices.clear();
|
|
449
|
+
|
|
450
|
+
// Remove state subscription
|
|
451
|
+
this.stateSubscription?.remove();
|
|
452
|
+
this.stateSubscription = null;
|
|
453
|
+
|
|
454
|
+
// Destroy the manager
|
|
455
|
+
this.manager.destroy();
|
|
456
|
+
this.removeAllListeners();
|
|
457
|
+
}
|
|
458
|
+
}
|
|
459
|
+
|
|
460
|
+
/**
|
|
461
|
+
* Singleton instance
|
|
462
|
+
*/
|
|
463
|
+
let instance = null;
|
|
464
|
+
|
|
465
|
+
/**
|
|
466
|
+
* Get or create the BLE manager singleton
|
|
467
|
+
*/
|
|
468
|
+
export function getBleManager() {
|
|
469
|
+
if (!instance) {
|
|
470
|
+
instance = new BleManager();
|
|
471
|
+
}
|
|
472
|
+
return instance;
|
|
473
|
+
}
|
|
474
|
+
|
|
475
|
+
/**
|
|
476
|
+
* Reset the BLE manager singleton (for testing)
|
|
477
|
+
*/
|
|
478
|
+
export function resetBleManager() {
|
|
479
|
+
if (instance) {
|
|
480
|
+
instance.destroy();
|
|
481
|
+
instance = null;
|
|
482
|
+
}
|
|
483
|
+
}
|
|
484
|
+
//# sourceMappingURL=BleManager.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"names":["BleManager","RNBleManager","State","Buffer","EventEmitter","DEVICE_NAME_PREFIX","DEFAULT_MTU","MAX_MTU","CONNECTION_TIMEOUT","SCAN_TIMEOUT","BluetoothError","DeviceError","logger","parseDeviceType","parsePairingState","parseFirmwareVersion","log","tag","stateSubscription","disconnectSubscriptions","Map","connectedDevices","discoveredDevices","isScanning","cachedState","Unknown","constructor","manager","setupStateListener","onStateChange","state","debug","emit","getState","getCachedState","isReady","PoweredOn","waitForReady","timeoutMs","startTime","Date","now","Unsupported","unavailable","Unauthorized","unauthorized","PoweredOff","poweredOff","Promise","resolve","setTimeout","startScan","options","warn","timeout","deviceTypes","pairingState","minRssi","allowDuplicates","info","clear","scanTimeout","stopScan","startDeviceScan","error","device","clearTimeout","name","startsWith","discovered","parseDiscoveredDevice","includes","deviceType","undefined","rssi","existingDevice","get","id","set","type","stopDeviceScan","getDiscoveredDevices","Array","from","values","firmwareVersion","manufacturerData","length","e","deviceId","discoveredAt","connect","has","connectToDevice","requestMTU","discoverAllServicesAndCharacteristics","disconnectSub","onDisconnected","disconnectedDevice","message","delete","remove","Error","bleError","connectionFailed","disconnect","cancelConnection","isConnected","getConnectedDevice","getMtu","mtu","readCharacteristic","serviceUuid","characteristicUuid","notConnected","characteristic","readCharacteristicForService","value","alloc","writeCharacteristic","data","withResponse","base64Data","toString","writeCharacteristicWithResponseForService","writeCharacteristicWithoutResponseForService","subscribeToCharacteristic","onData","onError","monitorCharacteristicForService","destroy","sub","keys","catch","removeAllListeners","instance","getBleManager","resetBleManager"],"sourceRoot":"../../../src","sources":["ble/BleManager.ts"],"mappings":"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","ignoreList":[]}
|
|
@@ -0,0 +1,159 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* BLE Service and Characteristic UUIDs for Bota devices
|
|
3
|
+
* Based on Device-App Protocol specification
|
|
4
|
+
*/
|
|
5
|
+
|
|
6
|
+
// Standard Bluetooth SIG Services
|
|
7
|
+
export const SERVICE_DEVICE_INFO = '180A';
|
|
8
|
+
export const SERVICE_BATTERY = '180F';
|
|
9
|
+
export const SERVICE_NORDIC_DFU = 'FE59';
|
|
10
|
+
|
|
11
|
+
// Bota Custom Services
|
|
12
|
+
export const SERVICE_BOTA_AUDIO = 'B07A0001-0000-1000-8000-00805F9B34FB';
|
|
13
|
+
export const SERVICE_BOTA_CONTROL = 'B07A0002-0000-1000-8000-00805F9B34FB';
|
|
14
|
+
export const SERVICE_BOTA_PROVISIONING = 'B07A0003-0000-1000-8000-00805F9B34FB';
|
|
15
|
+
export const SERVICE_BOTA_STORAGE = 'B07A0004-0000-1000-8000-00805F9B34FB';
|
|
16
|
+
|
|
17
|
+
// Device Information Service Characteristics (0x180A)
|
|
18
|
+
export const CHAR_MANUFACTURER_NAME = '2A29';
|
|
19
|
+
export const CHAR_MODEL_NUMBER = '2A24';
|
|
20
|
+
export const CHAR_SERIAL_NUMBER = '2A25';
|
|
21
|
+
export const CHAR_HARDWARE_REVISION = '2A27';
|
|
22
|
+
export const CHAR_FIRMWARE_REVISION = '2A26';
|
|
23
|
+
|
|
24
|
+
// Battery Service Characteristics (0x180F)
|
|
25
|
+
export const CHAR_BATTERY_LEVEL = '2A19';
|
|
26
|
+
|
|
27
|
+
// Bota Audio Service Characteristics (B07A0001)
|
|
28
|
+
export const CHAR_AUDIO_DATA = 'B07A0001-0001-1000-8000-00805F9B34FB';
|
|
29
|
+
export const CHAR_AUDIO_CODEC = 'B07A0001-0002-1000-8000-00805F9B34FB';
|
|
30
|
+
export const CHAR_AUDIO_CONTROL = 'B07A0001-0003-1000-8000-00805F9B34FB';
|
|
31
|
+
|
|
32
|
+
// Bota Control Service Characteristics (B07A0002)
|
|
33
|
+
export const CHAR_DEVICE_STATUS = 'B07A0002-0001-1000-8000-00805F9B34FB';
|
|
34
|
+
export const CHAR_RECORDING_CONTROL = 'B07A0002-0002-1000-8000-00805F9B34FB';
|
|
35
|
+
export const CHAR_RECORDING_STATUS = 'B07A0002-0003-1000-8000-00805F9B34FB';
|
|
36
|
+
export const CHAR_TIME_SYNC = 'B07A0002-0004-1000-8000-00805F9B34FB';
|
|
37
|
+
export const CHAR_DEVICE_COMMAND = 'B07A0002-0005-1000-8000-00805F9B34FB';
|
|
38
|
+
|
|
39
|
+
// Bota Provisioning Service Characteristics (B07A0003)
|
|
40
|
+
export const CHAR_PAIRING_STATE = 'B07A0003-0001-1000-8000-00805F9B34FB';
|
|
41
|
+
export const CHAR_DEVICE_TOKEN = 'B07A0003-0002-1000-8000-00805F9B34FB';
|
|
42
|
+
export const CHAR_API_ENDPOINT = 'B07A0003-0003-1000-8000-00805F9B34FB';
|
|
43
|
+
export const CHAR_WIFI_CONFIG = 'B07A0003-0004-1000-8000-00805F9B34FB';
|
|
44
|
+
export const CHAR_PROVISIONING_RESULT = 'B07A0003-0005-1000-8000-00805F9B34FB';
|
|
45
|
+
|
|
46
|
+
// Bota Storage Service Characteristics (B07A0004)
|
|
47
|
+
export const CHAR_STORAGE_INFO = 'B07A0004-0001-1000-8000-00805F9B34FB';
|
|
48
|
+
export const CHAR_RECORDING_LIST = 'B07A0004-0002-1000-8000-00805F9B34FB';
|
|
49
|
+
export const CHAR_RECORDING_TRANSFER = 'B07A0004-0003-1000-8000-00805F9B34FB';
|
|
50
|
+
export const CHAR_TRANSFER_CONTROL = 'B07A0004-0004-1000-8000-00805F9B34FB';
|
|
51
|
+
export const CHAR_TRANSFER_STATUS = 'B07A0004-0005-1000-8000-00805F9B34FB';
|
|
52
|
+
|
|
53
|
+
// Device name prefixes for scanning
|
|
54
|
+
export const DEVICE_NAME_PREFIX = 'Bota-';
|
|
55
|
+
export const DEVICE_NAME_PREFIX_PIN = 'Bota-Pin-';
|
|
56
|
+
export const DEVICE_NAME_PREFIX_PIN_4G = 'Bota-Pin4G-';
|
|
57
|
+
export const DEVICE_NAME_PREFIX_NOTE = 'Bota-Note-';
|
|
58
|
+
|
|
59
|
+
// Manufacturer data byte positions
|
|
60
|
+
export const MFG_DATA_DEVICE_TYPE = 0;
|
|
61
|
+
export const MFG_DATA_FW_MAJOR = 1;
|
|
62
|
+
export const MFG_DATA_FW_MINOR = 2;
|
|
63
|
+
export const MFG_DATA_PAIRING_STATE = 3;
|
|
64
|
+
export const MFG_DATA_BATTERY = 4;
|
|
65
|
+
|
|
66
|
+
// Device type values in manufacturer data
|
|
67
|
+
export const DEVICE_TYPE_PIN = 0x01;
|
|
68
|
+
export const DEVICE_TYPE_PIN_4G = 0x02;
|
|
69
|
+
export const DEVICE_TYPE_NOTE = 0x03;
|
|
70
|
+
|
|
71
|
+
// Pairing state values
|
|
72
|
+
export const PAIRING_STATE_UNPAIRED = 0x00;
|
|
73
|
+
export const PAIRING_STATE_PAIRING = 0x01;
|
|
74
|
+
export const PAIRING_STATE_PAIRED = 0x02;
|
|
75
|
+
export const PAIRING_STATE_ERROR = 0x03;
|
|
76
|
+
|
|
77
|
+
// Provisioning result codes
|
|
78
|
+
export const PROVISIONING_SUCCESS = 0x00;
|
|
79
|
+
export const PROVISIONING_INVALID_TOKEN = 0x01;
|
|
80
|
+
export const PROVISIONING_STORAGE_ERROR = 0x02;
|
|
81
|
+
export const PROVISIONING_CHUNK_ERROR = 0x03;
|
|
82
|
+
|
|
83
|
+
// API endpoint values
|
|
84
|
+
export const API_ENDPOINT_PRODUCTION = 0x00;
|
|
85
|
+
export const API_ENDPOINT_SANDBOX = 0x01;
|
|
86
|
+
|
|
87
|
+
// Transfer control commands
|
|
88
|
+
export const TRANSFER_CMD_LIST = 0x01;
|
|
89
|
+
export const TRANSFER_CMD_START = 0x02;
|
|
90
|
+
export const TRANSFER_CMD_CONFIRM_SYNC = 0x07;
|
|
91
|
+
|
|
92
|
+
// Transfer packet types (Device → App)
|
|
93
|
+
export const PACKET_TYPE_DATA = 0x01;
|
|
94
|
+
export const PACKET_TYPE_EOF = 0x02;
|
|
95
|
+
export const PACKET_TYPE_ERROR = 0xff;
|
|
96
|
+
|
|
97
|
+
// ACK types (App → Device)
|
|
98
|
+
export const ACK_TYPE_ACK = 0x10;
|
|
99
|
+
export const ACK_TYPE_NACK = 0x11;
|
|
100
|
+
export const ACK_TYPE_ABORT = 0x12;
|
|
101
|
+
|
|
102
|
+
// Device command values
|
|
103
|
+
export const DEVICE_CMD_ENTER_DFU = 0x03;
|
|
104
|
+
|
|
105
|
+
// Device state values (from status)
|
|
106
|
+
export const DEVICE_STATE_IDLE = 0x00;
|
|
107
|
+
export const DEVICE_STATE_RECORDING = 0x01;
|
|
108
|
+
export const DEVICE_STATE_SYNCING = 0x02;
|
|
109
|
+
export const DEVICE_STATE_UPLOADING = 0x03;
|
|
110
|
+
export const DEVICE_STATE_CHARGING = 0x04;
|
|
111
|
+
export const DEVICE_STATE_LOW_BATTERY = 0x05;
|
|
112
|
+
export const DEVICE_STATE_STORAGE_FULL = 0x06;
|
|
113
|
+
export const DEVICE_STATE_ERROR = 0xff;
|
|
114
|
+
|
|
115
|
+
// Device status flags (bitmask)
|
|
116
|
+
export const FLAG_CHARGING = 1 << 0;
|
|
117
|
+
export const FLAG_USB_CONNECTED = 1 << 1;
|
|
118
|
+
export const FLAG_LOW_BATTERY = 1 << 2;
|
|
119
|
+
export const FLAG_CRITICAL_BATTERY = 1 << 3;
|
|
120
|
+
export const FLAG_STORAGE_WARNING = 1 << 4;
|
|
121
|
+
export const FLAG_STORAGE_FULL = 1 << 5;
|
|
122
|
+
export const FLAG_CELLULAR_AVAILABLE = 1 << 6;
|
|
123
|
+
export const FLAG_CELLULAR_ROAMING = 1 << 7;
|
|
124
|
+
export const FLAG_WIFI_CONNECTED = 1 << 8;
|
|
125
|
+
export const FLAG_RECORDING_ACTIVE = 1 << 9;
|
|
126
|
+
export const FLAG_SYNC_REQUIRED = 1 << 10;
|
|
127
|
+
export const FLAG_UPDATE_AVAILABLE = 1 << 11;
|
|
128
|
+
|
|
129
|
+
// Audio codec values
|
|
130
|
+
export const CODEC_PCM_16K = 0x00;
|
|
131
|
+
export const CODEC_PCM_8K = 0x01;
|
|
132
|
+
export const CODEC_OPUS_16K = 0x10;
|
|
133
|
+
export const CODEC_OPUS_8K = 0x11;
|
|
134
|
+
|
|
135
|
+
// BLE error codes
|
|
136
|
+
export const BLE_ERROR_SUCCESS = 0x00;
|
|
137
|
+
export const BLE_ERROR_INVALID_COMMAND = 0x01;
|
|
138
|
+
export const BLE_ERROR_INVALID_STATE = 0x02;
|
|
139
|
+
export const BLE_ERROR_INVALID_PARAMETER = 0x03;
|
|
140
|
+
export const BLE_ERROR_STORAGE_FULL = 0x10;
|
|
141
|
+
export const BLE_ERROR_RECORDING_NOT_FOUND = 0x11;
|
|
142
|
+
export const BLE_ERROR_TRANSFER_FAILED = 0x12;
|
|
143
|
+
export const BLE_ERROR_TOKEN_INVALID = 0x20;
|
|
144
|
+
export const BLE_ERROR_TOKEN_EXPIRED = 0x21;
|
|
145
|
+
export const BLE_ERROR_NETWORK_ERROR = 0x30;
|
|
146
|
+
export const BLE_ERROR_UPLOAD_FAILED = 0x31;
|
|
147
|
+
export const BLE_ERROR_UNKNOWN = 0xff;
|
|
148
|
+
|
|
149
|
+
// Timeouts (ms)
|
|
150
|
+
export const SCAN_TIMEOUT = 30000;
|
|
151
|
+
export const CONNECTION_TIMEOUT = 30000;
|
|
152
|
+
export const OPERATION_TIMEOUT = 10000;
|
|
153
|
+
export const TRANSFER_PACKET_TIMEOUT = 2000;
|
|
154
|
+
|
|
155
|
+
// Transfer settings
|
|
156
|
+
export const TRANSFER_WINDOW_SIZE = 4;
|
|
157
|
+
export const DEFAULT_MTU = 23;
|
|
158
|
+
export const MAX_MTU = 512;
|
|
159
|
+
//# sourceMappingURL=constants.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"names":["SERVICE_DEVICE_INFO","SERVICE_BATTERY","SERVICE_NORDIC_DFU","SERVICE_BOTA_AUDIO","SERVICE_BOTA_CONTROL","SERVICE_BOTA_PROVISIONING","SERVICE_BOTA_STORAGE","CHAR_MANUFACTURER_NAME","CHAR_MODEL_NUMBER","CHAR_SERIAL_NUMBER","CHAR_HARDWARE_REVISION","CHAR_FIRMWARE_REVISION","CHAR_BATTERY_LEVEL","CHAR_AUDIO_DATA","CHAR_AUDIO_CODEC","CHAR_AUDIO_CONTROL","CHAR_DEVICE_STATUS","CHAR_RECORDING_CONTROL","CHAR_RECORDING_STATUS","CHAR_TIME_SYNC","CHAR_DEVICE_COMMAND","CHAR_PAIRING_STATE","CHAR_DEVICE_TOKEN","CHAR_API_ENDPOINT","CHAR_WIFI_CONFIG","CHAR_PROVISIONING_RESULT","CHAR_STORAGE_INFO","CHAR_RECORDING_LIST","CHAR_RECORDING_TRANSFER","CHAR_TRANSFER_CONTROL","CHAR_TRANSFER_STATUS","DEVICE_NAME_PREFIX","DEVICE_NAME_PREFIX_PIN","DEVICE_NAME_PREFIX_PIN_4G","DEVICE_NAME_PREFIX_NOTE","MFG_DATA_DEVICE_TYPE","MFG_DATA_FW_MAJOR","MFG_DATA_FW_MINOR","MFG_DATA_PAIRING_STATE","MFG_DATA_BATTERY","DEVICE_TYPE_PIN","DEVICE_TYPE_PIN_4G","DEVICE_TYPE_NOTE","PAIRING_STATE_UNPAIRED","PAIRING_STATE_PAIRING","PAIRING_STATE_PAIRED","PAIRING_STATE_ERROR","PROVISIONING_SUCCESS","PROVISIONING_INVALID_TOKEN","PROVISIONING_STORAGE_ERROR","PROVISIONING_CHUNK_ERROR","API_ENDPOINT_PRODUCTION","API_ENDPOINT_SANDBOX","TRANSFER_CMD_LIST","TRANSFER_CMD_START","TRANSFER_CMD_CONFIRM_SYNC","PACKET_TYPE_DATA","PACKET_TYPE_EOF","PACKET_TYPE_ERROR","ACK_TYPE_ACK","ACK_TYPE_NACK","ACK_TYPE_ABORT","DEVICE_CMD_ENTER_DFU","DEVICE_STATE_IDLE","DEVICE_STATE_RECORDING","DEVICE_STATE_SYNCING","DEVICE_STATE_UPLOADING","DEVICE_STATE_CHARGING","DEVICE_STATE_LOW_BATTERY","DEVICE_STATE_STORAGE_FULL","DEVICE_STATE_ERROR","FLAG_CHARGING","FLAG_USB_CONNECTED","FLAG_LOW_BATTERY","FLAG_CRITICAL_BATTERY","FLAG_STORAGE_WARNING","FLAG_STORAGE_FULL","FLAG_CELLULAR_AVAILABLE","FLAG_CELLULAR_ROAMING","FLAG_WIFI_CONNECTED","FLAG_RECORDING_ACTIVE","FLAG_SYNC_REQUIRED","FLAG_UPDATE_AVAILABLE","CODEC_PCM_16K","CODEC_PCM_8K","CODEC_OPUS_16K","CODEC_OPUS_8K","BLE_ERROR_SUCCESS","BLE_ERROR_INVALID_COMMAND","BLE_ERROR_INVALID_STATE","BLE_ERROR_INVALID_PARAMETER","BLE_ERROR_STORAGE_FULL","BLE_ERROR_RECORDING_NOT_FOUND","BLE_ERROR_TRANSFER_FAILED","BLE_ERROR_TOKEN_INVALID","BLE_ERROR_TOKEN_EXPIRED","BLE_ERROR_NETWORK_ERROR","BLE_ERROR_UPLOAD_FAILED","BLE_ERROR_UNKNOWN","SCAN_TIMEOUT","CONNECTION_TIMEOUT","OPERATION_TIMEOUT","TRANSFER_PACKET_TIMEOUT","TRANSFER_WINDOW_SIZE","DEFAULT_MTU","MAX_MTU"],"sourceRoot":"../../../src","sources":["ble/constants.ts"],"mappings":"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","ignoreList":[]}
|