@jiabaida/tools 1.0.0 → 1.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.
Files changed (57) hide show
  1. package/dist/cjs/core/BleApiManager.js +1 -1
  2. package/dist/cjs/core/BleCmdAnalysis/BaseParamProtocol.js +1 -0
  3. package/dist/cjs/core/BleCmdAnalysis/BleCmdAnalysis.js +1 -0
  4. package/dist/cjs/core/BleCmdAnalysis/BleCmdDD.js +1 -0
  5. package/dist/cjs/core/BleCmdAnalysis/BleCmdFFAA.js +1 -0
  6. package/dist/cjs/core/BleCmdAnalysis/BleCmdHVES.js +1 -0
  7. package/dist/cjs/core/BleCmdAnalysis/ESHostProtocol.js +1 -0
  8. package/dist/cjs/core/BleCmdAnalysis/readAndSetParam.js +1 -0
  9. package/dist/cjs/core/BleCmdAnalysis.js +1 -0
  10. package/dist/cjs/core/BleDataProcess.js +1 -0
  11. package/dist/cjs/core/OtaUpgrade.js +1 -0
  12. package/dist/cjs/core/TelinkApi.js +1 -0
  13. package/dist/cjs/core/Transfer.js +1 -0
  14. package/dist/cjs/core/commonfun.js +1 -1
  15. package/dist/cjs/core/dataJson/baseParamsJson.js +1 -0
  16. package/dist/cjs/core/keyAndPwdManager.js +1 -0
  17. package/dist/cjs/index.js +1 -1
  18. package/dist/esm/core/BleApiManager.js +1 -1
  19. package/dist/esm/core/BleCmdAnalysis/BaseParamProtocol.js +1 -0
  20. package/dist/esm/core/BleCmdAnalysis/BleCmdAnalysis.js +1 -0
  21. package/dist/esm/core/BleCmdAnalysis/BleCmdDD.js +1 -0
  22. package/dist/esm/core/BleCmdAnalysis/BleCmdFFAA.js +1 -0
  23. package/dist/esm/core/BleCmdAnalysis/BleCmdHVES.js +1 -0
  24. package/dist/esm/core/BleCmdAnalysis/ESHostProtocol.js +1 -0
  25. package/dist/esm/core/BleCmdAnalysis/readAndSetParam.js +1 -0
  26. package/dist/esm/core/BleCmdAnalysis.js +1 -0
  27. package/dist/esm/core/BleDataProcess.js +1 -0
  28. package/dist/esm/core/OtaUpgrade.js +1 -0
  29. package/dist/esm/core/TelinkApi.js +1 -0
  30. package/dist/esm/core/Transfer.js +1 -0
  31. package/dist/esm/core/commonfun.js +1 -1
  32. package/dist/esm/core/dataJson/baseParamsJson.js +1 -0
  33. package/dist/esm/core/keyAndPwdManager.js +1 -0
  34. package/dist/esm/index.js +1 -1
  35. package/package.json +13 -3
  36. package/src/core/BleApiManager.js +487 -0
  37. package/src/core/BleCmdAnalysis/BaseParamProtocol.js +651 -0
  38. package/src/core/BleCmdAnalysis/BleCmdAnalysis.js +222 -0
  39. package/src/core/BleCmdAnalysis/BleCmdDD.js +1214 -0
  40. package/src/core/BleCmdAnalysis/BleCmdDDA4.js +762 -0
  41. package/src/core/BleCmdAnalysis/BleCmdFFAA.js +407 -0
  42. package/src/core/BleCmdAnalysis/BleCmdHVES.js +1222 -0
  43. package/src/core/BleCmdAnalysis/ESHostProtocol.js +829 -0
  44. package/src/core/BleCmdAnalysis/index.js +7 -0
  45. package/src/core/BleCmdAnalysis/readAndSetParam.js +288 -0
  46. package/src/core/BleDataProcess.js +355 -0
  47. package/src/core/OtaUpgrade.js +338 -0
  48. package/src/core/TelinkApi.js +73 -0
  49. package/src/core/Transfer.js +516 -0
  50. package/src/core/array.js +10 -0
  51. package/src/core/commonfun.js +87 -0
  52. package/src/core/dataJson/baseParamsJson.js +754 -0
  53. package/src/core/dataJson/index.js +1 -0
  54. package/src/core/keyAndPwdManager.js +346 -0
  55. package/src/core/mqttServer.js +296 -0
  56. package/src/core/rsaEncrypt.js +45 -0
  57. package/src/index.js +11 -0
