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/mqttService.js | 1832 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
 1 files changed, 1,832 insertions(+), 0 deletions(-)

diff --git a/vf205_access/src/service/mqttService.js b/vf205_access/src/service/mqttService.js
new file mode 100644
index 0000000..63dad5a
--- /dev/null
+++ b/vf205_access/src/service/mqttService.js
@@ -0,0 +1,1832 @@
+/**
+ * MQTT鏈嶅姟妯″潡
+ * 澶勭悊MQTT娑堟伅鐨勬帴鏀跺拰鍙戦�侊紝鍖呮嫭璁惧绠$悊銆佷汉鍛樼鐞嗐�佹潈闄愮鐞嗙瓑鍔熻兘
+ */
+import common from "../../dxmodules/dxCommon.js";
+import config from "../../dxmodules/dxConfig.js";
+import logger from "../../dxmodules/dxLogger.js";
+import ota from "../../dxmodules/dxOta.js";
+import std from "../../dxmodules/dxStd.js";
+import dxMap from '../../dxmodules/dxMap.js'
+import driver from "../driver.js";
+import configService from "./configService.js";
+import sqliteService from "./sqliteService.js";
+import sqlite from "../../dxmodules/dxSqlite.js";
+import utils from '../common/utils/utils.js'
+
+const mqttService = {}
+let map = dxMap.get("faceAccesss")
+
+/**
+ * 鎺ユ敹MQTT娑堟伅骞跺鐞�
+ * @param {object} data - MQTT娑堟伅鏁版嵁
+ * @param {string} data.topic - 娑堟伅涓婚
+ * @param {string} data.payload - 娑堟伅杞借嵎
+ */
+mqttService.receiveMsg = function (data) {
+    // {"topic":"ddddd","payload":"{\n  \"msg\": \"world\"\n}"}
+    logger.info('[mqttService] receiveMsg :' + JSON.stringify(data.topic))
+    // 鎻愬彇涓婚鐨勬渶鍚庨儴鍒嗕綔涓哄嚱鏁板悕
+    if (typeof mqttService[data.topic.match(/[^/]+$/)[0]] == 'function') {
+        mqttService[data.topic.match(/[^/]+$/)[0]](data)
+    } else {
+        logger.error("鏈疄鐜扮殑topic", data.topic)
+    }
+}
+
+// =================================鏉冮檺澧炲垹鏀规煡=================================
+/**
+ * 娣诲姞鏉冮檺
+ * @param {object} event - MQTT浜嬩欢瀵硅薄
+ */
+mqttService.insertPermission = function (event) {
+    try {
+        logger.info('[mqttService] 鎺ユ敹鍒癷nsertPermission鍛戒护:', JSON.stringify(event.topic))
+        logger.info('[mqttService] 鍛戒护payload:', event.payload)
+        let payload = JSON.parse(event.payload)
+        let data = payload.payload && payload.payload.data ? payload.payload.data : {}
+        logger.info('[mqttService] 瑙f瀽鍚庣殑鍙傛暟:', JSON.stringify(data))
+        let res = this.insertPermissionAgreement(data)
+        if (typeof res == 'string') {
+            logger.error('[mqttService] insertPermission澶辫触:', res)
+            return reply(event, res, CODE.E_100)
+        }
+        logger.info('[mqttService] insertPermission鎴愬姛')
+        return reply(event)
+    } catch (error) {
+        logger.error('[mqttService] insertPermission error:', error)
+        return reply(event, { error: error.message }, CODE.E_100)
+    }
+}
+
+/**
+ * 娣诲姞鏉冮檺閫氱敤鍗忚鏍煎紡
+ * @param {array} data - 鏉冮檺鏁版嵁鏁扮粍
+ * @returns {boolean|string} true琛ㄧず鎴愬姛锛宻tring琛ㄧず閿欒淇℃伅
+ */
+mqttService.insertPermissionAgreement = function (data) {
+    let permissions = []
+    for (let i = 0; i < data.length; i++) {
+        const permission = data[i];
+        if (!permission.permissionId || !permission.userId) {
+            return "id or userId cannot be empty"
+        }
+        if (!permission.extra) {
+            permission.extra = ""
+        }
+        if (!permission.time) {
+            return "time and type cannot be empty"
+        }
+        if (permission.time.type != 0 && permission.time.type != 1 && permission.time.type != 2 && permission.time.type != 3) {
+            return "time type is not supported"
+        }
+        let record = {}
+        record.permissionId = permission.permissionId
+        record.userId = permission.userId
+        record.door = isEmpty(permission.index) ? 0 : permission.index
+        record.extra = isEmpty(permission.extra) ? JSON.stringify({}) : JSON.stringify(permission.extra)
+        record.timeType = permission.time.type
+        record.beginTime = permission.time.type == 0 ? 0 : permission.time.range.beginTime
+        record.endTime = permission.time.type == 0 ? 0 : permission.time.range.endTime
+        record.repeatBeginTime = permission.time.type != 2 ? 0 : permission.time.beginTime
+        record.repeatEndTime = permission.time.type != 2 ? 0 : permission.time.endTime
+        record.period = permission.time.type != 3 ? 0 : JSON.stringify(permission.time.weekPeriodTime)
+        let ret = sqliteService.d1_permission.save(record)
+        if (ret != 0) {
+            // 濡傛灉淇濆瓨澶辫触锛屽皾璇曞垹闄ゅ悗閲嶆柊淇濆瓨
+            sqliteService.d1_permission.deleteByPermissionId(record.permissionId)
+            ret = sqliteService.d1_permission.save(record)
+            if (ret != 0) {
+                return "sql error ret:" + ret
+            } else {
+                continue
+            }
+        }
+    }
+    return true
+}
+
+/**
+ * 鏌ヨ鏉冮檺
+ * @param {object} event - MQTT浜嬩欢瀵硅薄
+ */
+mqttService.getPermission = function (event) {
+    try {
+        logger.info('[mqttService] 鎺ユ敹鍒癵etPermission鍛戒护:', JSON.stringify(event.topic))
+        logger.info('[mqttService] 鍛戒护payload:', event.payload)
+        let payload = JSON.parse(event.payload)
+        let data = payload.payload && payload.payload.data ? payload.payload.data : {}
+        logger.info('[mqttService] 瑙f瀽鍚庣殑鏌ヨ鍙傛暟:', JSON.stringify(data))
+        let res = this.getPermissionAgreement(data)
+        logger.info('[mqttService] 鏌ヨ缁撴灉:', JSON.stringify(res))
+        return reply(event, res)
+    } catch (error) {
+        logger.error('[mqttService] getPermission error:', error)
+        return reply(event, { error: error.message }, CODE.E_100)
+    }
+}
+
+/**
+ * 鏌ヨ鏉冮檺閫氱敤鍗忚鏍煎紡
+ * @param {object} data - 鏌ヨ鍙傛暟
+ * @returns {object} 鏌ヨ缁撴灉
+ */
+mqttService.getPermissionAgreement = function (data) {
+    try {
+        // 纭繚data鍙傛暟涓嶄负undefined
+        data = data || {}
+        data.page = isEmpty(data.page) ? 0 : data.page
+        data.size = isEmpty(data.size) ? 10 : data.size
+        let totalCount = sqliteService.d1_permission.count(data)
+        let permissions = sqliteService.d1_permission.findAll(data)
+        // 鏋勫缓杩斿洖缁撴灉
+        let content = permissions.map(permission => ({
+            permissionId: permission.permissionId,
+            userId: permission.userId,
+            extra: JSON.parse(permission.extra ? permission.extra : "{}"),
+            time: {
+                type: permission.timeType,
+                beginTime: permission.timeType != 2 ? undefined : permission.repeatBeginTime,
+                endTime: permission.timeType != 2 ? undefined : permission.repeatEndTime,
+                range: permission.timeType === 0 ? undefined : { beginTime: permission.beginTime, endTime: permission.endTime },
+                weekPeriodTime: permission.timeType != 3 ? undefined : JSON.parse(permission.period)
+            }
+        }))
+        return {
+            content: content,
+            page: data.page,
+            size: data.size,
+            total: totalCount,
+            totalPage: Math.ceil(totalCount / data.size),
+            count: content.length
+        }
+    } catch (error) {
+        logger.error('[mqttService] getPermissionAgreement error:', error)
+        throw error
+    }
+}
+
+/**
+ * 鍒犻櫎鏉冮檺
+ * @param {object} event - MQTT浜嬩欢瀵硅薄
+ */
+mqttService.delPermission = function (event) {
+    try {
+        logger.info('[mqttService] 鎺ユ敹鍒癲elPermission鍛戒护:', JSON.stringify(event.topic))
+        logger.info('[mqttService] 鍛戒护payload:', event.payload)
+        let payload = JSON.parse(event.payload)
+        let data = payload.payload && payload.payload.data ? payload.payload.data : {}
+        logger.info('[mqttService] 瑙f瀽鍚庣殑鍙傛暟:', JSON.stringify(data))
+        let res = this.delPermissionAgreement(data)
+        if (typeof res == 'string') {
+            logger.error('[mqttService] delPermission澶辫触:', res)
+            return reply(event, res, CODE.E_100)
+        }
+        logger.info('[mqttService] delPermission鎴愬姛')
+        return reply(event)
+    } catch (error) {
+        logger.error('[mqttService] delPermission error:', error)
+        return reply(event, { error: error.message }, CODE.E_100)
+    }
+}
+
+/**
+ * 鍒犻櫎鏉冮檺閫氱敤鍗忚鏍煎紡
+ * @param {object} data - 鍒犻櫎鍙傛暟
+ * @returns {boolean|string} true琛ㄧず鎴愬姛锛宻tring琛ㄧず閿欒淇℃伅
+ */
+mqttService.delPermissionAgreement = function (data) {
+    if (data.permissionIds && data.permissionIds.length > 0) {
+        let ret = sqliteService.d1_permission.deleteByPermissionIdInBatch(data.permissionIds)
+        if (ret != 0) {
+            return "sql error ret:" + ret
+        }
+    }
+    if (data.userIds && data.userIds.length > 0) {
+        let ret = sqliteService.d1_permission.deleteByUserIdInBatch(data.userIds)
+        if (ret != 0) {
+            return "sql error ret:" + ret
+        }
+    }
+    return true
+}
+
+/**
+ * 娓呯┖鏉冮檺
+ * @param {object} event - MQTT浜嬩欢瀵硅薄
+ */
+mqttService.clearPermission = function (event) {
+    try {
+        logger.info('[mqttService] 鎺ユ敹鍒癱learPermission鍛戒护:', JSON.stringify(event.topic))
+        logger.info('[mqttService] 鍛戒护payload:', event.payload)
+        let ret = sqliteService.d1_permission.deleteAll()
+        if (ret == 0) {
+            logger.info('[mqttService] clearPermission鎴愬姛')
+            return reply(event)
+        } else {
+            logger.error('[mqttService] clearPermission澶辫触:', "sql error ret:" + ret)
+            return reply(event, "sql error ret:" + ret, CODE.E_100)
+        }
+    } catch (error) {
+        logger.error('[mqttService] clearPermission error:', error)
+        return reply(event, { error: error.message }, CODE.E_100)
+    }
+}
+
+
+// =================================浜哄憳澧炲垹鏀规煡=================================
+/**
+ * 娣诲姞浜哄憳
+ * @param {object} event - MQTT浜嬩欢瀵硅薄
+ */
+mqttService.insertUser = function (event) {
+    try {
+        logger.info('[mqttService] 鎺ユ敹鍒癷nsertUser鍛戒护:', JSON.stringify(event.topic))
+        logger.info('[mqttService] 鍛戒护payload:', event.payload)
+        let payload = JSON.parse(event.payload)
+        let data = payload.payload && payload.payload.data ? payload.payload.data : []
+        logger.info('[mqttService] 瑙f瀽鍚庣殑鍙傛暟:', JSON.stringify(data))
+        let res = this.insertUserAgreement(data)
+        if (typeof res == 'string') {
+            logger.error('[mqttService] insertUser澶辫触:', res)
+            return reply(event, res, CODE.E_100)
+        }
+        logger.info('[mqttService] insertUser鎴愬姛')
+        return reply(event)
+    } catch (error) {
+        logger.error('[mqttService] insertUser error:', error)
+        return reply(event, { error: error.message }, CODE.E_100)
+    }
+}
+
+/**
+ * 娣诲姞浜哄憳閫氱敤鍗忚鏍煎紡
+ * @param {array} data - 浜哄憳鏁版嵁鏁扮粍
+ * @returns {boolean|string} true琛ㄧず鎴愬姛锛宻tring琛ㄧず閿欒淇℃伅
+ */
+mqttService.insertUserAgreement = function (data) {
+    let persons = []
+    for (let i = 0; i < data.length; i++) {
+        const person = data[i];
+        // 涓ユ牸妫�鏌ユ暟鎹牸寮�
+        if (!person.userId || !person.name || person.type === undefined || !person.idCard) {
+            return "鏁版嵁鏍煎紡閿欒锛岀己灏戝繀瑕佸瓧娈碉紙userId銆乶ame銆乼ype銆乮dCard锛�"
+        }
+        // 妫�鏌ype瀛楁绫诲瀷
+        if (typeof person.type !== 'number') {
+            return "鏁版嵁鏍煎紡閿欒锛宼ype瀛楁蹇呴』鏄暟瀛�"
+        }
+        // 妫�鏌ype瀛楁鍊艰寖鍥�
+        if (person.type < 0 || person.type > 1) {
+            return "鏁版嵁鏍煎紡閿欒锛宼ype瀛楁鍊煎繀椤诲湪0-1涔嬮棿"
+        }
+        let record = {}
+        record.userId = person.userId
+        record.name = person.name
+        // 澶勭悊浜哄憳绫诲瀷瀛楁鍜岃韩浠借瘉鍙�
+        let extra = {}
+        extra.type = person.type
+        extra.idCard = person.idCard
+        record.extra = JSON.stringify(extra)
+        persons.push(record)
+        
+        // 澶勭悊浜鸿劯淇℃伅
+        if (person.face) {
+            try {
+                logger.info('[mqttService] 寮�濮嬪鐞嗕汉鑴镐俊鎭�:', person.userId)
+                
+                let faceFilePath = person.face
+                
+                // 妫�鏌ユ槸鍚︽槸base64缂栫爜鐨勫浘鐗囨暟鎹�
+                if (person.face.startsWith('data:image/')) {
+                    logger.info('[mqttService] 妫�娴嬪埌base64缂栫爜鐨勫浘鐗囨暟鎹�')
+                    // 鎻愬彇base64鏁版嵁
+                    let base64Data = person.face.split(',')[1]
+                    // 鍒涘缓涓存椂鏂囦欢
+                    faceFilePath = '/app/data/user/temp_face_' + person.userId + '.jpg'
+                    std.ensurePathExists(faceFilePath)
+                    // 灏哹ase64鏁版嵁杞崲涓烘枃浠�
+                    common.base64_2binfile(faceFilePath, base64Data)
+                    logger.info('[mqttService] 宸插皢base64鏁版嵁淇濆瓨涓烘枃浠�:', faceFilePath)
+                } else {
+                    return "鏁版嵁鏍煎紡閿欒锛宖ace瀛楁蹇呴』鏄痓ase64缂栫爜鐨勫浘鐗囨暟鎹�"
+                }
+                
+                // 妫�鏌ユ枃浠舵槸鍚﹀瓨鍦�
+                let fileExists = common.systemWithRes(`test -e "${faceFilePath}" && echo "OK" || echo "NO"`, 2)
+                logger.info('[mqttService] 浜鸿劯鍥剧墖鏂囦欢瀛樺湪:', fileExists.includes('OK'))
+                
+                if (fileExists.includes('OK')) {
+                    // 娉ㄥ唽浜鸿劯
+                    logger.info('[mqttService] 寮�濮嬫敞鍐屼汉鑴�:', person.userId)
+                    let ret = driver.face.registerFaceByPicFile(person.userId, faceFilePath)
+                    logger.info('[mqttService] 娉ㄥ唽浜鸿劯缁撴灉:', ret)
+                    
+                    if (ret == 0) {
+                        // 娉ㄥ唽鎴愬姛鍚庣Щ鍔ㄥ浘鐗囧埌鐢ㄦ埛鐩綍
+                        let src = "/app/data/user/" + person.userId + "/register.jpg"
+                        std.ensurePathExists(src)
+                        logger.info('[mqttService] 绉诲姩浜鸿劯鍥剧墖鍒扮敤鎴风洰褰�:', faceFilePath, '->', src)
+                        common.systemBrief('mv ' + faceFilePath + " " + src)
+                        
+                        // 淇濆瓨浜鸿劯鍑瘉
+                        logger.info('[mqttService] 淇濆瓨浜鸿劯鍑瘉:', person.userId)
+                        let voucherRet = sqliteService.d1_voucher.save({
+                            keyId: std.genRandomStr(32),
+                            type: "300",
+                            code: src,
+                            userId: person.userId,
+                            extra: JSON.stringify({ faceType: 0 })
+                        });
+                        logger.info('[mqttService] 淇濆瓨浜鸿劯鍑瘉缁撴灉:', voucherRet)
+                    } else {
+                        logger.error('[mqttService] 娉ㄥ唽浜鸿劯澶辫触锛岃繑鍥炵爜:', ret)
+                    }
+                } else {
+                    logger.error('[mqttService] 浜鸿劯鍥剧墖鏂囦欢涓嶅瓨鍦�:', faceFilePath)
+                }
+            } catch (error) {
+                logger.error('[mqttService] 澶勭悊浜鸿劯淇℃伅閿欒:', error)
+                return "澶勭悊浜鸿劯淇℃伅閿欒: " + error.message
+            } finally {
+                logger.info('[mqttService] 浜鸿劯淇℃伅澶勭悊瀹屾垚:', person.userId)
+            }
+        }
+    }
+    let ret = sqliteService.d1_person.saveAll(persons)
+    if (ret != 0) {
+        //澶辫触浜� 鎶婅繖浜涗汉鍏ㄩ兘鍒犻櫎鍚庡湪鏂板涓�涓�
+        let userIds = persons.map(obj => obj.userId);
+        sqliteService.d1_person.deleteByUserIdInBatch(userIds)
+        //閲嶆柊鏂板
+        let ret = sqliteService.d1_person.saveAll(persons)
+        if (ret != 0) {
+            return "sql error ret:" + ret
+        }
+    }
+    
+    // 涓虹敤鎴锋坊鍔犲搴旀潈闄�
+    for (let i = 0; i < data.length; i++) {
+        const person = data[i];
+        let userId = person.userId
+        let userType = person.type
+        
+        // 鍙湁淇濈鍛橈紙0锛夊拰绉戦暱锛�1锛夐渶瑕佹坊鍔犳潈闄�
+        if (userType == 0 || userType == 1) {
+            try {
+                // 妫�鏌ユ槸鍚﹀凡瀛樺湪鏉冮檺璁板綍
+                let existingPermissions = sqliteService.d1_permission.findByUserId(userId)
+                if (existingPermissions && existingPermissions.length == 0) {
+                    // 娣诲姞姘镐箙鏉冮檺
+                    let permissionRet = sqliteService.d1_permission.save({
+                        permissionId: std.genRandomStr(32),
+                        userId: userId,
+                        timeType: 0, // 姘镐箙鏉冮檺
+                        beginTime: 0,
+                        endTime: 0,
+                        repeatBeginTime: 0,
+                        repeatEndTime: 0,
+                        period: ""
+                    });
+                    logger.info('[mqttService] 涓虹敤鎴锋坊鍔犳潈闄愮粨鏋�:', permissionRet)
+                } else {
+                    logger.info('[mqttService] 鐢ㄦ埛宸插瓨鍦ㄦ潈闄愯褰曪紝璺宠繃鏉冮檺娣诲姞:', userId)
+                }
+            } catch (error) {
+                logger.error('[mqttService] 娣诲姞鏉冮檺鏃跺嚭閿�:', error)
+            }
+        }
+    }
+    
+    return true
+
+}
+
+/**
+ * 鏌ヨ浜哄憳
+ * @param {object} event - MQTT浜嬩欢瀵硅薄
+ */
+mqttService.getUser = function (event) {
+    try {
+        logger.info('[mqttService] 鎺ユ敹鍒癵etUser鍛戒护:', JSON.stringify(event.topic))
+        logger.info('[mqttService] 鍛戒护payload:', event.payload)
+        let payload = JSON.parse(event.payload)
+        let data = payload.payload && payload.payload.data ? payload.payload.data : {}
+        let res = this.getUserAgreement(data)
+        logger.info('[mqttService] 鏌ヨ缁撴灉:', JSON.stringify(res))
+        return reply(event, res)
+    } catch (error) {
+        logger.error('[mqttService] getUser error:', error)
+        return reply(event, { error: error.message }, CODE.E_100)
+    }
+}
+
+/**
+ * 鏌ヨ浜哄憳閫氱敤鍗忚鏍煎紡
+ * @param {object} data - 鏌ヨ鍙傛暟
+ * @returns {object} 鏌ヨ缁撴灉
+ */
+mqttService.getUserAgreement = function (data) {
+    try {
+        data.page = isEmpty(data.page) ? 0 : data.page
+        data.size = isEmpty(data.size) ? 10 : data.size
+        let totalCount = sqliteService.d1_person.count(data)
+        let persons = sqliteService.d1_person.findAll(data)
+        // 瑙f瀽 extra 瀛楁锛孞SON瀛楃涓茶浆鍖栦负JSON瀵硅薄锛屾秷闄よ浆涔夊瓧绗�
+        persons.forEach(person => {
+            try {
+                if (person.extra) {
+                    person.extra = JSON.parse(person.extra)
+                }
+            } catch (error) {
+                logger.error('[mqttService] 瑙f瀽 extra 瀛楁閿欒:', error)
+            }
+        })
+
+        let result = {
+            content: persons,
+            page: data.page,
+            size: data.size,
+            total: totalCount,
+            totalPage: Math.ceil(totalCount / data.size),
+            count: persons.length
+        }
+
+        return result
+    } catch (error) {
+        logger.error('[mqttService] getUserAgreement error:', error)
+        throw error
+    }
+}
+
+/**
+ * 鍒犻櫎浜哄憳
+ * @param {object} event - MQTT浜嬩欢瀵硅薄
+ */
+mqttService.delUser = function (event) {
+    try {
+        logger.info('[mqttService] 鎺ユ敹鍒癲elUser鍛戒护:', JSON.stringify(event.topic))
+        logger.info('[mqttService] 鍛戒护payload:', event.payload)
+        let payload = JSON.parse(event.payload)
+        let data = payload.payload && payload.payload.data ? payload.payload.data : []
+        logger.info('[mqttService] 瑙f瀽鍚庣殑鍙傛暟:', JSON.stringify(data))
+        let res = this.delUserAgreement(data)
+        if (typeof res == 'string') {
+            logger.error('[mqttService] delUser澶辫触:', res)
+            return reply(event, res, CODE.E_100)
+        }
+        logger.info('[mqttService] delUser鎴愬姛')
+        return reply(event)
+    } catch (error) {
+        logger.error('[mqttService] delUser error:', error)
+        return reply(event, { error: error.message }, CODE.E_100)
+    }
+}
+
+/**
+ * 鍒犻櫎浜哄憳閫氱敤鍗忚鏍煎紡
+ * @param {array} data - 浜哄憳ID鏁扮粍
+ * @returns {boolean|string} true琛ㄧず鎴愬姛锛宻tring琛ㄧず閿欒淇℃伅
+ */
+mqttService.delUserAgreement = function (data) {
+    if (data && data.length > 0) {
+        sqliteService.transaction()
+        let ret1 = sqliteService.d1_person.deleteByUserIdInBatch(data)
+        let ret2 = sqliteService.d1_permission.deleteByUserIdInBatch(data)
+        let ret3 = sqliteService.d1_voucher.deleteByUserIdInBatch(data)
+        if (ret1 != 0 || ret2 != 0 || ret3 != 0) {
+            sqliteService.rollback()
+            return "sql error"
+        }
+        sqliteService.commit()
+        // 鍒犻櫎浜哄憳鐨勪汉鑴告暟鎹�
+        data.forEach(element => {
+            driver.face.delete(element)
+        });
+    }
+    return true
+}
+
+
+/**
+ * 娓呯┖浜哄憳
+ * @param {object} event - MQTT浜嬩欢瀵硅薄
+ */
+mqttService.clearUser = function (event) {
+    try {
+        logger.info('[mqttService] 鎺ユ敹鍒癱learUser鍛戒护:', JSON.stringify(event.topic))
+        logger.info('[mqttService] 鍛戒护payload:', event.payload)
+        let persons = sqliteService.d1_person.findAll()
+        // 鍒犻櫎鎵�鏈変汉鍛樼殑浜鸿劯鏁版嵁
+        logger.info('[mqttService] 寮�濮嬪垹闄や汉鑴告暟鎹紝鍏�', persons.length, '鏉�')
+        persons.forEach(element => {
+            driver.face.delete(element.userId)
+        });
+        let ret1 = sqliteService.d1_person.deleteAll()
+        let ret2 = sqliteService.d1_permission.deleteAll()
+        let ret3 = sqliteService.d1_voucher.deleteAll()
+        if (ret1 == 0 && ret2 == 0 && ret3 == 0) {
+            logger.info('[mqttService] clearUser鎴愬姛')
+            return reply(event)
+        } else {
+            let errorMsg = "sql error ret: " + ret1 + ", " + ret2 + ", " + ret3
+            logger.error('[mqttService] clearUser澶辫触:', errorMsg)
+            return reply(event, errorMsg, CODE.E_100)
+        }
+    } catch (error) {
+        logger.error('[mqttService] clearUser error:', error)
+        return reply(event, { error: error.message }, CODE.E_100)
+    }
+}
+
+// =================================鍑瘉澧炲垹鏀规煡=================================
+/**
+ * 娣诲姞鍑瘉
+ * @param {object} event - MQTT浜嬩欢瀵硅薄
+ */
+mqttService.insertKey = function (event) {
+    try {
+        logger.info('[mqttService] 鎺ユ敹鍒癷nsertKey鍛戒护:', JSON.stringify(event.topic))
+        logger.info('[mqttService] 鍛戒护payload:', event.payload)
+        let payload = JSON.parse(event.payload)
+        let data = payload.payload && payload.payload.data ? payload.payload.data : {}
+        logger.info('[mqttService] 瑙f瀽鍚庣殑鍙傛暟:', JSON.stringify(data))
+        let res = this.insertKeyAgreement(data)
+        if (typeof res == 'string') {
+            logger.error('[mqttService] insertKey澶辫触:', res)
+            return reply(event, res, CODE.E_100)
+        }
+        logger.info('[mqttService] insertKey鎴愬姛')
+        return reply(event)
+    } catch (error) {
+        logger.error('[mqttService] insertKey error:', error)
+        return reply(event, { error: error.message }, CODE.E_100)
+    }
+}
+
+/**
+ * 娣诲姞鍑瘉閫氱敤鍗忚鏍煎紡
+ * @param {array} data - 鍑瘉鏁版嵁鏁扮粍
+ * @returns {boolean|string} true琛ㄧず鎴愬姛锛宻tring琛ㄧず閿欒淇℃伅
+ */
+mqttService.insertKeyAgreement = function (data) {
+    let vouchers = []
+    for (let i = 0; i < data.length; i++) {
+        const voucher = data[i];
+        if (!voucher.keyId || !voucher.type || !voucher.code || !voucher.userId) {
+            return "keyId or type or code  or userId cannot be empty"
+        }
+
+        // 鍑瘉閲嶅
+        let ret = sqliteService.d1_voucher.findAllBycode(voucher.code)
+        if (ret.length != 0) {
+            return "Duplicate vouchers"
+        }
+
+        if (voucher.type == 300) {
+            if (voucher.extra) {
+                if (voucher.extra.faceType != 0 && voucher.extra.faceType != 1) {
+                    return "faceType Incorrect format"
+                }
+            } else {
+                return "faceType is required"
+            }
+        }
+        let record = {}
+        record.keyId = voucher.keyId
+        record.type = voucher.type
+        if (voucher.type == "400") {
+            if (voucher.code.length > 6) {
+                return "Password length cannot exceed 6 digits"
+            }
+        }
+        if (voucher.type == "300") {
+            if (voucher.extra.faceType == 0) {
+                record.code = `/app/data/user/${voucher.userId}/register.jpg`
+                // 淇濆瓨base64鍥剧墖
+                std.ensurePathExists(record.code)
+                common.base64_2binfile(record.code, voucher.code)
+                // 娉ㄥ唽浜鸿劯
+                let weq = driver.face.registerFaceByPicFile(voucher.userId, record.code)
+                if (weq == 0) {
+                    logger.info("娉ㄥ唽浜鸿劯鎴愬姛")
+                } else {
+                    logger.info("绗竴娆′汉鑴告敞鍐屽け璐�")
+                    //鍒犻櫎閲嶆柊娉ㄥ唽
+                    driver.face.delete(voucher.userId)
+                    let res = driver.face.registerFaceByPicFile(voucher.userId, record.code)
+                    if (res == 0) {
+                        logger.info("绗簩娆℃敞鍐屼汉鑴告垚鍔�")
+                        sqliteService.d1_voucher.deleteByKeyId(record.keyId)
+                    } else {
+                        return "Face registration failed"
+                    }
+                }
+            } else {
+                record.code = voucher.code
+                //鐗瑰緛鍊兼敞鍐�
+                let res = driver.face.reg(voucher.userId, voucher.code)
+                if (res != 0) {
+                    return "Face registration failed"
+                }
+            }
+        } else {
+            record.code = voucher.code
+            let ret = sqliteService.d1_voucher.findAllByCodeAndType(voucher.code, voucher.type)
+            if (ret.length != 0) {
+                return "Duplicate vouchers"
+            }
+        }
+
+        record.userId = voucher.userId
+        record.extra = isEmpty(voucher.extra) ? JSON.stringify({ type: 0 }) : JSON.stringify(voucher.extra)
+        vouchers.push(record)
+    }
+    let ret = sqliteService.d1_voucher.saveAll(vouchers)
+    if (ret == 0) {
+        return true
+    } else {
+        return "sql error ret:" + ret
+    }
+}
+
+/**
+ * 鏌ヨ鍑瘉
+ * @param {object} event - MQTT浜嬩欢瀵硅薄
+ */
+mqttService.getKey = function (event) {
+    try {
+        logger.info('[mqttService] 鎺ユ敹鍒癵etKey鍛戒护:', JSON.stringify(event.topic))
+        logger.info('[mqttService] 鍛戒护payload:', event.payload)
+        let payload = JSON.parse(event.payload)
+        let data = payload.payload && payload.payload.data ? payload.payload.data : {}
+        logger.info('[mqttService] 瑙f瀽鍚庣殑鏌ヨ鍙傛暟:', JSON.stringify(data))
+        let res = this.getKeyAgreement(data)
+        if (typeof res == 'string') {
+            logger.error('[mqttService] getKey澶辫触:', res)
+            return reply(event, res, CODE.E_100)
+        }
+        logger.info('[mqttService] 鏌ヨ缁撴灉:', JSON.stringify(res))
+        return reply(event, res)
+    } catch (error) {
+        logger.error('[mqttService] getKey error:', error)
+        return reply(event, { error: error.message }, CODE.E_100)
+    }
+}
+
+/**
+ * 鏌ヨ鍑瘉閫氱敤鍗忚鏍煎紡
+ * @param {object} data - 鏌ヨ鍙傛暟
+ * @returns {object|string} 鏌ヨ缁撴灉鎴栭敊璇俊鎭�
+ */
+mqttService.getKeyAgreement = function (data) {
+    if (!data.type) {
+        return "type is required"
+    }
+    if (data.type == 300) {
+        data.size = 1
+    } else {
+        data.page = isEmpty(data.page) ? 0 : data.page
+        data.size = isEmpty(data.size) ? 10 : data.size
+    }
+    let totalCount = sqliteService.d1_voucher.count(data)
+    let vouchers = sqliteService.d1_voucher.findAll(data)
+    vouchers.forEach(element => {
+        if (element.type == 300 && element.extra && JSON.parse(element.extra).faceType == 0) {
+            //浜鸿劯鐗规畩澶勭悊涓�涓� 
+            element.code = driver.face.fileToBase64(element.code)
+        }
+    });
+    return {
+        content: vouchers,
+        page: data.page,
+        size: data.size,
+        total: totalCount,
+        totalPage: Math.ceil(totalCount / data.size),
+        count: vouchers.length
+    }
+}
+
+/**
+ * 鍒犻櫎鍑瘉
+ * @param {object} event - MQTT浜嬩欢瀵硅薄
+ */
+mqttService.delKey = function (event) {
+    try {
+        logger.info('[mqttService] 鎺ユ敹鍒癲elKey鍛戒护:', JSON.stringify(event.topic))
+        logger.info('[mqttService] 鍛戒护payload:', event.payload)
+        let payload = JSON.parse(event.payload)
+        let data = payload.payload && payload.payload.data ? payload.payload.data : {}
+        logger.info('[mqttService] 瑙f瀽鍚庣殑鍙傛暟:', JSON.stringify(data))
+        let res = this.delKeyAgreement(data)
+        if (typeof res == 'string') {
+            logger.error('[mqttService] delKey澶辫触:', res)
+            return reply(event, res, CODE.E_100)
+        }
+        logger.info('[mqttService] delKey鎴愬姛')
+        return reply(event)
+    } catch (error) {
+        logger.error('[mqttService] delKey error:', error)
+        return reply(event, { error: error.message }, CODE.E_100)
+    }
+}
+
+/**
+ * 鍒犻櫎鍑瘉閫氱敤鍗忚鏍煎紡
+ * @param {object} data - 鍒犻櫎鍙傛暟
+ * @returns {boolean|string} true琛ㄧず鎴愬姛锛宻tring琛ㄧず閿欒淇℃伅
+ */
+mqttService.delKeyAgreement = function (data) {
+    if (data.keyIds && data.keyIds.length > 0) {
+        let userIds = []
+        for (let i = 0; i < data.keyIds.length; i++) {
+            const element = data.keyIds[i];
+            let res = sqliteService.d1_voucher.findAllByKeyId(element)
+            if (res.length <= 0) {
+                continue
+            }
+            if (res[0].type == 300) {
+                userIds.push(res[0].userId)
+            }
+        }
+        let ret = sqliteService.d1_voucher.deleteByKeyIdInBatch(data.keyIds)
+        if (ret != 0) {
+            return "sql error ret:" + ret
+        }
+        // 鍒犻櫎浜鸿劯鏁版嵁
+        userIds.forEach(element => {
+            driver.face.delete(element)
+        });
+    }
+    if (data.userIds && data.userIds.length > 0) {
+        let ret = sqliteService.d1_voucher.deleteByUserIdInBatch(data.userIds)
+        if (ret != 0) {
+            return "sql error ret:" + ret
+        }
+        // 鍒犻櫎浜鸿劯鏁版嵁
+        data.userIds.forEach(element => {
+            driver.face.delete(element)
+        });
+    }
+    return true
+}
+
+/**
+ * 娓呯┖鍑瘉
+ * @param {object} event - MQTT浜嬩欢瀵硅薄
+ */
+mqttService.clearKey = function (event) {
+    try {
+        logger.info('[mqttService] 鎺ユ敹鍒癱learKey鍛戒护:', JSON.stringify(event.topic))
+        logger.info('[mqttService] 鍛戒护payload:', event.payload)
+        let res = sqliteService.d1_voucher.findAll()
+        let userIds = []
+        res.forEach(element => {
+            if (element.type == 300) {
+                userIds.push(element.userId)
+            }
+        });
+        logger.info('[mqttService] 鎵惧埌闇�瑕佸垹闄ょ殑浜鸿劯鏁版嵁锛屽叡', userIds.length, '鏉�')
+        let ret = sqliteService.d1_voucher.deleteAll()
+        if (ret == 0) {
+            // 鍒犻櫎浜鸿劯鏁版嵁
+            logger.info('[mqttService] 寮�濮嬪垹闄や汉鑴告暟鎹�')
+            userIds.forEach((element, index) => {
+                driver.face.delete(element)
+            });
+            logger.info('[mqttService] clearKey鎴愬姛')
+            reply(event)
+        } else {
+            logger.error('[mqttService] clearKey澶辫触:', "sql error ret:" + ret)
+            reply(event, "sql error ret:" + ret, CODE.E_100)
+        }
+    } catch (error) {
+        logger.error('[mqttService] clearKey error:', error)
+        return reply(event, { error: error.message }, CODE.E_100)
+    }
+}
+
+// =================================搴旀�ュ紑浠撳瘑鐮佸鍒犳敼鏌�=================================
+/**
+ * 娣诲姞搴旀�ュ紑浠撳瘑鐮�
+ * @param {object} event - MQTT浜嬩欢瀵硅薄
+ */
+mqttService.insertEmergencyPassword = function (event) {
+    try {
+        logger.info('[mqttService] 鎺ユ敹鍒癷nsertEmergencyPassword鍛戒护:', JSON.stringify(event.topic))
+        logger.info('[mqttService] 鍛戒护payload:', event.payload)
+        let payload = JSON.parse(event.payload)
+        let data = payload.payload && payload.payload.data ? payload.payload.data : {}
+        logger.info('[mqttService] 瑙f瀽鍚庣殑鍙傛暟:', JSON.stringify(data))
+        let res = this.insertEmergencyPasswordAgreement(data)
+        if (typeof res == 'string') {
+            logger.error('[mqttService] insertEmergencyPassword澶辫触:', res)
+            return reply(event, res, CODE.E_100)
+        }
+        logger.info('[mqttService] insertEmergencyPassword鎴愬姛')
+        return reply(event)
+    } catch (error) {
+        logger.error('[mqttService] insertEmergencyPassword error:', error)
+        return reply(event, { error: error.message }, CODE.E_100)
+    }
+}
+
+/**
+ * 娣诲姞搴旀�ュ紑浠撳瘑鐮侀�氱敤鍗忚鏍煎紡
+ * @param {object} data - 搴旀�ュ紑浠撳瘑鐮佹暟鎹璞�
+ * @returns {boolean|string} true琛ㄧず鎴愬姛锛宻tring琛ㄧず閿欒淇℃伅
+ */
+mqttService.insertEmergencyPasswordAgreement = function (data) {
+    // 搴旀�ュ紑浠撳瘑鐮佸湪璁惧涓粎鏈夊敮涓�鐨�1涓紝鎵�浠ュ厛娓呯┖琛�
+    let deleteRet = sqliteService.d1_emergency_password.deleteAll()
+    if (deleteRet != 0) {
+        return "娓呯┖鏃у瘑鐮佸け璐�: " + deleteRet
+    }
+    
+    // 妫�鏌ュ瘑鐮佹槸鍚︽湁鏁�
+    if (!data.password) {
+        return "password cannot be empty"
+    }
+    
+    // 妫�鏌ュ瘑鐮侀暱搴︽槸鍚﹀ぇ浜庣瓑浜�8浣�
+    if (data.password.length < 8) {
+        return "Password length must be at least 8 digits"
+    }
+    
+    // 鏋勫缓瀵嗙爜璁板綍
+    let record = {}
+    record.id = data.id || 'emergency_' + Date.now() // 濡傛灉娌℃湁id锛岃嚜鍔ㄧ敓鎴�
+    record.password = data.password
+    record.description = data.description || ""
+    record.createTime = Date.now()
+    record.updateTime = Date.now()
+    record.status = data.status || 1
+    
+    // 淇濆瓨瀵嗙爜
+    let ret = sqliteService.d1_emergency_password.save(record)
+    if (ret == 0) {
+        return true
+    } else {
+        return "sql error ret:" + ret
+    }
+}
+
+/**
+ * 鏌ヨ搴旀�ュ紑浠撳瘑鐮�
+ * @param {object} event - MQTT浜嬩欢瀵硅薄
+ */
+mqttService.getEmergencyPassword = function (event) {
+    try {
+        logger.info('[mqttService] 鎺ユ敹鍒癵etEmergencyPassword鍛戒护:', JSON.stringify(event.topic))
+        logger.info('[mqttService] 鍛戒护payload:', event.payload)
+        let payload = JSON.parse(event.payload)
+        let res = this.getEmergencyPasswordAgreement()
+        logger.info('[mqttService] 鏌ヨ缁撴灉:', JSON.stringify(res))
+        return reply(event, res)
+    } catch (error) {
+        logger.error('[mqttService] getEmergencyPassword error:', error)
+        return reply(event, { error: error.message }, CODE.E_100)
+    }
+}
+
+/**
+ * 鏃堕棿鎴宠浆鏃ユ湡瀛楃涓�
+ * @param {number} timestamp - 鏃堕棿鎴�
+ * @returns {string} 鏃ユ湡瀛楃涓诧紝鏍煎紡锛歒YYY-MM-DD HH:MM:SS
+ */
+function timestampToDateString(timestamp) {
+    const date = new Date(timestamp);
+    const year = date.getFullYear();
+    const month = String(date.getMonth() + 1).padStart(2, '0');
+    const day = String(date.getDate()).padStart(2, '0');
+    const hours = String(date.getHours()).padStart(2, '0');
+    const minutes = String(date.getMinutes()).padStart(2, '0');
+    const seconds = String(date.getSeconds()).padStart(2, '0');
+    return `${year}-${month}-${day} ${hours}:${minutes}:${seconds}`;
+}
+
+/**
+ * 鏌ヨ搴旀�ュ紑浠撳瘑鐮侀�氱敤鍗忚鏍煎紡
+ * @returns {object} 鏌ヨ缁撴灉
+ */
+mqttService.getEmergencyPasswordAgreement = function () {
+    let passwords = sqliteService.d1_emergency_password.findAll()
+    if (passwords && passwords.length > 0) {
+        let password = passwords[0];
+        // 杞崲鏃堕棿鎴充负瀛楃涓叉牸寮�
+        password.createTime = timestampToDateString(password.createTime);
+        password.updateTime = timestampToDateString(password.updateTime);
+        return password;
+    }
+    return {};
+}
+
+
+/**
+ * 娓呯┖搴旀�ュ紑浠撳瘑鐮�
+ * @param {object} event - MQTT浜嬩欢瀵硅薄
+ */
+mqttService.clearEmergencyPassword = function (event) {
+    try {
+        logger.info('[mqttService] 鎺ユ敹鍒癱learEmergencyPassword鍛戒护:', JSON.stringify(event.topic))
+        logger.info('[mqttService] 鍛戒护payload:', event.payload)
+        let ret = sqliteService.d1_emergency_password.deleteAll()
+        if (ret == 0) {
+            logger.info('[mqttService] clearEmergencyPassword鎴愬姛')
+            return reply(event)
+        } else {
+            logger.error('[mqttService] clearEmergencyPassword澶辫触:', "sql error ret:" + ret)
+            return reply(event, "sql error ret:" + ret, CODE.E_100)
+        }
+    } catch (error) {
+        logger.error('[mqttService] clearEmergencyPassword error:', error)
+        return reply(event, { error: error.message }, CODE.E_100)
+    }
+}
+
+// =================================瀵嗛挜澧炲垹鏀规煡=================================
+/**
+ * 娣诲姞瀵嗛挜
+ * @param {object} event - MQTT浜嬩欢瀵硅薄
+ */
+mqttService.insertSecurity = function (event) {
+    try {
+        logger.info('[mqttService] 鎺ユ敹鍒癷nsertSecurity鍛戒护:', JSON.stringify(event.topic))
+        logger.info('[mqttService] 鍛戒护payload:', event.payload)
+        let payload = JSON.parse(event.payload)
+        let data = payload.payload && payload.payload.data ? payload.payload.data : {}
+        logger.info('[mqttService] 瑙f瀽鍚庣殑鍙傛暟:', JSON.stringify(data))
+        let res = this.insertSecurityAgreement(data)
+        if (typeof res == 'string') {
+            logger.error('[mqttService] insertSecurity澶辫触:', res)
+            return reply(event, res, CODE.E_100)
+        }
+        logger.info('[mqttService] insertSecurity鎴愬姛')
+        return reply(event)
+    } catch (error) {
+        logger.error('[mqttService] insertSecurity error:', error)
+        return reply(event, { error: error.message }, CODE.E_100)
+    }
+}
+
+/**
+ * 娣诲姞瀵嗛挜閫氱敤鍗忚鏍煎紡
+ * @param {array} data - 瀵嗛挜鏁版嵁鏁扮粍
+ * @returns {boolean|string} true琛ㄧず鎴愬姛锛宻tring琛ㄧず閿欒淇℃伅
+ */
+mqttService.insertSecurityAgreement = function (data) {
+    let securities = []
+    for (let i = 0; i < data.length; i++) {
+        const security = data[i];
+        let record = []
+        record.securityId = security.securityId
+        record.type = security.type
+        record.key = security.key
+        record.value = security.value
+        record.startTime = security.startTime
+        record.endTime = security.endTime
+        securities.push(record)
+    }
+    let ret = sqliteService.d1_security.saveAll(securities)
+    if (ret == 0) {
+        return true
+    } else {
+        return "sql error ret:" + ret
+    }
+}
+
+/**
+ * 鏌ヨ瀵嗛挜
+ * @param {object} event - MQTT浜嬩欢瀵硅薄
+ */
+mqttService.getKey = function (event) {
+    try {
+        logger.info('[mqttService] 鎺ユ敹鍒癵etKey鍛戒护:', JSON.stringify(event.topic))
+        logger.info('[mqttService] 鍛戒护payload:', event.payload)
+        let payload = JSON.parse(event.payload)
+        let data = payload.payload && payload.payload.data ? payload.payload.data : {}
+        logger.info('[mqttService] 瑙f瀽鍚庣殑鏌ヨ鍙傛暟:', JSON.stringify(data))
+        let res = this.getKeyAgreement(data)
+        logger.info('[mqttService] 鏌ヨ缁撴灉:', JSON.stringify(res))
+        return reply(event, res)
+    } catch (error) {
+        logger.error('[mqttService] getKey error:', error)
+        return reply(event, { error: error.message }, CODE.E_100)
+    }
+}
+
+/**
+ * 鏌ヨ瀵嗛挜閫氱敤鍗忚鏍煎紡
+ * @param {object} data - 鏌ヨ鍙傛暟
+ * @returns {object} 鏌ヨ缁撴灉
+ */
+mqttService.getSecurityAgreement = function (data) {
+    data.page = isEmpty(data.page) ? 0 : data.page
+    data.size = isEmpty(data.size) ? 10 : data.size
+    let totalCount = sqliteService.d1_security.count(data)
+    let securities = sqliteService.d1_security.findAll(data)
+    return {
+        content: securities,
+        page: data.page,
+        size: data.size,
+        total: totalCount,
+        totalPage: Math.ceil(totalCount / data.size),
+        count: securities.length
+    }
+}
+
+/**
+ * 鍒犻櫎瀵嗛挜
+ * @param {object} event - MQTT浜嬩欢瀵硅薄
+ */
+mqttService.delSecurity = function (event) {
+    try {
+        logger.info('[mqttService] 鎺ユ敹鍒癲elSecurity鍛戒护:', JSON.stringify(event.topic))
+        logger.info('[mqttService] 鍛戒护payload:', event.payload)
+        let payload = JSON.parse(event.payload)
+        let data = payload.payload && payload.payload.data ? payload.payload.data : {}
+        logger.info('[mqttService] 瑙f瀽鍚庣殑鍙傛暟:', JSON.stringify(data))
+        let res = this.delSecurityAgreement(data)
+        if (typeof res == 'string') {
+            logger.error('[mqttService] delSecurity澶辫触:', res)
+            return reply(event, res, CODE.E_100)
+        }
+        logger.info('[mqttService] delSecurity鎴愬姛')
+        return reply(event)
+    } catch (error) {
+        logger.error('[mqttService] delSecurity error:', error)
+        return reply(event, { error: error.message }, CODE.E_100)
+    }
+}
+
+/**
+ * 鍒犻櫎瀵嗛挜閫氱敤鍗忚鏍煎紡
+ * @param {array} data - 瀵嗛挜ID鏁扮粍
+ * @returns {boolean|string} true琛ㄧず鎴愬姛锛宻tring琛ㄧず閿欒淇℃伅
+ */
+mqttService.delSecurityAgreement = function (data) {
+    if (data.length > 0) {
+        let ret = sqliteService.d1_security.deleteBySecurityIdInBatch(data)
+        if (ret != 0) {
+            return "sql error ret:" + ret
+        }
+    }
+    return true
+}
+
+/**
+ * 娓呯┖瀵嗛挜
+ * @param {object} event - MQTT浜嬩欢瀵硅薄
+ */
+mqttService.clearSecurity = function (event) {
+    try {
+        logger.info('[mqttService] 鎺ユ敹鍒癱learSecurity鍛戒护:', JSON.stringify(event.topic))
+        logger.info('[mqttService] 鍛戒护payload:', event.payload)
+        let ret = sqliteService.d1_key.deleteAll()
+        if (ret == 0) {
+            logger.info('[mqttService] clearSecurity鎴愬姛')
+            return reply(event)
+        } else {
+            logger.error('[mqttService] clearSecurity澶辫触:', "sql error ret:" + ret)
+            return reply(event, "sql error ret:" + ret, CODE.E_100)
+        }
+    } catch (error) {
+        logger.error('[mqttService] clearSecurity error:', error)
+        return reply(event, { error: error.message }, CODE.E_100)
+    }
+}
+
+/**
+ * 杩滅▼鎺у埗
+ * @param {object} event - MQTT浜嬩欢瀵硅薄
+ */
+mqttService.control = function (event) {
+    try {
+        logger.info('[mqttService] 鎺ユ敹鍒癱ontrol鍛戒护:', JSON.stringify(event.topic))
+        logger.info('[mqttService] 鍛戒护payload:', event.payload)
+        let payload = JSON.parse(event.payload)
+        let data = payload.payload.data || {}
+        switch (data.command) {
+            case 0:
+                //閲嶅惎
+                logger.info('[mqttService] 鎵ц閲嶅惎鍛戒护')
+                reply(event)
+                common.asyncReboot(2)
+                return
+            case 1:
+                //杩滅▼寮�闂�
+                logger.info('[mqttService] 鎵ц杩滅▼寮�闂ㄥ懡浠�')
+                driver.gpio.open()
+                break
+            case 4:
+                //閲嶇疆
+                logger.info('[mqttService] 鎵ц閲嶇疆鍛戒护')
+                common.systemBrief("rm -rf /app/data/config/*")
+                common.systemBrief("rm -rf /app/data/db/*")
+                common.systemBrief("rm -rf /app/data/user/*")
+                common.systemBrief("rm -rf /app/data/user/*")
+                common.systemBrief("rm -rf /vgmj.db")
+                reply(event)
+                common.asyncReboot(2)
+                return
+            case 5:
+                //鎾斁璇煶
+                logger.info('[mqttService] 鎵ц鎾斁璇煶鍛戒护')
+                if (data.extra) {
+                    let res = common.systemWithRes(`test -e "/app/code/resource/wav/${data.extra.wav}.wav" && echo "OK" || echo "NO"`, 2)
+                    if (res.includes('OK')) {
+                        driver.alsa.play(`/app/code/resource/wav/${data.extra.wav}.wav`)
+                    }
+                }
+                break
+            case 6:
+                // 6锛氬睆骞曞睍绀哄浘鐗�
+                // TODO
+                logger.info('[mqttService] 鎵ц灞忓箷灞曠ず鍥剧墖鍛戒护')
+                break
+            case 7:
+                // 7锛氬睆骞曞睍绀烘枃瀛�
+                // TODO
+                logger.info('[mqttService] 鎵ц灞忓箷灞曠ず鏂囧瓧鍛戒护')
+                break
+            case 10:
+                logger.info('[mqttService] 鎵ц浜岀淮鐮佸睍绀哄懡浠�')
+                if (!isEmpty(data.extra.qrCodeBase64) && typeof data.extra.qrCodeBase64 == 'string') {
+                    //base64杞浘鐗囦繚瀛�
+                    let src = `/app/code/resource/image/app_qrcode.png`
+                    std.ensurePathExists(src)
+                    common.base64_2binfile(src, data.extra.qrCodeBase64)
+                    logger.info('[mqttService] 浜岀淮鐮佷繚瀛樻垚鍔�')
+                    return reply(event)
+                }
+                break
+            default:
+                logger.info('[mqttService] 鏈煡鍛戒护:', data.command)
+                break
+        }
+        logger.info('[mqttService] control鍛戒护鎵ц瀹屾垚')
+        return reply(event)
+    } catch (error) {
+        logger.error('[mqttService] control error:', error)
+        return reply(event, { error: error.message }, CODE.E_100)
+    }
+}
+
+/**
+ * 鏌ヨ閰嶇疆
+ * @param {object} event - MQTT浜嬩欢瀵硅薄
+ */
+mqttService.getConfig = function (event) {
+    try {
+        logger.info('[mqttService] 鎺ユ敹鍒癵etConfig鍛戒护:', JSON.stringify(event.topic))
+        logger.info('[mqttService] 鍛戒护payload:', event.payload)
+        let payload = JSON.parse(event.payload)
+        let data = payload.payload && payload.payload.data ? payload.payload.data : {}
+        logger.info('[mqttService] 瑙f瀽鍚庣殑鍙傛暟:', JSON.stringify(data))
+        let configAll = config.getAll()
+        let res = {}
+        // 閰嶇疆鍒嗙粍
+        for (const key in configAll) {
+            const value = configAll[key];
+            const keys = key.split(".")
+            if (keys.length == 2) {
+                if (!res[keys[0]]) {
+                    res[keys[0]] = {}
+                }
+                res[keys[0]][keys[1]] = value
+            } else {
+                res[keys[0]] = value
+            }
+        }
+        res.sys = {
+            // 淇濈暀鍘熸湁鐨� sysInfo 涓殑鍏朵粬鍊�
+            ...res.sys,
+            totalmem: common.getTotalmem(),
+            freemem: common.getFreemem(),
+            totaldisk: common.getTotaldisk(),
+            freedisk: common.getFreedisk(),
+            freecpu: common.getFreecpu()
+        };
+        if (isEmpty(data) || typeof data != "string" || data == "") {
+            // 鏌ヨ鍏ㄩ儴
+            logger.info('[mqttService] getConfig鎴愬姛锛岃繑鍥炲叏閮ㄩ厤缃紝閰嶇疆鏁伴噺:', Object.keys(res).length)
+            return reply(event, res)
+        }
+        // 鍗曟潯浠舵煡璇�"data": "mqttInfo.clientId"
+        let keys = data.split(".")
+        let search = {}
+        if (keys.length == 2) {
+            if (res[keys[0]]) {
+                search[keys[0]] = {}
+                search[keys[0]][keys[1]] = res[keys[0]][keys[1]]
+            }
+        } else {
+            search[keys[0]] = res[keys[0]]
+        }
+        logger.info('[mqttService] getConfig鎴愬姛锛岃繑鍥炴寚瀹氶厤缃�:', JSON.stringify(search))
+        return reply(event, search)
+    } catch (error) {
+        logger.error('[mqttService] getConfig error:', error)
+        return reply(event, { error: error.message }, CODE.E_100)
+    }
+}
+
+/**
+ * 淇敼閰嶇疆
+ * @param {object} event - MQTT浜嬩欢瀵硅薄
+ */
+mqttService.setConfig = function (event) {
+    try {
+        logger.info('[mqttService] 鎺ユ敹鍒皊etConfig鍛戒护:', JSON.stringify(event.topic))
+        logger.info('[mqttService] 鍛戒护payload:', event.payload)
+        let payload = JSON.parse(event.payload)
+        let data = payload.payload && payload.payload.data ? payload.payload.data : {}
+        logger.info('[mqttService] 瑙f瀽鍚庣殑鍙傛暟:', JSON.stringify(data))
+        if (!data || typeof data != 'object') {
+            logger.error('[mqttService] setConfig澶辫触: data should not be empty')
+            return reply(event, "data should not be empty", CODE.E_100)
+        }
+        let res = configService.configVerifyAndSave(data)
+        if (typeof res != 'boolean') {
+            // 杩斿洖閿欒淇℃伅
+            logger.error('[mqttService] setConfig澶辫触:', res)
+            return reply(event, res, CODE.E_100)
+        }
+        if (res) {
+            logger.info('[mqttService] setConfig鎴愬姛')
+            return reply(event)
+        } else {
+            logger.error('[mqttService] setConfig澶辫触: unknown failure')
+            return reply(event, "unknown failure", CODE.E_100)
+        }
+    } catch (error) {
+        logger.error('[mqttService] setConfig error:', error)
+        return reply(event, { error: error.message }, CODE.E_100)
+    }
+}
+
+/**
+ * 鍗囩骇鍥轰欢
+ * @param {object} event - MQTT浜嬩欢瀵硅薄
+ */
+mqttService.upgradeFirmware = function (event) {
+    try {
+        logger.info('[mqttService] 鎺ユ敹鍒皍pgradeFirmware鍛戒护:', JSON.stringify(event.topic))
+        logger.info('[mqttService] 鍛戒护payload:', event.payload)
+        let payload = JSON.parse(event.payload)
+        let data = payload.payload && payload.payload.data ? payload.payload.data : {}
+        logger.info('[mqttService] 瑙f瀽鍚庣殑鍙傛暟:', JSON.stringify(data))
+        if (!data || typeof data != 'object' || typeof data.type != 'number' || typeof data.url != 'string' || typeof data.md5 != 'string') {
+            logger.error('[mqttService] upgradeFirmware澶辫触: data\'s params error')
+            return reply(event, "data's params error", CODE.E_100)
+        }
+
+        if (data.type == 0) {
+            try {
+                logger.info('[mqttService] 寮�濮嬪浐浠跺崌绾э紝url:', data.url, 'md5:', data.md5)
+                driver.screen.upgrade({ title: "confirm.upgrade", content: "confirm.upgrading" })
+                ota.updateHttp(data.url, data.md5, 300)
+                driver.screen.upgrade({ title: "confirm.upgrade", content: "confirm.upgradeSuccess" })
+                logger.info('[mqttService] 鍥轰欢鍗囩骇鎴愬姛')
+                reply(event)
+                common.asyncReboot(3)
+                return
+            } catch (error) {
+                logger.error('[mqttService] 鍥轰欢鍗囩骇澶辫触:', error)
+                driver.screen.upgrade({ title: "confirm.upgrade", content: "confirm.upgradeFail" })
+                return reply(event, "upgrade failure", CODE.E_100)
+            }
+        }
+
+        logger.error('[mqttService] upgradeFirmware澶辫触: 涓嶆敮鎸佺殑鍗囩骇绫诲瀷')
+        return reply(event, "upgrade failure", CODE.E_100)
+    } catch (error) {
+        logger.error('[mqttService] upgradeFirmware error:', error)
+        return reply(event, { error: error.message }, CODE.E_100)
+    }
+}
+
+/**
+ * 鏌ヨ璇嗗埆璁板綍
+ * @param {object} event - MQTT浜嬩欢瀵硅薄
+ */
+mqttService.getRecords = function (event) {
+    try {
+        logger.info('[mqttService] 鎺ユ敹鍒癵etRecords鍛戒护:', JSON.stringify(event.topic))
+        logger.info('[mqttService] 鍛戒护payload:', event.payload)
+        let payload = JSON.parse(event.payload)
+        let data = payload.payload && payload.payload.data ? payload.payload.data : {}
+        logger.info('[mqttService] 瑙f瀽鍚庣殑鏌ヨ鍙傛暟:', JSON.stringify(data))
+        let res = this.getRecordsAgreement(data)
+        logger.info('[mqttService] 鏌ヨ缁撴灉:', JSON.stringify(res))
+        return reply(event, res)
+    } catch (error) {
+        logger.error('[mqttService] getRecords error:', error)
+        return reply(event, { error: error.message }, CODE.E_100)
+    }
+}
+
+/**
+ * 灏嗘棩鏈熷瓧绗︿覆杞崲涓烘椂闂存埑锛堢锛�
+ * @param {string} dateString - 鏃ユ湡瀛楃涓诧紝鏍煎紡锛歒YYY-MM-DD HH:MM:SS
+ * @returns {number} 鏃堕棿鎴筹紙绉掞級
+ */
+function dateStringToTimestamp(dateString) {
+    if (!dateString) return null
+    // 灏哬YYY-MM-DD HH:MM:SS鏍煎紡杞崲涓篩YYY-MM-DDTHH:MM:SS鏍煎紡锛屼互渚縩ew Date()姝g‘瑙f瀽
+    const formattedDateString = dateString.replace(' ', 'T')
+    const date = new Date(formattedDateString)
+    return Math.floor(date.getTime() / 1000)
+}
+
+/**
+ * 鏌ヨ璇嗗埆璁板綍閫氱敤鍗忚鏍煎紡
+ * @param {object} data - 鏌ヨ鍙傛暟
+ * @returns {object} 鏌ヨ缁撴灉
+ */
+mqttService.getRecordsAgreement = function (data) {
+    data.page = isEmpty(data.page) ? 0 : data.page
+    data.size = isEmpty(data.size) ? 10 : data.size
+    
+    // 澶勭悊鏃堕棿鍙傛暟锛屽皢瀛楃涓叉牸寮忚浆鎹负鏃堕棿鎴�
+    let startTime = null
+    let endTime = null
+    if (data.startTime) {
+        if (typeof data.startTime === 'string') {
+            startTime = dateStringToTimestamp(data.startTime)
+        } else {
+            startTime = Math.floor(data.startTime / 1000) // 杞崲涓虹绾ф椂闂存埑
+        }
+    }
+    if (data.endTime) {
+        if (typeof data.endTime === 'string') {
+            endTime = dateStringToTimestamp(data.endTime)
+        } else {
+            endTime = Math.floor(data.endTime / 1000) // 杞崲涓虹绾ф椂闂存埑
+        }
+    }
+    
+    // 鏋勫缓鏌ヨ鏉′欢
+    let queryData = {}
+    let nameFilter = null
+    // 澶嶅埗鍏朵粬鏌ヨ鍙傛暟
+    for (const key in data) {
+        if (key !== 'startTime' && key !== 'endTime' && key !== 'name') {
+            queryData[key] = data[key]
+        } else if (key === 'name') {
+            nameFilter = data[key]
+        }
+    }
+    
+    // 鏋勫缓SQL鏉′欢
+    let whereClause = ''
+    if (startTime) {
+        whereClause += `time >= ${startTime} `
+    }
+    if (endTime) {
+        if (whereClause) {
+            whereClause += `AND `
+        }
+        whereClause += `time <= ${endTime} `
+    }
+    
+    // 澶嶅埗鍏朵粬鏉′欢
+    for (const key in queryData) {
+        if (key !== 'page' && key !== 'size') {
+            if (whereClause) {
+                whereClause += `AND `
+            }
+            if (typeof queryData[key] === 'string') {
+                whereClause += `${key} = '${queryData[key]}' `
+            } else {
+                whereClause += `${key} = ${queryData[key]} `
+            }
+        }
+    }
+    
+    // 鎵ц鏌ヨ
+    let totalCount = 0
+    let securities = []
+    try {
+        // 鏋勫缓count SQL
+        let countSql = `SELECT COUNT(*) FROM d1_pass_record `
+        if (whereClause) {
+            countSql += `WHERE ${whereClause} `
+        }
+        countSql += `;`
+        let countResult = sqlite.select(countSql)
+        if (countResult && countResult[0] && countResult[0]['COUNT(*)']) {
+            totalCount = countResult[0]['COUNT(*)']
+        }
+        
+        // 鏋勫缓findAll SQL
+        let findSql = `SELECT * FROM d1_pass_record `
+        if (whereClause) {
+            findSql += `WHERE ${whereClause} `
+        }
+        findSql += `ORDER BY time DESC `
+        if (queryData.page !== undefined && queryData.size !== undefined) {
+            findSql += `LIMIT ${queryData.size} OFFSET ${queryData.page * queryData.size} `
+        }
+        findSql += `;`
+        securities = sqlite.select(findSql)
+    } catch (error) {
+        logger.error('[mqttService] 鏌ヨ璁板綍澶辫触:', error)
+    }
+    
+    // 澶勭悊姣忔潯璁板綍
+    let processedSecurities = securities.map(record => {
+        // 瑙f瀽extra瀛楁
+        let extraData = {}
+        try {
+            if (record.extra && record.extra !== '') {
+                extraData = JSON.parse(record.extra)
+            }
+        } catch (error) {
+            logger.error('[mqttService] 瑙f瀽extra澶辫触:', error)
+        }
+        
+        // 瑙f瀽extra2瀛楁
+        let extra2Data = {}
+        try {
+            if (record.extra2 && record.extra2 !== '') {
+                extra2Data = JSON.parse(record.extra2)
+            }
+        } catch (error) {
+            logger.error('[mqttService] 瑙f瀽extra2澶辫触:', error)
+        }
+        
+        // 鏋勫缓鏂拌褰�
+        return {
+            id: record.id,
+            keyId: record.keyId,
+            permissionId: record.permissionId,
+            permissionId2: record.permissionId2,
+            userId: record.userId,
+            userId2: record.userId2,
+            type: record.type,
+            code: record.code,
+            door: record.door,
+            time: timestampToDateString(record.time * 1000), // 灏嗙绾ф椂闂存埑杞崲涓烘绉掔骇锛屽啀杞崲涓烘棩鏈熷瓧绗︿覆
+            result: record.result,
+            name: extraData.name || '',
+            idCard: extraData.idCard || '',
+            name2: extra2Data.name || '',
+            idCard2: extra2Data.idCard || '',
+            message: record.message
+        }
+    })
+    
+    // 搴旂敤name杩囨护
+    if (nameFilter) {
+        processedSecurities = processedSecurities.filter(record => 
+            record.name.toLowerCase().includes(nameFilter.toLowerCase())
+        )
+        // 鏇存柊鎬绘暟鍜屾�婚〉鏁�
+        totalCount = processedSecurities.length
+    }
+    
+    return {
+        content: processedSecurities,
+        page: data.page,
+        size: data.size,
+        total: totalCount,
+        totalPage: Math.ceil(totalCount / data.size),
+        count: processedSecurities.length
+    }
+}
+
+/**
+ * 鍒犻櫎璁板綍
+ * @param {object} event - MQTT浜嬩欢瀵硅薄
+ */
+mqttService.delRecords = function (event) {
+    try {
+        logger.info('[mqttService] 鎺ユ敹鍒癲elRecords鍛戒护:', JSON.stringify(event.topic))
+        logger.info('[mqttService] 鍛戒护payload:', event.payload)
+        let payload = JSON.parse(event.payload)
+        let data = payload.payload && payload.payload.data ? payload.payload.data : {}
+        logger.info('[mqttService] 瑙f瀽鍚庣殑鍙傛暟:', JSON.stringify(data))
+        let res = this.delRecordsAgreement(data)
+        if (typeof res == 'string') {
+            logger.error('[mqttService] delRecords澶辫触:', res)
+            return reply(event, res, CODE.E_100)
+        }
+        logger.info('[mqttService] delRecords鎴愬姛')
+        return reply(event)
+    } catch (error) {
+        logger.error('[mqttService] delRecords error:', error)
+        return reply(event, { error: error.message }, CODE.E_100)
+    }
+}
+
+/**
+ * 鍒犻櫎璁板綍閫氱敤鍗忚鏍煎紡
+ * @param {object} data - 鍒犻櫎鍙傛暟
+ * @returns {boolean|string} true琛ㄧず鎴愬姛锛宻tring琛ㄧず閿欒淇℃伅
+ */
+mqttService.delRecordsAgreement = function (data) {
+    
+    // 鏍规嵁鏃堕棿鑼冨洿鍒犻櫎璁板綍
+    if (data.startTime || data.endTime) {
+        logger.info('[mqttService] 鏃堕棿鑼冨洿: startTime=' + data.startTime + ', endTime=' + data.endTime)
+        
+        try {
+            // 鏋勫缓鏌ヨ鏉′欢
+            let query = {};
+            if (data.startTime) {
+                query.startTime = data.startTime;
+            }
+            if (data.endTime) {
+                query.endTime = data.endTime;
+            }
+            
+            // 浣跨敤getRecordsAgreement鍑芥暟鐨勬煡璇㈤�昏緫鏉ヨ幏鍙栫鍚堟潯浠剁殑璁板綍
+            let result = mqttService.getRecordsAgreement(query);
+            let records = result.content || [];
+            
+            // 閫愪釜鍒犻櫎璁板綍
+            let deletedCount = 0;
+            for (let record of records) {
+                // 濡傛灉鏄汉鑴歌褰曪紝鍒犻櫎瀵瑰簲鐨勫浘鐗囨枃浠�
+                if (record.type == 300 && record.code) {
+                    try {
+                        common.systemBrief(`rm -rf ${record.code}`);
+                    } catch (error) {
+                        logger.error('[mqttService] 鍒犻櫎鍥剧墖鏂囦欢鍑洪敊: ' + error.message);
+                    }
+                }
+                // 鍒犻櫎璁板綍
+                sqliteService.d1_pass_record.delete({ id: record.id });
+                deletedCount++;
+            }
+            
+            logger.info('[mqttService] 鎴愬姛鍒犻櫎 ' + deletedCount + ' 鏉¤褰�');
+        } catch (error) {
+            logger.error('[mqttService] 鍒犻櫎璁板綍鍑洪敊: ' + error.message);
+            // 蹇界暐閿欒锛岃繑鍥炴垚鍔�
+        }
+    }
+    
+    return true
+}
+/**
+ * 閫氳涓婃姤鍥炲
+ * @param {object} event - MQTT浜嬩欢瀵硅薄
+ */
+mqttService.access_reply = function (event) {
+    try {
+        logger.info('[mqttService] 鎺ユ敹鍒癮ccess_reply鍛戒护:', JSON.stringify(event.topic))
+        logger.info('[mqttService] 鍛戒护payload:', event.payload)
+        let payload = JSON.parse(event.payload)
+        logger.info('[mqttService] 瑙f瀽鍚庣殑鍙傛暟:', JSON.stringify(payload))
+        let serialNo = map.get(payload.serialNo)
+        if (serialNo) {
+            logger.info('[mqttService] 娓呯悊涓存椂鏂囦欢:', serialNo)
+            common.systemBrief(`rm -rf ${serialNo}`)
+            map.del(payload.serialNo)
+        }
+        logger.info('[mqttService] 娓呯┖閫氳璁板綍')
+        sqliteService.d1_pass_record.deleteAll()
+        logger.info('[mqttService] access_reply澶勭悊瀹屾垚')
+    } catch (error) {
+        logger.error('[mqttService] access_reply error:', error)
+    }
+}
+
+/**
+ * 鍦ㄧ嚎楠岃瘉鍥炲
+ * @param {object} raw - MQTT浜嬩欢瀵硅薄
+ */
+mqttService.access_online_reply = function (raw) {
+    try {
+        logger.info('[mqttService] 鎺ユ敹鍒癮ccess_online_reply鍛戒护:', JSON.stringify(raw.topic))
+        logger.info('[mqttService] 鍛戒护payload:', raw.payload)
+        let payload = JSON.parse(raw.payload)
+        logger.info('[mqttService] 瑙f瀽鍚庣殑鍙傛暟:', JSON.stringify(payload))
+        let map = dxMap.get("VERIFY")
+        let data = map.get(payload.serialNo)
+        if (data) {
+            logger.info('[mqttService] 澶勭悊鍦ㄧ嚎楠岃瘉鍥炲锛宻erialNo:', payload.serialNo)
+            map.del(payload.serialNo)
+            driver.mqtt.getOnlinecheckReply(payload)
+        }
+        logger.info('[mqttService] access_online_reply澶勭悊瀹屾垚')
+    } catch (error) {
+        logger.error('[mqttService] access_online_reply error:', error)
+    }
+}
+
+/**
+ * 閿欒浠g爜瀹氫箟
+ */
+const CODE = {
+    // 鎴愬姛
+    S_000: "000000",
+    // 鏈煡閿欒
+    E_100: "100000",
+    // 璁惧宸茶绂佺敤	
+    E_101: "100001",
+    // 璁惧姝e繖锛岃绋嶅悗鍐嶈瘯	
+    E_102: "100002",
+    // 绛惧悕妫�楠屽け璐�	
+    E_103: "100003",
+    // 瓒呮椂閿欒
+    E_104: "100004",
+    // 璁惧绂荤嚎	
+    E_105: "100005",
+}
+mqttService.CODE = CODE
+
+/**
+ * 涓婃姤璁惧淇℃伅鍜岄�氳璁板綍
+ */
+mqttService.report = function () {
+    // 鍦ㄧ嚎涓婃姤
+    let payloadReply = mqttReply(std.genRandomStr(10), {
+        mac: config.get("sys.mac") || '',
+        version: config.get("sys.version"),
+        appVersion: config.get("sys.version"),
+        releaseTime: config.get("sys.createTime"),
+        type: config.get("net.type"),
+    }, CODE.S_000)
+    driver.mqtt.send("access_device/v2/event/connect", JSON.stringify(payloadReply))
+
+    //閫氳璁板綍涓婃姤 - 宸插叧闂�
+    // let res = sqliteService.d1_pass_record.findAll()
+    // if (res.length <= 0) {
+    //     return
+    // }
+    // // 绛涢�夊嚭 type === 300 鐨勫璞★紙浜鸿劯璁板綍锛�
+    // let faceArray = res.filter(item => item.type == 300);
+    // // 绛涢�夊嚭 type !== 300 鐨勫璞★紙鍏朵粬璁板綍锛�
+    // let recordArray = res.filter(item => item.type != 300);
+    // if (recordArray.length > 0) {
+    //     driver.mqtt.send("access_device/v2/event/access", JSON.stringify(mqttReply(std.genRandomStr(10), recordArray, CODE.S_000)))
+    // }
+    // if (faceArray.length > 0) {
+    //     let index = 0
+    //     let timer = std.setInterval(() => {
+    //         let serialNo = std.genRandomStr(10)
+    //         //缂撳瓨鏀惧叆瑕佸垹闄ょ殑浜鸿劯鐓х墖 src
+    //         map.del(serialNo)
+    //         map.put(serialNo, faceArray[index].code)
+    //         
+    //         // 妫�鏌aceArray[index].code鏄惁鏈夋晥
+    //         if (faceArray[index].code) {
+    //             faceArray[index].code = driver.face.fileToBase64(faceArray[index].code)
+    //         } else {
+    //             faceArray[index].code = ""
+    //             logger.info("浜鸿劯璁板綍涓璫ode瀛楁涓虹┖锛岃烦杩嘊ase64杞崲")
+    //         }
+    //         
+    //         driver.mqtt.send("access_device/v2/event/access", JSON.stringify(mqttReply(serialNo, [faceArray[index]], CODE.S_000)))
+    //         index++
+    //         if (!faceArray[index]) {
+    //             std.clearInterval(saveTimer)
+    //             std.clearInterval(timer)
+    //         }
+    //     }, 1000)
+    //     // 姣忛殧500ms妫�鏌ヤ竴娆qtt杩炴帴鐘舵�侊紝濡傛灉鏂紑锛屽垯鍋滄涓婃姤
+    //     let saveTimer = std.setInterval(() => {
+    //         if (!driver.mqtt.getStatus()) {
+    //             std.clearInterval(saveTimer)
+    //             std.clearInterval(timer)
+    //         }
+    //     }, 500)
+    // }
+}
+
+/**
+ * mqtt璇锋眰缁熶竴鍥炲
+ * @param {object} event - MQTT浜嬩欢瀵硅薄
+ * @param {any} data - 鍥炲鏁版嵁
+ * @param {string} code - 閿欒浠g爜
+ */
+function reply(event, data, code) {
+    try {
+        let topic = getReplyTopic(event)
+        let payload = JSON.parse(event.payload)
+        let serialNo = payload.serialNo || std.genRandomStr(10)
+        let reply = JSON.stringify(mqttReply(serialNo, data, isEmpty(code) ? CODE.S_000 : code))
+        driver.mqtt.send(topic, reply)
+    } catch (error) {
+        logger.error('[mqttService] reply error:', error)
+    }
+}
+
+/**
+ * 鑾峰彇鍥炲涓婚
+ * @param {object} data - MQTT浜嬩欢瀵硅薄
+ * @returns {string} 鍥炲涓婚
+ */
+function getReplyTopic(data) {
+    //    return data.topic.replace("/" + config.get("sys.sn"), '') + "_reply";
+    try {
+        let sn = config.get("mqtt.clientId")
+        return data.topic.replace("/" + sn, '') + "_reply";
+    } catch (error) {
+        logger.error('[mqttService] getReplyTopic error:', error)
+        // 鍥為��鍒颁娇鐢ㄥ浐瀹氭牸寮�
+        return data.topic + "_reply"
+    }
+}
+
+/**
+ * mqtt鍥炲鏍煎紡鏋勫缓
+ * @param {string} serialNo - 搴忓垪鍙�
+ * @param {any} data - 鍥炲鏁版嵁
+ * @param {string} code - 閿欒浠g爜
+ * @returns {object} 鍥炲鏍煎紡瀵硅薄
+ */
+function mqttReply(serialNo, data, code) {
+    // 鐢熸垚褰撳墠鏃堕棿鐨勫瓧绗︿覆鏍煎紡
+    const now = new Date();
+    const year = now.getFullYear();
+    const month = String(now.getMonth() + 1).padStart(2, '0');
+    const day = String(now.getDate()).padStart(2, '0');
+    const hours = String(now.getHours()).padStart(2, '0');
+    const minutes = String(now.getMinutes()).padStart(2, '0');
+    const seconds = String(now.getSeconds()).padStart(2, '0');
+    const timeString = `${year}-${month}-${day} ${hours}:${minutes}:${seconds}`;
+    
+    return {
+        serialNo: serialNo,
+        uuid: config.get("sys.uuid"),
+        sign: '',
+        code: code,
+        data: data,
+        time: timeString
+    }
+}
+mqttService.mqttReply = mqttReply
+
+/**
+ * 鑾峰彇鎵�鏈夎闃呯殑topic
+ * @returns {array} 璁㈤槄鐨則opic鍒楄〃
+ */
+mqttService.getTopics = function () {
+    // 鑾峰彇鎵�鏈夎闃呯殑topic
+    let sn = config.get("mqtt.clientId")
+    const topics = [
+        "control", "getConfig", "setConfig", "upgradeFirmware", "test",
+        "getPermission", "insertPermission", "delPermission", "clearPermission",
+        "getKey", "insertKey", "delKey", "clearKey",
+        "getUser", "insertUser", "delUser", "clearUser",
+        "getSecurity", "insertSecurity", "delSecurity", "clearSecurity", "getRecords", "delRecords",
+        "insertEmergencyPassword", "delEmergencyPassword", "clearEmergencyPassword", "getEmergencyPassword"
+    ]
+    const eventReplies = ["connect_reply", "alarm_reply", "access_reply", "access_online_reply"]
+
+    let flag = 'access_device/v2/cmd/' + sn + "/"
+    let eventFlag = 'access_device/v2/event/' + sn + "/"
+    return topics.map(item => flag + item).concat(eventReplies.map(item => eventFlag + item));
+}
+
+/**
+ * 鍒ょ┖鍑芥暟
+ * @param {any} value - 瑕佸垽鏂殑鍊�
+ * @returns {boolean} 鏄惁涓虹┖
+ */
+function isEmpty(value) {
+    return value === undefined || value === null || value === ""
+}
+
+export default mqttService
+
+/*
+`mqttService.getTopics()` 鍑芥暟杩斿洖鐨勬墍鏈� topic 濡備笅锛�
+
+### 鍛戒护 topic锛堢敤浜庢帴鏀舵湇鍔″櫒涓嬪彂鐨勫懡浠わ級锛�
+- `access_device/v2/cmd/{sn}/control` - 鎺у埗鍛戒护
+- `access_device/v2/cmd/{sn}/getConfig` - 鑾峰彇閰嶇疆
+- `access_device/v2/cmd/{sn}/setConfig` - 璁剧疆閰嶇疆
+- `access_device/v2/cmd/{sn}/upgradeFirmware` - 鍥轰欢鍗囩骇
+- `access_device/v2/cmd/{sn}/test` - 娴嬭瘯鍛戒护
+- `access_device/v2/cmd/{sn}/getPermission` - 鑾峰彇鏉冮檺
+- `access_device/v2/cmd/{sn}/insertPermission` - 鎻掑叆鏉冮檺
+- `access_device/v2/cmd/{sn}/delPermission` - 鍒犻櫎鏉冮檺
+- `access_device/v2/cmd/{sn}/clearPermission` - 娓呴櫎鏉冮檺
+- `access_device/v2/cmd/{sn}/getKey` - 鑾峰彇瀵嗛挜
+- `access_device/v2/cmd/{sn}/insertKey` - 鎻掑叆瀵嗛挜
+- `access_device/v2/cmd/{sn}/delKey` - 鍒犻櫎瀵嗛挜
+- `access_device/v2/cmd/{sn}/clearKey` - 娓呴櫎瀵嗛挜
+- `access_device/v2/cmd/{sn}/getUser` - 鑾峰彇鐢ㄦ埛
+- `access_device/v2/cmd/{sn}/insertUser` - 鎻掑叆鐢ㄦ埛
+- `access_device/v2/cmd/{sn}/delUser` - 鍒犻櫎鐢ㄦ埛
+- `access_device/v2/cmd/{sn}/clearUser` - 娓呴櫎鐢ㄦ埛
+- `access_device/v2/cmd/{sn}/getSecurity` - 鑾峰彇瀹夊叏淇℃伅
+- `access_device/v2/cmd/{sn}/insertSecurity` - 鎻掑叆瀹夊叏淇℃伅
+- `access_device/v2/cmd/{sn}/delSecurity` - 鍒犻櫎瀹夊叏淇℃伅
+- `access_device/v2/cmd/{sn}/clearSecurity` - 娓呴櫎瀹夊叏淇℃伅
+- `access_device/v2/cmd/{sn}/getRecords` - 鑾峰彇璁板綍
+- `access_device/v2/cmd/{sn}/delRecords` - 鍒犻櫎璁板綍
+
+### 浜嬩欢鍥炲 topic锛堢敤浜庢帴鏀舵湇鍔″櫒瀵逛簨浠剁殑鍥炲锛夛細
+- `access_device/v2/event/{sn}/connect_reply` - 杩炴帴鍥炲
+- `access_device/v2/event/{sn}/alarm_reply` - 鍛婅鍥炲
+- `access_device/v2/event/{sn}/access_reply` - 閫氳鍥炲
+- `access_device/v2/event/{sn}/access_online_reply` - 鍦ㄧ嚎楠岃瘉鍥炲
+
+鍏朵腑 `{sn}` 鏄澶囩殑搴忓垪鍙凤紝浼氳鏇挎崲涓哄疄闄呯殑璁惧搴忓垪鍙枫��
+*/
\ No newline at end of file

--
Gitblit v1.9.3