物联网全流程开发记录

问题

有数据采集设备,服务器,上位机用户显示三部分,采集设备将采集的数据发送至服务器。服务器将数据保存,上位机读取服务器保存的数据库显示。当出现多设备,多用户时,如何通过多设备对应多用户,可能的情况有一台设备一个用户,一台设备多个用户,多台设备一个用户,多台设备多个用户 我在数据库都如何配置和保存数据 上位机如何读取和保存数据

方案

在多设备多用户的系统中,数据库设计和数据交互逻辑需要兼顾 灵活性、扩展性安全性,以支持以下四种核心场景:


一、数据库设计(关系型数据库,如 MySQL/PostgreSQL)

1. 核心表结构设计
-- 用户表(存储用户信息)
CREATE TABLE users (
    user_id INT PRIMARY KEY AUTO_INCREMENT,  -- 用户唯一ID
    username VARCHAR(50) UNIQUE NOT NULL,    -- 用户名
    password_hash VARCHAR(255) NOT NULL,     -- 密码哈希(加密存储)
    role ENUM('admin', 'user') DEFAULT 'user'-- 角色(管理员/普通用户)
);

-- 设备表(存储设备信息)
CREATE TABLE devices (
    device_id INT PRIMARY KEY AUTO_INCREMENT,-- 设备唯一ID
    device_name VARCHAR(100) NOT NULL,       -- 设备名称(如 "D1", "D2")
    ip_address VARCHAR(15) NOT NULL,         -- 设备IP地址
    description TEXT                         -- 设备描述
);

-- 用户-设备关联表(多对多关系)
CREATE TABLE user_device (
    user_id INT NOT NULL,                    -- 外键:关联 users.user_id
    device_id INT NOT NULL,                  -- 外键:关联 devices.device_id
    access_level ENUM('read', 'write') DEFAULT 'read', -- 访问权限
    PRIMARY KEY (user_id, device_id),        -- 联合主键(唯一约束)
    FOREIGN KEY (user_id) REFERENCES users(user_id) ON DELETE CASCADE,
    FOREIGN KEY (device_id) REFERENCES devices(device_id) ON DELETE CASCADE
);

-- 数据表(存储设备采集的数据)
CREATE TABLE sensor_data (
    data_id BIGINT PRIMARY KEY AUTO_INCREMENT,-- 数据唯一ID
    device_id INT NOT NULL,                  -- 外键:关联 devices.device_id
    timestamp DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP, -- 采集时间
    temperature DECIMAL(5,2),                -- 示例字段:温度
    humidity DECIMAL(5,2),                   -- 示例字段:湿度
    voltage DECIMAL(5,2),                    -- 示例字段:电压
    FOREIGN KEY (device_id) REFERENCES devices(device_id) ON DELETE CASCADE
);
2. 表结构说明
表名功能说明
users存储用户信息,包括身份认证和角色
devices存储设备元数据(名称、IP等)
user_device管理用户与设备的多对多关系及权限
sensor_data存储设备采集的传感器数据
3. 支持的场景
场景数据库配置方式
一台设备一个用户user_device 中为一个 user_id 和一个 device_id 配置权限
一台设备多个用户user_device 中为多个 user_id 关联同一个 device_id
多台设备一个用户user_device 中为一个 user_id 关联多个 device_id
多台设备多个用户user_device 中交叉关联多个 user_id 和多个 device_id

二、数据采集与存储流程

1. 设备端逻辑
  • 数据发送:设备通过 TCP/HTTP/WebSocket 协议将数据发送到服务器。
  • 数据格式(示例 JSON):
    {
      "device_id": 1,
      "timestamp": "2025-04-05T14:30:00Z",
      "temperature": 25.5,
      "humidity": 60.0,
      "voltage": 3.7
    }
    
2. 服务器端逻辑
  • 接收数据:服务器监听端口,接收设备发送的 JSON 数据。
  • 数据验证:检查 device_id 是否存在,数据格式是否合法。
  • 数据存储:将数据插入 sensor_data 表。
    INSERT INTO sensor_data (device_id, timestamp, temperature, humidity, voltage)
    VALUES (1, '2025-04-05 14:30:00', 25.5, 60.0, 3.7);
    

三、上位机(用户端)数据读取与显示

1. 用户认证与权限控制
  • 登录流程
    1. 用户输入用户名和密码。
    2. 服务器验证密码哈希,生成 JWT Token(含用户 ID 和角色)。
    3. 后续请求携带 Token 进行身份验证。
2. 数据查询逻辑
  • 根据用户权限动态筛选数据

    -- 查询用户有权限访问的所有设备的最新数据
    SELECT d.device_id, d.device_name, sd.temperature, sd.humidity, sd.timestamp
    FROM user_device ud
    JOIN devices d ON ud.device_id = d.device_id
    JOIN sensor_data sd ON d.device_id = sd.device_id
    WHERE ud.user_id = 1001
    ORDER BY sd.timestamp DESC;
    
  • 分页与过滤

    -- 按时间范围和设备ID筛选数据
    SELECT * FROM sensor_data
    WHERE device_id = 1
      AND timestamp BETWEEN '2025-04-05 00:00:00' AND '2025-04-05 23:59:59'
    LIMIT 100 OFFSET 0;
    
3. 数据展示
  • 前端界面(如 Web 或桌面应用):
    1. 根据用户权限动态加载设备列表。
    2. 使用图表库(如 ECharts/D3.js)绘制实时数据。
    3. 支持导出 CSV/Excel。

四、权限管理与安全性

1. 数据访问控制
  • 行级权限:在查询时通过 user_device 表限制用户只能访问授权设备的数据。
  • 字段级权限:通过视图(View)限制用户只能查看特定字段(如仅读取 temperature,隐藏 voltage)。
2. 数据安全
  • 传输加密:使用 HTTPS/TLS 加密通信。
  • 存储加密:敏感字段(如密码)使用 AES 加密存储。
  • 审计日志:记录用户操作(如查询、导出数据)。

五、性能优化建议

1. 数据库优化
  • 索引:为 sensor_data.device_idsensor_data.timestamp 添加复合索引。
  • 分表:按时间或设备ID分表(如 sensor_data_202504)。
  • 缓存:使用 Redis 缓存高频访问的设备数据。
2. 服务器优化
  • 异步写入:使用消息队列(如 Kafka/RabbitMQ)缓冲设备数据,再异步写入数据库。
  • 负载均衡:多服务器集群部署,通过 Nginx 负载均衡。
3. 上位机优化
  • 分页加载:避免一次性加载大量数据,采用懒加载。
  • WebSocket 实时推送:设备数据更新后,服务器主动推送给上位机。

六、总结

功能模块关键点
数据库设计通过 user_device 表实现多对多关系,灵活支持各种场景
数据采集设备发送 JSON 数据,服务器验证后存储到 sensor_data
权限控制通过 user_device 限制用户访问的设备和字段
上位机查询动态生成 SQL 查询,结合分页和过滤条件
性能优化索引、分表、缓存、异步写入、WebSocket 推送

如需进一步了解 如何实现设备数据的实时同步如何设计权限的动态配置界面,或 如何使用时序数据库(如 InfluxDB)优化存储,请继续提问!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值