import log from '../dxmodules/dxLogger.js'
|
import std from '../dxmodules/dxStd.js'
|
import dxCommon from '../dxmodules/dxCommon.js'
|
import bus from '../dxmodules/dxEventBus.js'
|
import driver from './driver.js'
|
import pool from '../dxmodules/dxWorkerPool.js'
|
import config from '../dxmodules/dxConfig.js'
|
import * as os from "os"
|
import dxDriver from '../dxmodules/dxDriver.js'
|
import sqliteService from './service/sqliteService.js'
|
|
let topics = [
|
"recognition",
|
"bleCallback",
|
driver.gpiokey.RECEIVE_MSG,
|
"access",
|
"setConfig",
|
driver.nfc.NFC_CARD_RECEIVE,
|
driver.nfc.EID_RECEIVE,
|
driver.mqtt.CONNECTED_CHANGED,
|
driver.mqtt.RECEIVE_MSG,
|
driver.uartCode.RECEIVE_MSG,
|
"code",
|
driver.finger.RECEIVE_MSG
|
]
|
|
function initController() {
|
driver.config.init()
|
driver.gpio.init()
|
driver.watchdog.init()
|
driver.audio.init()
|
driver.gpiokey.init()
|
if (dxDriver.DRIVER.MODEL == "vf202") {
|
driver.uartBle.init()
|
}
|
if (!driver.device.finger && (dxDriver.DRIVER.MODEL == "vf105" || dxDriver.DRIVER.MODEL == "vf114")) {
|
driver.uartCode.init()
|
}
|
driver.net.init()
|
driver.sqlite.init()
|
if (dxDriver.DRIVER.MODEL != "vf105" || std.loadFile('/etc/app/nfc.conf')) {
|
driver.nfc.init()
|
driver.nfc.eidInit()
|
}
|
driver.pwm.init()
|
driver.mqtt.init()
|
driver.ntp.init()
|
if(driver.device.finger){
|
driver.finger.init()
|
}
|
}
|
|
// 清理未绑定的凭证信息
|
function cleanupUnboundVouchers() {
|
try {
|
log.info("[cleanup]: 开始清理未绑定的凭证信息")
|
// 查询所有凭证
|
const vouchers = sqliteService.d1_voucher.findAll()
|
if (vouchers && vouchers.length > 0) {
|
let deletedCount = 0
|
// 用于记录需要删除人脸特征的用户ID
|
const userIdsToDeleteFace = new Set()
|
// 用于记录有效的指纹ID
|
const validFingerIds = new Set()
|
|
for (const voucher of vouchers) {
|
// 检查userId是否存在于d1_person表中
|
const person = sqliteService.d1_person.findByUserId(voucher.userId)
|
if (!person || person.length === 0) {
|
// 删除未绑定的凭证
|
const result = sqliteService.d1_voucher.deleteByKeyId(voucher.keyId)
|
if (result === 0) {
|
deletedCount++
|
log.info(`[cleanup]: 删除未绑定的凭证,keyId: ${voucher.keyId}, userId: ${voucher.userId}, type: ${voucher.type}`)
|
|
// 根据凭证类型进行相应的设备清理
|
if (voucher.type === "500" && driver.device.finger) {
|
// 指纹凭证,从设备中删除指纹
|
try {
|
const fingerId = parseInt(voucher.code)
|
if (!isNaN(fingerId)) {
|
const deleteResult = driver.finger.delete(fingerId)
|
log.info(`[cleanup]: 从设备中删除指纹,fingerId: ${fingerId}, result: ${deleteResult}`)
|
}
|
} catch (error) {
|
log.error(`[cleanup]: 删除指纹时发生错误:`, error)
|
}
|
} else if (voucher.type === "300") {
|
// 人脸凭证,记录用户ID以便后续删除人脸特征
|
userIdsToDeleteFace.add(voucher.userId)
|
} else if (voucher.type === "200") {
|
// 卡片凭证,记录删除信息
|
log.info(`[cleanup]: 删除未绑定的卡片凭证,code: ${voucher.code}`)
|
} else if (voucher.type === "400") {
|
// 密码凭证,记录删除信息
|
log.info(`[cleanup]: 删除未绑定的密码凭证`)
|
}
|
}
|
} else if (voucher.type === "500") {
|
// 记录有效的指纹ID
|
try {
|
const fingerId = parseInt(voucher.code)
|
if (!isNaN(fingerId)) {
|
validFingerIds.add(fingerId)
|
}
|
} catch (error) {
|
log.error(`[cleanup]: 解析指纹ID时发生错误:`, error)
|
}
|
}
|
}
|
|
// 删除未绑定用户的人脸特征
|
for (const userId of userIdsToDeleteFace) {
|
try {
|
const deleteResult = driver.face.deleteFea(userId)
|
log.info(`[cleanup]: 从设备中删除人脸特征,userId: ${userId}, result: ${deleteResult}`)
|
// 清理用户目录
|
dxos.systemBrief(`rm -rf /data/user/${userId}`)
|
} catch (error) {
|
log.error(`[cleanup]: 删除人脸特征时发生错误:`, error)
|
}
|
}
|
|
// 删除系统中非凭证的指纹信息
|
if (driver.device.finger) {
|
try {
|
log.info("[cleanup]: 开始清理系统中非凭证的指纹信息")
|
|
// 记录需要保留的指纹ID
|
const validFingerArray = Array.from(validFingerIds);
|
log.info(`[cleanup]: 需要保留的指纹ID: ${validFingerArray.join(', ')}`)
|
|
// 对于指纹清理,我们采用更高效的策略:
|
// 1. 如果没有需要保留的指纹,直接清理所有指纹
|
// 2. 如果有需要保留的指纹,只清理非凭证指纹
|
if (validFingerArray.length === 0) {
|
// 没有需要保留的指纹,直接清理所有指纹
|
log.info("[cleanup]: 没有需要保留的指纹,清理所有指纹")
|
const clearResult = driver.finger.clear()
|
log.info(`[cleanup]: 清理所有指纹结果: ${clearResult}`)
|
} else {
|
// 有需要保留的指纹,只清理非凭证指纹
|
// 注意:由于ZAZ指纹模块的限制,我们只能尝试删除非凭证指纹
|
// 但会捕获错误以避免日志污染
|
log.info("[cleanup]: 执行指纹清理,只保留有效的指纹凭证")
|
|
// 对于ZAZ指纹模块,我们可以使用更智能的方式
|
// 由于我们已经知道有效的指纹ID,我们可以只关注这些ID
|
// 这里我们不遍历所有可能的指纹ID,而是只处理可能存在的指纹
|
// 假设指纹ID是连续分配的,我们只检查到最大的有效指纹ID
|
const maxFingerId = Math.max(...validFingerArray);
|
log.info(`[cleanup]: 最大的有效指纹ID: ${maxFingerId}`)
|
|
let deletedNonValidCount = 0;
|
// 只检查到最大有效指纹ID的范围,减少不必要的操作
|
for (let i = 1; i <= Math.min(maxFingerId + 10, 1024); i++) {
|
// 检查指纹ID是否在有效的指纹ID集合中
|
if (!validFingerIds.has(i)) {
|
try {
|
// 尝试删除非凭证的指纹
|
const deleteResult = driver.finger.delete(i)
|
if (deleteResult === 0) {
|
deletedNonValidCount++
|
log.info(`[cleanup]: 从设备中删除非凭证指纹,fingerId: ${i}`)
|
}
|
} catch (error) {
|
// 忽略删除不存在指纹的错误
|
}
|
}
|
}
|
log.info(`[cleanup]: 系统中非凭证的指纹信息清理完成,共删除 ${deletedNonValidCount} 个非凭证指纹`)
|
}
|
} catch (error) {
|
log.error(`[cleanup]: 清理系统中非凭证的指纹信息时发生错误:`, error)
|
}
|
}
|
|
log.info(`[cleanup]: 清理完成,共删除 ${deletedCount} 个未绑定的凭证`)
|
} else {
|
log.info("[cleanup]: 没有凭证需要清理")
|
|
// 如果没有凭证,清理所有指纹
|
if (driver.device.finger) {
|
try {
|
log.info("[cleanup]: 没有凭证,清理所有指纹")
|
const clearResult = driver.finger.clear()
|
log.info(`[cleanup]: 清理所有指纹结果: ${clearResult}`)
|
} catch (error) {
|
log.error(`[cleanup]: 清理所有指纹时发生错误:`, error)
|
}
|
}
|
}
|
} catch (error) {
|
log.error("[cleanup]: 清理未绑定凭证时发生错误:", error)
|
}
|
}
|
|
(function () {
|
bus.newWorker('screen', '/app/code/src/worker/screenWorker.js')
|
initController()
|
// 通行记录上报独立线程(依赖 sqlite/mqtt 初始化完成)
|
bus.newWorker('passRecord', '/app/code/src/worker/passRecordWorker.js')
|
bus.newWorker('controller', '/app/code/src/controller.js')
|
bus.newWorker('httpServer', '/app/code/src/service/httpService.js')
|
pool.init('/app/code/src/services.js', bus, topics, 5, 100)
|
|
// 清理未绑定的凭证信息
|
cleanupUnboundVouchers()
|
|
let appVersion
|
let releaseTime
|
if (dxDriver.DRIVER.MODEL == "vf202") {
|
appVersion = 'vf202_v12_access_2.0.2'
|
releaseTime = '2026-01-09 13:00:00'
|
} else if (dxDriver.DRIVER.MODEL == "vf203") {
|
appVersion = 'vf203_v14_access_2.0.2'
|
releaseTime = '2026-02-04 14:30:00'
|
} else if (dxDriver.DRIVER.MODEL == "vf114") {
|
if(driver.device.finger) {
|
appVersion = 'vf124_v12_access_2.0.2'
|
releaseTime = '2026-03-19 13:00:00'
|
} else {
|
appVersion = 'vf114_v12_access_2.0.2'
|
releaseTime = '2026-01-09 13:00:00'
|
}
|
} else if (dxDriver.DRIVER.MODEL == "vf105") {
|
if(driver.device.finger) {
|
appVersion = 'vf107_v12_access_2.0.2.1'
|
releaseTime = '2026-03-19 13:00:00'
|
} else {
|
appVersion = 'vf105_v12_access_2.0.2'
|
releaseTime = '2026-01-09 13:00:00'
|
}
|
}
|
config.setAndSave('sys.version', appVersion)
|
config.setAndSave('sys.appVersion', appVersion)
|
config.setAndSave('sys.releaseTime', releaseTime)
|
log.info("=================== version:" + appVersion + " ====================")
|
})();
|
|
std.setInterval(() => {
|
try {
|
driver.watchdog.restart(driver.watchdog.MAIN_WORKER)
|
} catch (error) {
|
log.error(error)
|
}
|
}, 3000)
|
|
// std.setInterval(() => {
|
// os.exec(["free", "-k"])
|
// os.exec(["uptime"])
|
// }, 6000);
|