# 智慧充电桩火灾报警管理平台 — 部署说明

## 生产部署（Windows Server 2022 · 双域名版）

目标架构：
```
互联网 ──Apache 2.4(80/443)──┬─ isfp.szaxwl.cn     → PHP 模块 → AXISFP 源码目录
                             └─ tracker.szaxwl.cn → 反代 http://127.0.0.1:8080（AXCMP Python 服务）
AXCMP 数据库/接口 ← AXISFP（config.php AXCMP_API_URL）
```
- `isfp.szaxwl.cn`：本平台（AXISFP）对外访问域名
- `tracker.szaxwl.cn`：AXCMP 设备接入平台（已在线上 8080 端口运行）；同服务器部署时由 Apache 反代
- 技术栈：**纯 PHP 8.2 + MariaDB/MySQL + Apache 2.4**，不需要 Node.js / Java / Composer
- 视频流媒体（SRS，wrtc.dvr168.org:1985/1990）与 AXCMP 设备接入为外部既有服务，本机无需重复部署

> 说明：Windows 平台推荐 Apache（php_module 模块方式，开发环境 C:\axisfp-stack 已验证同款栈，可直接复制上生产）；Nginx Windows 版无官方服务守护且 php-cgi 不稳定，不建议。

### 一、服务器环境前置依赖检查与安装

目录规划（与开发机一致，便于直接复制迁移）：
```
C:\axisfp-stack\          运行栈根目录
    Apache24\             Apache 2.4
    php\                  PHP 8.2 Thread Safe
    mariadb\              MariaDB（或独立安装 MySQL）
    cert\                 HTTPS 证书
    scripts\              计划任务脚本（vbs）
    tools\nssm\           NSSM（AXCMP 进程守护）
D:\www\axisfp\            AXISFP 代码
D:\www\axcmp\             AXCMP 代码（同机部署时）
```

```powershell
# 1) 系统检查
Get-ComputerInfo -Property OsName, OsVersion, OsArchitecture
tzutil /s "China Standard Time"        # 时区北京时间
Get-NetTCPConnection -LocalPort 80,443,8080 -State Listen -ErrorAction SilentlyContinue   # 端口占用预检

# 2) VC++ 运行库（Apache/PHP 依赖，缺失会导致 httpd 无法启动）
#    下载安装 https://aka.ms/vc14/vc_redist.x64.exe
Invoke-WebRequest "https://aka.ms/vc14/vc_redist.x64.exe" -OutFile "$env:TEMP\vc_redist.x64.exe"
Start-Process "$env:TEMP\vc_redist.x64.exe" -ArgumentList '/install','/quiet','/norestart' -Wait

# 3) Apache 2.4（Apache Lounge VS17/18 版）
#    下载 https://www.apachelounge.com/download/ 的 httpd-x.y.z-Win64-VS17.zip
Expand-Archive "$env:TEMP\httpd-2.4.x.zip" -DestinationPath "C:\axisfp-stack" -Force
#    解压后得到 C:\axisfp-stack\Apache24

# 4) PHP 8.2 Thread Safe（必须 TS 版才带 php8apache2_4.dll）
#    下载 https://windows.php.net/download/ 的 php-8.2.x-Win32-vs16-x64.zip
Expand-Archive "$env:TEMP\php-8.2.x-Win32-vs16-x64.zip" -DestinationPath "C:\axisfp-stack\php" -Force
#    复制 php.ini-production 为 php.ini，并确认/修改：
#      extension_dir = "ext"
#      extension=curl / gd / mbstring / mysqli / openssl / pdo_mysql / fileinfo

# 5) MariaDB 11.x（或 MySQL 8.0，二选一）
#    msi 安装时勾选"作为 Windows 服务安装、开机自启"，设置 root 密码

# 6) win-acme（Let's Encrypt Windows 客户端，用于 HTTPS 证书）
#    下载 https://www.win-acme.com/ 解压到 C:\axisfp-stack\tools\wacs

# 7) NSSM（AXCMP 进程守护，同机部署时）
#    下载 https://nssm.cc/release/nssm-2.24.zip，nssm.exe 放 C:\axisfp-stack\tools\nssm\
```

### 二、项目代码部署与配置文件修改

```powershell
# 1) 上传代码（本机打包后 scp/远程桌面复制均可）
#    目标：D:\www\axisfp\

# 2) 目录权限：给 Apache 运行账户（默认 Local System/Administrators）可写 uploads
icacls "D:\www\axisfp\uploads" /grant "Users:(OI)(CI)M" /T
```

