#!/usr/bin/env python3 """ 模拟告警服务器 用于测试 RK3588 Media Server 的 alarm 节点 external_api 功能 提供两个接口: 1. POST /api/getToken - 获取访问令牌 2. POST /api/putMessage - 接收告警信息 使用方法: python3 mock_alarm_server.py 默认监听:0.0.0.0:8080 """ from flask import Flask, request, jsonify from datetime import datetime import json import sys app = Flask(__name__) # 模拟 token 存储 - 使用纯ASCII字符,避免转义问题 mock_token = "mocktoken123456789abcdef123456789" token_expire_time = 30 * 60 # 30分钟过期时间(秒) # 统计信息 stats = { "token_requests": 0, "alarm_requests": 0, "last_alarm": None } @app.route('/api/getToken', methods=['POST']) def get_token(): """ 模拟获取 token 接口 返回格式与 d8_1.py 中一致 """ stats["token_requests"] += 1 # 打印请求信息 print(f"\n[{datetime.now().strftime('%Y-%m-%d %H:%M:%S')}] 收到 Token 请求") # 简化的响应,纯ASCII,避免转义问题 response = { "errorDesc": "", "message": "", "responseBody": { "expireTime": str(token_expire_time), "token": mock_token, "refreshToken": mock_token + "_refresh" }, "retCode": "200" } # 手动序列化并打印原始JSON raw_json = json.dumps(response, ensure_ascii=True) print(f" 返回 JSON: {raw_json}") # 返回纯文本JSON,避免Flask jsonify的额外处理 return raw_json, 200, {'Content-Type': 'application/json'} @app.route('/api/putMessage', methods=['POST']) def put_message(): """ 模拟接收告警信息接口 接收格式与 d8_1.py 中 send_post_request 一致 """ stats["alarm_requests"] += 1 # 获取请求头中的 token token = request.headers.get('X-Access-Token', 'None') # 解析请求体 try: data = request.json if request.is_json else json.loads(request.data) except: data = {} # 打印告警信息 print(f"\n[{datetime.now().strftime('%Y-%m-%d %H:%M:%S')}] 收到告警信息") print(f" Token: {token[:30]}...") print(f" 租户代码: {data.get('tenantCode', 'N/A')}") print(f" 频道号: {data.get('channelNo', 'N/A')}") print(f" 告警内容: {data.get('alarmContent', 'N/A')}") print(f" 告警时间: {data.get('alarmTime', 'N/A')}") # 打印图片/视频信息 pic_info = data.get('picInfo', []) video_info = data.get('videoInfo', []) if pic_info: print(f" 图片地址: {len(pic_info)} 张") for i, pic in enumerate(pic_info[:3]): # 只打印前3个 print(f" [{i+1}] {pic.get('url', 'N/A')}") if len(pic_info) > 3: print(f" ... 还有 {len(pic_info) - 3} 张") if video_info: print(f" 视频地址: {len(video_info)} 个") for i, video in enumerate(video_info[:3]): print(f" [{i+1}] {video.get('url', 'N/A')}") # 更新统计 stats["last_alarm"] = { "time": datetime.now().strftime('%Y-%m-%d %H:%M:%S'), "content": data.get('alarmContent', 'N/A'), "channel": data.get('channelNo', 'N/A') } # 返回成功响应 response = { "responseBody": "1", "message": None, "retCode": "200", "errorDesc": None } print(f" 响应: 告警接收成功") return jsonify(response) @app.route('/stats', methods=['GET']) def get_stats(): """查看统计信息""" return jsonify({ "token_requests": stats["token_requests"], "alarm_requests": stats["alarm_requests"], "last_alarm": stats["last_alarm"] }) @app.route('/', methods=['GET']) def index(): """首页说明""" return """
可用接口:
当前统计: