通用物联网平台提纲

以下是一份可直接作为 AI 提示词使用的通用物联网平台提纲。

定位是“简单但完整”:核心服务二选一,推荐 Node.js + Express(TypeScript),备选 Python + FastAPI;保留涂鸦平台/米家平台的核心逻辑(产品定义驱动接入、规则引擎打通数据与动作、多租户隔离),把静态文件管理系统 + 默认公共组件 + 厂家自定义单页 HTML作为应用层的一等公民;平台可作为通用物联网平台基座,驱动多行业(如智慧水产)的业务过程数据化,行业应用所需能力由通用平台统一提供。


总体架构:五层 + 一个静态文件子系统

设备 / 网关
    │  MQTT(一机一密,可选 HTTP/TCP)
    ▼
接入层    EMQX Broker(HTTP 认证回调 + 共享订阅消费 + HTTP Hook)
    │  共享订阅 / HTTP Hook
    ▼
核心层    Node.js+Express / FastAPI 应用(二选一,推荐 Node.js+Express)
          (物模型解析 · 设备生命周期 · 规则引擎 · 静态文件系统)
    │
    ├── 数据层    PostgreSQL(元数据)+ Redis(最新状态)+ TimescaleDB/MySQL 分区(历史)
    │
    ├── 静态文件子系统   默认组件库 · 厂家自定义 HTML · 租户隔离存储
    │
    ▼
应用层    多租户(厂家 + 一级租户 + 用户)/ 权限 / 产品管理 / 设备管理 / 可视化 / 日志审计

关键设计原则:配置与数据分离——产品定义、物模型、规则、权限存关系库;设备上报的属性值走时序或缓存,二者通过 product_key / device_id 关联,不混在一张表里。所有业务数据强制带 tenant_id 过滤,保证多租户隔离。


一、数据库设计(元数据与数据分离)

关系库用 PostgreSQL(JSONB 字段对动态物模型非常友好),起步可不引入额外时序库,用 Redis 存最新状态 + PostgreSQL 按月分区存短周期历史;数据量大时再引入 TimescaleDB / MySQL 分区 / Elasticsearch 做历史存储与时序检索。

核心表(最小集)设计如下,按“元数据与数据分离”组织:

表 关键字段 说明
tenant id, name, status 租户/家庭根实体,一级租户的组织单元
vendor(厂家) id, name, status 厂家维度隔离实体,多租户体系中的顶层厂家
user id, tenant_id, email, password_hash, role 用户归属于具体租户,tenant_id 实现租户内隔离
product_group id, tenant_id, code, name, sort_order 产品分组:一级扁平,只有组号/名称,无 parent_id、无树
product id, tenant_id, group_id, product_key, name, status product_key 全局唯一,对外暴露,作为设备标识的一部分;产品少时可用 product_a / product_b
thing_model id, product_id, properties JSONB, services JSONB, events JSONB, version 物模型整体存 JSONB,前端动态定义后直接落库,运行时解释执行;发布后走版本管理
device id, tenant_id, product_id, device_name, device_secret_hash, status, last_seen device_name + product_key 组成设备唯一标识,device_secret 只存哈希
device_group id, tenant_id, name, parent_id 设备分组(按空间/业务维度,如鱼塘/车间)
device_share id, device_id, user_id, permission 设备分享授权关系(只读/可控)
firmware id, product_id, version, file_url, status 产品固件,支撑 OTA 升级(可选扩展)
device_state device_id, property_identifier, value, updated_at 设备最新状态表,轻量场景可直接放 Redis
property_history device_id, identifier, value, ts 时序/分区表,存设备属性上报历史
rule id, tenant_id, name, trigger_config JSONB, action_config JSONB, enabled 规则配置,触发条件与执行动作以 JSONB 存库
alarm id, tenant_id, device_id, rule_id, level, status, detail JSONB, created_at 告警记录,支撑告警确认/处理/恢复闭环
product_ui product_id, template_type (default/custom), html_path, asset_dir 产品显示模板记录,关联默认组件与自定义 HTML
audit_log tenant_id, user_id, action, target_type, target_id, detail JSONB, created_at 操作日志,记录物模型/规则/UI 模板/权限等变更