**检查 PHP 文件无 BOM（本项目踩过的坑）：**
```powershell
# 前三字节 3C 3F 70 = 无 BOM（正常）；EF BB BF = 有 BOM（必须剥离，否则 headers already sent）
$b = [IO.File]::ReadAllBytes("D:\www\axisfp\config\config.php")[0..2]
($b | ForEach-Object { $_.ToString('X2') }) -join ' '
# 批量检查 config/ includes/ api/ 下所有 php：
Get-ChildItem "D:\www\axisfp" -Recurse -Filter *.php | ForEach-Object {
    if (([IO.File]::ReadAllBytes($_.FullName)[0..2] -join ' ') -eq '239 187 191') { $_.FullName }
}
```
> 注意：不要用 PowerShell 5.1 的 `Set-Content -Encoding UTF8` 编辑 PHP 文件（会写入 BOM）；用 VSCode（右下角选 UTF-8）或 PHP 脚本改。

**config/config.php 域名/环境相关配置项（部署必改）：**

| 配置项 | 生产值 | 说明 |
|--------|--------|------|
| `DB_HOST` | `127.0.0.1` | 本机 MariaDB/MySQL |
| `DB_NAME` / `DB_USER` / `DB_PASS` | `axisfp` / 专用账号 / 强密码 | **不要用 root 空密码** |
| `AXCMP_API_URL` | 同机：`http://127.0.0.1:8080`<br>异机：`http://tracker.szaxwl.cn:8080` | AXCMP 数据源；同机走回环更稳 |
| `AXCMP_API_TOKEN` | AXCMP 开启 Bearer 鉴权时填写 | |
| `AMAP_KEY` / `AMAP_SECRET` | 高德控制台申请 | **必须在高德控制台把 `isfp.szaxwl.cn` 加入 Key 的域名白名单**，否则地图大屏加载失败 |
| `SMS_*` / `SIM_SDK_*` / `GB_NODE_SECRET` | 按实际第三方填写 | 短信告警、流量卡同步、国标节点 |

**建库与导入：**
```sql
CREATE DATABASE axisfp DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
CREATE USER 'axisfp'@'localhost' IDENTIFIED BY '强密码';
GRANT ALL PRIVILEGES ON axisfp.* TO 'axisfp'@'localhost';
FLUSH PRIVILEGES;
```
```powershell
& "C:\axisfp-stack\mariadb\bin\mysql.exe" -u axisfp -p axisfp -e "source D:/www/axisfp/config/database.sql"
# 初始超管：admin / admin123（上线后立即改密）
```

### 三、服务启动与进程守护

```powershell
# 1) Apache 安装为 Windows 服务（自动启动 + 崩溃后由服务管理器拉起）
& "C:\axisfp-stack\Apache24\bin\httpd.exe" -t          # 先做配置语法测试，必须 Syntax OK
& "C:\axisfp-stack\Apache24\bin\httpd.exe" -k install -n "AXISFPApache"
Start-Service "AXISFPApache"
Get-Service "AXISFPApache"                              # 预期 Running
Set-Service "AXISFPApache" -StartupType Automatic

# 2) MariaDB：msi 安装时已注册服务；zip 版手动注册：
# & "C:\axisfp-stack\mariadb\bin\mysqld.exe" --install MariaDB --defaults-file="C:\axisfp-stack\mariadb\my.ini"
Get-Service MariaDB

# 3) AXCMP 同机部署：NSSM 守护（按 AXCMP 实际入口文件调整）
& "C:\axisfp-stack\tools\nssm\nssm.exe" install AXCMP "C:\Python312\python.exe" "api.py --port 8080"
& "C:\axisfp-stack\tools\nssm\nssm.exe" set AXCMP AppDirectory "D:\www\axcmp"
& "C:\axisfp-stack\tools\nssm\nssm.exe" set AXCMP AppStdout "D:\www\axcmp\logs\out.log"
& "C:\axisfp-stack\tools\nssm\nssm.exe" set AXCMP AppStderr "D:\www\axcmp\logs\err.log"
Start-Service AXCMP
```

### 四、双域名虚拟主机 + HTTPS（Apache 配置）