@@ -0,0 +1,407 @@
1
+ import { getData } from './BleCmdAnalysis.js'
2
+ import { string2hexArr, decimalToHex, hex2string, hexArr2string, generateCheckSum, hexArr2Assic, hexToDecimal } from '../BleDataProcess';
3
+ // #region 获取随机数
4
+ /**获取随机数 */
5
+ export const getFFAA17Async = async (deviceId) => {
6
+ const command = ['0xFF', '0xAA', '0x17', '0x00', '0x17'];
7
+ return getData(
8
+ deviceId,
9
+ {
10
+ command,
11
+ commandVerifyHandler: (hexArr) => ({ verified: hexArr[0] == 0xff && hexArr[1] == 0xaa && hexArr[2] == 0x17, pkgLen: hexArr[3] + 5 }),
12
+ pkgVerifyHandler: (pkg) => {
13
+ const _pkg = pkg.map((o) => hex2string(o));
14
+ const len = pkg.length;
15
+ const [c1] = generateCheckSum(_pkg.slice(2, len - 1));
16
+ const _c1 = pkg[len - 1];
17
+ return { verified: c1 == _c1 };
18
+ },
19
+ },
20
+ 'FFAA_17(获取随机数)'
21
+ );
22
+ }
23
+ // #region 发送FFAA指令 appkey相关 密码
24
+ /**发送FFAA指令 appkey相关 密码
25
+ *
26
+ * @param {*} deviceId
27
+ * @param {*} code 指令码
28
+ * @param {*} code '0x19' 广播数据
29
+ * @param {*} code '0x20' 恢复出厂设置
30
+ * @param {*} code '0x1F' 恢复二级密码
31
+ * @param {*} code '0x23' 清除一级密码 content 0x01 / 清除key content 0x02
32
+ * @param {*} code '0x21' 验证appkey
33
+ * @param {*} code '0x22' 启用appkey
34
+ * @param {*} content 指令内容 eg:["0x01"]
35
+ * @param {*} type 指令类型描述 eg:'广播数据'
36
+ * @returns
37
+ */
38
+ export const getFFAAKeyAsync = async (deviceId, code, content, type) => {
39
+ const /*包头*/ header = ['0xff', '0xaa'];
40
+ const /*命令码*/ commandCode = [code];
41
+ const /*数据内容*/ data = [...content];
42
+ const /*数据内容长度*/ dataLength = [`0x${decimalToHex(data.length, 2)}`];
43
+ const /*校验位(指令+长度+数据位)*/ check = generateCheckSum([...commandCode, ...dataLength, ...data]);
44
+ // 包头-命令码-数据内容长度-数据内容-校验位
45
+ const command = [...header, ...commandCode, ...dataLength, ...data, ...check];
46
+ console.log('command: ---------------', command);
47
+
48
+ return getData(
49
+ deviceId,
50
+ {
51
+ command,
52
+ commandVerifyHandler: (hexArr) => ({ verified: hexArr[0] == 0xff && hexArr[1] == 0xaa && hexArr[2] == hexToDecimal(code), pkgLen: hexArr[3] + 5 }),
53
+ pkgVerifyHandler: (pkg) => {
54
+ const _pkg = pkg.map((o) => hex2string(o));
55
+ const len = pkg.length;
56
+ const [c1] = generateCheckSum(_pkg.slice(2, len - 1));
57
+ const _c1 = pkg[len - 1];
58
+ return { verified: c1 == _c1 };
59
+ },
60
+ },
61
+ `FFAA_${code}(${type})`
62
+ );
63
+ }
64
+ // #region 解析FFAAKey指令响应
65
+ /** 解析FFAAKey指令响应
66
+ *
67
+ * @param {*} data
68
+ * @returns */
69
+ export const resolveFFAAKey = (data) => {
70
+ if (!data) return null;
71
+ const dataStr = hexArr2string(data);
72
+ const response = data[data.length - 2]
73
+ const status = response
74
+ return { data, dataStr, response, status };
75
+ }
76
+ // #region 恢复出厂设置
77
+ /**
78
+ * 恢复出厂设置
79
+ * @param {*} deviceId
80
+ * @returns hex []
81
+ */
82
+ export const resetFactoryData = async (deviceId) => {
83
+ return getFFAAKeyAsync(deviceId, '0x20', ['0x01'], '恢复出厂设置');
84
+ }
85
+ // #region 恢复二级密码
86
+ /**
87
+ * 恢复二级密码
88
+ * @param {*} deviceId
89
+ * @returns hex []
90
+ */
91
+ export const resetSecondaryKey = async (deviceId) => {
92
+ return getFFAAKeyAsync(deviceId, '0x1F', ['0x01'], '恢复二级密码');
93
+ }
94
+ // #region 清除一级密码
95
+ /**
96
+ * 清除一级密码
97
+ * @param {*} deviceId
98
+ * @returns hex []
99
+ */
100
+ export const clearPrimaryKey = async (deviceId) => {
101
+ return getFFAAKeyAsync(deviceId, '0x23', ['0x01'], '清除一级密码');
102
+ }
103
+
104
+ /**读取蓝牙名称 */
105
+ export const getBluetoothName = async (deviceId) => {
106
+ const hex = await getFFAAKeyAsync(deviceId, '0x06', [], '蓝牙名称');
107
+ let name = ''
108
+ if (hex && hex[2] == 0x06) {
109
+ let arr = hex.slice(4, -1);
110
+ if (arr.length == 0) return '';
111
+ name = String.fromCharCode(...arr);
112
+ }
113
+ return name;
114
+ }
115
+ /**写蓝牙名称
116
+ * @param {*} deviceId 设备id
117
+ * @param {*} value 蓝牙名称
118
+ * @returns boolean 是否成功
119
+ */
120
+ export const setBluetoothName = async (deviceId, value) => {
121
+ const content = string2hexArr(value).map((o) => `0x${o}`);
122
+ const hex = await getFFAAKeyAsync(deviceId, '0x07', content, '蓝牙名称');
123
+ let name = ''
124
+ if (hex && hex[2] == 0x07) {
125
+ return true
126
+ }
127
+ throw new Error('设置蓝牙名称失败');
128
+ }
129
+
130
+ // #region 获取广播数据
131
+ /**
132
+ * 获取广播数据
133
+ * @param {*} deviceId
134
+ * @returns hex []
135
+ */
136
+ export const getBroadcastDataCmd = async (deviceId) => {
137
+ return getFFAAKeyAsync(deviceId, '0x19', ['0x01'], '广播数据');
138
+ }
139
+ // #region AT指令(FFAA80)
140
+ /** AT指令(FFAA80)
141
+ *
142
+ * @param {*} deviceId
143
+ * @param {*} ATStr eg: 'at^wifimode?'
144
+ * @returns
145
+ */
146
+ export const getFFAA80Async = async (deviceId, ATStr) => {
147
+ const /*包头*/ header = ['0xff', '0xaa'];
148
+ const /*命令码*/ commandCode = ['0x80'];
149
+ const /*数据内容*/ data = string2hexArr(ATStr).map((o) => `0x${o}`);
150
+ const /*数据内容长度*/ dataLength = [`0x${decimalToHex(data.length, 2)}`];
151
+ const /*校验位(指令+长度+数据位)*/ check = generateCheckSum([...commandCode, ...dataLength, ...data], false);
152
+ // 包头-命令码-数据内容长度-数据内容-校验位
153
+ const command = [...header, ...commandCode, ...dataLength, ...data, ...check];
154
+ const response = 'FFAA802D41545E56455253494F4E3F0D0A0D0A5E56455253494F4E3A204A42442E425730332E30312E3030360A4F4B0D0A19';
155
+
156
+ const hex = await getData(
157
+ deviceId,
158
+ {
159
+ command,
160
+ commandVerifyHandler: (hexArr) => ({ verified: hexArr[0] == 0xff && hexArr[1] == 0xaa && hexArr[2] == 0x80, pkgLen: hexArr[3] + 5 }),
161
+ pkgVerifyHandler: (pkg) => {
162
+ const _pkg = pkg.map((o) => hex2string(o));
163
+ const len = pkg.length;
164
+ const [c1] = generateCheckSum(_pkg.slice(2, len - 1));
165
+ const _c1 = pkg[len - 1];
166
+ return { verified: c1 == _c1 };
167
+ },
168
+ },
169
+ 'FFAA_80(AT)'
170
+ );
171
+ if(!hex) return null;
172
+ return resolveFFAA80(hex);
173
+ }
174
+ // #region 解析AT指令响应
175
+ /** 解析AT指令响应
176
+ *
177
+ * @param {*} data
178
+ * @returns
179
+ */
180
+ export const resolveFFAA80 = (data) => {
181
+ if (!data) return null;
182
+ const dataStr = hexArr2string(data);
183
+ const status = data[data.length - 2];
184
+ const response = hexArr2Assic(data.slice(4, -1));
185
+ // const response= "AT^VERSION?\r\n\r\n^VERSION: JBD.BW03.01.006\nOK\r\n"
186
+ const moduleVersion = response.replace(/\r|\n|\s+|\OK/g, '').split(':')[1] ?? '';
187
+ return { dataStr, status, response, moduleVersion };
188
+ }
189
+ // #region 通用FFAA
190
+ /**通用FFAA
191
+ * 方案指令执行(FFAA)
192
+ * @param {*} deviceId
193
+ * @param {*} command
194
+ * @returns
195
+ */
196
+ export const set_PlanCMD_FFAA = async (deviceId, command) => {
197
+ if (typeof command == 'string') {
198
+ command = command.match(/(.{2})/g).map((o) => `0x${o}`);
199
+ }
200
+ let result = null;
201
+ try {
202
+ const data = await getData(
203
+ deviceId,
204
+ {
205
+ command,
206
+ commandVerifyHandler: (hexArr) => ({ verified: hexArr[0] == 0xff && hexArr[1] == 0xaa && hexArr[2] == command[2], pkgLen: hexArr[3] + 5 }),
207
+ pkgVerifyHandler: (pkg) => {
208
+ const _pkg = pkg.map((o) => hex2string(o));
209
+ const len = pkg.length;
210
+ const [c1] = generateCheckSum(_pkg.slice(2, len - 1));
211
+ const _c1 = pkg[len - 1];
212
+ return { verified: c1 == _c1 };
213
+ },
214
+ },
215
+ '通用CMD_FFAA'
216
+ );
217
+ if (data) {
218
+ result = resolveFFAAKey(data);
219
+ }
220
+ } catch (error) {
221
+ console.error(error);
222
+ }
223
+ return result;
224
+ }
225
+ // #region 方案指令执行(FFAA80-AT)
226
+ /**方案指令执行(FFAA80-AT)
227
+ * @param {*} deviceId
228
+ * @param {*} ATStr
229
+ * @returns
230
+ */
231
+ export const set_PlanCMD_FFAA80 = async (deviceId, ATStr) => {
232
+ let data = null;
233
+ try {
234
+ if (ATStr.slice(0, 11).toUpperCase() == 'AT^WIFISTA=') {
235
+ const [v0, v1] = ATStr.split('=');
236
+ const [rssi, pwd] = v1.split(',');
237
+ data = await setWiFi(deviceId, rssi, pwd);
238
+ console.warn('WiFi_STA', data);
239
+ } else {
240
+ const hex = await getFFAA80Async(deviceId, ATStr);
241
+ data = resolveFFAA80(hex);
242
+ }
243
+ } catch (error) { }
244
+
245
+ return data;
246
+ }
247
+ // #region 设备配置WiFi
248
+ /**设备配置WiFi */
249
+ export const setWiFiSta = async (deviceId, rssi, pwd) => {
250
+ const str = `AT^WIFISTA=${rssi},${pwd}`;
251
+ try {
252
+ const hex = await getFFAA80Async(deviceId, str, 'WiFi_STA');
253
+ const data = resolveFFAA80(hex);
254
+ return data;
255
+ // return data&& data?.response?.includes('OK');
256
+ } catch (error) { }
257
+ return false;
258
+ }
259
+ // #region 查询WiFi IP
260
+ /**查询WiFi IP */
261
+ export const getWiFiIP = async (deviceId) => {
262
+ return new Promise(async (r, j) => {
263
+ try {
264
+ const str = 'AT^WIFISTA_IP?';
265
+ const hex = await getFFAA80Async(deviceId, str, 'WiFi_IP');
266
+ const data = resolveFFAA80(hex);
267
+ const ok = data && data?.response?.includes('OK') && data?.response?.includes(str) && !data?.response?.includes('ip:0.0.0.0');
268
+ if (ok) r(data);
269
+ else j(data);
270
+ } catch (error) {
271
+ j(error);
272
+ }
273
+ });
274
+ }
275
+ export const setWiFi = async (deviceId, rssi, pwd) => {
276
+ let data = null;
277
+ try {
278
+ const ok = await setWiFiSta(deviceId, rssi, pwd);
279
+ data = ok;
280
+ // if (ok) {
281
+ // data = await runWithLimitedTimeout(() => getWiFiIP(deviceId), { retryDelay: 1500, debug, retryTimeout: 30000 });
282
+ // }
283
+ } catch (error) { }
284
+ return data;
285
+ }
286
+ // #region ====LCD屏 ======
287
+
288
+
289
+
290
+
291
+
292
+
293
+ // #region 查询配对mac地址
294
+ /** 查询配对mac地址(FFAA25)
295
+ *
296
+ * eg:LCD屏
297
+ * @param {*} deviceId
298
+ * @returns
299
+ */
300
+ export const getFFAA25Async = async (deviceId) => {
301
+ const /*包头*/ header = ['0xff', '0xaa'];
302
+ const /*命令码*/ commandCode = ['0x25'];
303
+ const /*数据内容*/ data = [];
304
+ const /*数据内容长度*/ dataLength = [`0x${decimalToHex(data.length, 2)}`];
305
+ const /*校验位(指令+长度+数据位)*/ check = generateCheckSum([...commandCode, ...dataLength, ...data], false);
306
+ // 包头-命令码-数据内容长度-数据内容-校验位
307
+ const command = [...header, ...commandCode, ...dataLength, ...data, ...check];
308
+
309
+ return getData(
310
+ deviceId,
311
+ {
312
+ command,
313
+ commandVerifyHandler: (hexArr) => ({ verified: hexArr[0] == 0xff && hexArr[1] == 0xaa && hexArr[2] == 0x25, pkgLen: hexArr[3] + 5 }),
314
+ pkgVerifyHandler: (pkg) => {
315
+ const _pkg = pkg.map((o) => hex2string(o));
316
+ const len = pkg.length;
317
+ const [c1] = generateCheckSum(_pkg.slice(2, len - 1));
318
+ const _c1 = pkg[len - 1];
319
+ return { verified: c1 == _c1 };
320
+ },
321
+ },
322
+ 'FFAA_25(LCD屏查询配对mac)'
323
+ );
324
+ }
325
+ /** 解析FFAA25查询配对mac地址指令响应
326
+ *
327
+ * @param {*} data
328
+ * @returns
329
+ */
330
+ export const resolveFFAA25 = (data) => {
331
+ if (!data) return null;
332
+ // FFAA25 07 AAC237000569 04 41
333
+ const dataStr = hexArr2string(data);
334
+ const response = dataStr.slice(8, -2);
335
+ const arr = response.match(/(.{2})/g);
336
+ const state = arr.pop();
337
+ const macAddr = arr.join(':');
338
+ // 0: 未连接 1: UART连接BMS 2: CAN连接BMS 4: 蓝牙连接BMS
339
+ return { dataStr, response, macAddr, state, isConnected: state != 0 };
340
+ }
341
+ // #region 设置配对mac地址
342
+ /** 设置配对mac地址(FFAA26)
343
+ *
344
+ * @param {*} deviceId
345
+ * @param {*} macAddrArr
346
+ * @returns
347
+ */
348
+ export const getFFAA26Async = async (deviceId, macAddrArr) => {
349
+ const /*包头*/ header = ['0xff', '0xaa'];
350
+ const /*命令码*/ commandCode = ['0x26'];
351
+ const /*数据内容*/ data = [...macAddrArr];
352
+ const /*数据内容长度*/ dataLength = [`0x${decimalToHex(data.length, 2)}`];
353
+ const /*校验位(指令+长度+数据位)*/ check = generateCheckSum([...commandCode, ...dataLength, ...data], false);
354
+ // 包头-命令码-数据内容长度-数据内容-校验位
355
+ const command = [...header, ...commandCode, ...dataLength, ...data, ...check];
356
+
357
+ return getData(
358
+ deviceId,
359
+ {
360
+ command,
361
+ commandVerifyHandler: (hexArr) => ({ verified: hexArr[0] == 0xff && hexArr[1] == 0xaa && hexArr[2] == 0x26, pkgLen: hexArr[3] + 5 }),
362
+ pkgVerifyHandler: (pkg) => {
363
+ const _pkg = pkg.map((o) => hex2string(o));
364
+ const len = pkg.length;
365
+ const [c1] = generateCheckSum(_pkg.slice(2, len - 1));
366
+ const _c1 = pkg[len - 1];
367
+ return { verified: c1 == _c1 };
368
+ },
369
+ },
370
+ 'FFAA_26(LCD屏设置配对mac)'
371
+ );
372
+ }
373
+ // #region 解析FFAA26设置配对mac地址指令响应
374
+ /** 解析FFAA26设置配对mac地址指令响应
375
+ *
376
+ * @param {*} data
377
+ * @returns
378
+ */
379
+ export const resolveFFAA26 = (data) => {
380
+ if (!data) return null;
381
+ // FFAA 26 00 26
382
+ const dataStr = hexArr2string(data);
383
+ const response = dataStr.slice(6, -2);
384
+
385
+ const result = response == 0; // 0:成功 1:失败
386
+ return { dataStr, response, result };
387
+ }
388
+ // #region 模块复位
389
+ /**模块复位 */
390
+ export const getFFAA03Async = async (deviceId) => {
391
+ const command = ['0xFF', '0xAA', '0x03', '0x00', '0x03'];
392
+ return getData(
393
+ deviceId,
394
+ {
395
+ command,
396
+ commandVerifyHandler: (hexArr) => ({ verified: hexArr[0] == 0xff && hexArr[1] == 0xaa && hexArr[2] == 0x03, pkgLen: hexArr[3] + 5 }),
397
+ pkgVerifyHandler: (pkg) => {
398
+ const _pkg = pkg.map((o) => hex2string(o));
399
+ const len = pkg.length;
400
+ const [c1] = generateCheckSum(_pkg.slice(2, len - 1));
401
+ const _c1 = pkg[len - 1];
402
+ return { verified: c1 == _c1 };
403
+ },
404
+ },
405
+ 'FFAA_03(模块复位)'
406
+ );
407
+ }