设计说明: - 产品分组只做一级扁平:product_group 无 parent_id,不得建产品分类树;device_group 仍可保留 parent_id 用于空间/业务层级。 - 物模型整体以 JSONB 存储三要素(属性/服务/事件),前端定义完成后无需代码生成,由平台运行时直接解释校验,实现动态生效; - 设备上报的属性值单独走 device_state(最新状态)+ property_history(历史),与物模型定义(元数据)分表存储,通过 product_key / device_id 关联,不混在一张表里,保证性能与隔离; - 所有业务查询强制带 tenant_id 过滤,这是租户隔离的第一道防线;规则执行、设备查询、属性历史查询均不得出现跨租户 JOIN。


二、登录与权限(多租户 RBAC)

认证方式:采用 JWT 无状态令牌。普通用户走登录换取 JWT;开放 API 走 AccessKey;设备端走 MQTT 一机一密,三类凭据不混用同一套体系。账号层级遵循“用户 → 租户/家庭 → 设备”的归属关系。

权限模型:租户内 RBAC。角色至少分三级——平台管理员(跨租户管理)、租户管理员(管理本租户)、租户普通成员(使用本租户产品与设备)。权限粒度落到具体操作上,包括“产品创建 / 物模型编辑 / 设备绑定 / 设备分享 / 规则配置 / UI 模板上传”等,用 Casbin 或自研依赖注入做路由级检查。

数据隔离硬规则:Repository 层统一注入 tenant_id 条件;设备查询、属性历史查询、规则执行时均不得出现跨租户 JOIN。


三、MQTT 接入层(EMQX + 一机一密,协议可扩展)

Broker 选 EMQX 开源版,平台侧不实现 MQTT 协议栈,只做“认证回调 + 数据消费”。

认证机制:开启 EMQX 的 HTTP 认证。设备连接时携带 clientId / username / password,EMQX 回调平台 /internal/mqtt/auth 接口,平台用 product_key + device_name + device_secret 校验,返回 allow/deny。设备凭据在创建时生成,device_secret 只存哈希值,不落明文。

Topic 设计(上下行分离,便于规则引擎按租户分发):

上行:/tenant/{tenant_id}/device/{device_id}/property/post
上行:/tenant/{tenant_id}/device/{device_id}/event/post
下行:/tenant/{tenant_id}/device/{device_id}/service/{identifier}/set

数据消费:平台侧用 MQTT 共享订阅($share/platform/tenant/+/device/+/property/post)消费上行消息,多个 FastAPI worker 之间自动负载均衡,避免单点消费瓶颈。消费到消息后交给物模型解析器做校验和落库。设备上下线通过 EMQX HTTP Hook/Webhook 通知平台,更新设备状态与 last_seen。

协议扩展:MQTT 为必选接入;起步阶段可选 HTTP 直连上报,后续按需扩展 TCP/UDP/CoAP 接入与 Modbus/JT808/GB/T28181 等工业协议——参考开源物平台的协议包机制,私有协议封装为协议包热加载,不改主流程。

传输加密:生产环境启用 TLS(EMQX 8883 端口),平台侧做证书管理;设备端凭据全程不明文落库。

一型一密(动态注册):除一机一密外,支持同型号设备预烧相同 product_secret,设备首连时调用平台动态注册接口换取一机一密凭据,便于批量量产,不必逐台预写密钥。

网关与子设备:子设备(如 RS485/Zigbee 传感器)经网关代理接入——网关维护子设备拓扑(添加/删除子设备、代理上报子设备上下线),子设备消息沿用统一 Topic 结构并复用物模型校验与规则引擎,无需单独接入链路。


四、物模型层(动态定义的核心抽象)

物模型保留标准三要素,存储形态为 JSONB,前端定义完成后无需“代码生成”,由核心服务(Node.js+Express 或 FastAPI)在运行时解释执行。

属性(Property):定义字段包括 identifier、name、data_type(int / float / bool / enum / string)、access(r / rw / report_only)、unit、min/max 等。设备上报 JSON 时,物模型解析器逐字段校验类型与范围,通过后写最新状态和历史。