**httpd.conf 启用模块与 PHP（去掉行首 # 或新增）：**
```apache
LoadModule ssl_module modules/mod_ssl.so
LoadModule rewrite_module modules/mod_rewrite.so
LoadModule proxy_module modules/mod_proxy.so
LoadModule proxy_http_module modules/mod_proxy_http.so
LoadModule headers_module modules/mod_headers.so
Include conf/extra/httpd-ssl.conf
Include conf/extra/httpd-vhosts.conf

# PHP 8.2 模块接入
LoadModule php_module "C:/axisfp-stack/php/php8apache2_4.dll"
PHPIniDir "C:/axisfp-stack/php"
AddType application/x-httpd-php .php

Listen 443
ServerName localhost:80
```

**conf/extra/httpd-vhosts.conf 完整配置：**
```apache
# ====== isfp.szaxwl.cn：AXISFP（PHP 站点） ======
<VirtualHost *:80>
    ServerName isfp.szaxwl.cn
    RewriteEngine On
    RewriteRule ^(.*)$ https://%{HTTP_HOST}$1 [R=301,L]
</VirtualHost>

<VirtualHost *:443>
    ServerName isfp.szaxwl.cn
    DocumentRoot "D:/www/axisfp"

    SSLEngine on
    SSLCertificateFile      "C:/axisfp-stack/cert/isfp.szaxwl.cn-crt.pem"
    SSLCertificateKeyFile   "C:/axisfp-stack/cert/isfp.szaxwl.cn-key.pem"
    SSLProtocol all -SSLv3 -TLSv1 -TLSv1.1

    <Directory "D:/www/axisfp">
        AllowOverride All
        Require all granted
    </Directory>

    # 上传目录禁止执行 PHP（防 webshell）
    <DirectoryMatch "^D:/www/axisfp/uploads/">
        php_admin_flag engine off
    </DirectoryMatch>

    # 上传大小与 config.php UPLOAD_MAX_SIZE 匹配
    LimitRequestBody 12582912

    # 第三方对接 API 建议 IP 白名单（按需启用）
    # <LocationMatch "^/api/thirdparty/">
    #     Require ip 10.0.0.0/8 172.16.0.0/12 192.168.0.0/16
    # </LocationMatch>

    ErrorLog  "logs/isp-error.log"
    CustomLog "logs/isp-access.log" common
</VirtualHost>

# ====== tracker.szaxwl.cn：反代 AXCMP(8080) ======
<VirtualHost *:80>
    ServerName tracker.szaxwl.cn
    RewriteEngine On
    RewriteRule ^(.*)$ https://%{HTTP_HOST}$1 [R=301,L]
</VirtualHost>

<VirtualHost *:443>
    ServerName tracker.szaxwl.cn
    SSLEngine on
    SSLCertificateFile      "C:/axisfp-stack/cert/tracker.szaxwl.cn-crt.pem"
    SSLCertificateKeyFile   "C:/axisfp-stack/cert/tracker.szaxwl.cn-key.pem"
    SSLProtocol all -SSLv3 -TLSv1 -TLSv1.1

    # 设备上报长连接/大 body
    LimitRequestBody 20971520
    ProxyTimeout 120

    ProxyPreserveHost On
    ProxyPass        / http://127.0.0.1:8080/
    ProxyPassReverse / http://127.0.0.1:8080/
    RequestHeader set X-Forwarded-Proto "https"

    ErrorLog  "logs/tracker-error.log"
    CustomLog "logs/tracker-access.log" common
</VirtualHost>
```

> httpd-ssl.conf 中默认的 `Listen 443` 与默认 VirtualHost 需注释掉（避免与 vhosts 冲突），只保留 `SSLSessionCache` 等全局指令；若报"Address already in use"检查两文件是否重复 Listen 443。

**HTTPS 证书（win-acme）：**
```powershell
# 前提：两个域名 DNS A 记录已指向本机公网 IP，80 端口公网可入
cd C:\axisfp-stack\tools\wacs
.\wacs.exe --source manual --host isfp.szaxwl.cn --validation filesystem --store pemfiles --pemfilespath C:\axisfp-stack\cert
.\wacs.exe --source manual --host tracker.szaxwl.cn --validation filesystem --store pemfiles --pemfilespath C:\axisfp-stack\cert
# 证书文件名以实际输出为准（-crt.pem / -key.pem / -chain.pem），与 vhost 配置对应
# win-acme 安装时已自带续期计划任务，可用 wacs.exe --list 查看
```
> 若服务器不满足 Let's Encrypt 验证条件（如 80 端口受限），改用云厂商免费证书（腾讯云/阿里云均可申请 szaxwl.cn 子域名证书），下载 Apache 格式（crt + key + root_chain）放入 `C:\axisfp-stack\cert\`。

