From 568480cfab8ebea1d25bb182b740e6957e0e5a73 Mon Sep 17 00:00:00 2001
From: chenyc <501753378@qq.com>
Date: 星期二, 03 十二月 2024 10:25:07 +0800
Subject: [PATCH] 优化

---
 electron/main/deviceClientSocket.ts |   52 ++++++++++++++++++++++++++++++++++++----------------
 1 files changed, 36 insertions(+), 16 deletions(-)

diff --git a/electron/main/deviceClientSocket.ts b/electron/main/deviceClientSocket.ts
index 81a409e..940cfb0 100644
--- a/electron/main/deviceClientSocket.ts
+++ b/electron/main/deviceClientSocket.ts
@@ -140,28 +140,27 @@
     if (!this.client.destroyed) {
       // 原始字符串
       const originalString = str;
-      // 将字符串转换为 Buffer
-      const buffer = Buffer.from(originalString);
-      console.log(buffer)
-      console.log(buffer.length)
-      // 获取校验码
-      const checksum = calculateChecksum2(buffer);
-      // 将校验码转换为两位十六进制字符串
-      const checksumHex = checksum.toString(16).padStart(2, '0').toUpperCase();
-      // 输出结果
-      console.log(`Checksum (Hexadecimal): ${checksumHex}`);
-      // 将校验码追加到原始 Buffer
-      const zuijia = Buffer.concat([buffer, Buffer.from([checksum])]);
-      console.log('----')
-      console.log(zuijia[0], zuijia[zuijia.length - 1])
-      console.log('33333')
+      // 计算CRC-16校验码
+      const crcResult = crc16(originalString);
+      // 将结果转换为字节数组
+      const crcBytes = [
+        (crcResult >> 8) & 0xFF, // 高字节
+        crcResult & 0xFF         // 低字节
+      ];
+      // 创建包含校验码的数据包(先转换为Buffer)
+      const messageBuffer = Buffer.concat([
+        Buffer.from(originalString), // 原始数据部分
+        Buffer.from(crcBytes),     // CRC校验码部分
+        Buffer.from([0x0D,0x0A])
+      ]);
+      console.log('ping hao d jiao yan ma',messageBuffer.length)
       if( this.waitingForAck){
         console.log('londion-------zhong')
         const listData = { ip: this.host, prot: this.port, data: '正在等待应答中,会自动尝试10秒后发送' }
         fanhuiCommLog(listData)
       }else{
         console.log('fa song xue ya shu ju ')
-        this.sendAndAwaitAck(zuijia)
+        this.sendAndAwaitAck(messageBuffer)
       }
     } else {
       return
@@ -340,6 +339,27 @@
   // 如果需要,可以对 sum 取模以适应单个字节
   return sum & 0xFF;
 }
+/**
+ * CRC-16-CCITT(多项式 0x1021)来计算校验码。
+ */
+function crc16(data) {
+  let crc = 0xFFFF; // 初始值
+  let polynomial = 0x1021; // 使用的多项式
+  for (let i = 0; i < data.length; i++) {
+      let byte = data.charCodeAt(i);
+      crc ^= byte << 8;
+      for (let j = 0; j < 8; j++) {
+          if ((crc & 0x8000) > 0) {
+              crc = (crc << 1) ^ polynomial;
+          } else {
+              crc = crc << 1;
+          }
+      }
+      crc &= 0xFFFF; // 确保结果为16位
+  }
+
+  return crc >>> 0; // 转换为无符号整数
+}
 /**解析数据1 */
 function parseData(buf: Uint8Array, index1: number, index2: number, index3: number, index4: number): number {
   let data5: number = (buf[index1] << 24) | (buf[index2] << 16) | (buf[index3] << 8) | buf[index4];

--
Gitblit v1.8.0