当前位置: 首页 > 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实现实时数据推送和展示。
  • 使用图表库展示历史数据趋势。

相关文章:

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

要在软件中实时查看硬件设备的信息&#xff0c;通常需要结合前后端技术来实现。以下是设计思路和实现步骤&#xff1a; 1. 系统架构设计 实时查看硬件设备信息的系统通常采用以下架构&#xff1a; 数据采集层: 硬件设备通过传感器采集数据&#xff0c;发送到InfluxDB。数据存…...

【Linux系统编程】初识系统编程

目录 一、什么是系统编程1. 系统编程的定义2. 系统编程的特点3. 系统编程的应用领域4. 系统编程的核心概念5. 系统编程的工具和技术 二、操作系统四大基本功能1. 进程管理&#xff08;Process Management&#xff09;2. 内存管理&#xff08;Memory Management&#xff09;3. 文…...

解决stylelint对deep报错

报错如图 在.stylelintrc.json的rules中配置 "selector-pseudo-class-no-unknown": [true,{"ignorePseudoClasses": ["deep"]} ]...

React基础之useInperativehandlle

通过ref调用子组件内部的focus方法来实现聚焦 与forwardRef类似&#xff0c;但是forwardRef是通过暴露整个Ref来实现&#xff0c;而useInperativehandle是通过对外暴露一个方法来实现的 import { forwardRef, useImperativeHandle, useRef, useState } from "react";…...

使用joblib 多线程/多进程

文章目录 1. Joblib 并行计算的两种模式多进程(Multiprocessing,适用于 CPU 密集型任务)多线程(Multithreading,适用于 I/O 密集型任务)2. Joblib 的基本用法3. Joblib 多进程示例(适用于 CPU 密集型任务)示例:计算平方4. Joblib 多线程示例(适用于 I/O 密集型任务)…...

⭐算法OJ⭐N-皇后问题 II【回溯剪枝】(C++实现)N-Queens II

⭐算法OJ⭐N-皇后问题【回溯剪枝】&#xff08;C实现&#xff09;N-Queens 问题描述 The n-queens puzzle is the problem of placing n n n queens on an n n n \times n nn chessboard such that no two queens attack each other. Given an integer n, return the num…...

【数据结构初阶】---堆的实现、堆排序以及文件中的TopK问题

1.树的概念及结构 1.1树的概念 树是一种非线性的数据结构&#xff0c;它是由n&#xff08;n>0&#xff09;个有限结点组成一个具有层次关系的集合。把它叫做树是因为它看起来像一棵倒挂的树&#xff0c;也就是说它是根朝上&#xff0c;而叶朝下的。 有一个特殊的结点&…...

ubuntu20系统下conda虚拟环境下安装文件存储位置

在 Conda 虚拟环境中执行 pip install 安装软件后&#xff0c;安装的文件会存储在该虚拟环境专属的 site-packages 目录中。具体路径取决于你激活的 Conda 环境路径。以下是定位步骤&#xff1a; 1. 确认 Conda 虚拟环境的安装路径 查看所有环境&#xff1a; conda info --env…...

鸿蒙开发:RelativeContainer 相对布局详解【全套华为认证学习资料分享(考试大纲、培训教材、实验手册等等)】

前言 在最新版本的 DevEco Studio 中&#xff0c;官方在创建新项目时&#xff0c;默认使用 RelativeContainer 组件作为根布局。这足以证明 RelativeContainer 的重要性。相比其他容器组件&#xff0c;它极大地简化了复杂 UI 布局中的元素对齐问题。 例如&#xff0c;在没有 R…...

基于SpringBoot实现旅游酒店平台功能一

一、前言介绍&#xff1a; 1.1 项目摘要 随着社会的快速发展和人民生活水平的不断提高&#xff0c;旅游已经成为人们休闲娱乐的重要方式之一。人们越来越注重生活的品质和精神文化的追求&#xff0c;旅游需求呈现出爆发式增长。这种增长不仅体现在旅游人数的增加上&#xff0…...

