Table of Contents

CTWing 设备数据工作流 — 冷启动文件

版本: 1.1 | 日期: 2026-08-16 | 用途: CTWing 设备数据系统的冷启动/重建/排障手册
服务器: 腾讯云轻量 lhins-1dai07vu | 公网IP: 82.156.85.124 | 域名: dev.mandolinwu.site(ICP备案中)
所属体系: 曼陀林平台(完整平台文档见《曼陀林工作冷启动文件》)

1. 系统链路

设备(4G双头阀/NB球阀/土壤墒情站) → AEP平台(iot.ctwing.cn)
   → 北向订阅(定源,设备级) → HTTP推送 → Flask接收端(:13543)
   → SQLite(ctwing.db) → 每日09:00日报 → MySQL(huifei_daily) → 微信推送
   → H5查询工具(/ctwing/h5: 设备台账管理 + 图表 + 分析报告)
备用通道: RabbitMQ(:5672, vhost=ctwing, 队列ctwing.data) ← MQ消费端(mq_consumer)

访问地址:

服务 地址
————
H5设备查询工具 http://82.156.85.124/ctwing/h5(备案后 https://dev.mandolinwu.site/ctwing/h5
接收端健康检查 http://82.156.85.124:13543/ctwing/health
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台账
日报脚本 db_writer.py + ~/.hermes/scripts/ctwing_daily.sh 09:00聚合写MySQL+微信推送
cron b3b717e6550f 每天09:00 设备日报(no_agent)

3. AEP 开放平台接入(关键)

3.1 凭证(存 ~/.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域名前缀)

3.2 API 接入

- 域名: `https://2000455438.api.ctwing.cn`(租户ID.api.ctwing.cn,open.ctwing.cn 无DNS) - 签名算法(血泪教训,不是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):

  1. CreateSubscription: POST /subscription version=20181031202018
  2. DeleteSubscription: DELETE /subscription version=20181031202023
  3. GetSubscriptionsList: GET /subscribes version=20220624163719

- AEP deviceId = 产品ID + SN(如 17080670+863304082793730) - 返回: {“code”:0,“msg”:“ok”,“result”:…};创建成功 result=null → subId 靠 List 反查

3.3 设备管理原则(用户明确要求)

- 添加设备 → 创建该设备的设备级订阅(subLevel=2) - 删除设备 → 删除该设备的订阅 - 禁止产品级订阅(会把全产品设备数据都拉过来) - 幂等: 已有相同订阅(同deviceId+subUrl)不重复创建 - 安全: 删除只允许动 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()(mq_consumer.py 同款)

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下载) - 产品选择: 4G智慧球阀 / NB智慧球阀 / 土壤墒情气象站(凭证按产品区分) - 纯前端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             # 重启反代
tail -f ~/projects/ctwing-2/data/cron.log  # 日报日志
cd ~/projects/ctwing-2 && ./venv/bin/python -c "import aep_api; print(aep_api.list_subscriptions('4g_valve'))"  # 查AEP订阅

8. 排障速查

症状 排查
————
数据没流入 curl http://localhost:13543/ctwing/health;查AEP订阅列表是否还在
添加设备报“deviceId不属于该productId” 该SN未在AEP产品里注册,先到AEP控制台注册设备
添加设备报“已经存在相同订阅” 设备已有定源(幂等,正常)
日报无数据 检查设备是否上报;cron b3b717e6550f 状态;cron.log
AEP签名401 时间戳偏差>5分钟?用/echo校准;空值参数也要参与签名
微信打不开链接 未备案域名被拦截,用IP+系统浏览器;二维码在 /home/ubuntu/qrcodes/

9. 冷启动恢复步骤

1. 装 Docker + 启动 rabbitmq/huifei-mysql 容器 2. 装 python3-venv + pip install flask pika pymysql;恢复 ~/projects/ctwing-2 代码与 data/ctwing.db 3. systemd: ctwing-receiver + mq_consumer 启用 4. Caddy 配置 + 防火墙放行 80/443/13543/5672 5. cron 建 b3b717e6550f(每天09:00) 6. 验证: /ctwing/health → AEP订阅列表 → 等数据入库 → H5页面