# 设备模拟器

设备模拟器用于在真实硬件就绪前运行当前设备智能体：它会按设备规格在浏览器中启动临时设备，连接 MQTT、注册设备、上报状态并响应对话命令，方便先验证设备列表、状态、事件和消息链路。

## 先跑通设备流程

设备模拟器适合在这些阶段使用：

- 创建设备智能体后，快速确认命令、遥测和事件是否符合预期。
- 硬件原型还没有准备好，但需要先验证对话控制和状态展示。
- 接入 SDK 或 MQTT 前，先检查设备规格里的字段、参数和事件设计。
- 演示或联调时，需要一台能立即上线、能被控制的测试设备。

模拟器不会访问真实传感器或执行器，也不会验证固件、驱动、网络和系统权限。它主要用于验证设备智能体和设备规格，真实上线仍需要接入真实设备。

## 启动模拟设备

进入设备智能体工作区，在左侧 **设备** 面板点击 **用模拟设备试试**。弹窗中会显示这台模拟设备的基本信息：

- 设备名称：默认使用当前设备智能体名称生成。
- 设备 ID：默认生成一个 `sim-` 开头的唯一 ID，可以重新生成。
- 连接信息：展开后可以查看命名空间、MQTT Broker、用户名和密码状态。

点击 **模拟连接** 后，浏览器会启动这台模拟设备，连接 MQTT，并向当前设备智能体上报第一条状态和数据。

![启动浏览器模拟设备](../images/docs/device-access/simulator/zh/01-start-simulator.png)

连接成功后，设备列表中会出现带有 **模拟** 标记的设备。选中它后，右侧状态面板会显示：

- 设备在线状态。
- 当前数据。
- 可用命令。
- 最近上报事件。

![模拟设备状态](../images/docs/device-access/simulator/zh/02-simulator-status.png)

## 状态上报

模拟设备会根据设备规格中的遥测字段生成初始状态。如果字段配置了默认值，会优先使用默认值；如果没有默认值，会按字段类型生成一个基础值，例如布尔值为 `false`，数字为 `0`，对象为空对象，数组为空数组，字符串为空字符串。

连接成功后，模拟设备会持续保持 MQTT 连接，并定期上报当前状态。状态面板中的当前数据会随上报内容更新。

如果设备规格中包含 `online` 或 `connected` 字段，模拟设备连接时会把它们更新为 `true`，断开时会更新为 `false`。

## 对话控制

保持模拟设备处于选中状态，在对话区输入控制指令，例如：

```text
把目标温度设置为 24 度，并切换到自动模式。
```

设备智能体会根据设备规格选择命令并生成参数。模拟设备收到命令后，会先校验命令名和参数；校验通过后更新本地状态，并继续上报最新状态。

可以通过这些结果判断命令是否生效：

- 当前数据是否变化。
- 命令是否出现在可用命令中。
- 对话中是否返回命令执行结果。

如果命令名不存在、参数缺失或类型不匹配，模拟设备会返回失败结果。此时通常需要回到设备规格，调整命令名称、参数字段或字段类型。

## 模拟事件

如果设备规格定义了事件，可以在对话中要求模拟设备上报一次事件，例如：

```text
让当前模拟设备上报一次温度过高事件。
```

设备智能体会根据当前设备规格生成符合事件定义的事件消息。事件上报成功后，可以在状态面板的 **最近上报事件** 中查看记录。

事件不会自动写入当前数据。需要改变当前数据时，应同时让模拟设备上报新的状态。

## 断开与重新连接

模拟设备运行在当前浏览器中。关闭页面、刷新页面或点击断开后，它会变为离线。设备列表中可能仍保留这条模拟设备记录，可以继续选择它查看最后一次状态，也可以删除后重新启动一台新的模拟设备。

同一个设备智能体下通常只需要一台浏览器模拟设备。如果需要更换设备 ID，删除旧的模拟设备后重新创建即可。

## 切换到真实设备

| 项目 | 模拟设备 | 真实设备 |
| --- | --- | --- |
| 运行位置 | 当前浏览器 | 设备端固件、网关或后端服务 |
| 状态来源 | 根据设备规格和命令结果生成 | 来自真实传感器、执行器或业务系统 |
| 命令执行 | 更新模拟状态并返回结果 | 控制真实硬件或业务服务 |
| 适合用途 | PoC、演示、调试设备规格 | 生产接入、真实联调和上线 |

## 下一步

- 阅读 [使用设备智能体](../usage/use-device-agent.md)，了解如何选择模拟设备并通过对话控制。
- 阅读 [SDK 接入](./sdk-generation.md)，把同一份设备规格接入真实硬件。
- 阅读 [MQTT 接入](./mqtt.md)，了解真实设备和模拟设备共用的主题与消息体约定。
