当前位置: 首页 > news >正文

物联网设备接入系统后如何查看硬件实时数据?

要在软件中实时查看硬件设备的信息,通常需要结合前后端技术来实现。以下是设计思路和实现步骤:


1. 系统架构设计

实时查看硬件设备信息的系统通常采用以下架构:

  • 数据采集层: 硬件设备通过传感器采集数据,发送到InfluxDB。
  • 数据存储层: InfluxDB存储设备的历史和实时数据。
  • 后端服务层: 提供API接口,从InfluxDB查询数据并返回给前端。
  • 前端展示层: 通过Web界面或移动端实时展示设备信息。
  • 实时通信层: 使用WebSocket或Server-Sent Events (SSE)实现实时数据推送。

2. 实现步骤

(1) 数据采集与存储

硬件设备通过MQTT、HTTP或其他协议将数据发送到后端,后端将数据写入InfluxDB。可以参考前面的Java代码实现数据写入。


(2) 后端服务设计

后端需要提供API接口,用于查询设备的历史数据和实时数据。

API设计
  • 查询历史数据: 返回设备在某个时间范围内的数据。

    • 请求示例:GET /api/devices/{deviceId}/history?start=2023-10-01T00:00:00Z&end=2023-10-02T00:00:00Z

    • 响应示例:

      {
          "deviceId": "device_123",
          "data": [
              {"time": "2023-10-01T12:00:00Z", "temperature": 25.3, "humidity": 60.1},
              {"time": "2023-10-01T12:05:00Z", "temperature": 25.5, "humidity": 60.0}
          ]
      }
      
  • 查询实时数据: 返回设备的最新数据。

    • 请求示例:GET /api/devices/{deviceId}/realtime

    • 响应示例:

      {
          "deviceId": "device_123",
          "time": "2023-10-01T12:10:00Z",
          "temperature": 25.4,
          "humidity": 60.2
      }
      
后端代码示例(Spring Boot + InfluxDB)
import com.influxdb.client.InfluxDBClient;
import com.influxdb.client.InfluxDBClientFactory;
import com.influxdb.client.QueryApi;
import com.influxdb.query.FluxRecord;
import com.influxdb.query.FluxTable;
import org.springframework.web.bind.annotation.*;

import java.time.Instant;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

@RestController
@RequestMapping("/api/devices")
public class DeviceController {

    private final InfluxDBClient influxDBClient;

    public DeviceController() {
        // 初始化InfluxDB客户端
        this.influxDBClient = InfluxDBClientFactory.create("http://localhost:8086", "your-token".toCharArray(), "your-org", "your-bucket");
    }

    // 查询历史数据
    @GetMapping("/{deviceId}/history")
    public Map<String, Object> getHistoryData(
            @PathVariable String deviceId,
            @RequestParam String start,
            @RequestParam String end) {

        String fluxQuery = String.format("from(bucket: \"your-bucket\") " +
                "|> range(start: %s, stop: %s) " +
                "|> filter(fn: (r) => r._measurement == \"hardware_metrics\" and r.device_id == \"%s\")", start, end, deviceId);

        QueryApi queryApi = influxDBClient.getQueryApi();
        List<FluxTable> tables = queryApi.query(fluxQuery);

        List<Map<String, Object>> data = new ArrayList<>();
        for (FluxTable table : tables) {
            for (FluxRecord record : table.getRecords()) {
                Map<String, Object> point = new HashMap<>();
                point.put("time", record.getTime());
                point.put(record.getField(), record.getValue());
                data.add(point);
            }
        }

        Map<String, Object> response = new HashMap<>();
        response.put("deviceId", deviceId);
        response.put("data", data);
        return response;
    }

    // 查询实时数据
    @GetMapping("/{deviceId}/realtime")
    public Map<String, Object> getRealtimeData(@PathVariable String deviceId) {
        String fluxQuery = String.format("from(bucket: \"your-bucket\") " +
                "|> range(start: -1m) " + // 查询最近1分钟的数据
                "|> filter(fn: (r) => r._measurement == \"hardware_metrics\" and r.device_id == \"%s\") " +
                "|> last()", deviceId); // 获取最新的一条数据

        QueryApi queryApi = influxDBClient.getQueryApi();
        List<FluxTable> tables = queryApi.query(fluxQuery);

        Map<String, Object> response = new HashMap<>();
        if (!tables.isEmpty()) {
            FluxRecord record = tables.get(0).getRecords().get(0);
            response.put("deviceId", deviceId);
            response.put("time", record.getTime());
            response.put(record.getField(), record.getValue());
        }
        return response;
    }
}

(3) 前端实时展示

