@samlab-corp/sfm-node 0.1.0

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 (75) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +479 -0
  3. package/dist/commands/data.d.ts +29 -0
  4. package/dist/commands/data.d.ts.map +1 -0
  5. package/dist/commands/data.js +176 -0
  6. package/dist/commands/data.js.map +1 -0
  7. package/dist/commands/fingerprint.d.ts +132 -0
  8. package/dist/commands/fingerprint.d.ts.map +1 -0
  9. package/dist/commands/fingerprint.js +580 -0
  10. package/dist/commands/fingerprint.js.map +1 -0
  11. package/dist/commands/firmware.d.ts +37 -0
  12. package/dist/commands/firmware.d.ts.map +1 -0
  13. package/dist/commands/firmware.js +152 -0
  14. package/dist/commands/firmware.js.map +1 -0
  15. package/dist/commands/freescan.d.ts +68 -0
  16. package/dist/commands/freescan.d.ts.map +1 -0
  17. package/dist/commands/freescan.js +202 -0
  18. package/dist/commands/freescan.js.map +1 -0
  19. package/dist/commands/index.d.ts +88 -0
  20. package/dist/commands/index.d.ts.map +1 -0
  21. package/dist/commands/index.js +104 -0
  22. package/dist/commands/index.js.map +1 -0
  23. package/dist/commands/system.d.ts +82 -0
  24. package/dist/commands/system.d.ts.map +1 -0
  25. package/dist/commands/system.js +191 -0
  26. package/dist/commands/system.js.map +1 -0
  27. package/dist/constants/crypto.d.ts +11 -0
  28. package/dist/constants/crypto.d.ts.map +1 -0
  29. package/dist/constants/crypto.js +10 -0
  30. package/dist/constants/crypto.js.map +1 -0
  31. package/dist/constants/index.d.ts +6 -0
  32. package/dist/constants/index.d.ts.map +1 -0
  33. package/dist/constants/index.js +4 -0
  34. package/dist/constants/index.js.map +1 -0
  35. package/dist/constants/packet.d.ts +17 -0
  36. package/dist/constants/packet.d.ts.map +1 -0
  37. package/dist/constants/packet.js +17 -0
  38. package/dist/constants/packet.js.map +1 -0
  39. package/dist/constants/protocol.d.ts +653 -0
  40. package/dist/constants/protocol.d.ts.map +1 -0
  41. package/dist/constants/protocol.js +422 -0
  42. package/dist/constants/protocol.js.map +1 -0
  43. package/dist/core/client.d.ts +118 -0
  44. package/dist/core/client.d.ts.map +1 -0
  45. package/dist/core/client.js +320 -0
  46. package/dist/core/client.js.map +1 -0
  47. package/dist/core/crypto.d.ts +86 -0
  48. package/dist/core/crypto.d.ts.map +1 -0
  49. package/dist/core/crypto.js +248 -0
  50. package/dist/core/crypto.js.map +1 -0
  51. package/dist/core/errors.d.ts +25 -0
  52. package/dist/core/errors.d.ts.map +1 -0
  53. package/dist/core/errors.js +66 -0
  54. package/dist/core/errors.js.map +1 -0
  55. package/dist/core/index.d.ts +15 -0
  56. package/dist/core/index.d.ts.map +1 -0
  57. package/dist/core/index.js +10 -0
  58. package/dist/core/index.js.map +1 -0
  59. package/dist/core/packet.d.ts +126 -0
  60. package/dist/core/packet.d.ts.map +1 -0
  61. package/dist/core/packet.js +267 -0
  62. package/dist/core/packet.js.map +1 -0
  63. package/dist/core/serial.d.ts +123 -0
  64. package/dist/core/serial.d.ts.map +1 -0
  65. package/dist/core/serial.js +421 -0
  66. package/dist/core/serial.js.map +1 -0
  67. package/dist/core/tcp.d.ts +58 -0
  68. package/dist/core/tcp.d.ts.map +1 -0
  69. package/dist/core/tcp.js +219 -0
  70. package/dist/core/tcp.js.map +1 -0
  71. package/dist/index.d.ts +19 -0
  72. package/dist/index.d.ts.map +1 -0
  73. package/dist/index.js +16 -0
  74. package/dist/index.js.map +1 -0
  75. package/package.json +49 -0
