======= 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): - CreateSubscription: POST /subscription version=20181031202018 - DeleteSubscription: DELETE /subscription version=20181031202023 - 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":""}}` - 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页面