通过网盘分享的文件:物联网平台.zip
链接: https://pan.baidu.com/s/1KQUDfIR1QLjROQbR3enMSw?pwd=vstp 提取码: vstp
夸克:
链接:夸克网盘分享
提取码:ZsVG




> 适用版本:v2.0(基于 iot-platform.exe 单文件部署)
> 本手册面向平台使用者(管理员与普通用户),涵盖运行部署、端口修改、物模型、设备接入、数据导出、用户管理等日常操作。
1. 平台简介
本平台是一个**单文件部署**的轻量级物联网数据平台,包含:
| 组成 | 说明 | 默认端口 |
|------|------|----------|
| Web 管理端 | 浏览器访问,管理产品、设备、数据、账号 | 8000 |
| MQTT Broker | 内置 MQTT 消息代理,设备直接接入(支持 3.1.1 / 5.0) | 1883 |
主要功能:
-
产品与物模型管理(属性定义、表达式运算、命令下发)
-
设备接入与鉴权(设备号 + 密码,MQTT 连接时认证)
-
实时数据上报 / 历史数据补传(携带时间戳)
-
数据查看、曲线展示、CSV 导出
-
多级账号体系(超级管理员 → 管理员 → 普通账号 → 子账号)
-
登录传输加密(RSA 非对称加密 + 时间戳 + 盐,浏览器端自动完成,无需配置)
2. 运行与停止
2.1 运行
-
将 `iot-platform.exe` 复制到目标电脑任意目录(如 `D:\iot\`)。
-
双击运行,会弹出一个控制台窗口(显示运行日志,**请勿关闭**,关闭即停止服务)。
-
首次运行会自动在同目录生成:
-
`config.json` ------ 配置文件
-
`iot.db` ------ SQLite 数据库(**AES-256 整机加密存储**,所有数据都存这里)
-
`db.key` ------ **数据库密钥文件**(256-bit 随机密钥,请与 iot.db 一并妥善保管,切勿泄露)
-
`logs\` ------ 日志目录
-
在浏览器访问:`http://本机IP:8000`(本机可用 `http://localhost:8000`)。
-
默认管理员账号:
| 用户名 | 密码 |
|--------|--------|
| admin | admin123 |
> **首次登录后请立即修改密码**(见 2.3)。
2.2 防火墙放行
局域网其他电脑/设备要访问平台,需在服务器电脑放行两个端口:
-
**TCP 8000**(网页访问)
-
**TCP 1883**(设备 MQTT 接入)
Windows 操作:控制面板 → Windows Defender 防火墙 → 高级设置 → 入站规则 → 新建规则 → 端口 → 填入 `8000,1883` → 允许连接。
2.3 修改密码与退出
-
登录后点击页面**右上角用户名** → 「修改密码」→ 输入原密码和新密码 → 确定。
-
点击右上角用户名 → 「退出登录」。
-
安全策略:**超过 10 分钟无操作自动退出登录**,重新登录即可。
2.4 停止服务
关闭 EXE 的控制台窗口,或在任务管理器结束 `iot-platform.exe` 进程。
3. 修改端口号
-
停止服务(关闭控制台窗口)。
-
用记事本打开 EXE 同目录下的 `config.json`:
```json
{"web_port": 8000, "mqtt_port": 1883}
```
-
`web_port`:网页访问端口(如改为 8080)
-
`mqtt_port`:设备 MQTT 接入端口(如改为 1884)
-
保存文件,重新运行 EXE。
-
用新端口访问,例如 `http://本机IP:8080`;设备端 MQTT 连接端口也要同步修改。
-
若修改了端口,防火墙放行的端口也要相应更新。
> 若 `config.json` 被删除,下次启动会按默认端口(8000/1883)重新生成。
4. 产品与物模型
**产品是设备的模板**:定义一类设备上报哪些属性、支持哪些命令。设备必须先选择所属产品才能创建。
进入左侧「**产品与物模型**」页面操作。
4.1 新建产品与物模型
-
点击「+ 新建产品」,填写产品名称(必填)、描述(可选)。
-
在「物模型(JSON 格式)」文本框中定义属性与命令,格式如下:
```json
{
"properties": [
{"key": "temp", "name": "温度", "type": "float", "unit": "℃", "expr": "value / 10 - 40"},
{"key": "hum", "name": "湿度", "type": "float", "unit": "%RH"},
{"key": "alarm", "name": "报警", "type": "bool"}
],
"commands": [
{"key": "setTemp", "name": "设置温度", "params": {"key": "target", "name": "目标值", "type": "int"}}
]
}
```
字段说明:
| 字段 | 说明 |
|------|------|
| `key` | 设备上报报文里的字段名(英文,与设备端约定一致) |
| `name` | 页面上显示的中文名称 |
| `type` | 数据类型:`int` / `float` / `bool` / `string` |
| `unit` | 单位(可选,如 ℃、%RH) |
| `expr` | 换算表达式(可选)。变量 `value` 为设备上报的原始值,支持 `+ - * / % **` 及 `abs round min max pow int float sqrt`,如 `value / 10 - 40`。运算后的值才入库显示 |
| `commands\[\].key` | 下发命令的标识 |
| `commands\[\].params` | 命令参数列表(可选),每项含 `key/name/type` |
-
编辑框下方会**实时预览**属性表格;「**上报示例**」区域会按当前物模型**自动生成并自动更新**设备上报的示例 JSON(含实时上报与历史上报两种)。
-
点击「**复制上报示例**」可把示例 JSON 复制到剪贴板,直接发给设备端开发人员对接。
-
点击「保存」。
4.2 编辑 / 删除产品
-
列表中点击「编辑」修改物模型,保存后**立即对该产品下所有设备生效**。
-
删除产品前需先删除该产品下的所有设备(有设备时无法删除)。
5. 设备接入(添加设备)
进入左侧「**设备管理**」页面。
5.1 添加设备
-
点击「+ 添加设备」。
-
填写:
-
**设备名称**(必填,如"一号温湿度传感器")
-
**所属产品**(下拉选择,决定该设备的数据解析规则)
-
**设备号**(可选):留空自动生成;也可自定义 3--32 位字母/数字/下划线/中划线
-
**设备密码**(可选):留空自动生成;6--32 位且不含空格
- 点击「创建」,弹出**设备凭据**(设备号 + 设备密码),请妥善保存。
> 忘记凭据时,可在设备列表点击「凭据」按钮随时再次查看。
5.2 设备端 MQTT 接入说明
把以下信息提供给设备端开发人员:
| 项目 | 值 |
|------|-----|
| 服务器 | 平台电脑 IP |
| 端口 | 1883(MQTT,支持 3.1.1 / 5.0) |
| 用户名 | 设备号 |
| 密码 | 设备密码 |
**上行(设备 → 平台)**:发布到主题 `device/设备号/up`
```json
实时上报: {"data": {"temp": 365, "hum": 600}}
历史上报: {"ts": 1756368000000, "data": {"temp": 365}}
```
-
实时上报**不带 `ts`**,按平台服务器时间入库。
-
历史上报**携带 `ts`**(毫秒/秒级 Unix 时间戳,或 `"2026-08-28 12:00:00"` 格式字符串),按该时间戳入库,查询时标记为「历史」。时间戳不能晚于当前时间(容忍 5 分钟),也不能早于 30 天,否则整条报文被拒绝。
-
`data` 内的字段名需与物模型 `key` 一致;带 `expr` 的属性上报**原始值**(如温度按 `value / 10 - 40` 运算,则上报 365 而不是 36.5)。
-
设备连接认证通过后,后续报文**免密**,无需再携带密码字段。
**下行(平台 → 设备)**:设备订阅主题 `device/设备号/down`,收到的报文格式:
```json
{"cmd": "setTemp", "params": {"target": 25}}
```
5.3 设备状态
-
设备列表实时显示在线/离线状态(自动刷新)。
-
设备断开 MQTT 连接即离线,记录离线时间。
5.4 下发命令
在设备列表或设备信息页点击「下发」,选择物模型中定义的命令,填写参数后发送。设备端在 `device/设备号/down` 主题收到对应 JSON。
5.5 远程升级(FTP)
侧边栏「远程升级」页:选择产品 → 选择设备 → 填写目标版本号与 FTP 信息(服务器地址、端口、用户名、密码、文件夹、文件名)→ 点击「下发升级」。
平台仅负责把升级参数下发到设备,**FTP 服务器与升级包由用户自行准备**。设备端收到:
```json
{"cmd": "upgrade", "params": {"version": "v1.2.0", "ftp_host": "ftp.example.com", "ftp_port": 21, "ftp_user": "user", "ftp_pass": "pass", "ftp_dir": "/firmware", "ftp_file": "fw_v1.2.0.bin"}}
```
设备从 FTP 下载升级包完成升级后,向 `device/设备号/up` 上报完成标志(**result=0 成功,非 0 失败**):
```json
{"upgrade": {"device_no": "D1A2B3C4D", "version": "v1.2.0", "result": 0, "message": "升级成功"}}
```
-
平台自动匹配该设备最近一条「已下发/待上报」的升级任务并更新状态(成功 / 失败)。
-
**设备在线时立即下发;设备离线时自动排队,设备下次上报数据时自动补发**(物模型命令下发同样适用)。
-
**下发超时时间**:系统设置中可配置(默认 30 分钟)。升级任务超过该时间未收到设备上报结果自动判定失败;排队命令超时后不再补发。
-
升级记录按账号可见设备过滤,每页 20 条支持翻页,每 5 秒自动刷新。
6. 数据查看与导出
6.1 查看历史数据
设备列表点击「数据」进入历史数据页:
-
按时间倒序分页展示,可翻页。
-
属性值已按物模型 `expr` 运算显示,并带名称和单位。
-
时间列带橙色「**历史**」标签的行,表示该数据由设备携带时间戳补传(非实时上报)。
6.2 导出数据(CSV)
在历史数据页点击「**导出数据(CSV)**」按钮,浏览器下载该设备的全部历史数据(最多 30 天):
-
第一行为列头:`时间, 来源, 属性1, 属性2, ...`(列头含属性名、标识与单位)
-
「来源」列标识该行数据是实时上报还是历史补传
-
同一时间戳的多个属性合并为一行(宽表),时间正序
-
文件带 UTF-8 BOM,**Excel 双击直接打开不乱码**
7. 报警功能
当设备上报的数据超过设定值时,平台自动记录报警;报警可消除(保留记录),消除后主页不再显示。
7.1 设置报警值(上限 / 下限)
-
在设备列表点击「数据」进入设备页,点击顶部「**报警设置**」按钮。
-
页面按物模型属性逐行列出,可为每个属性填写:
-
**上限报警值**:数据 **大于** 该值时报警(如温度超过 80)
-
**下限报警值**:数据 **小于** 该值时报警(如温度低于 -10)
-
留空表示不启用该方向的报警
- 点击「保存报警设置」生效。
> 说明:判断使用的是物模型 `expr` 运算后的数值(与页面显示一致)。等于阈值不报警。
7.2 查看报警记录
-
**单设备**:设备页点击「**报警记录**」进入二级页面,查看该设备的全部报警,支持「未消除 / 已消除 / 全部」筛选,每页 20 条。
-
**全局**:点击左侧导航「**报警信息**」,可直接查看当前账号可见范围内**未消除的报警**,每条显示时间、设备、产品、属性、报警类型(超上限 / 低于下限)、当前值与阈值。
7.3 消除报警
-
在报警列表点击某条记录的「**消除**」,或点击「**消除全部报警**」。
-
消除后**记录仍然保留**(状态列显示「已消除」及消除时间),只是不再计入报警统计。
-
同一设备的同一属性同一方向,在报警未消除期间**不会重复记录**;消除后若再次越限,会重新记录一条。
7.4 主页报警统计
主页统计卡片显示「**报警中设备(未消除)**」数量(有报警时红色显示);产品概览表格的「**报警设备**」列显示每个产品有几台设备在报警中,点击红色「N 台报警中」可直接进入报警信息页。
7.5 报警信息可见范围
报警数据与设备权限一致:您只能看到自己及下级账号创建设备的报警,消除操作亦受同样限制。
8. 用户管理
仅超级管理员和管理员可进入「**用户管理**」页面。
7.1 账号角色说明
| 角色 | 说明 | 可创建的账号 |
|------|------|--------------|
| 超级管理员(admin 登录账号) | 最高权限,可见全部设备 | 管理员、普通账号 |
| 管理员 | 由超级管理员创建 | 普通账号 |
| 普通账号 | 业务账号,管理自己的设备 | 子账号 |
| 子账号 | 普通账号的附属账号 | 不能创建账号 |
-
**数据可见范围**:上级账号可以看到自己及其所有下级(含下级的下级)创建的设备;同级账号之间互不可见。
-
**创建者标识**:设备列表「创建者」列和设备信息页「创建账号」行会显示该设备由哪个账号创建;自己创建的显示为「本账号」。
7.2 创建账号
-
点击「+ 新建账号」,填写用户名(唯一)、密码。
-
选择角色(超级管理员可创建"管理员"或"普通账号";管理员只能创建"普通账号";普通账号在设备管理页可创建"子账号")。
-
创建"普通账号"时,超级管理员可指定其所属管理员;创建"子账号"时可勾选「**允许添加设备**」。
7.3 管理账号
-
**重置密码**:上级账号可对下级账号重置密码。
-
**子账号权限**:在账号列表中直接勾选/取消「可添加设备」,实时生效。
-
**删除账号**:删除账号会**级联删除**其名下所有设备与数据,操作前请确认。
9. 数据保留策略
-
每台设备的数据保留 **30 天**,且最多保留最近 **10,000 条**,超限自动清理最旧数据。
-
如需长期留存,请定期使用 CSV 导出功能备份。
10. 常见问题(FAQ)
**Q1:浏览器打不开管理页面?**
确认 EXE 正在运行(控制台窗口未关闭)、端口未被修改、防火墙已放行 8000 端口、访问地址 `http://服务器IP:8000` 正确。
**Q2:设备连不上 MQTT(1883)?**
检查防火墙是否放行 1883;确认用户名=设备号、密码=设备密码(在设备列表「凭据」可查);确认报文发布主题为 `device/设备号/up`。
**Q3:上报了数据但页面看不到?**
确认 `data` 里的字段名与物模型 `key` 完全一致;物模型 JSON 格式正确;带 `expr` 的属性上报的是原始值。
**Q4:带时间戳的历史数据没有入库?**
`ts` 格式必须为毫秒/秒级 Unix 时间戳或 `"YYYY-MM-DD HH:MM:SS"`;不能晚于当前时间 5 分钟以上;不能早于 30 天。可在服务控制台日志中查看拒绝原因。
**Q5:忘记 admin 密码怎么办?**
删除 `iot.db`(和 `db.key`)会重置为默认账号 admin/admin123,但**会清空所有数据,慎用**。建议平时保管好密码,或让超级管理员为下级账号重置密码。
**Q6:db.key 文件丢失或误删怎么办?**
`iot.db` 已加密,**没有 db.key 数据无法解密恢复**。请务必与 iot.db 一起备份保管。若确认数据可以丢弃,删除 `iot.db`、`iot.db-wal`、`iot.db-shm` 和 `db.key` 后重启程序,即按全新数据库初始化。
**Q7:如何备份数据?**
停止服务后,**同时复制 `iot.db` 和 `db.key`** 两个文件保存(缺一不可),恢复时放回同一目录。注意:备份文件等同于全部数据,请存放在安全位置。
**Q8:登录时浏览器提示密码错误但确认没输错?**
会话超过 10 分钟未操作会自动失效,刷新页面重新登录即可。
**Q9:设置了报警值却没有产生报警?**
确认设备已重新上报数据(报警只在数据上报时检查);确认数值确实**严格大于上限 / 小于下限**(等于阈值不报警);确认判断的是 `expr` 运算后的数值,而非设备上报的原始值。
11. 目录文件说明
| 文件/目录 | 说明 | 可否删除 |
|-----------|------|----------|
| iot-platform.exe | 程序本体 | 否 |
| config.json | 端口配置(首次运行生成) | 可删,按默认重建 |
| iot.db | 数据库(AES-256 加密存储,账号/设备/数据) | 否(备份用,需连同 db.key) |
| db.key | 数据库加密密钥(首次运行生成,**丢失则数据无法解密**) | 否(备份用,需连同 iot.db) |
| logs\ | 运行日志 | 可定期清理 |
> 从旧版本升级:用新版 EXE 替换旧文件后首次启动,程序会自动把旧明文 `iot.db` 迁移为加密格式,原文件保留为 `iot.db.plain.bak`(确认系统运行正常后可自行删除)。