目前没有厂商设备协议,HTTP 和 MQTT 供水接入默认关闭,协议适配器为空。不生成模拟在线状态,不自动注册设备,不操作库存、套餐权益或配送任务。
POST /iot/water/report,控制器 app/controller/WaterDeviceController.php。关闭时返回 HTTP 503 和 {"code":503,"message":"设备 HTTP 接口尚未启用","data":null}。MqttSubscriber 接收消息后发送 mqtt.message 事件;config/event.php 注册 DeviceIngress::mqtt,供水开关关闭时直接忽略,不改变原 MQTT 订阅、发布和重连逻辑。app/service/water/DeviceProtocolAdapter.php。未来实现 fromHttp(body,headers) / fromMqtt(topic,payload,properties),把厂商数据转换成内部报告;不相关消息返回 null。app/service/water/DeviceReport.php,仅接受已登记 SN,并检查关联企业、规格启用状态。无需新增数据库表。以下是服务端内部格式,不是对设备厂商协议的预设。暂不提供可直接启用的厂商适配器。
{
"sn": "已登记设备SN",
"kind": "heartbeat",
"reported_at": "2026-09-10 12:00:00"
}
kind=heartbeat:仅更新 sa_water_device.last_seen。时间为北京时间 Y-m-d H:i:s,必须在最近5分钟内且不晚于服务端当前时间。重复、较旧时间不刷新在线状态。kind=usage:额外提供 today_liters(当日累计用水升数,非本次增量,最多两位小数)。仅接收当天报告,同行锁下同日取累计最大值,跨日从新累计值开始;重复或乱序较小值不重复累加。last_seen 判断在线。设备的 today_liters 与 telemetry_date 驱动“今日用水”,不计算账户 daily_liters 或补货预测。新增 sa_water_device_usage 和 WaterDeviceUsage 模型,部署先执行 php scripts/migrate_water_device_usage.php --apply。DeviceReport 在原设备行锁/事务内写入设备当日累计最大值,同日重复或乱序较小报告不累加,跨日保留旧记录。看板30日趋势使用该表;无报告日期保留空缺,不补造往日数据。HTTP/MQTT默认关闭和适配器为空的边界不变。详情参见 WATER_DEVICE_DASHBOARD.md。
config/water_device.php 填写可信的适配器类名并测试,再启用所需通道。HTTP 当前预留给可信设备网关,使用独立的至少32字符 WATER_DEVICE_HTTP_TOKEN(Bearer 头,通过HTTPS传输),不复用管理员JWT;若设备直连,须按真实协议补设备级鉴权。WATER_DEVICE_HTTP_ENABLED,MQTT 使用 WATER_DEVICE_MQTT_ENABLED,MQTT 还需原 MQTT_ENABLED 和 Broker 配置。Windows 需重启相关 HTTP/MQTT 进程加载配置。php tests/water_device_ingress_test.php:30项检查通过,覆盖默认关闭、认证、适配器缺失、消息大小、心跳在线、重复/乱序/过期/未来时间、日累计幂等与跨日、无关Topic及库存权益隔离。数据库测试全部回滚,不启用实际网关或连接 Broker。
HTTP/MQTT 的真实设备收发、身份校验、重放防护和离线协议,待拿到设备后按上述清单联调。
本地验证:php webman route:list 已列出 POST 路由;重启本项目 HTTP 子进程后,实际请求 http://127.0.0.1:8787/iot/water/report 返回 HTTP503。原有 php tests/water_business_test.php 69项也通过,测试数据均回滚。MQTT 通道继续关闭,未来启用时需重启对应进程加载事件配置。