服务(Service):定义 identifier、name、input_params、output_params。平台调用服务时,将参数打包下发到下行 Topic,并可选等待设备响应。

事件(Event):定义 identifier、name、output_params(如故障码)。设备主动上报,平台校验后写入设备日志并交给规则引擎匹配。

动态生效的关键:物模型本身是数据,不是代码。设备上报 → 查 thing_model JSONB → 按定义校验 → 通过则落库。产品发布后物模型变更要走版本管理,避免已绑定设备上报格式与定义不一致。


五、设备管理(设备全生命周期)


六、产品管理(产品定义驱动接入)

产品结构:一级扁平,禁止分类树/父子分组。 产品少时直接用 product_a / product_b;product_group 只做组号/名称,仅用于检索归类。


七、规则引擎(条件 → 动作,自研轻量)

不引入 Flink 或复杂流处理。规则以结构化 JSON 存库,物模型数据流入时在应用进程内(Express/FastAPI)做内存匹配。

触发条件支持三类:

执行动作支持三类:

告警中心:规则触发生成告警记录(含级别:提示/警告/严重、触发设备、触发值、时间),支持告警确认/处理/恢复闭环,告警记录可查、可导出;通知渠道作为告警动作触发,避免"规则跑了但无告警痕迹"。

场景联动:多条"触发条件 → 执行动作"可编排为场景(支持串行/并行动作),规则通过界面配置即时生效、无需发版——参考开源物平台 LiteFlow 编排思路,本框架用内存匹配实现同等语义。

执行保障:规则先写入 rule 表;数据流入时按 product_key + identifier 索引快速匹配,匹配成功则异步执行动作并记入执行日志,规则执行失败不阻塞数据落库。


八、应用层:静态文件显示系统(默认组件 + 自定义 HTML)

这是让平台“像涂鸦/米家”的关键模块。

设计目标:每个产品在“设备详情/控制页”上有一套显示模板。平台先保证默认公共组件让任何合法物模型都能正常显示数据;厂家(或高级用户)可以上传自定义单页 HTML 来替换默认显示,实现更专业、更形象的交互。

两级模板策略:

模板类型 存储 渲染方式 适用场景
default 平台内置,不按租户存储 前端根据物模型 JSONB 动态生成公共组件(布尔→开关卡片,数值→仪表盘/折线图,枚举→选择器,字符串→文本) 所有产品开箱即用,保证数据可显示
custom 按 tenant_id / product_key / version 隔离存储 上传的单页 HTML 文件,在受控沙箱中加载,平台通过 postMessage 或注入的 JS Bridge 向其提供属性读取与指令下发能力 厂家需要品牌化、专业化的产品显示

存储结构建议:

static/
└── ui/
    └── {tenant_id}/
        └── {product_key}/
            ├── current/          # 当前生效版本
            │   ├── index.html
            │   └── assets/
            └── versions/
                └── {timestamp}/  # 历史版本,支持回滚

安全与隔离:自定义 HTML 上传必须做文件类型白名单(仅 .html / .css / .js / 图片),禁止 .git、.env 等敏感文件。上传目录独立于应用代码目录,生产中由 Nginx 直接服务静态文件,FastAPI 只负责上传和元数据管理。自定义 HTML 在 <iframe sandbox> 或受限环境中加载,避免其窃取其他租户的 JWT 或直接调用管理 API。平台向自定义页面暴露的能力通过 postMessage 桥接 或短期设备 token 控制,不直接赋予平台内部 API 权限。

默认公共组件的回退逻辑:设备详情页优先查找 product_ui.template_type = custom 且状态有效的模板;若不存在或加载失败,回退到默认组件按物模型生成显示。这样厂家不上传 HTML 时平台依然完整可用,上传后则获得更专业的呈现。


九、日志、可视化与监控

日志分两类:

可视化分三级:


十、行业应用与通用能力(参考行业设计指南)

本框架定位为通用物联网平台基座,不局限于单一行业,可驱动多行业将业务过程数据化。以智慧水产为典型场景:通过数据赋能水产行业,设计数据集、功能点与行业标准,实现行业全流程数据化,降低行业成本、提升人均效率与人均产出。

