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