```powershell
& "C:\axisfp-stack\Apache24\bin\httpd.exe" -t        # Syntax OK 后重启
Restart-Service "AXISFPApache"
```

### 五、防火墙与安全组端口

| 端口 | 用途 | 开放策略 |
|------|------|----------|
| 3389 | 远程桌面 | 限运维出口 IP（强烈建议） |
| 80 | HTTP（跳转 HTTPS + 证书验证） | 公网开放 |
| 443 | HTTPS 业务入口 | 公网开放 |
| 8080 | AXCMP 原始端口 | **安全组不建议再对公网开放**（已由 443 反代）；如第三方直连，保留并限源 |
| 3306 | MariaDB/MySQL | **不开放**，仅 127.0.0.1 |
| 1985/1990 | SRS 信令 | 在 SRS 服务器（wrtc.dvr168.org）上，本机无需开 |

```powershell
# Windows 防火墙（云服务器建议同时配置安全组）
New-NetFirewallRule -DisplayName "AXISFP-HTTP"  -Direction Inbound -LocalPort 80  -Protocol TCP -Action Allow
New-NetFirewallRule -DisplayName "AXISFP-HTTPS" -Direction Inbound -LocalPort 443 -Protocol TCP -Action Allow
```

DNS：`isfp.szaxwl.cn` 与 `tracker.szaxwl.cn` 的 A 记录均指向本服务器公网 IP。

### 六、定时任务（Windows 计划任务）

脚本统一放 `C:\axisfp-stack\scripts\`，用 vbs 包裹 curl.exe 隐藏窗口（**直接用 powershell -WindowStyle Hidden 会闪窗**，本项目已验证）。

`C:\axisfp-stack\scripts\axisfp-cron.vbs`（一个文件跑全部任务）：
```vbscript
' AXISFP scheduled tasks - run curl fully hidden (window mode 0)
Set sh = CreateObject("WScript.Shell")
sh.Run "curl.exe -s -X POST ""http://127.0.0.1/api/device.php?action=offline_check"" -d ""timeout=90""", 0, True
sh.Run "curl.exe -s ""http://127.0.0.1/api/device.php?action=selftest""", 0, True
sh.Run "curl.exe -s -X POST ""http://127.0.0.1/api/sim.php?action=check_and_alert"" -d ""threshold=80""", 0, True
sh.Run "curl.exe -s -X POST ""http://127.0.0.1/api/gb.php?action=status_sync"" -d ""node_id=1""", 0, True
sh.Run """C:\axisfp-stack\php\php.exe"" ""D:\www\axisfp\cli\sync_device_data.php""", 0, True
```

注册计划任务（每分钟）：
```powershell
schtasks /Create /TN "AXISFP-Cron" /SC MINUTE /MO 1 `
  /TR "wscript.exe \"C:\axisfp-stack\scripts\axisfp-cron.vbs\"" /RU SYSTEM /F
schtasks /Run /TN "AXISFP-Cron"      # 立即试跑一次
schtasks /Query /TN "AXISFP-Cron" /V # 查看上次执行结果
```

> 注意：`offline_check` 等接口仅允许本机调用（127.0.0.1 白名单），必须走回环地址；vbs 文件**不要包含中文注释**且保存为 ANSI/UTF-8 带 BOM 之外的格式（中文 GBK 错位会导致 CreateObject 报错，本项目已验证）。

### 七、部署完成后的验证步骤

```powershell
# 1) 两个域名 HTTPS 可达（预期 HTTP/1.1 200）
curl.exe -I https://isfp.szaxwl.cn/admin/login.php
curl.exe -I https://tracker.szaxwl.cn/

# 2) HTTP 自动跳 HTTPS（预期 301）
curl.exe -I http://isfp.szaxwl.cn/admin/login.php

# 3) API 业务验证（预期返回 {"code":...} JSON 而非 500）
curl.exe -s "https://isfp.szaxwl.cn/api/auth.php?action=info"

# 4) 浏览器登录
#    https://isfp.szaxwl.cn/admin/login.php → admin 登录 → 立即改密
#    https://isfp.szaxwl.cn/screen/map.php   → 地图与点位加载（验证高德 Key 域名白名单）
#    https://isfp.szaxwl.cn/screen/video.php → 三路视频播放（mp4/webrtc/wss-flv）

# 5) 服务与日志
Get-Service "AXISFPApache", "MariaDB"
Get-Content "C:\axisfp-stack\Apache24\logs\isp-error.log" -Tail 20
Get-Content "C:\axisfp-stack\Apache24\logs\tracker-error.log" -Tail 20
# Windows 事件查看器 → Windows 日志 → 应用程序（PHP/Apache 崩溃记录）
```

