硬件模拟器
可视化 MQTT 虚拟设备模拟工具,物模型驱动,无需真实硬件即可调试完整数据链路。
代码仓库:YunStack-IoT/yunstack-mock-hardware
快速开始
bash
git clone https://github.com/YunStack-IoT/yunstack-mock-hardware.git
cd yunstack-mock-hardware
pnpm install
# Web 可视化模式
node server.js
# 浏览器打开 http://localhost:3456
# CLI 模式(自动化测试)
node cli.js --type relay
node cli.js --type both --count 3 --interval 10
node cli.js --thing-model ./thing-models/p_env_sensor.json两种使用方式
| 场景 | 模式 | 说明 |
|---|---|---|
| 手动测试 / 演示 | Web 界面 | 可视化属性面板、实时日志、OTA 进度 |
| 自动化测试 / CI | CLI | 命令行参数,脚本友好,可批量启动 |
Web 界面功能
- 物模型选择:下拉选择内置模板(继电器/传感器),或粘贴自定义物模型 JSON
- 连接面板:配置 MQTT Broker 地址、ProductKey、PhysicalId、Secret
- 属性面板:实时显示设备属性值,布尔型可点击切换,数值型带单位
- 实时日志流:SSE 实时推送 MQTT 收发消息日志
- OTA 模拟:收到 OTA 通知 → 模拟下载进度 → 安装完成 → 上报结果
- 多设备管理:一个页面管理多个虚拟设备,各自独立连接
CLI 参数
-b, --broker <url> MQTT Broker 地址 (默认: mqtt://localhost:1883)
-t, --type <type> 设备类型: relay | sensor | both
-p, --productKey <key> 产品标识
-n, --count <n> 每类型设备数量 (默认: 1)
-i, --interval <sec> 属性上报间隔秒数 (默认: 5)
-m, --thing-model <路径> 自定义物模型 JSON 文件MQTT 行为模拟
| 行为 | Topic | 方向 | 说明 |
|---|---|---|---|
| 属性上报 | sys/{pid}/{did}/thing/event/property/post | 设备→平台 | 按间隔自动上报 |
| 接收指令 | sys/{pid}/{did}/thing/service/property/set | 平台→设备 | 执行后回复 set_reply + 上报新状态 |
| 配置下发 | sys/{pid}/{did}/thing/config/set | 平台→设备 | 接收逻辑 ID 后更新订阅 |
| OTA 通知 | sys/{pid}/{did}/thing/ota/notify | 平台→设备 | 接收后模拟下载→安装→完成 |
| OTA 进度 | sys/{pid}/{did}/thing/ota/progress | 设备→平台 | 定时上报下载/安装进度 |
物模型格式
json
{
"version": "1.0",
"deviceType": "relay_controller",
"meta": { "name": "四路智能继电器", "description": "..." },
"properties": [
{ "id": "relay_1", "name": "继电器1", "type": "bool", "access": "rw", "ui": { "component": "switch" } },
{ "id": "temperature", "name": "温度", "type": "float", "access": "r", "unit": "°C", "min": -40, "max": 85 }
]
}支持类型:
bool: 布尔开关,偶尔随机翻转float/int: 数值,在 min-max 范围内随机漂移string/enum: 字符串,保持默认值
REST API (Web 模式)
Web 模式下提供完整的 REST API,可被自动化脚本调用:
| 方法 | 路径 | 说明 |
|---|---|---|
| POST | /api/devices | 创建设备 |
| DELETE | /api/devices/:id | 删除设备 |
| POST | /api/devices/:id/connect | 连接 MQTT |
| POST | /api/devices/:id/disconnect | 断开 |
| POST | /api/devices/:id/report | 手动上报 |
| PUT | /api/devices/:id/properties | 修改属性值 |
| PUT | /api/devices/:id/interval | 修改上报间隔 |
| GET | /api/devices | 设备列表 |
| GET | /api/devices/:id | 设备详情(含属性值) |
| GET | /api/devices/:id/logs/stream | SSE 实时日志流 |
| POST | /api/thing-model/import | 导入物模型 |
架构
┌─────────────────────────────────────────┐
│ Web UI (public/) │
│ HTML/CSS/JS → 属性面板/日志/OTA进度 │
├─────────────────────────────────────────┤
│ server.js (Express) │
│ REST API + SSE + 静态文件 │
├─────────────────────────────────────────┤
│ lib/mqtt-client.js │
│ MQTT 连接/订阅/发布/OTA 模拟 │
├─────────────────────────────────────────┤
│ lib/data-generator.js │
│ 物模型驱动的数据生成器 │
└─────────────────────────────────────────┘
↕ MQTT
┌─────────────────┐
│ EMQX Broker │
└─────────────────┘