Files
server/src/managers/DeviceManager.ts

230 lines
5.6 KiB
TypeScript
Raw Normal View History

2026-02-09 16:34:01 +08:00
import Logger from '../utils/Logger'
/**
*
*/
export interface DeviceInfo {
id: string
socketId: string
name: string
model: string
osVersion: string
appVersion: string
appPackage?: string
appName?: string
screenWidth: number
screenHeight: number
capabilities: string[]
connectedAt: Date
lastSeen: Date
status: 'online' | 'offline' | 'busy'
inputBlocked?: boolean
isLocked?: boolean // 设备锁屏状态
remark?: string // 🆕 设备备注
publicIP?: string
// 🆕 新增系统版本信息字段
systemVersionName?: string // 如"Android 11"、"Android 12"
romType?: string // 如"MIUI"、"ColorOS"、"原生Android"
romVersion?: string // 如"MIUI 12.5"、"ColorOS 11.1"
osBuildVersion?: string // 如"1.0.19.0.UMCCNXM"等完整构建版本号
}
/**
*
*/
export interface DeviceStatus {
cpu: number
memory: number
battery: number
networkSpeed: number
orientation: 'portrait' | 'landscape'
screenOn: boolean
}
/**
*
*/
class DeviceManager {
private devices: Map<string, DeviceInfo> = new Map()
private deviceStatuses: Map<string, DeviceStatus> = new Map()
private socketToDevice: Map<string, string> = new Map()
private logger: Logger
constructor() {
this.logger = new Logger('DeviceManager')
}
/**
*
*/
clearAllDevices(): void {
const deviceCount = this.devices.size
this.devices.clear()
this.deviceStatuses.clear()
this.socketToDevice.clear()
this.logger.info(`🧹 已清理所有设备记录: ${deviceCount} 个设备`)
}
/**
*
*/
addDevice(deviceInfo: DeviceInfo): void {
this.devices.set(deviceInfo.id, deviceInfo)
this.socketToDevice.set(deviceInfo.socketId, deviceInfo.id)
this.logger.info(`设备已添加: ${deviceInfo.name} (${deviceInfo.id})`)
}
/**
*
*/
removeDevice(deviceId: string): boolean {
const device = this.devices.get(deviceId)
if (device) {
this.devices.delete(deviceId)
this.deviceStatuses.delete(deviceId)
this.socketToDevice.delete(device.socketId)
this.logger.info(`设备已移除: ${device.name} (${deviceId})`)
return true
}
return false
}
/**
* Socket ID移除设备
*/
removeDeviceBySocketId(socketId: string): boolean {
const deviceId = this.socketToDevice.get(socketId)
if (deviceId) {
return this.removeDevice(deviceId)
}
return false
}
/**
*
*/
getDevice(deviceId: string): DeviceInfo | undefined {
return this.devices.get(deviceId)
}
/**
* Socket ID获取设备
*/
getDeviceBySocketId(socketId: string): DeviceInfo | undefined {
const deviceId = this.socketToDevice.get(socketId)
return deviceId ? this.devices.get(deviceId) : undefined
}
/**
*
*/
getAllDevices(): DeviceInfo[] {
return Array.from(this.devices.values())
}
/**
* 线
*/
getOnlineDevices(): DeviceInfo[] {
return Array.from(this.devices.values()).filter(device => device.status === 'online')
}
/**
*
*/
getDeviceCount(): number {
return this.devices.size
}
/**
*
*/
updateDeviceStatus(socketId: string, status: DeviceStatus): void {
const deviceId = this.socketToDevice.get(socketId)
if (deviceId) {
const device = this.devices.get(deviceId)
if (device) {
device.lastSeen = new Date()
this.deviceStatuses.set(deviceId, status)
this.logger.debug(`设备状态已更新: ${deviceId}`, status)
}
}
}
/**
*
*/
getDeviceStatus(deviceId: string): DeviceStatus | undefined {
return this.deviceStatuses.get(deviceId)
}
/**
*
*/
updateDeviceConnectionStatus(deviceId: string, status: DeviceInfo['status']): void {
const device = this.devices.get(deviceId)
if (device) {
device.status = status
device.lastSeen = new Date()
this.logger.info(`设备连接状态已更新: ${deviceId} -> ${status}`)
}
}
/**
* 线
*/
isDeviceOnline(deviceId: string): boolean {
const device = this.devices.get(deviceId)
return device ? device.status === 'online' : false
}
/**
* Socket ID
*/
getDeviceSocketId(deviceId: string): string | undefined {
const device = this.devices.get(deviceId)
return device?.socketId
}
/**
* 线 ()
*/
cleanupOfflineDevices(timeoutMs: number = 300000): void {
const now = Date.now()
const devicesToRemove: string[] = []
for (const [deviceId, device] of this.devices.entries()) {
if (now - device.lastSeen.getTime() > timeoutMs) {
devicesToRemove.push(deviceId)
}
}
devicesToRemove.forEach(deviceId => {
this.removeDevice(deviceId)
})
if (devicesToRemove.length > 0) {
this.logger.info(`已清理 ${devicesToRemove.length} 个离线设备`)
}
}
/**
*
*/
getDeviceStats(): {
total: number
online: number
offline: number
busy: number
} {
const devices = Array.from(this.devices.values())
return {
total: devices.length,
online: devices.filter(d => d.status === 'online').length,
offline: devices.filter(d => d.status === 'offline').length,
busy: devices.filter(d => d.status === 'busy').length,
}
}
}
export default DeviceManager