1
驱动概览
这是什么

YCBox 驱动是 EasyPro 平台用于接入源创自研 YCBox 网关的驱动。YCBox 是一类边缘网关设备,下接各类传感器与执行器,将采集数据通过 MQTT 协议上报到平台云。

YCBox 驱动采用物模型(Thing Model)建模——网关上报的不仅是数据值,还有完整的设备结构(产品/设备/属性),平台据此自动创建设备类型、设备与点位。这是它与通用 MQTT 驱动的核心区别。

规模最大

YCBox 是平台代码量最大的驱动(54 个 Java 文件),拥有完整的 model 层(base/bo/receive/send)、10 个消息处理器、存储层与丰富的物模型定义。

关键事实
属性值说明
驱动名称ycboxSPI 注册名
版本V 1.1.0getDriverVersion()
接入模式EMBEDDED内嵌于平台主应用
协议库Eclipse Paho MQTT v3同 MQTT 驱动
通信模型事件驱动(推模式)网关主动上报,无轮询
Web 接口2 个查网关 / 绑网关
定时任务1 个每 10 秒检测实例存活
协议版本1.0持续版本(CONTINUOUS_VERSION)
2
物模型与拓扑
四层结构

YCBox 物模型采用清晰的四层结构,网关上报时按此结构组织数据:

flowchart TB GW[" 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 / doubledouble
intint
boolbool
texttext
3
Topic 结构
订阅的 Topic(平台接收)
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(平台发送)
Topic({0} 为网关 ID)用途
/gw/{0}/create/reply回复网关创建
/sys/{0}/batch/property/set批量下行控制

方法名:thing.service.subDevice.property.set / thing.service.batch.property.set。

4
整体架构
单客户端 + 10 处理器管线

同 MQTT 驱动,YCBox 维护一个共享 Paho 客户端。入站消息经 MqttMessagePipLine 分发给 10 个 handler,每条消息在独立虚拟线程处理:

flowchart TB B[" MQTT Broker"] --> CB["OnMessageCallback"] CB --> PL["MqttMessagePipLine
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
连接参数
参数值
cleanSessionfalse
connectionTimeout30 秒
keepAliveInterval20 秒
automaticReconnecttrue
5
网关发现与导入
在线发现 + 异步全量导入

YCBox 网关接入是「两步式」:网关先自荐,用户确认后平台异步拉取完整物模型建实例:

sequenceDiagram participant G as YCBox 网关 participant B as Broker participant D as YCBox 驱动 participant U as 用户 participant P as 平台 G->>B: 发布 /gw/{id}/create B->>D: 推送(进入 noProjectGatewayCache) U->>D: 调 chooseGateway (gatewayId, projectId, subsystemId) D->>D: 绑定网关到项目+子系统 D->>P: 异步虚拟线程全量导入 par 异步导入 P->>P: 创建设备类型(含物模型属性) P->>P: 创建设备 P->>P: 创建点位 end D-->>U: 导入成功
IP 自动解析

网关绑定后,驱动通过 EMQX HTTP API(/clients/{clientId})解析网关 IP,并兼容 EMQX <4.3 与 ≥4.3 两个版本的 API 差异。

6
数据上报与下行控制
批量属性上报(核心读路径)

YCBox 网关以批量方式上报属性——一次消息包含多个设备多个属性的最新值,平台 BatchPropertyHandler 解析后批量推送入库。相比单条上报,批量大幅减少消息数与处理开销。

批量下行控制(写路径)

平台下发控制(issuePointValue)时,构建 BatchSet JSON 发布到 /sys/{gateway}/batch/property/set:

布尔值转换

下行的 bool 值会被转换为字符串:true → "1"、false → "0",以匹配网关侧的解析约定。

7
驱动与实例配置
驱动级配置(Broker,YcBoxConfig)

与 MQTT 驱动结构一致,存在 iot_driver_config:

配置项说明
urlBroker 地址
clientId / username / password客户端与认证
emqApiUrl / emqAppId / emqAppSecretEMQX HTTP API(解析网关 IP)
secret / expires / completionTimeoutToken 与超时
实例级属性

实例属性由驱动在导入时自动填充:

属性名来源说明
ipEMQX HTTP API 解析网关客户端 IP
maker驱动默认厂商,默认 "源创"
8
点位属性与唯一码
三点定位唯一码

YCBox 点位由设备名 + 标识编码唯一定位,唯一码格式:

formula
# 点位唯一码
<...>&&deviceName&&identifierCode

另外,点位的 OrgName 属性保存产品名(编码网关与产品信息)。

点位属性
属性名含义
OrgName产品名(编码网关+产品)
deviceName(唯一码组成)设备名
identifierCode(唯一码组成)属性标识编码
9
Web 接口与定时任务
2 个 HTTP API
映射路径用途参数
queryGateway查询已连接但未绑定项目的网关无参数
chooseGateway将网关绑定到项目+子系统,触发异步全量导入gatewayId, projectId, subsystemId?

调用路径前缀:POST /driver/api/ycbox/{mapping}。

定时任务
任务名Cron频率职责
instanceAliveTask0/10 * * * * ?每 10 秒检测全部 YCBox 实例存活状态(MQTT 在线 + EMQX 在线),推送状态变更
10
常见问题
Q1
网关已上线,chooseGateway 找不到?
网关必须先发布 /gw/{id}/create 进入 noProjectGatewayCache 后才能被 queryGateway 发现。确认网关 MQTT 配置正确、Broker 连通、且 create 消息已送达。
Q2
chooseGateway 后设备/点位没创建?
导入是异步执行的虚拟线程流程,需等待网关上报完整的物模型(产品/设备/属性)。若网关在线但迟迟未创建,检查网关是否实际下发了物模型数据,以及平台导入任务日志是否报错。
Q3
YCBox 与通用 MQTT 驱动有什么区别?
核心区别是物模型建模。通用 MQTT 驱动的点位结构由网关自定;YCBox 驱动有标准化的四层物模型(网关→产品→设备→属性),平台据此自动建设备类型/设备/点位,且采用批量上报/批量下发以优化高频场景。YCBox 是源创自研协议(协议版本 1.0)。
Q4
下行 bool 控制网关收到的值不对?
YCBox 驱动会将 bool 转为字符串:true→"1"、false→"0"。网关侧需按此约定解析。若网关期望的是布尔 JSON 值,需协调两端约定。