前端可以通过以下方式实现实时数据展示:

  • 轮询(Polling): 定期调用后端API获取最新数据(简单但不高效)。
  • WebSocket: 建立双向通信通道,后端主动推送数据到前端。
  • Server-Sent Events (SSE): 后端单向推送数据到前端。
WebSocket实现示例
  • 后端(Spring Boot):

    import org.springframework.messaging.handler.annotation.MessageMapping;
    import org.springframework.messaging.handler.annotation.SendTo;
    import org.springframework.stereotype.Controller;
    
    @Controller
    public class WebSocketController {
    
        @MessageMapping("/device-data")
        @SendTo("/topic/device-data")
        public String sendDeviceData(String deviceId) {
            // 查询设备的最新数据并返回
            return "Device Data: " + deviceId;
        }
    }
    
  • 前端(JavaScript):

    const socket = new WebSocket('ws://localhost:8080/ws');
    socket.onmessage = function(event) {
        const data = JSON.parse(event.data);
        console.log("Received data:", data);
        // 更新UI
    };
    
SSE实现示例
  • 后端(Spring Boot):

    import org.springframework.web.bind.annotation.GetMapping;
    import org.springframework.web.bind.annotation.PathVariable;
    import org.springframework.web.bind.annotation.RestController;
    import org.springframework.web.servlet.mvc.method.annotation.SseEmitter;
    
    @RestController
    public class SSEController {
    
        @GetMapping("/sse/device-data/{deviceId}")
        public SseEmitter streamDeviceData(@PathVariable String deviceId) {
            SseEmitter emitter = new SseEmitter();
            // 模拟实时数据推送
            new Thread(() -> {
                try {
                    while (true) {
                        String data = fetchDataFromInfluxDB(deviceId); // 从InfluxDB获取数据
                        emitter.send(data);
                        Thread.sleep(1000); // 每秒推送一次
                    }
                } catch (Exception e) {
                    emitter.completeWithError(e);
                }
            }).start();
            return emitter;
        }
    
        private String fetchDataFromInfluxDB(String deviceId) {
            // 查询InfluxDB并返回数据
            return "Device Data: " + deviceId;
        }
    }
    
  • 前端(JavaScript):

    const eventSource = new EventSource('/sse/device-data/device_123');
    eventSource.onmessage = function(event) {
        const data = JSON.parse(event.data);
        console.log("Received data:", data);
        // 更新UI
    };
    

(4) 前端UI设计

使用前端框架(如React、Vue.js)构建实时数据展示界面,例如:

  • 实时数据卡片:显示设备的当前状态(温度、湿度等)。
  • 历史数据图表:使用ECharts或Chart.js展示历史数据趋势。

3. 总结

通过InfluxDB存储设备数据,结合后端API和前端实时通信技术(如WebSocket或SSE),可以高效实现硬件设备信息的实时查看。关键点包括:

  • 使用InfluxDB高效存储和查询时序数据。
  • 后端提供API接口,支持历史数据和实时数据查询。
  • 前端通过WebSocket或SSE实现实时数据推送和展示。
  • 使用图表库展示历史数据趋势。

相关文章:

  • 【摸鱼指南】--- VSCode 使用 Thief-Book 隐形阅读模式配置教程 程序员必备插件
  • 子集(78)
  • Docker 深入解析 Docker 配置文件:/etc/docker/daemon.json
  • 操作系统——进程与线程
  • 用CMake编译glfw进行OpenGL配置,在Visual Studio上运行
  • python爬虫系列课程8:js浏览器window对象属性
  • K8s构建带有maven环境的jenkins镜像
  • Fragment 懒加载的优化方案
  • vuejs 模板语法、条件渲染、v-for、事件处理、表单输入绑定
  • 01.04、回文排序
  • Linux基础---切换用户、创建用户、删除用户、添加和删除用户组、修改密码
  • OSPF的各种LSA类型,多区域及特殊区域
  • day1 postman重置密码,提交(submit)没有任何反应或者会提示超时
  • AI代码工场:基于Agent架构的Python程序自动化生成流水线
  • MWC 2025 | 紫光展锐与中国联通联合发布5G eSIM 平板
  • AGI(Artificial General Intelligence,通用人工智能)技术介绍
  • 理解梯度下降、链式法则、梯度消失/爆炸
  • Spring Boot整合ArangoDB教程
  • RocketMQ 消息发送高级特性解析(一)
  • Python项目-基于Django的在线教育平台开发
  • 像wordpress一样的网站/个人博客网站设计毕业论文
  • 用table做网站/推广平台网站
  • 创业网站开发/站长之家seo工具包
  • 苏州高端网站建设/真实的优化排名
  • 衢州做网站公司/运营商推广5g技术
  • 企业网站建设上市公司/站长网站工具