Files
0DMRMaster/api/dmrapi.py
T

101 строка
2.7 KiB
Python
Исполняемый файл

import uvicorn
from datetime import datetime
from fastapi import FastAPI
from fastapi.staticfiles import StaticFiles
from dmrtools.dispatcher import Dispatcher
class DMRApiHelper:
CALLS_MAX = 50
dispatcher: Dispatcher|None = None
@classmethod
def get_peers(cls) -> list:
if cls.dispatcher is None:
return list()
peers = sorted(cls.dispatcher.peer_keeper.peers,
key=lambda p: p.connect_time)
peers_info = [{
"name": p.name,
"peer_id": p.peer_id,
"addr": p.addr_str,
"status": p.status.name,
"connect_time": p.connect_time,
"active_time": p.active_time,
"units": list(p.units.keys()),
"config": p.config} for p in peers]
return peers_info
@classmethod
def get_calls(cls) -> list:
if cls.dispatcher is None:
return list()
calls = sorted(cls.dispatcher.call_keeper.calls_log,
key=lambda c: c.start_time, reverse=True)
# get first CALLS_MAX if more than
if len(calls) > cls.CALLS_MAX:
calls = calls[:cls.CALLS_MAX]
calls_info = [{
"call_id": c.call_id,
"dir": f"{c.src_id}->{c.dst_hr}",
"src_id": c.src_id,
"dst_id": c.dst_id,
"peer_id": c.peer_id,
"call_type": c.call_type.name,
"start_time": c.start_time,
"last_packet_time": c.last_packet_time,
"is_ended": c.is_ended,
"end_time": c.end_time,
"broadcast": c.route_to is None,
"route_to": (list(peer.name for peer in c.route_to)
if c.route_to is not None else []),
"time": f"{c.time:.1f}s"} for c in calls]
return calls_info
# Define FastAPI app
app = FastAPI()
# Mount the "dashboard" directory at /dashboard
app.mount("/dashboard", StaticFiles(directory="dashboard"), name="dashboard")
@app.get("/api/dashboard")
async def get_dashboard():
return {"success": True,
"peers": DMRApiHelper.get_peers(),
"calls": DMRApiHelper.get_calls()}
@app.get("/api/peers")
async def get_peers():
return {"success": True, "peers": DMRApiHelper.get_peers()}
@app.get("/api/calls")
async def get_calls():
return {"success": True, "calls": DMRApiHelper.get_calls()}
async def start_api(host: str, port: int, dispatcher: Dispatcher) -> None:
DMRApiHelper.dispatcher = dispatcher
config = uvicorn.Config(app, host=host, port=port, log_level="error",
loop="asyncio")
server = uvicorn.Server(config)
try:
await server.serve()
except Exception as e:
print(f"start_api: Exception {e}")