YCBox 驱动功能设计
YCBox 自研 MQTT 网关接入 · 物模型建模 · 批量属性上报与控制
YCBox 驱动是 EasyPro 平台用于接入源创自研 YCBox 网关的驱动。YCBox 是一类边缘网关设备,下接各类传感器与执行器,将采集数据通过 MQTT 协议上报到平台云。
YCBox 驱动采用物模型(Thing Model)建模——网关上报的不仅是数据值,还有完整的设备结构(产品/设备/属性),平台据此自动创建设备类型、设备与点位。这是它与通用 MQTT 驱动的核心区别。
YCBox 是平台代码量最大的驱动(54 个 Java 文件),拥有完整的 model 层(base/bo/receive/send)、10 个消息处理器、存储层与丰富的物模型定义。
| 属性 | 值 | 说明 |
|---|---|---|
| 驱动名称 | ycbox | SPI 注册名 |
| 版本 | V 1.1.0 | getDriverVersion() |
| 接入模式 | EMBEDDED | 内嵌于平台主应用 |
| 协议库 | Eclipse Paho MQTT v3 | 同 MQTT 驱动 |
| 通信模型 | 事件驱动(推模式) | 网关主动上报,无轮询 |
| Web 接口 | 2 个 | 查网关 / 绑网关 |
| 定时任务 | 1 个 | 每 10 秒检测实例存活 |
| 协议版本 | 1.0 | 持续版本(CONTINUOUS_VERSION) |
YCBox 物模型采用清晰的四层结构,网关上报时按此结构组织数据:
(Gateway)"] P1[" 产品 A
(Product / 设备类型)"] P2[" 产品 B"] D1[" 设备 1
(Device)"] D2[" 设备 2"] D3[" 设备 3"] A1[" 属性
温度/湿度/开关..."] A2[" 属性"] A3[" 属性"] GW --> P1 GW --> P2 P1 --> D1 P1 --> D2 P2 --> D3 D1 --> A1 D2 --> A2 D3 --> A3 style GW fill:#e8f0fe,stroke:#007aff,stroke-width:2px,color:#1c1c1e style P1 fill:#f0f0f5,stroke:#5856d6,color:#1c1c1e style P2 fill:#f0f0f5,stroke:#5856d6,color:#1c1c1e style D1 fill:#fff4e8,stroke:#ff9500,color:#1c1c1e
| 层级 | 说明 | 平台对应 |
|---|---|---|
| 网关 Gateway | 一个 YCBox 边缘设备 | 一个驱动实例 |
| 产品 Product | 同类设备的抽象(设备类型) | 设备类型(含物模型属性) |
| 设备 Device | 一个具体物理设备 | 一个设备 |
| 属性 Identifier | 设备的一个测点(温度/开关等) | 一个点位 |
物模型属性(Identifier.type)映射为平台点位的数据类型:
| 物模型类型 | 平台类型 |
|---|---|
| float / double | double |
| int | int |
| bool | bool |
| text | text |
| Topic(+ 为网关 ID 通配) | 用途 |
|---|---|
/gw/+/create | 网关上线创建请求 |
/gw/+/heartbeat | 网关心跳 |
/sys/+/subDevice/+/+/property/post | 子设备单条实时属性上报 |
/sys/+/subDevice/+/+/history/post | 子设备单条历史属性补传 |
/sys/+/batch/property/post | 批量实时属性上报(核心) |
/sys/+/batch/history/post | 批量历史属性补传 |
.../set/reply | 设备对下行控制的回复 |
.../status/change | 设备状态变更 |
| Topic({0} 为网关 ID) | 用途 |
|---|---|
/gw/{0}/create/reply | 回复网关创建 |
/sys/{0}/batch/property/set | 批量下行控制 |
方法名:thing.service.subDevice.property.set / thing.service.batch.property.set。
同 MQTT 驱动,YCBox 维护一个共享 Paho 客户端。入站消息经 MqttMessagePipLine 分发给 10 个 handler,每条消息在独立虚拟线程处理:
10 个 handler"] PL --> H1["HeartbeatHandler
心跳"] PL --> H2["BatchPropertyHandler
批量属性上报"] PL --> H3["SinglePropertyHandler
单条属性上报"] PL --> H4["BatchHistoryHandler
批量历史"] PL --> H5["SingleHistoryHandler
单条历史"] PL --> H6["GatewayCreateHandler
网关创建"] PL --> H7["SetReplyHandler
下行回复"] PL --> H8["StatusChangeHandler
状态变更"] PL --> H9["其他..."] style B fill:#e8f0fe,stroke:#007aff,stroke-width:2px,color:#1c1c1e style PL fill:#f0f0f5,stroke:#5856d6,stroke-width:2px,color:#1c1c1e
| 参数 | 值 |
|---|---|
| cleanSession | false |
| connectionTimeout | 30 秒 |
| keepAliveInterval | 20 秒 |
| automaticReconnect | true |
YCBox 网关接入是「两步式」:网关先自荐,用户确认后平台异步拉取完整物模型建实例:
网关绑定后,驱动通过 EMQX HTTP API(/clients/{clientId})解析网关 IP,并兼容 EMQX <4.3 与 ≥4.3 两个版本的 API 差异。
YCBox 网关以批量方式上报属性——一次消息包含多个设备多个属性的最新值,平台 BatchPropertyHandler 解析后批量推送入库。相比单条上报,批量大幅减少消息数与处理开销。
平台下发控制(issuePointValue)时,构建 BatchSet JSON 发布到 /sys/{gateway}/batch/property/set:
下行的 bool 值会被转换为字符串:true → "1"、false → "0",以匹配网关侧的解析约定。
与 MQTT 驱动结构一致,存在 iot_driver_config:
| 配置项 | 说明 |
|---|---|
url | Broker 地址 |
clientId / username / password | 客户端与认证 |
emqApiUrl / emqAppId / emqAppSecret | EMQX HTTP API(解析网关 IP) |
secret / expires / completionTimeout | Token 与超时 |
实例属性由驱动在导入时自动填充:
| 属性名 | 来源 | 说明 |
|---|---|---|
ip | EMQX HTTP API 解析 | 网关客户端 IP |
maker | 驱动默认 | 厂商,默认 "源创" |
YCBox 点位由设备名 + 标识编码唯一定位,唯一码格式:
# 点位唯一码 <...>&&deviceName&&identifierCode
另外,点位的 OrgName 属性保存产品名(编码网关与产品信息)。
| 属性名 | 含义 |
|---|---|
OrgName | 产品名(编码网关+产品) |
| deviceName(唯一码组成) | 设备名 |
| identifierCode(唯一码组成) | 属性标识编码 |
| 映射路径 | 用途 | 参数 |
|---|---|---|
queryGateway | 查询已连接但未绑定项目的网关 | 无参数 |
chooseGateway | 将网关绑定到项目+子系统,触发异步全量导入 | gatewayId, projectId, subsystemId? |
调用路径前缀:POST /driver/api/ycbox/{mapping}。
| 任务名 | Cron | 频率 | 职责 |
|---|---|---|---|
instanceAliveTask | 0/10 * * * * ? | 每 10 秒 | 检测全部 YCBox 实例存活状态(MQTT 在线 + EMQX 在线),推送状态变更 |
/gw/{id}/create 进入 noProjectGatewayCache 后才能被 queryGateway 发现。确认网关 MQTT 配置正确、Broker 连通、且 create 消息已送达。true→"1"、false→"0"。网关侧需按此约定解析。若网关期望的是布尔 JSON 值,需协调两端约定。