### 八、常见部署问题排查

| 现象 | 排查方向 |
|------|----------|
| Apache 服务无法启动 | **VC++ Redist 未装**（查事件查看器应用程序日志）；`httpd.exe -t` 看配置语法；443 被占用（`Get-NetTCPConnection -LocalPort 443`，IIS/其他服务冲突则停掉或改端口） |
| 访问 403 | DocumentRoot 路径错误或目录权限缺 `Require all granted`；目录 ACL 未给 Apache 运行账户 |
| PHP 不执行（显示源码/下载） | php_module 未加载、`PHPIniDir` 路径错、PHP 用了 **Non Thread Safe 版**（无 php8apache2_4.dll，必须 TS 版） |
| 页面 500 / headers already sent | **config.php 带 UTF-8 BOM**（EF BB BF），用本文第二节命令批量检查剥离 |
| 数据库连接失败 | 账号密码/库名与 config.php 是否一致；`Get-Service MariaDB` 是否运行；本机 3306 是否监听 |
| 地图大屏空白 / INVALID_USER_KEY | 高德 Key 未绑定 `isfp.szaxwl.cn` 域名白名单，到高德控制台补充 |
| 大屏视频黑屏 | F12 看 wrtc.dvr168.org:1990 信令是否可达（HTTPS 页面走 1990 加密信令）；flv 地址用 `https://` 前缀直接探测 |
| HTTPS 证书申请失败 | DNS 未生效或 80 端口未公网可入：`nslookup isfp.szaxwl.cn` 比对公网 IP；改用云厂商证书 |
| AXCMP 推送告警不达 | AXCMP 侧 `AXISFP_WEBHOOK_URL` 是否指向 `https://isfp.szaxwl.cn/api/alarm.php?action=report`；AXISFP 侧查 `alarm_record` 是否入库 |
| 计划任务不执行 / 控制台闪窗 | `schtasks /Query /V` 看结果码；必须用 wscript+vbs 包裹（隐藏窗口模式 0），不要直接跑 curl/powershell |
| 测试 JSON 接口返回假 400 | PowerShell 5.1 向 curl.exe 传 JSON 会丢内嵌引号，**改用 `Invoke-RestMethod -Body`**（本项目已验证） |
| 中文乱码 | 库表 utf8mb4；PHP 文件 UTF-8 无 BOM；避免 PowerShell 5.1 直接写 SQLite/文件（GBK 双重编码坑） |
| 时间慢 8 小时 | `tzutil /s "China Standard Time"`；config.php 已设 Asia/Shanghai |

---

## 目录结构
```
config/         全局配置与数据库脚本
includes/       公共库（db/auth/permission/response/command/sms/simsdk/gbclient）
api/           全部接口（REST-like，统一响应）
admin/          后台管理（login + index + pages/*）
screen/         大屏（map + video）
app/            App H5（login + index + device + live + alarms + scan）
assets/         静态资源（css/js/img）
uploads/        上传文件目录（需可写）
tests/          脚本
```

## 访问入口

| 入口 | URL 示例 |
|------|----------|
| 后台管理 | `https://isfp.szaxwl.cn/admin/login.php` |
| 地图大屏 | `https://isfp.szaxwl.cn/screen/map.php` |
| 视频大屏 | `https://isfp.szaxwl.cn/screen/video.php` |
| App H5   | `https://isfp.szaxwl.cn/app/login.php` |

## 接口清单