@@ -0,0 +1,422 @@
1
+ /**
2
+ * SFM Protocol Manual V3.6.0
3
+ * 프로토콜 레벨 상수 (에러 코드, 플래그, 명령어, 시스템 파라미터)
4
+ */
5
+ // ─── 에러/응답 코드 (매뉴얼 Section 5.2) ───
6
+ export const SFM_ERROR = {
7
+ SUCCESS: 0x61, // 성공
8
+ SCAN_SUCCESS: 0x62, // 스캔 성공 (중간 응답)
9
+ SCAN_FAIL: 0x63, // 스캔 실패
10
+ NOT_FOUND: 0x69, // 데이터 없음
11
+ NOT_MATCH: 0x6a, // 불일치
12
+ TRY_AGAIN: 0x6b, // 재시도 필요 (이미지 품질 불량 등)
13
+ TIME_OUT: 0x6c, // 시간 초과
14
+ MEM_FULL: 0x6d, // 메모리 가득 참
15
+ EXIST_ID: 0x6e, // 이미 존재하는 ID
16
+ CONTINUE: 0x74, // 데이터 계속 전송 (핑퐁)
17
+ UNSUPPORTED: 0x75, // 지원하지 않는 명령
18
+ };
19
+ // ─── 요청 플래그 (매뉴얼 Section 5.1) ───
20
+ export const SFM_FLAG = {
21
+ NONE: 0x00, // 플래그 없음
22
+ CHECK_ID: 0x70, // ID 중복 확인
23
+ ADD_NEW: 0x71, // 기존 ID에 지문 추가
24
+ AUTO_ID: 0x79, // ID 자동 할당
25
+ CHECK_FINGER: 0x84, // 지문 중복 확인
26
+ };
27
+ // ─── 통신 레벨 에러 (내부 사용) ───
28
+ export const COMM_ERROR = {
29
+ SUCCESS: 0,
30
+ PACKET_FORMAT_ERROR: -3,
31
+ INVALID_PACKET_SIZE: -4,
32
+ WRITE_TIMEOUT: -5,
33
+ READ_TIMEOUT: -6,
34
+ CHECKSUM_MISMATCH: -7,
35
+ PROBE_TIMEOUT: -102,
36
+ MEMORY_ALLOC_FAILED: -200,
37
+ INVALID_FILE_SIZE: -202,
38
+ INVALID_FIRMWARE_HEADER: -203,
39
+ SECURE_PACKET_TIMEOUT: -305,
40
+ SECURE_CODE_MISMATCH: -501,
41
+ };
42
+ // ─── 명령어 코드 (매뉴얼 Section 4) ───
43
+ export const SFM_CMD = {
44
+ // 4.1 시스템 설정 (System Configuration)
45
+ SW: 0x01, // 시스템 파라미터 쓰기
46
+ SF: 0x02, // 시스템 파라미터 저장 (Flash)
47
+ SR: 0x03, // 시스템 파라미터 읽기
48
+ SS: 0x04, // 시스템 상태 확인
49
+ RS: 0xd0, // 모듈 리셋
50
+ SDB: 0xd4, // 데이터베이스 저장 (SFM6000/Slim)
51
+ LDB: 0xd3, // 데이터베이스 로드 (SFM6000/Slim)
52
+ // 4.2 등록 (Enroll)
53
+ ES: 0x05, // 스캔하여 등록
54
+ ESA: 0x70, // 관리자 인증 후 스캔 등록
55
+ EI: 0x06, // 이미지로 등록
56
+ EIX: 0x80, // 이미지로 등록 (확장 프로토콜)
57
+ ET: 0x07, // 템플릿으로 등록
58
+ ETX: 0x87, // 템플릿으로 등록 (확장 프로토콜)
59
+ // 4.3 인증 (Verify - 1:1)
60
+ VS: 0x08, // 스캔하여 검증
61
+ VI: 0x09, // 이미지로 검증
62
+ VIX: 0x82, // 이미지로 검증 (확장 프로토콜)
63
+ VT: 0x10, // 템플릿으로 검증
64
+ VH: 0x22, // 호스트 템플릿으로 스캔 검증
65
+ // 4.4 식별 (Identify - 1:N)
66
+ IS: 0x11, // 스캔하여 식별
67
+ II: 0x12, // 이미지로 식별
68
+ IIX: 0x81, // 이미지로 식별 (확장 프로토콜)
69
+ IT: 0x13, // 템플릿으로 식별
70
+ // 4.5 삭제 (Delete)
71
+ DA: 0x17, // 전체 템플릿 삭제
72
+ DT: 0x16, // 특정 템플릿 삭제
73
+ DS: 0x1e, // 스캔하여 삭제
74
+ // 4.6 템플릿 및 데이터 관리
75
+ LT: 0x18, // 사용자 ID 목록 조회
76
+ LTX: 0x86, // 사용자 ID 목록 조회 (확장)
77
+ RI: 0x20, // 스캔된 이미지 읽기
78
+ RIX: 0x84, // 스캔된 이미지 읽기 (확장)
79
+ SI: 0x15, // 이미지 스캔
80
+ SIX: 0x83, // 이미지 스캔 (확장)
81
+ RT: 0x14, // 템플릿 읽기
82
+ RTX: 0x89, // 템플릿 읽기 (확장)
83
+ ST: 0x21, // 템플릿 스캔 (저장 안 함)
84
+ // 4.7 보안 및 기타
85
+ KW: 0x34, // 암호화 키 쓰기
86
+ AW: 0x65, // 관리자 권한 설정
87
+ AR: 0x66, // 관리자 권한 읽기
88
+ ABL: 0xf3, // 블랙리스트 추가
89
+ DBL: 0xf4, // 블랙리스트 삭제
90
+ PKE: 0x2a, // 공개 키 교환 (SFM6000/Slim)
91
+ };
92
+ // ─── 시스템 파라미터 (ID + Alias 매핑, 매뉴얼 Section 3) ───
93
+ export const SFM_PARAM = {
94
+ /** 입력 대기 시간 */
95
+ TIMEOUT: {
96
+ id: 0x62,
97
+ options: [
98
+ { value: 0x30, alias: "INFINITE" },
99
+ { value: 0x31, alias: "1S" },
100
+ { value: 0x32, alias: "2S" },
101
+ { value: 0x33, alias: "3S" },
102
+ { value: 0x34, alias: "4S" },
103
+ { value: 0x35, alias: "5S" },
104
+ { value: 0x3a, alias: "10S" },
105
+ { value: 0x3f, alias: "15S" },
106
+ { value: 0x44, alias: "20S" },
107
+ ],
108
+ },
109
+ /** 템플릿 크기 */
110
+ TEMPLATE_SIZE: { id: 0x64 },
111
+ /** 등록 모드 */
112
+ ENROLL_MODE: {
113
+ id: 0x65,
114
+ options: [
115
+ { value: 0x30, alias: "SCAN1" },
116
+ { value: 0x31, alias: "SCAN2_MERGE" },
117
+ { value: 0x41, alias: "SCAN2_DUAL" },
118
+ ],
119
+ },
120
+ /** 보안 등급 (FAR) */
121
+ SECURITY_LEVEL: {
122
+ id: 0x66,
123
+ options: [
124
+ { value: 0x32, alias: "LOW" },
125
+ { value: 0x33, alias: "NORMAL" },
126
+ { value: 0x34, alias: "HIGH" },
127
+ { value: 0x35, alias: "HIGHEST" },
128
+ { value: 0x50, alias: "AUTO_NORMAL" },
129
+ { value: 0x51, alias: "AUTO_SECURE" },
130
+ { value: 0x52, alias: "AUTO_MORE_SECURE" },
131
+ ],
132
+ },
133
+ /** 암호화 모드 */
134
+ ENCRYPTION_MODE: {
135
+ id: 0x67,
136
+ options: [
137
+ { value: 0x30, alias: "OFF" },
138
+ { value: 0x31, alias: "ON" },
139
+ ],
140
+ },
141
+ /** 센서 타입 */
142
+ SENSOR_TYPE: {
143
+ id: 0x68,
144
+ options: [
145
+ { value: 0x31, alias: "FC" },
146
+ { value: 0x33, alias: "OPTICAL" },
147
+ { value: 0x34, alias: "TC" },
148
+ { value: 0x38, alias: "OC" },
149
+ { value: 0x39, alias: "OL" },
150
+ { value: 0x3b, alias: "FOH02" },
151
+ { value: 0x3c, alias: "TS4" },
152
+ ],
153
+ },
154
+ /** 이미지 전송 포맷 */
155
+ IMAGE_FORMAT: {
156
+ id: 0x6c,
157
+ options: [
158
+ { value: 0x30, alias: "RAW_GRAY" },
159
+ { value: 0x31, alias: "BINARY" },
160
+ { value: 0x32, alias: "GRAY_4BIT" },
161
+ { value: 0x33, alias: "WSQ" },
162
+ ],
163
+ },
164
+ /** 모듈 ID */
165
+ MODULE_ID: { id: 0x6d },
166
+ /** 펌웨어 버전 */
167
+ FIRMWARE_VERSION: { id: 0x6e },
168
+ /** 시리얼 넘버 */
169
+ SERIAL_NUMBER: { id: 0x6f },
170
+ /** 통신 속도 */
171
+ BAUDRATE: {
172
+ id: 0x71,
173
+ options: [
174
+ { value: 0x31, alias: "9600" },
175
+ { value: 0x32, alias: "19200" },
176
+ { value: 0x33, alias: "38400" },
177
+ { value: 0x34, alias: "57600" },
178
+ { value: 0x35, alias: "115200" },
179
+ { value: 0x36, alias: "230400" },
180
+ { value: 0x37, alias: "460800" },
181
+ { value: 0x38, alias: "921600" },
182
+ ],
183
+ },
184
+ /** 보조 통신 속도 */
185
+ BAUDRATE2: { id: 0x72 },
186
+ /** 등록된 지문 수 */
187
+ ENROLLED_FINGER: { id: 0x73 },
188
+ /** 등록 가능한 지문 수 */
189
+ AVAILABLE_FINGER: { id: 0x74 },
190
+ /** SCAN_SUCCESS 응답 전송 */
191
+ SEND_SCAN_SUCCESS: {
192
+ id: 0x75,
193
+ options: [
194
+ { value: 0x30, alias: "OFF" },
195
+ { value: 0x31, alias: "ON" },
196
+ ],
197
+ },
198
+ /** 패킷 교환 형식 */
199
+ ASCII_PACKET: {
200
+ id: 0x76,
201
+ options: [
202
+ { value: 0x30, alias: "HEX" },
203
+ { value: 0x31, alias: "ASCII" },
204
+ ],
205
+ },
206
+ /** 센서 이미지 회전 */
207
+ ROTATE_IMAGE: {
208
+ id: 0x77,
209
+ options: [
210
+ { value: 0x30, alias: "NORMAL" },
211
+ { value: 0x31, alias: "FLIP" },
212
+ ],
213
+ },
214
+ /** 매칭 허용 회전 각도 */
215
+ ROTATION: {
216
+ id: 0x78,
217
+ options: [
218
+ { value: 0x31, alias: "DEG15" },
219
+ { value: 0x32, alias: "DEG30" },
220
+ { value: 0x33, alias: "DEG45" },
221
+ { value: 0x34, alias: "DEG60" },
222
+ { value: 0x35, alias: "DEG75" },
223
+ { value: 0x36, alias: "DEG90" },
224
+ ],
225
+ },
226
+ /** 센서 감도 */
227
+ SENSITIVITY: {
228
+ id: 0x80,
229
+ options: [
230
+ { value: 0x30, alias: "LV0" },
231
+ { value: 0x31, alias: "LV1" },
232
+ { value: 0x32, alias: "LV2" },
233
+ { value: 0x33, alias: "LV3" },
234
+ { value: 0x34, alias: "LV4" },
235
+ { value: 0x35, alias: "LV5" },
236
+ { value: 0x36, alias: "LV6" },
237
+ { value: 0x37, alias: "LV7" },
238
+ ],
239
+ },
240
+ /** 이미지 품질 기준 */
241
+ IMAGE_QUALITY: {
242
+ id: 0x81,
243
+ options: [
244
+ { value: 0x30, alias: "WEAK" },
245
+ { value: 0x31, alias: "MODERATE" },
246
+ { value: 0x32, alias: "STRONG" },
247
+ { value: 0x33, alias: "STRONGEST" },
248
+ ],
249
+ },
250
+ /** GPIO/FreeScan 자동 응답 */
251
+ AUTO_RESPONSE: {
252
+ id: 0x82,
253
+ options: [
254
+ { value: 0x30, alias: "OFF" },
255
+ { value: 0x31, alias: "HOST" },
256
+ { value: 0x32, alias: "AUX" },
257
+ { value: 0x33, alias: "BOTH" },
258
+ ],
259
+ },
260
+ /** 네트워크 통신 모드 */
261
+ NETWORK_MODE: {
262
+ id: 0x83,
263
+ options: [
264
+ { value: 0x30, alias: "SINGLE" },
265
+ { value: 0x31, alias: "NETWORK" },
266
+ ],
267
+ },
268
+ /** 유휴 상태 자동 스캔 */
269
+ FREE_SCAN: {
270
+ id: 0x84,
271
+ options: [
272
+ { value: 0x30, alias: "OFF" },
273
+ { value: 0x32, alias: "ON" },
274
+ ],
275
+ },
276
+ /** 임시 등록 모드 */
277
+ PROVISIONAL_ENROLL: {
278
+ id: 0x85,
279
+ options: [
280
+ { value: 0x30, alias: "PERMANENT" },
281
+ { value: 0x31, alias: "TEMPORARY" },
282
+ ],
283
+ },
284
+ /** DB 비어있을 때 인증 결과 */
285
+ PASS_WHEN_EMPTY: {
286
+ id: 0x86,
287
+ options: [
288
+ { value: 0x30, alias: "FAIL" },
289
+ { value: 0x31, alias: "PASS" },
290
+ ],
291
+ },
292
+ /** 응답 딜레이 */
293
+ RESPONSE_DELAY: {
294
+ id: 0x87,
295
+ options: [
296
+ { value: 0x30, alias: "NONE" },
297
+ { value: 0x31, alias: "20MS" },
298
+ { value: 0x32, alias: "40MS" },
299
+ { value: 0x33, alias: "60MS" },
300
+ { value: 0x34, alias: "80MS" },
301
+ { value: 0x35, alias: "100MS" },
302
+ { value: 0x3a, alias: "200MS" },
303
+ ],
304
+ },
305
+ /** 매칭 타임아웃 */
306
+ MATCHING_TIMEOUT: {
307
+ id: 0x88,
308
+ options: [
309
+ { value: 0x30, alias: "INFINITE" },
310
+ { value: 0x31, alias: "1S" },
311
+ { value: 0x33, alias: "3S" },
312
+ { value: 0x35, alias: "5S" },
313
+ { value: 0x3a, alias: "10S" },
314
+ { value: 0x44, alias: "20S" },
315
+ ],
316
+ },
317
+ /** 빌드 넘버 */
318
+ BUILD_NUMBER: { id: 0x89 },
319
+ /** 등록 시 지문 이동 거리 */
320
+ ENROLL_DISPLACEMENT: {
321
+ id: 0x8a,
322
+ options: [
323
+ { value: 0x30, alias: "NONE" },
324
+ { value: 0x31, alias: "1MM" },
325
+ { value: 0x33, alias: "3MM" },
326
+ { value: 0x35, alias: "5MM" },
327
+ { value: 0x3a, alias: "10MM" },
328
+ ],
329
+ },
330
+ /** 조명 환경 */
331
+ LIGHTING_CONDITION: {
332
+ id: 0x90,
333
+ options: [
334
+ { value: 0x30, alias: "OUTDOOR" },
335
+ { value: 0x31, alias: "INDOOR" },
336
+ ],
337
+ },
338
+ /** Free Scan 연속 인식 딜레이 */
339
+ FREE_SCAN_DELAY: {
340
+ id: 0x91,
341
+ options: [
342
+ { value: 0x30, alias: "NONE" },
343
+ { value: 0x31, alias: "1S" },
344
+ { value: 0x32, alias: "2S" },
345
+ { value: 0x33, alias: "3S" },
346
+ { value: 0x35, alias: "5S" },
347
+ { value: 0x3a, alias: "10S" },
348
+ ],
349
+ },
350
+ /** 1:N 매칭 속도 향상 */
351
+ FAST_MODE: {
352
+ id: 0x93,
353
+ options: [
354
+ { value: 0x30, alias: "OFF" },
355
+ { value: 0x31, alias: "LV1" },
356
+ { value: 0x32, alias: "LV2" },
357
+ { value: 0x33, alias: "LV3" },
358
+ { value: 0x34, alias: "LV4" },
359
+ { value: 0x35, alias: "FASTEST" },
360
+ { value: 0x36, alias: "AUTO" },
361
+ ],
362
+ },
363
+ /** 워치독 타이머 */
364
+ WATCHDOG: {
365
+ id: 0x94,
366
+ options: [
367
+ { value: 0x30, alias: "OFF" },
368
+ { value: 0x31, alias: "ON" },
369
+ ],
370
+ },
371
+ /** 템플릿 타입 */
372
+ TEMPLATE_TYPE: {
373
+ id: 0x96,
374
+ options: [
375
+ { value: 0x30, alias: "SUPREMA" },
376
+ { value: 0x31, alias: "ISO" },
377
+ { value: 0x32, alias: "ANSI" },
378
+ ],
379
+ },
380
+ /** 개인정보 보호 모드 */
381
+ ENHANCED_PRIVACY: {
382
+ id: 0x97,
383
+ options: [
384
+ { value: 0x30, alias: "OFF" },
385
+ { value: 0x31, alias: "ON" },
386
+ ],
387
+ },
388
+ /** 위조 지문 감지 */
389
+ FAKE_FINGER_DETECTION: {
390
+ id: 0x98,
391
+ options: [
392
+ { value: 0x30, alias: "OFF" },
393
+ { value: 0x31, alias: "WEAK" },
394
+ { value: 0x32, alias: "NORMAL" },
395
+ { value: 0x33, alias: "STRONG" },
396
+ ],
397
+ },
398
+ /** 잔류 지문 감지 */
399
+ CHECK_LATENT_FINGERPRINT: {
400
+ id: 0x9a,
401
+ options: [
402
+ { value: 0x30, alias: "ENROLL_ONLY" },
403
+ { value: 0x31, alias: "NEVER" },
404
+ { value: 0x32, alias: "ALWAYS" },
405
+ ],
406
+ },
407
+ /** 전압 경고 임계값 */
408
+ VOLTAGE_WARNING: { id: 0x9b },
409
+ /** 자동 전원 차단 타임아웃 */
410
+ POWER_OFF: { id: 0x9c },
411
+ };
412
+ /** alias 문자열 → hex value 변환 */
413
+ export function resolveParamAlias(key, alias) {
414
+ const def = SFM_PARAM[key];
415
+ const opt = def.options.find((o) => o.alias === alias);
416
+ if (!opt)
417
+ throw new Error(`Unknown alias "${alias}" for param "${key}"`);
418
+ return opt.value;
419
+ }
420
+ // ─── 기타 ───
421
+ export const FIRMWARE_MAGIC = 0x1f2f3f4f;
422
+ //# sourceMappingURL=protocol.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"protocol.js","sourceRoot":"","sources":["../../src/constants/protocol.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,118 @@
1
+ /**
2
+ * SFM Protocol Manual V3.6.0 Serial Communication Client
3
+ *
4
+ * Provides packet protocol, AES256 encryption, multi-packet transfer,
5
+ * and firmware upgrade functionality.
6
+ */
7
+ import { SfmSerial } from "./serial";
8
+ import { SfmCrypto } from "./crypto";
9
+ import type { NormalPacketResult, NetworkPacketResult } from "./packet";
10
+ import type { SecureRecvPacketResult } from "./crypto";
11
+ import type { EncryptionMode } from "../constants";
12
+ type PacketResult = NormalPacketResult | NetworkPacketResult | SecureRecvPacketResult;
13
+ export interface SfmClientOptions {
14
+ portPath?: string;
15
+ baudRate?: number;
16
+ encryptionKey?: Buffer | string;
17
+ iv?: Buffer | string;
18
+ secureCode?: Buffer | string;
19
+ encryptionMode?: EncryptionMode;
20
+ secureMode?: boolean;
21
+ debug?: boolean;
22
+ networkMode?: boolean;
23
+ terminalId?: number;
24
+ hexAsciiMode?: boolean;
25
+ commandTimeout?: number;
26
+ readTimeout?: number;
27
+ autoReconnect?: import("./serial").AutoReconnectOptions;
28
+ }
29
+ /**
30
+ * SFM Unified Client
31
+ */
32
+ export declare class SfmClient {
33
+ serial: SfmSerial;
34
+ crypto: SfmCrypto;
35
+ portPath: string | undefined;
36
+ secureMode: boolean;
37
+ debug: boolean;
38
+ networkMode: boolean;
39
+ terminalId: number;
40
+ hexAsciiMode: boolean;
41
+ commandTimeout: number;
42
+ readTimeout: number;
43
+ private _onDisconnect;
44
+ constructor(options?: SfmClientOptions);
45
+ /** Set disconnect callback */
46
+ setOnDisconnect(callback: ((error?: Error) => void) | null): void;
47
+ /** Set auto-reconnect options (delegates to serial layer) */
48
+ setAutoReconnect(options: import("./serial").AutoReconnectOptions | null): void;
49
+ /** Set auto-reconnect callbacks only */
50
+ setAutoReconnectCallbacks(callbacks: import("./serial").AutoReconnectCallbacks): void;
51
+ /** Whether reconnection is in progress */
52
+ get isReconnecting(): boolean;
53
+ /**
54
+ * Connect to device
55
+ */
56
+ connect(portPath?: string): Promise<void>;
57
+ /**
58
+ * Disconnect from device
59
+ */
60
+ disconnect(): Promise<void>;
61
+ /**
62
+ * Send command (SFM Packet Protocol)
63
+ */
64
+ sendCommand(command: number, param?: number, size?: number, flag?: number): Promise<PacketResult>;
65
+ /**
66
+ * Send network command (15-byte packet, RS422/485)
67
+ */
68
+ sendNetworkCommand(command: number, param?: number, size?: number, flag?: number): Promise<NetworkPacketResult>;
69
+ /**
70
+ * Receive response (used in multi-packet protocol)
71
+ */
72
+ receiveResponse(timeoutMs?: number): Promise<PacketResult>;
73
+ /**
74
+ * Send secure command (AES256 encrypted, 35-byte packet)
75
+ * @internal
76
+ */
77
+ private _sendSecureCommand;
78
+ /**
79
+ * Switch secure mode
80
+ */
81
+ setSecureMode(enabled: boolean, options?: {
82
+ key?: Buffer | string;
83
+ iv?: Buffer | string;
84
+ secureCode?: Buffer | string;
85
+ mode?: EncryptionMode;
86
+ }): void;
87
+ /**
88
+ * Switch network protocol mode (RS422/485)
89
+ */
90
+ setNetworkMode(enabled: boolean, terminalId?: number): void;
91
+ /**
92
+ * Write packet (supports Hex-ASCII mode)
93
+ * @internal
94
+ */
95
+ _writePacket(data: Buffer): Promise<void>;
96
+ /**
97
+ * Read packet (supports Hex-ASCII mode)
98
+ * @internal
99
+ */
100
+ _readPacket(size: number, timeoutMs?: number): Promise<Buffer>;
101
+ /**
102
+ * Read packet after scanning for start byte
103
+ * @internal
104
+ */
105
+ _readWithStartByteScan(packetSize: number, packetType: "normal" | "network" | "secure", timeoutMs?: number): Promise<Buffer>;
106
+ /**
107
+ * Calculate read timeout (based on data size)
108
+ * @internal
109
+ */
110
+ _getReadTimeout(dataSize: number): number;
111
+ /**
112
+ * Calculate write timeout (based on data size)
113
+ * @internal
114
+ */
115
+ _getWriteTimeout(dataSize: number): number;
116
+ }
117
+ export {};
118
+ //# sourceMappingURL=client.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"client.d.ts","sourceRoot":"","sources":["../../src/core/client.ts"],"names":[],"mappings":"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"}