通用物联网平台基本能力(基座必备):

行业应用价值(以智慧水产为例):

参考:智慧水产解决方案网站(虾/鱼/蟹等多品类养殖方案与知识库)、鱼塘智能化平台、开源物模型物联网平台(如 FastBee),可复用其行业功能、数据与能力设计。


十一、技术选型与存储架构参考(参考开源物平台实现)

本框架核心为轻量实现,可在此基础上按扩展需求选择技术栈与存储架构。参考开源物平台(如 FastBee)实现,形成以下参考与对照。

11.1 技术选型参考(轻量起步 + 按需扩展)

层级 主框架轻量选型 参考扩展选型(开源物平台) 说明
后端 Node.js + Express(推荐)/ Python + FastAPI(备选) Spring Boot + MyBatis Plus(微服务拆分) 前者轻量、单人上手快;后者适合中大型扩展
规则引擎 自研轻量内存匹配 LiteFlow 编排式规则引擎 前者进程内条件匹配,后者支持场景联动、规则不发版
安全与权限 JWT + RBAC(Casbin 或自研) Spring Security + JWT + 若依权限体系 前者够用,后者支持组织/部门/岗位精细化管控
前端 Vue3 + Element Plus Vue + ElementUI + Uniapp(Web + 移动端跨端) 按端需求选择
MQTT 接入 EMQX 开源版(仅做认证回调 + 共享订阅消费) EMQX / 内置 Netty Broker 平台侧不实现 MQTT 协议栈
关系库 PostgreSQL(JSONB 对动态物模型友好) MySQL / PG / Oracle / 达梦等多库适配 按部署环境与国产化需求选择
时序库 / 历史 MySQL 按月分区 + Redis 存最新状态 TimescaleDB / TDengine / IoTDB 轻量起步用分区,海量高频数据迁时序库
缓存 Redis(会话、最新状态、读加速) Redis 实时状态与读加速
设备端 SDK MQTT 客户端 + 接入示例 ESP32 / ESP8266 / 树莓派 / Arduino / MicroPython SDK 主流硬件快速接入
扩展协议/视频 按需扩展 SIP + ZLMediaKit + GB/T28181、Modbus/JT808 协议包 可选,非基础必备

后端语言二选一:Node.js + Express(TypeScript,推荐) 或 Python + FastAPI(备选)。推荐 Express 的原因:单人/小团队上手快、前后端同栈、现有 Node 基础、I/O 与 WebSocket 够用;FastAPI 适合 Python 团队、AI/数据分析或物模型 Schema 极复杂的场景。同一项目只选一套,本文其余部分与语言无关。

集群扩展:单机起步即可闭环;设备规模增长后可参考集群版思路(消息队列 + 分布式 Broker + 多 worker),支撑海量设备接入。

11.2 存储架构参考(多库分工)

参考开源物平台的多库分层,匹配不同数据访问模式,可在轻量单库基础上扩展为多库:

存储层 承载数据 适用场景
关系库 用户、权限、产品、物模型、规则、日志等结构化元数据 主数据管理与权限组织
时序库 / 分区库 设备高频属性、事件上报的历史数据 海量高频数据、实时监测
缓存 设备最新状态、会话、高频读取缓存 实时状态与读加速
消息层 EMQX 承担 MQTT 通信与消息路由 设备接入、消息处理

本框架轻量阶段可先用单库(PostgreSQL JSONB + Redis),数据量增长后按上述分层扩展,不改变现有“配置与数据分离”的核心设计。

11.3 物模型设计路线对照

