Files
banban/talkingq-url/services/device_auth_manager.py
2026-03-24 15:04:36 +08:00

102 lines
4.2 KiB
Python

import asyncio
from sqlalchemy import select, update, insert
from utils.logger import session_logger
from database.models import DeviceAuth
from services.database_service_base import DatabaseServiceBase
from typing import Optional
class DeviceAuthManager(DatabaseServiceBase):
def __init__(self):
super().__init__(service_name="device_auth")
self.auth_cache = {} # 缓存设备认证信息
self.lock = asyncio.Lock()
async def authenticate_device(self, device_id: str, serial_number: str) -> bool:
"""验证设备凭据"""
await self._init_database()
if device_id in self.auth_cache:
return self.auth_cache[device_id] == serial_number
db_session = await self.get_session()
try:
query = select(DeviceAuth).where(DeviceAuth.device_id == device_id, DeviceAuth.is_active == True)
result = await db_session.execute(query)
device_auth = result.scalar_one_or_none()
if device_auth and device_auth.serial_number == serial_number:
self.auth_cache[device_id] = serial_number
session_logger.info("system", "device_auth", f"设备 {device_id} 验证成功")
return True
session_logger.warning("system", "device_auth", f"设备 {device_id} 验证失败,无效的凭据")
return False
except Exception as e:
session_logger.error("system", "device_auth", f"验证设备 {device_id} 时出错: {str(e)}")
return False
finally:
await db_session.close()
async def register_device(self, device_id: str, serial_number: str, batch_id: str = None, is_active: bool = True) -> bool:
"""注册新设备或更新已有设备"""
await self._init_database()
db_session = await self.get_session()
try:
query = select(DeviceAuth).where(DeviceAuth.device_id == device_id)
result = await db_session.execute(query)
existing_device = result.scalar_one_or_none()
if existing_device:
stmt = update(DeviceAuth).where(
DeviceAuth.device_id == device_id
).values(
serial_number=serial_number,
batch_id=batch_id,
is_active=is_active
)
await db_session.execute(stmt)
else:
stmt = insert(DeviceAuth).values(
device_id=device_id,
serial_number=serial_number,
batch_id=batch_id,
is_active=is_active
)
await db_session.execute(stmt)
await db_session.commit()
self.auth_cache[device_id] = serial_number
session_logger.info("system", "device_auth", f"设备 {device_id} 注册成功,批次: {batch_id}")
return True
except Exception as e:
await db_session.rollback()
session_logger.error("system", "device_auth", f"注册设备 {device_id} 时出错: {str(e)}")
return False
finally:
await db_session.close()
async def get_device_info(self, device_id: str) -> Optional[dict]:
"""获取设备详细信息"""
await self._init_database()
db_session = await self.get_session()
try:
query = select(DeviceAuth).where(DeviceAuth.device_id == device_id)
result = await db_session.execute(query)
device = result.scalar_one_or_none()
if not device:
return None
return {
"device_id": device.device_id,
"serial_number": device.serial_number,
"batch_id": device.batch_id,
"is_active": device.is_active,
"created_at": device.created_at,
"updated_at": device.updated_at
}
except Exception as e:
session_logger.error("system", "device_auth", f"获取设备 {device_id} 信息时出错: {str(e)}")
return None
finally:
await db_session.close()
device_auth_manager = DeviceAuthManager()