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