@jiabaida/tools 1.0.0 → 1.0.1
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/core/BleApiManager.js +1 -1
- package/dist/cjs/core/BleCmdAnalysis/BaseParamProtocol.js +1 -0
- package/dist/cjs/core/BleCmdAnalysis/BleCmdAnalysis.js +1 -0
- package/dist/cjs/core/BleCmdAnalysis/BleCmdDD.js +1 -0
- package/dist/cjs/core/BleCmdAnalysis/BleCmdFFAA.js +1 -0
- package/dist/cjs/core/BleCmdAnalysis/BleCmdHVES.js +1 -0
- package/dist/cjs/core/BleCmdAnalysis/ESHostProtocol.js +1 -0
- package/dist/cjs/core/BleCmdAnalysis/readAndSetParam.js +1 -0
- package/dist/cjs/core/BleCmdAnalysis.js +1 -0
- package/dist/cjs/core/BleDataProcess.js +1 -0
- package/dist/cjs/core/OtaUpgrade.js +1 -0
- package/dist/cjs/core/TelinkApi.js +1 -0
- package/dist/cjs/core/Transfer.js +1 -0
- package/dist/cjs/core/commonfun.js +1 -1
- package/dist/cjs/core/dataJson/baseParamsJson.js +1 -0
- package/dist/cjs/core/keyAndPwdManager.js +1 -0
- package/dist/cjs/index.js +1 -1
- package/dist/esm/core/BleApiManager.js +1 -1
- package/dist/esm/core/BleCmdAnalysis/BaseParamProtocol.js +1 -0
- package/dist/esm/core/BleCmdAnalysis/BleCmdAnalysis.js +1 -0
- package/dist/esm/core/BleCmdAnalysis/BleCmdDD.js +1 -0
- package/dist/esm/core/BleCmdAnalysis/BleCmdFFAA.js +1 -0
- package/dist/esm/core/BleCmdAnalysis/BleCmdHVES.js +1 -0
- package/dist/esm/core/BleCmdAnalysis/ESHostProtocol.js +1 -0
- package/dist/esm/core/BleCmdAnalysis/readAndSetParam.js +1 -0
- package/dist/esm/core/BleCmdAnalysis.js +1 -0
- package/dist/esm/core/BleDataProcess.js +1 -0
- package/dist/esm/core/OtaUpgrade.js +1 -0
- package/dist/esm/core/TelinkApi.js +1 -0
- package/dist/esm/core/Transfer.js +1 -0
- package/dist/esm/core/commonfun.js +1 -1
- package/dist/esm/core/dataJson/baseParamsJson.js +1 -0
- package/dist/esm/core/keyAndPwdManager.js +1 -0
- package/dist/esm/index.js +1 -1
- package/package.json +13 -3
- package/src/core/BleApiManager.js +487 -0
- package/src/core/BleCmdAnalysis/BaseParamProtocol.js +651 -0
- package/src/core/BleCmdAnalysis/BleCmdAnalysis.js +220 -0
- package/src/core/BleCmdAnalysis/BleCmdDD.js +1214 -0
- package/src/core/BleCmdAnalysis/BleCmdDDA4.js +762 -0
- package/src/core/BleCmdAnalysis/BleCmdFFAA.js +407 -0
- package/src/core/BleCmdAnalysis/BleCmdHVES.js +1222 -0
- package/src/core/BleCmdAnalysis/ESHostProtocol.js +829 -0
- package/src/core/BleCmdAnalysis/index.js +7 -0
- package/src/core/BleCmdAnalysis/readAndSetParam.js +288 -0
- package/src/core/BleDataProcess.js +355 -0
- package/src/core/OtaUpgrade.js +338 -0
- package/src/core/TelinkApi.js +73 -0
- package/src/core/Transfer.js +516 -0
- package/src/core/array.js +10 -0
- package/src/core/commonfun.js +84 -0
- package/src/core/dataJson/baseParamsJson.js +754 -0
- package/src/core/dataJson/index.js +1 -0
- package/src/core/keyAndPwdManager.js +346 -0
- package/src/core/mqttServer.js +296 -0
- package/src/core/rsaEncrypt.js +45 -0
- package/src/index.js +11 -0
|
@@ -0,0 +1,220 @@
|
|
|
1
|
+
import { hexArr2ab, ab2decimalArr, hexArr2string, sleep } from '../BleDataProcess';
|
|
2
|
+
import { getOS, eventBus } from '../commonfun';
|
|
3
|
+
|
|
4
|
+
const BLE_RESPONSE_TIMEOUT = 300; // 蓝牙指令响应超时
|
|
5
|
+
const STORE_MUTATION_NAME = 'setBleChangedCharacteristicValue';
|
|
6
|
+
const serviceId = '0000FF00-0000-1000-8000-00805F9B34FB';
|
|
7
|
+
const UUID_READ = '0000FF01-0000-1000-8000-00805F9B34FB';
|
|
8
|
+
const characteristicId = '0000FF02-0000-1000-8000-00805F9B34FB';
|
|
9
|
+
// #region 发送写入指令
|
|
10
|
+
/** 向蓝牙设备写入特征值 发送指令
|
|
11
|
+
* @param {string} deviceId - 设备ID
|
|
12
|
+
* @param {ArrayBuffer} value - 要写入的值
|
|
13
|
+
* @returns {Promise<boolean>} - 返回写入结果
|
|
14
|
+
*/
|
|
15
|
+
async function _writeAsync(deviceId, value) {
|
|
16
|
+
console.log('deviceId, value: ', deviceId, value);
|
|
17
|
+
if (!deviceId || !value) return false;
|
|
18
|
+
return new Promise((resolve) => {
|
|
19
|
+
const { isAndroid, isIOS } = getOS();
|
|
20
|
+
console.log('isAndroid, isIOS: ', isAndroid, isIOS);
|
|
21
|
+
const writeType = isAndroid ? 'writeNoResponse' : 'write';
|
|
22
|
+
uni.writeBLECharacteristicValue({
|
|
23
|
+
deviceId,
|
|
24
|
+
serviceId,
|
|
25
|
+
characteristicId,
|
|
26
|
+
writeType,
|
|
27
|
+
value,
|
|
28
|
+
success: (res) => {
|
|
29
|
+
console.error('res: 写入成功', res);
|
|
30
|
+
resolve(true)
|
|
31
|
+
},
|
|
32
|
+
fail: (e) => {
|
|
33
|
+
console.error('写入失败', e);
|
|
34
|
+
resolve(false);
|
|
35
|
+
},
|
|
36
|
+
});
|
|
37
|
+
if (isIOS) setTimeout(() => resolve(true), 50);
|
|
38
|
+
//安卓偶尔会无回复 暂不明原因
|
|
39
|
+
// setTimeout(() => resolve(true), 50);
|
|
40
|
+
});
|
|
41
|
+
}
|
|
42
|
+
// #region 分包处理
|
|
43
|
+
/**
|
|
44
|
+
* 向蓝牙设备写入特征值 分包处理
|
|
45
|
+
* @param {string} deviceId - 设备ID
|
|
46
|
+
* @param {ArrayBuffer} value - 要写入的值
|
|
47
|
+
* @returns {Promise<boolean>} - 返回写入结果
|
|
48
|
+
*/
|
|
49
|
+
async function writeAsync(deviceId, value) {
|
|
50
|
+
console.log('value: ', value);
|
|
51
|
+
console.log('deviceId: ', deviceId);
|
|
52
|
+
if (!deviceId || !value) return false;
|
|
53
|
+
return new Promise(async (resolve) => {
|
|
54
|
+
const n = Math.ceil(value.byteLength / 20);
|
|
55
|
+
let res;
|
|
56
|
+
for (let i = 0; i < n; i++) {
|
|
57
|
+
const _value = value.slice(i * 20, (i + 1) * 20);
|
|
58
|
+
console.log('分包写入_value: ', _value);
|
|
59
|
+
await sleep(150);
|
|
60
|
+
res = await _writeAsync(deviceId, _value);
|
|
61
|
+
console.log(`分包写入结果 ${i + 1}/${n} : ${res}`);
|
|
62
|
+
if (!res) {
|
|
63
|
+
return resolve(false);
|
|
64
|
+
}
|
|
65
|
+
}
|
|
66
|
+
resolve(res);
|
|
67
|
+
});
|
|
68
|
+
}
|
|
69
|
+
// #region 蓝牙命令发送与数据接收处理
|
|
70
|
+
/**
|
|
71
|
+
* 蓝牙命令发送与数据接收处理
|
|
72
|
+
* @param {string} deviceId - 设备ID
|
|
73
|
+
* @param {Object} options - 配置选项
|
|
74
|
+
* @param {string} tag - 日志标签
|
|
75
|
+
* @returns {Promise<Array|null>} - 返回接收到的数据包或null
|
|
76
|
+
*/
|
|
77
|
+
export const getData = async (deviceId, {
|
|
78
|
+
command,
|
|
79
|
+
commandVerifyHandler = (hexArr) => ({ verified: false, pkgLen: null }),
|
|
80
|
+
pkgVerifyHandler = (pkg) => ({ verified: false }),
|
|
81
|
+
maxRetries = 2, // 最大写入次数
|
|
82
|
+
retryInterval = BLE_RESPONSE_TIMEOUT // 重试间隔
|
|
83
|
+
}, tag = '') => {
|
|
84
|
+
// 参数验证(提前失败)
|
|
85
|
+
if (!deviceId) throw new Error('deviceId is required');
|
|
86
|
+
if (!command || command.length <= 0) throw new Error('command is required');
|
|
87
|
+
|
|
88
|
+
return new Promise((resolve, reject) => {
|
|
89
|
+
let isCompleted = false;
|
|
90
|
+
let timeoutId = null;
|
|
91
|
+
let responsed = false;
|
|
92
|
+
let len = null;
|
|
93
|
+
let pkg = [];
|
|
94
|
+
const cmdContent = hexArr2ab(command);
|
|
95
|
+
|
|
96
|
+
// 清理函数 - 确保资源正确释放
|
|
97
|
+
const cleanup = () => {
|
|
98
|
+
if (isCompleted) return;
|
|
99
|
+
isCompleted = true;
|
|
100
|
+
clearTimeout(timeoutId);
|
|
101
|
+
eventBus.off(STORE_MUTATION_NAME, dataHandler);
|
|
102
|
+
};
|
|
103
|
+
|
|
104
|
+
// 数据处理函数
|
|
105
|
+
const dataHandler = (payload) => {
|
|
106
|
+
if (!payload || payload.deviceId !== deviceId || !payload.value) return;
|
|
107
|
+
|
|
108
|
+
const hexArr = ab2decimalArr(payload.value);
|
|
109
|
+
console.log('hexArr: ', hexArr);
|
|
110
|
+
console.warn(tag, '接收到数据:', hexArr2string(hexArr));
|
|
111
|
+
|
|
112
|
+
if (hexArr.length === 0) return;
|
|
113
|
+
|
|
114
|
+
// 首次验证指令包长度
|
|
115
|
+
if (len === null) {
|
|
116
|
+
const { verified, pkgLen } = commandVerifyHandler(hexArr);
|
|
117
|
+
console.log('指令验证结果:', { verified, pkgLen });
|
|
118
|
+
if (verified) len = pkgLen;
|
|
119
|
+
}
|
|
120
|
+
|
|
121
|
+
// 收集并验证数据包
|
|
122
|
+
if (len) {
|
|
123
|
+
pkg = [...pkg, ...hexArr];
|
|
124
|
+
console.log('当前数据包:', pkg, `长度: ${pkg.length}/${len}`);
|
|
125
|
+
|
|
126
|
+
if (pkg.length >= len) {
|
|
127
|
+
// 截取正确长度的数据
|
|
128
|
+
pkg = pkg.slice(0, len);
|
|
129
|
+
const { verified } = pkgVerifyHandler(pkg);
|
|
130
|
+
console.log('数据包验证结果:', { verified });
|
|
131
|
+
|
|
132
|
+
if (verified) {
|
|
133
|
+
responsed = true;
|
|
134
|
+
cleanup();
|
|
135
|
+
resolve([...pkg]);
|
|
136
|
+
} else {
|
|
137
|
+
// 验证失败,重置状态
|
|
138
|
+
len = null;
|
|
139
|
+
pkg = [];
|
|
140
|
+
}
|
|
141
|
+
}
|
|
142
|
+
} else {
|
|
143
|
+
// 未通过指令验证,重置状态
|
|
144
|
+
pkg = [];
|
|
145
|
+
}
|
|
146
|
+
};
|
|
147
|
+
|
|
148
|
+
// 写入设备指令
|
|
149
|
+
const writeToDevice = async (attempt = 1) => {
|
|
150
|
+
try {
|
|
151
|
+
console.warn(tag, `第${attempt}次写入指令:`, command.join('').replace(/0x/g, '').toUpperCase());
|
|
152
|
+
const writeSucceed = await writeAsync(deviceId, cmdContent);
|
|
153
|
+
console.warn(tag, `第${attempt}次写入结果:`, writeSucceed ? '成功' : '失败');
|
|
154
|
+
|
|
155
|
+
if (!writeSucceed) {
|
|
156
|
+
if (attempt < maxRetries) {
|
|
157
|
+
setTimeout(() => writeToDevice(attempt + 1), retryInterval);
|
|
158
|
+
} else {
|
|
159
|
+
cleanup();
|
|
160
|
+
resolve(null);
|
|
161
|
+
}
|
|
162
|
+
return;
|
|
163
|
+
}
|
|
164
|
+
|
|
165
|
+
// 写入成功,等待响应
|
|
166
|
+
await sleep(retryInterval);
|
|
167
|
+
if (!responsed && attempt < maxRetries) {
|
|
168
|
+
console.log(tag, `未收到响应,准备第${attempt + 1}次重试`);
|
|
169
|
+
writeToDevice(attempt + 1);
|
|
170
|
+
} else if (!responsed) {
|
|
171
|
+
console.warn(tag, `达到最大重试次数(${maxRetries}),未收到响应`);
|
|
172
|
+
cleanup();
|
|
173
|
+
resolve(null);
|
|
174
|
+
}
|
|
175
|
+
} catch (error) {
|
|
176
|
+
console.error(tag, '写入过程发生错误:', error);
|
|
177
|
+
cleanup();
|
|
178
|
+
reject(error);
|
|
179
|
+
}
|
|
180
|
+
};
|
|
181
|
+
|
|
182
|
+
// 设置总超时
|
|
183
|
+
timeoutId = setTimeout(() => {
|
|
184
|
+
console.warn(tag, '操作超时');
|
|
185
|
+
cleanup();
|
|
186
|
+
resolve(null);
|
|
187
|
+
}, (maxRetries + 2) * retryInterval);
|
|
188
|
+
|
|
189
|
+
// 订阅数据事件
|
|
190
|
+
eventBus.on(STORE_MUTATION_NAME, dataHandler);
|
|
191
|
+
|
|
192
|
+
// 开始执行写入
|
|
193
|
+
writeToDevice().catch(error => {
|
|
194
|
+
cleanup();
|
|
195
|
+
reject(error);
|
|
196
|
+
});
|
|
197
|
+
});
|
|
198
|
+
}
|
|
199
|
+
// #region 设置Android MTU 最大传输单元
|
|
200
|
+
/** 设置Android MTU
|
|
201
|
+
*
|
|
202
|
+
* @param {*} deviceId
|
|
203
|
+
* @param {*} mtu 要设置的最大传输单元, 默认设置为512
|
|
204
|
+
* @param {*} delay 延迟设置的时间, 默认延迟2500ms
|
|
205
|
+
* @returns
|
|
206
|
+
*/
|
|
207
|
+
export const setMTUAsync = (deviceId, mtu = 512, delay = 2500) => {
|
|
208
|
+
return new Promise((resolve, reject) => {
|
|
209
|
+
try {
|
|
210
|
+
if (getOS().isIOS) return resolve(true);
|
|
211
|
+
setTimeout(async () => {
|
|
212
|
+
await uni.setBLEMTU({ deviceId, mtu });
|
|
213
|
+
resolve(true);
|
|
214
|
+
}, delay);
|
|
215
|
+
} catch (error) {
|
|
216
|
+
console.error(error);
|
|
217
|
+
reject(error);
|
|
218
|
+
}
|
|
219
|
+
});
|
|
220
|
+
}
|