63 lines
2.1 KiB
Python
63 lines
2.1 KiB
Python
"""
|
||
设备列表融合:WebSocket + MongoDB + ADB(供 /devices 与多机注册聚合复用)
|
||
"""
|
||
|
||
from typing import Any, Dict, List
|
||
|
||
from services.ws_hub import ws_hub
|
||
from services.device_manager import device_manager
|
||
from services.adb_device import adb_manager
|
||
from services.device_id_util import enrich_device_id_fields
|
||
|
||
|
||
async def list_merged_local_devices() -> List[Dict[str, Any]]:
|
||
"""与 routers.devices.get_devices 逻辑一致,返回设备 dict 列表。"""
|
||
db_devices: List[dict] = []
|
||
try:
|
||
db_devices = await device_manager.get_all_devices()
|
||
except Exception:
|
||
pass
|
||
|
||
online_devices = {d["device_id"]: d for d in ws_hub.get_online_devices()}
|
||
|
||
seen_ids: set = set()
|
||
devices: List[Dict[str, Any]] = []
|
||
|
||
for raw in db_devices:
|
||
device = dict(raw)
|
||
device_id = device["device_id"]
|
||
seen_ids.add(device_id)
|
||
if device_id in online_devices:
|
||
device = {**device, **online_devices[device_id]}
|
||
device["status"] = "online"
|
||
else:
|
||
device["status"] = "offline"
|
||
devices.append(enrich_device_id_fields(device))
|
||
|
||
for device_id, info in online_devices.items():
|
||
if device_id not in seen_ids:
|
||
seen_ids.add(device_id)
|
||
devices.append(enrich_device_id_fields(dict(info)))
|
||
|
||
adb_serials = await adb_manager.async_scan_devices()
|
||
for serial in adb_serials:
|
||
if serial not in seen_ids:
|
||
adb_dev = adb_manager.get_device(serial)
|
||
if adb_dev:
|
||
info = adb_dev.get_info()
|
||
devices.append(
|
||
enrich_device_id_fields(
|
||
{
|
||
"device_id": serial,
|
||
"model": info.get("model", "Unknown"),
|
||
"brand": info.get("brand", "Unknown"),
|
||
"android_version": info.get("android_version", "Unknown"),
|
||
"status": "adb",
|
||
"connection_type": "adb",
|
||
"display": info.get("display", {}),
|
||
}
|
||
)
|
||
)
|
||
|
||
return devices
|