HttpServletRequest 和 HttpServletResponse 区别和作用

一、核心作用对比 对象HttpServletRequest&#xff08;请求对象&#xff09;HttpServletResponse&#xff08;响应对象&#xff09;本质客户端发给服务器的 HTTP 请求信息&#xff08;输入&#xff09;服务器返回客户端的 HTTP 响应信息&#xff08;输出&#xff09;生命周期一…...

树莓派学习(一)——3B+环境配置与多用户管理及编程实践

树莓派学习&#xff08;一&#xff09;——3B环境配置与多用户管理及编程实践 一、实验目的 掌握树莓派3B无显示器安装与配置方法。学习Linux系统下多用户账号的创建与管理。熟悉在树莓派上使用C语言和Python3编写简单程序的方法。 二、实验环境 硬件设备&#xff1a;树莓派…...

Mysql安装方式

方式一&#xff1a;安装包安装 下载安装包 官网直接下载&#xff1a;https://dev.mysql.com/downloads/ 安装配置 2.1、双击刚刚下载好的msi文件&#xff0c;开始安装MySQL。 2.2、选择自定义模式Custom安装 2.3、点击选择自己电脑对应的mysql安装目录 2.5、继续点击下一步&…...

Vue3实战学习(Vue3的基础语法学习与使用(超详细))(3)

目录 &#xff08;1&#xff09;Vue3工程环境准备、项目基础脚手架搭建详细教程。(博客链接) &#xff08;2&#xff09;Vue3的基础语法学习与使用。 &#xff08;1&#xff09;"{{}}"绑定数据。 <1>ref()函数定义变量——绑定数据。 <2>reactive({...})…...

使用websocket,注入依赖service的bean为null

问题&#xff1a;依赖注入失败&#xff0c;service获取不到&#xff0c;提示null 这是参考代码 package com.shier.ws;import cn.hutool.core.date.DateUtil; import cn.hutool.json.JSONObject; import cn.hutool.json.JSONUtil; import com.google.gson.Gson; import com.s…...

批量在 Word 的指定位置插入页,如插入封面、末尾插入页面

我们经常会碰到需要在 Word 文档中插入新的页面的需求&#xff0c;比如在 Word 文档末尾插入一个广告页、给 Word 文档插入一个说明封面&#xff0c;在 Word 文档的中间位置插入新的页面等等。相信这个操作对于大部分小伙伴来说都不难&#xff0c;难的是同时给多个 Word 文档插…...

算法系列之滑动窗口

算法系列之滑动窗口 题目 给定一个字符串 s &#xff0c;请你找出其中不含有重复字符的 最长 子串 的长度。 示例 1:输入: s "abcabcbb" 输出: 3 解释: 因为无重复字符的最长子串是 "abc"&#xff0c;所以其长度为 3。 示例 2:输入: s "bbbbb"…...

【C#】详解C#中的内存管理机制

文章目录 前言一、C#内存管理的基本机制&#xff08;1&#xff09;托管堆&#xff08;Managed Heap&#xff09;&#xff08;2&#xff09;垃圾回收&#xff08;Garbage Collection&#xff09;&#xff08;3&#xff09;栈内存 二、 开发者需要主动管理的场景&#xff08;1&am…...

C/S架构与B/S架构

一、定义与核心区别 C/S架构&#xff08;Client/Server&#xff0c;客户端/服务器&#xff09; 客户端需安装专用软件&#xff08;如QQ、企业ERP系统&#xff09;&#xff0c;直接与服务器通信。服务器端通常包括数据库和业务逻辑处理1。特点&#xff1a;客户端承担部分计算任务…...

《DeepSeek MoE架构下,动态专家路由优化全解析》

在人工智能飞速发展的当下&#xff0c;模型架构的创新与优化始终是推动技术进步的关键力量。DeepSeek的混合专家模型&#xff08;MoE&#xff09;架构&#xff0c;以其独特的设计理念和卓越的性能表现&#xff0c;在大模型领域崭露头角。而其中的动态专家路由优化技术&#xff…...

