This is an old revision of the document!
Table of Contents
慧飞 CTWing 设备数据工作流 — 冷启动文件
版本: 1.0 | 日期: 2026-08-15 | 用途: 服务器冷启动/重建/新人接手时,按此文件可完整恢复系统
服务器: 腾讯云轻量 lhins-1dai07vu | 公网IP: 82.156.85.124 | 域名: dev.mandolinwu.site(HTTPS)
系统: Ubuntu | 时区: Asia/Shanghai
—
1. 系统总览
设备(4G/NB/土壤) → AEP平台(iot.ctwing.cn) → 北向订阅(定源) → HTTP推送 → 本机Flask接收端(:13543)
↓
SQLite(ctwing.db) → 每日09:00日报 → MySQL(huifei_daily) → 微信推送
↓
H5查询工具(/ctwing/h5) 图表+分析报告+设备台账管理
所有服务 URL:
| 服务 | 地址 |
| —— | —— |
| 设备数据查询 H5 | https://dev.mandolinwu.site/ctwing/h5 |
| 我的世界3D游戏 | https://dev.mandolinwu.site/game/mc |
| 佩奇丛林大冒险 | https://dev.mandolinwu.site/game |
| Halo博客(曼陀林) | http://82.156.85.124:8090(admin/mandolinwu) |
| NocoDB | http://82.156.85.124:8080 |
| RabbitMQ管理台 | http://82.156.85.124:15672 |
2. 核心组件清单
| 组件 | 位置 | 说明 |
| —— | —— | —— |
| Flask接收端 | ~/projects/ctwing-2/receiver_server.py | 接收AEP推送+解析入库+H5 API+游戏 |
| systemd服务 | ctwing-receiver | 端口13543,开机自启 |
| MQ消费端 | ~/projects/ctwing-2/mq_consumer.py | RabbitMQ订阅消费(备用通道) |
| systemd服务 | mq_consumer | 备用通道消费 |
| AEP SDK | ~/projects/ctwing-2/aep_sdk/ | 官方Python SDK(用户提供313302_sdk包) |
| AEP API客户端 | ~/projects/ctwing-2/aep_api.py | 订阅管理(增删设备定源) |
| SQLite | ~/projects/ctwing-2/data/ctwing.db | device_data + monitored_devices台账 |
| 日报脚本 | ~/projects/ctwing-2/db_writer.py + ~/.hermes/scripts/ctwing_daily.sh | 09:00聚合写MySQL+微信推送 |
| Caddy | /etc/caddy/Caddyfile | 80端口反代 /ctwing/*、/game* → 13543;dev.mandolinwu.site HTTPS |
| RabbitMQ | Docker容器 rabbitmq | 5672(AMQP)/15672(管理台),vhost=ctwing |
| MySQL | Docker容器 huifei-mysql | 127.0.0.1:3306,库 huifei_daily(日报)+halo(博客) |
| 二维码 | /home/ubuntu/qrcodes/ | 微信扫码访问用 |
cron定时任务: b3b717e6550f 每天09:00 设备日报(no_agent,先db_writer写MySQL再hermes send推送微信)
3. AEP 开放平台接入(关键!)
凭证(存 ~/.hermes/.env,权限600)
| 产品 | 产品ID | MasterKey变量 | 协议 |
| —— | ——– | ————– | —— |
| 4G智慧球阀 | 17080670 | AEP_VALVE_MASTER_KEY | MQTT |
| NB智慧球阀 | 17070058 | AEP_NB_MASTER_KEY | LWM2M |
| 土壤墒情气象站 | 17197695 | AEP_MASTER_KEY | 其他 |
- 应用凭证(共用): AEP_APP_KEY=IQsPnFznnO7, AEP_APP_SECRET=dbwgP7q7IM - 租户ID: 2000455438(=API域名前缀)
API 接入
- 域名: `https://2000455438.api.ctwing.cn`(租户ID.api.ctwing.cn) - 签名算法(血泪教训,不是MD5!):
code = "application:{AppKey}\ntimestamp:{毫秒时间戳}\n" + 参数行"名:值\n"(按key排序,空值参数也要!) + body + "\n"
signature = Base64(HMAC-SHA1(key=AppSecret, msg=code))
- 时间校准: GET /echo 的 x-ag-timestamp 头 - 订阅管理API(aep_subscribe_north):
- CreateSubscription: POST /subscription version=20181031202018
- DeleteSubscription: DELETE /subscription version=20181031202023
- GetSubscriptionsList: GET /subscribes version=20220624163719
- AEP deviceId = 产品ID + SN(如 17080670+863304082793730) - 定源语义: subLevel 1=产品级(不用!) 2=设备级(用这个) 3=分组级
设备管理原则(用户明确要求)
- 添加设备 → 创建该设备的设备级订阅 - 删除设备 → 删除该设备的订阅 - 禁止产品级订阅(会把全产品设备数据都拉过来) - 删除只允许动 subUrl=http://82.156.85.124:13543/ctwing/receive 的订阅,其他目的地(旧云函数/合作方)绝不删除
4. 设备数据解析(AEP直推格式)
AEP推送信封: `{“deviceId”:“…”,“payload”:{“APPdata”:“<base64>”}}` - APPdata base64解码(latin-1) → 内含SN(18位) + JSON数据体(cmd/bat/csq/mtemp/mcu_press/charge等) - 设备类型按deviceId前缀: 17080670=valve 17070058=nb_valve 17197695=soil - 解析函数: receiver_server.py 的 parse_aep_payload()
5. H5 设备管理工具
- 页面: /ctwing/h5 | API: /ctwing/api/manage(台账) /data(图表数据) /report(分析报告) - 台账表: monitored_devices(sn, name, device_type, product, aep_subscribed, aep_device_id, sub_id) - 功能: 添加/删除设备(自动同步AEP定源) + 4图(电压/信号/温度/压力) + 一键分析报告(HTML下载) - 纯前端Canvas绘图,零外部依赖
6. 日报流程(每天09:00)
1. cron b3b717e6550f 触发 ~/.hermes/scripts/ctwing_daily.sh 2. db_writer.py: SQLite(昨日08:30~今日08:29的meas数据) → MySQL huifei_daily.daily_reports 3. hermes send 微信推送日报+Excel附件 4. 日报窗口: 昨日08:30 ~ 今日08:29
7. 常见运维命令
sudo systemctl restart ctwing-receiver # 重启接收端 sudo systemctl restart mq_consumer # 重启MQ消费端 sudo systemctl restart caddy # 重启反代 sudo caddy reload --config /etc/caddy/Caddyfile docker ps # 查看容器(rabbitmq/huifei-mysql/nocodb/halo) tail -f ~/projects/ctwing-2/data/cron.log # 日报日志
8. 排障速查
| 症状 | 排查 |
| —— | —— |
| 数据没流入 | curl http://localhost:13543/ctwing/health;看AEP订阅列表(GetSubscriptionsList)是否还在 |
| 添加设备报“deviceId不属于该productId” | 该SN未在AEP产品里注册,先到AEP控制台注册设备 |
| 微信打不开链接 | 用 https://dev.mandolinwu.site 域名地址;二维码在 /home/ubuntu/qrcodes/ |
| 日报无数据 | 检查设备是否上报;cron b3b717e6550f 状态;cron.log |
| AEP签名401 | 时间戳偏差>5分钟?用/echo校准;参数含空值?签名要包含全部参数 |
9. 冷启动恢复步骤
1. 装 Docker + 启动容器(rabbitmq/huifei-mysql/nocodb/halo) 2. 装 python3-venv + pip install flask pika pymysql;恢复 ~/projects/ctwing-2 代码与 data/ctwing.db 3. systemd: ctwing-receiver + mq_consumer 启用 4. Caddy 配置(80+443) + 防火墙放行 80/443/13543/8080/8090/5672 5. cron 建 b3b717e6550f(每天09:00) 6. 验证: /ctwing/health → AEP订阅列表 → 等数据入库 → H5页面
