From e491cdb48129752324c4e3764f99bd9203c56dec Mon Sep 17 00:00:00 2001
From: lgq <1015864684@qq.com>
Date: 星期二, 31 三月 2026 09:48:44 +0800
Subject: [PATCH] 1.新增VF205门禁机代码

---
 vf205_access/src/service/uart485Service.js |  190 +++++++++++++++++++++++++++++++++++++++++++++++
 1 files changed, 190 insertions(+), 0 deletions(-)

diff --git a/vf205_access/src/service/uart485Service.js b/vf205_access/src/service/uart485Service.js
new file mode 100644
index 0000000..ade31dc
--- /dev/null
+++ b/vf205_access/src/service/uart485Service.js
@@ -0,0 +1,190 @@
+/**
+ * UART485鏈嶅姟妯″潡
+ * 澶勭悊UART485閫氫俊鐩稿叧鐨勪笟鍔¢�昏緫锛屽寘鎷潯鐮佹暟鎹帴鏀躲�佽澶囬厤缃鐞嗙瓑鍔熻兘
+ */
+import bus from "../../dxmodules/dxEventBus.js"
+import common from "../../dxmodules/dxCommon.js"
+import log from "../../dxmodules/dxLogger.js"
+import std from '../../dxmodules/dxStd.js'
+import driver from '../driver.js'
+import utils from '../common/utils/utils.js'
+import dxMap from '../../dxmodules/dxMap.js'
+import config from '../../dxmodules/dxConfig.js'
+const uart485Service = {}
+
+/**
+ * 灏嗗崄杩涘埗鏁拌浆鎹负灏忕搴忓崄鍏繘鍒跺瓧绗︿覆
+ * @param {number} decimalNumber - 鍗佽繘鍒舵暟瀛�
+ * @param {number} byteSize - 瀛楄妭澶у皬
+ * @returns {string} 灏忕搴忓崄鍏繘鍒跺瓧绗︿覆
+ */
+function decimalToLittleEndianHex (decimalNumber, byteSize) {
+  const littleEndianBytes = [];
+  for (let i = 0; i < byteSize; i++) {
+    littleEndianBytes.push(decimalNumber & 0xFF);
+    decimalNumber >>= 8; // 鐩稿綋浜庨櫎浠�256
+  }
+  const littleEndianHex = littleEndianBytes
+    .map((byte) => byte.toString(16).padStart(2, '0'))
+    .join('');
+  return littleEndianHex;
+}
+
+/**
+ * 灏嗘暟鎹寘杞崲涓哄瓧绗︿覆鏍煎紡
+ * @param {object} pack - 鏁版嵁鍖呭璞�
+ * @param {string} pack.cmd - 鍛戒护鐮�
+ * @param {string} pack.result - 缁撴灉鐮�
+ * @param {string} [pack.data] - 鏁版嵁
+ * @returns {string} 杞崲鍚庣殑瀛楃涓�
+ */
+function pack2str (pack) {
+  pack.data = (!pack.data) ? [] : pack.data.match(/.{2}/g)
+  let len = decimalToLittleEndianHex(pack.data.length, 2)
+  let str = "55aa" + pack.cmd + pack.result + len + pack.data.join('')
+  let crc = common.calculateBcc([0x55, 0xaa, parseInt(pack.cmd, 16), parseInt(pack.result, 16), pack.data.length % 256, pack.data.length / 256].concat(pack.data.map(v => parseInt(v, 16))))
+  return str + crc.toString(16).padStart(2, '0')
+}
+
+/**
+ * 鎺ユ敹UART485鏁版嵁骞跺鐞�
+ * @param {object} data - 鎺ユ敹鍒扮殑鏁版嵁
+ * @param {string} type - 鏁版嵁绫诲瀷锛�'code'琛ㄧず鏉$爜鏁版嵁锛�'instruction'琛ㄧず鎸囦护
+ */
+uart485Service.receive = function (data, type) {
+  log.info("code:",JSON.stringify(data))
+  if (type == 'code') {
+    if(data.cmd == "30") {
+      if(data.length > 0) {
+        let code = common.hexToString(data.data)
+        const now = new Date().getTime()
+        let map = dxMap.get("CODETIME")
+        let time = map.get("time") || 0
+        let interval = Math.max(1000, config.get("sys.interval"))
+        if(now -  time > interval) {
+          bus.fire("getCode", code)
+          map.put("time", new Date().getTime())
+        }
+      }
+    }
+  }
+  if (type == 'instruction') {
+    if (data.cmd == "0a") {
+      // 鑾峰彇璁惧SN
+      if (data.length > 0) {
+        console.log('---0A鍐欏叆--');
+        
+        let newSn = common.hexToString(data.data)
+        //淇敼 sn 鍙锋敼鎴愪紶鍏ュ弬鏁�
+        try {
+          let wgetApp = common.systemWithRes(`test -e "/etc/.sn" && echo "OK" || echo "NO"`, 2)
+          if (!wgetApp.includes('OK')) {
+            //娌℃湁鍒涘缓涓�涓�
+            common.systemBrief("touch /etc/.sn")
+          }
+          std.saveFile('/etc/.sn', newSn)
+          common.systemWithRes(`rm -rf /app/data/config/config.json`, 2)
+        } catch (error) {
+          log.info('0A鍐欏叆 sn 澶辫触鍘熷洜:', error.stack)
+          let pack1 = { "cmd": '0A', "result": '90', 'data': '' }
+          driver.uart485.sendVg(pack2str(pack1))
+          return
+        }
+        //杩斿洖涓插彛
+        let pack1 = { "cmd": '0A', "result": '00', 'data': common.stringToHex(newSn) }
+        driver.uart485.sendVg(pack2str(pack1))
+        common.asyncReboot(2)
+      } else {
+        log.info('-----0A鏌ヨ-----', common.getSn());
+        let pack1 = { "cmd": '0A', "result": '00', "data": common.stringToHex(common.getSn()) }
+        // log.info(pack2str(pack1));
+        driver.uart485.sendVg(pack2str(pack1))
+      }
+    } else if (data.cmd == "b0") {
+        log.info("----b0---")
+      // 鏌ヨ/淇敼璁惧閰嶇疆
+      let str = data.data
+      if (!str) {
+        return
+      }
+      //鏁版嵁鍩熺涓�涓瓧鑺傝〃绀轰慨鏀硅繕鏄煡璇�   00 鏌ヨ 01 淇敼	
+      if (parseInt(str.substring(0, 2)) == 0) {
+        //鏌ヨ閰嶇疆
+        let pack1 = { "cmd": 'B0', "result": '00', "data": common.stringToHex(common.getSn()) }
+        driver.uart485.sendVg(pack2str(pack1))
+      } else {
+        //淇敼閰嶇疆
+        if (data.dlen <= 1) {
+          return
+        }
+        // ___VBAR_CONFIG_V1.1.0___{ble_name="11127S"}--lLqHBRnE2bU8D2HJ5RTioQ==
+        let toString = common.hexToString(str.substring(2))
+        let content = parseString(toString)
+        if (content.sn) {
+          //淇敼 sn 鍙锋敼鎴愪紶鍏ュ弬鏁�
+          try {
+            let wgetApp = common.systemWithRes(`test -e "/etc/.sn" && echo "OK" || echo "NO"`, 2)
+            if (!wgetApp.includes('OK')) {
+              //娌℃湁鍒涘缓涓�涓�
+              common.systemBrief("touch /etc/.sn")
+            }
+            std.saveFile('/etc/.sn', content.sn)
+            common.systemWithRes(`rm -rf /app/data/config/config.json`, 2)
+          } catch (error) {
+            log.info('鍐欏叆/etc/.sn鏂囦欢澶辫触,鍘熷洜:', error.stack)
+            let pack1 = { "cmd": 'B0', "result": '90', "data": common.stringToHex(common.getSn()) }
+            driver.uart485.sendVg(pack2str(pack1))
+            return
+          }
+          //杩斿洖涓插彛
+          let pack1 = { "cmd": 'B0', "result": '00', "data": common.stringToHex(content.sn) }
+          driver.uart485.sendVg(pack2str(pack1))
+          common.asyncReboot(2)
+        }
+
+      }
+    } else if (data.cmd == "0c") {
+        log.info("----0c--")
+      // 鑾峰彇涓绘帶chipID
+      let pack = { "cmd": '0C', "result": '00', "data": common.stringToHex(common.getUuid()) }
+      driver.uart485.sendVg(pack2str(pack))
+    } 
+  }
+}
+
+/**
+ * 瑙f瀽瀛楃涓蹭负JSON瀵硅薄锛屾敞鎰弙alue鍐呬笉鑳芥湁"鍙�
+ * @param {string} inputString - 杈撳叆瀛楃涓�
+ * @returns {object} 瑙f瀽鍚庣殑JSON瀵硅薄
+ */
+utils.parseString = function (inputString) {
+    // 鑾峰彇{}鍙婂叾涔嬮棿鐨勫唴瀹�
+    inputString = inputString.slice(inputString.indexOf("{"), inputString.lastIndexOf("}") + 1)
+    // key=value姝e垯锛宬ey鏄痋w+锛堝瓧姣嶆暟瀛椾笅鍒掔嚎锛屽尯鍒ぇ灏忓啓锛夛紝=涓よ竟鍙湁绌烘牸锛寁alue鏄痋w+鎴栫浉閭讳袱涓�"涔嬮棿鐨勫唴瀹癸紙鍖呭惈"锛�
+    const keyValueRegex = /(\w+)\s*=\s*("[^"]*"|\w+)/g;
+    let jsonObject = {};
+    let match;
+    while ((match = keyValueRegex.exec(inputString)) !== null) {
+        let key = match[1];
+        let value = match[2]
+
+        if (/^\d+$/.test(value)) {
+            // 鏁板瓧
+            value = parseInt(value)
+        } else if (/^\d+\.\d+$/.test(value)) {
+            // 灏忔暟
+            value = parseFloat(value)
+        } else if (value == 'true') {
+            value = true
+        } else if (value == 'false') {
+            value = false
+        } else {
+            // 瀛楃涓�
+            value = value.replace(/"/g, '').trim()
+        }
+        jsonObject[key] = value;
+    }
+    return jsonObject;
+}
+
+export default uart485Service

--
Gitblit v1.9.3