Docker 离线安装指南

参考文章 1、确认操作系统类型及内核版本 Docker依赖于Linux内核的一些特性&#xff0c;不同版本的Docker对内核版本有不同要求。例如&#xff0c;Docker 17.06及之后的版本通常需要Linux内核3.10及以上版本&#xff0c;Docker17.09及更高版本对应Linux内核4.9.x及更高版本。…...

日语AI面试高效通关秘籍:专业解读与青柚面试智能助攻

在如今就业市场竞争日益激烈的背景下&#xff0c;越来越多的求职者将目光投向了日本及中日双语岗位。但是&#xff0c;一场日语面试往往让许多人感到步履维艰。你是否也曾因为面试官抛出的“刁钻问题”而心生畏惧&#xff1f;面对生疏的日语交流环境&#xff0c;即便提前恶补了…...

【Python】 -- 趣味代码 - 小恐龙游戏

文章目录 文章目录 00 小恐龙游戏程序设计框架代码结构和功能游戏流程总结01 小恐龙游戏程序设计02 百度网盘地址00 小恐龙游戏程序设计框架 这段代码是一个基于 Pygame 的简易跑酷游戏的完整实现,玩家控制一个角色(龙)躲避障碍物(仙人掌和乌鸦)。以下是代码的详细介绍:…...

shell脚本--常见案例

1、自动备份文件或目录 2、批量重命名文件 3、查找并删除指定名称的文件&#xff1a; 4、批量删除文件 5、查找并替换文件内容 6、批量创建文件 7、创建文件夹并移动文件 8、在文件夹中查找文件...

Linux简单的操作

ls ls 查看当前目录 ll 查看详细内容 ls -a 查看所有的内容 ls --help 查看方法文档 pwd pwd 查看当前路径 cd cd 转路径 cd .. 转上一级路径 cd 名 转换路径 …...

Cilium动手实验室: 精通之旅---20.Isovalent Enterprise for Cilium: Zero Trust Visibility

Cilium动手实验室: 精通之旅---20.Isovalent Enterprise for Cilium: Zero Trust Visibility 1. 实验室环境1.1 实验室环境1.2 小测试 2. The Endor System2.1 部署应用2.2 检查现有策略 3. Cilium 策略实体3.1 创建 allow-all 网络策略3.2 在 Hubble CLI 中验证网络策略源3.3 …...

vue3 字体颜色设置的多种方式

在Vue 3中设置字体颜色可以通过多种方式实现&#xff0c;这取决于你是想在组件内部直接设置&#xff0c;还是在CSS/SCSS/LESS等样式文件中定义。以下是几种常见的方法&#xff1a; 1. 内联样式 你可以直接在模板中使用style绑定来设置字体颜色。 <template><div :s…...

C# 类和继承(抽象类)

抽象类 抽象类是指设计为被继承的类。抽象类只能被用作其他类的基类。 不能创建抽象类的实例。抽象类使用abstract修饰符声明。 抽象类可以包含抽象成员或普通的非抽象成员。抽象类的成员可以是抽象成员和普通带 实现的成员的任意组合。抽象类自己可以派生自另一个抽象类。例…...

从面试角度回答Android中ContentProvider启动原理

Android中ContentProvider原理的面试角度解析&#xff0c;分为​​已启动​​和​​未启动​​两种场景&#xff1a; 一、ContentProvider已启动的情况 1. ​​核心流程​​ ​​触发条件​​&#xff1a;当其他组件&#xff08;如Activity、Service&#xff09;通过ContentR…...

十九、【用户管理与权限 - 篇一】后端基础:用户列表与角色模型的初步构建

【用户管理与权限 - 篇一】后端基础:用户列表与角色模型的初步构建 前言准备工作第一部分:回顾 Django 内置的 `User` 模型第二部分:设计并创建 `Role` 和 `UserProfile` 模型第三部分:创建 Serializers第四部分:创建 ViewSets第五部分:注册 API 路由第六部分:后端初步测…...