对照点 本框架(JSONB 文档物模型) 开源物平台(表驱动 EAV 物模型) 对照分析
物模型载体 thing_model 整体存 JSONB,运行时解释执行 iot_things_model 等表,一行一功能条目 本框架偏文档路线,开源物平台偏表驱动路线,语义可对照
三要素语义 属性/服务/事件(properties/events/services) type 1-属性/2-功能/3-事件 语义完全对齐(功能≈服务),本框架更侧重跨厂家联动
属性值存储 最新状态走 Redis/时序,历史走分区表 device_things_model_value 表(EAV) 均为行式存储,本质一致
存储架构 最简单库 JSONB + Redis 关系库 + 时序库 + 缓存 + 消息 多库分工 开源物平台适配海量时序、本框架免运维,可叠加或二选一
多租户 tenant_id 隔离,厂家可视为更细的租户维度 所有表带 tenant_id 机制一致,可叠加厂家维度
权限体系 JWT + RBAC(Casbin 或自研) 若依权限体系(用户/角色/部门/岗位) 机制一致,开源物平台权限体系更成熟,可支撑本框架 RBAC

结论:本框架保留 JSONB 文档物模型路线,侧重跨厂家联动、语义防漂移、免代码生成、免运维;开源物平台的表驱动物模型、多库分工与若依权限体系可作为扩展参考,两者物模型语义一致,可按需搭配或二选一。


十二、基本物联网平台标准速览清单

基础能力域 功能点
设备接入 MQTT 一机一密、一型一密/动态注册、TLS 加密、HTTP/TCP/CoAP 扩展、工业协议包
设备管理 注册/生命周期、设备影子、实时控制、数据监测、分组、分享、定位、日志、在线调试、网关与子设备拓扑
物模型 属性/服务/事件三要素、动态校验、版本管理、免代码生成
产品管理 产品创建/发布、一级扁平分组、OTA、设备授权
规则引擎 属性/事件/定时触发、下发/通知/虚拟属性/数据转发、告警中心(记录/级别/处理闭环)、场景联动
数据存储 元数据/最新值/历史分离、多库分工
多租户安全 厂家+租户+用户三级、RBAC、tenant_id 强制过滤、凭据哈希、沙箱隔离
可视化 默认组件、自定义 HTML、看板、大屏/报表
日志审计 操作日志 + 设备日志
开放能力 开放 API、数据转发推送(HTTP/Kafka/MQTT)
通知 站内信/Webhook/短信/邮件

十三、最小闭环与 AI 提示词分块建议

先跑通这个闭环,再扩展:

用户创建“开关”产品 → 定义 switch 布尔属性(读写)→ MQTT 模拟设备用一机一密连接并上报 {"switch": true} → 平台校验落库,默认公共组件显示为“开” → 厂家上传一个自定义 HTML 显示页 → 设备详情页切换为自定义显示 → 配一条规则“switch 变为 true 时发送站内信通知” → 通知触达,操作日志和设备日志可查。

建议在向 AI 投喂时把提示词拆成以下块,每块独立可迭代:

  1. 数据模型块:给出核心表 DDL 和 thing_model JSON 示例,让 AI 生成 SQLAlchemy 模型和 Pydantic schema;
  2. MQTT 接入块:描述 EMQX HTTP 认证回调 + HTTP Hook + 共享订阅消费逻辑,让 AI 生成 /internal/mqtt/auth 和共享订阅消费者代码;
  3. 物模型解析块:给出属性/服务/事件的 JSON 结构,让 AI 生成校验器和落库管道;
  4. 设备与产品管理块:描述产品发布流程、设备注册/影子/分组/分享/日志,让 AI 生成设备生命周期与产品管理 API;
  5. 规则引擎块:给出 trigger/action 的 JSON schema,让 AI 生成内存匹配器和动作执行器;
  6. 静态文件系统块:描述租户隔离目录、上传白名单、默认组件映射表、自定义 HTML 的 postMessage 桥接约定,让 AI 生成上传 API、静态文件挂载和前端回退逻辑;
  7. 最小可运行工程块:明确 Node.js+Express 或 FastAPI 目录结构(Express:modules / common / mqtt / thing-model / rule-engine / static-ui / workers;FastAPI:routers / services / repositories / mqtt / thing_model / rule_engine / static_ui),让 AI 按层生成。

一句话总结:设备走 MQTT 一机一密进来,物模型定义“设备是什么”,规则引擎在数据流入时判断“该做什么”,静态文件系统决定“用户看到什么”——默认组件保证完整可用,自定义 HTML 让厂家做专业呈现,多租户从数据库到静态目录全程隔离,框架作为通用物联网平台基座驱动多行业应用。