| 模块 | action | 方法 | 说明 |
|------|--------|------|------|
| **auth** | login | POST | 登录（username, password） |
| auth | logout | POST | 登出 |
| auth | info | GET | 当前登录用户信息 |
| auth | change_pwd | POST | 修改密码 |
| **company** | tree | GET | 企业树 |
| company | list | GET | 企业列表（page/pageSize） |
| company | add | POST | 添加企业（parent_id, name） |
| company | edit | POST | 编辑企业（id, name） |
| company | del | POST | 删除企业（id） |
| **user** | list | GET | 用户列表（keyword/company_id/page） |
| user | add | POST | 添加用户 |
| user | edit | POST | 编辑用户 |
| user | del | POST | 删除用户 |
| user | role_list | GET | 角色列表 |
| user | role_add | POST | 添加角色（superadmin 专属） |
| user | role_edit | POST | 编辑角色（superadmin 专属） |
| **unit** | list | GET | 单位列表（keyword/page） |
| unit | add | POST | 添加单位 |
| unit | edit | POST | 编辑单位 |
| unit | del | POST | 删除单位 |
| unit | auth_user | POST | 授权用户（unit_id, user_ids JSON） |
| unit | auth_user_list | GET | 获取已授权用户 |
| **device** | list | GET | 设备列表（keyword/type/unit_id/online） |
| device | get | GET | 设备详情（含联动） |
| device | add | POST | 添加设备 |
| device | edit | POST | 编辑设备 |
| device | del | POST | 删除设备 |
| device | bind_unit | POST | 关联单位 |
| device | command | POST | 指令下发（id, cmd, output_no, source） |
| device | onekey_fire | POST | 一键灭火 |
| device | scan_add | POST | 扫码录入（sn, unit_id, name） |
| device | heartbeat | POST | 设备/网关心跳上报（sn 或 devices JSON 批量，无需登录，SN 鉴权） |
| device | offline_check | POST | 心跳超时自动下线（timeout 秒，仅本机调用） |
| device | command_log | GET | 指令日志 |
| **linkage** | list | GET | 联动列表（trigger_device_id） |
| linkage | add | POST | 添加联动 |
| linkage | edit | POST | 编辑联动 |
| linkage | del | POST | 删除联动 |
| linkage | toggle | POST | 启用/禁用切换 |
| **alarmtask** | list | GET | 告警任务列表 |
| alarmtask | add | POST | 添加任务 |
| alarmtask | edit | POST | 编辑任务 |
| alarmtask | del | POST | 删除任务 |
| alarmtask | bind_devices | POST | 批量关联设备（device_ids JSON） |
| alarmtask | device_list | GET | 获取已关联设备 |
| **alarm** | list | GET | 告警记录（status/device_id/start/end） |
| alarm | confirm | POST | 确认告警（触发手动联动） |
| alarm | reject | POST | 标记误报 |
| alarm | stats | GET | 告警统计 |
| alarm | realtime | GET | 实时未确认告警（last_id） |
| **sim** | list | GET | 流量卡列表（keyword） |
| sim | add | POST | 添加卡号 |
| sim | edit | POST | 编辑卡号 |
| sim | del | POST | 删除卡号 |
| sim | sync | POST | 单卡同步 |
| sim | sync_all | POST | 批量同步 |
| sim | check_and_alert | POST | 用量检查+短信告警 |
| **thirdparty** | list | GET | 凭证列表 |
| thirdparty | add | POST | 添加凭证（name, scope, expire） |
| thirdparty | edit | POST | 编辑凭证 |
| thirdparty | del | POST | 删除凭证 |
| thirdparty | reset_token | POST | 重置 Token |
| thirdparty | device_list | GET | 第三方接口：设备列表（?token=&sub=device_list） |
| thirdparty | alarm_list | GET | 第三方接口：告警列表（?token=&sub=alarm_list） |
| thirdparty | device_data | GET | 第三方接口：单设备数据（?token=&sub=device_data&device_id=） |
| **gb** | node_list | GET | 国标节点列表 |
| gb | node_add | POST | 添加节点 |
| gb | node_edit | POST | 编辑节点 |
| gb | node_del | POST | 删除节点 |
| gb | whitelist | GET | 国标白名单 |
| gb | device_register | POST | 注册设备到国标 |
| gb | device_unregister | POST | 注销国标设备 |
| gb | stream_info | GET | 获取视频流信息 |
| gb | record_list | GET | 录像列表 |
| gb | status_sync | POST | 节点状态同步 |
| gb | callback | POST | 流媒体节点回调 |
| **screen** | map_data | GET | 地图大屏数据（单位+告警+统计） |
| screen | unit_detail | GET | 单位详情（设备+告警） |
| screen | device_curve | GET | 设备曲线（模拟数据） |
| screen | video_list | GET | 摄像头列表（含流地址） |
| screen | realtime_push | GET | 5秒轮询（alarms+online_stats） |
