Web组态数据联动

1. 通过get/post获取设备列表信息

2. websocket连接mqtt服务器,接收json报文信息

3. 通过Alpine进行数据联动

4. 封装svg对象,更新属性值

index.html

<!DOCTYPE html>  
<html lang="en">  
<head>  <meta charset="UTF-8">  <meta name="viewport" content="width=device-width, initial-scale=1.0">  <title>组态数据联动</title>
</head>  <body x-data="mqttApp()" x-init="initDevices()">  <ul><li><span>Web组态数据联动</span></li> <li><span>1. 通过get/post获取设备列表信息</span></li> <li><span>2. websocket连接mqtt服务器,接收json报文信息</span></li> <li><span>3. 通过Alpine进行数据联动</span></li> <li><span>4. 封装svg对象,更新属性值</span></li>  <li><span>MQTT测试指令</span></li> <li><span>{ "id": "ZP710", "value": "running" } </span></li> <li><span>{ "id": "ZP711", "value": "warning" } </span></li><li><span>{ "id": "ZP712", "value": "error" } </span></li></ul> <button @click="fetchGet">Http Get测试</button><button @click="fetchPost">Http Post测试</button><br/><svg-component id="workshop1" svg-url="svg/workshop1.svg"></svg-component>  <br/><!-- 设备列表 -->  <ul>  <template x-for="device in devices" :key="device.id">  <li>ID: <span x-text="device.id"></span>, 名称: <span x-text="device.name"></span>, 状态: <span x-text="device.status"></span></li>  </template>  </ul>  <script src="./js/jquery.min.js"></script><script src="./js/alpine.min.js" defer></script>  <script src="./js/mqtt.min.js"></script>  <script src="./js/svg-component.js"></script> <script>  function mqttApp() {  return {  ZP710: { value: '无数据' },  devices: [], // 设备列表数据模型  mqttClient: null,  workshop1: null,async fetchGet() {  fetch('http://localhost:8081/api/version/info', {  method: 'GET', // 默认就是 GET,其实可以省略这一行  headers: {   'Authorization': 'Bearer ' + 'eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJVc2VySWQiOiIyIiwiVXNlckFjY291bnQiOiJhZG1pbiIsIm5iZiI6MTcyOTA0MTY0NiwiZXhwIjoxNzI5MTI4MDQ2LCJpc3MiOiJsSkVsdFJ1ayIsImF1ZCI6ImxKRWx0UnVrIn0.q7GfL15a0N6YEEQ6aNfPr4O5YnyZ2wMzs3UVT8CjqoA'}  })  .then(response => {  if (!response.ok) {  throw new Error('Network response was not ok ' + response.statusText);  }  return response.json(); // 或者 response.text()、response.blob() 等,取决于你期望的响应类型  })  .then(data => {  alert(JSON.stringify(data));   // 处理响应数据  })  .catch(error => {  console.error('There has been a problem with your fetch operation:', error);  });},async fetchPost() { // 创建一个 FormData 对象  const formData = new FormData();  formData.append('account', 'admin');  formData.append('password', 'admin'); // const jsonData = JSON.stringify({ //   account: 'admin',  //   password: 'admin'  // });  fetch('http://localhost:8081/api/user/login', {  method: 'POST',  headers: {'Authorization': 'Bearer ' + 'eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJVc2VySWQiOiIyIiwiVXNlckFjY291bnQiOiJhZG1pbiIsIm5iZiI6MTcyOTA0MTY0NiwiZXhwIjoxNzI5MTI4MDQ2LCJpc3MiOiJsSkVsdFJ1ayIsImF1ZCI6ImxKRWx0UnVrIn0.q7GfL15a0N6YEEQ6aNfPr4O5YnyZ2wMzs3UVT8CjqoA'},  body: formData})  .then(response => {  if (!response.ok) {  throw new Error('Network response was not ok ' + response.statusText);  }  return response.json(); // 处理响应  })  .then(data => {   alert(JSON.stringify(data));  })  .catch(error => {  console.error('There has been a problem with your fetch operation:', error);  });},initDevices() {  // 使用模拟数据初始化设备列表  this.devices = [  { id: 'ZP710', name: '设备1', status: '' },  { id: 'ZP711', name: '设备2', status: '' },  { id: 'ZP712', name: '设备3', status: '' }  ];  // 初始化 MQTT 客户端(保持原样)  const url = 'ws://127.0.0.1:5001/mqtt';  const clientId = 'mqweb_' + Math.random().toString(16).substr(2, 8); // 生成唯一客户端 IDconst options = {  clientId: clientId,  username: 'admin',  password: '123456', clean: true, // 设置为 true 以便在断开时清除会话  keepalive: 60, // 将 KeepAlive 设置为 60秒  reconnectPeriod: 1000, // 如果连接丢失,1秒后重连  connackWaitTimeout: 60 * 1000 ,// 连接确认等待超时,设置为 60秒};  this.mqttClient = mqtt.connect(url, options);  this.mqttClient.on('connect', () => {  console.log('MQTT 连接成功');  this.mqttClient.subscribe('iot/data');  });  this.mqttClient.on('error', (err) => {  console.error('连接错误:', err);  });  this.mqttClient.on('close', () => {  console.log('连接关闭');  });  this.mqttClient.on('disconnect', (packet) => {  console.log('断开连接:', packet);  });  this.mqttClient.on('message', (topic, message) => {  const data = JSON.parse(message.toString());  if (data.id && data.value) {  // 更新文本信息let device = this.devices.find(d => d.id === data.id);  if (device) {  device.status = data.value;   }  // 更新svg动画var color;switch (data.value) {  case 'running': color = 'green';  break;  case 'warning': color = 'yellow'; break;  case 'error': color = 'red'; break;  default: color = 'gray'; break;  }  this.workshop1.setAttribute(data.id, 'fill', color); }  }); this.workshop1 = document.getElementById('workshop1');  },  };  }  </script>  
</body>  
</html>

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/diannao/56393.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Wavelet Convolutions for Large Receptive Fields

大感受野的小波卷积 论文链接&#xff1a;https://arxiv.org/abs/2407.05848v2 项目链接&#xff1a;https://github.com/BGU-CS-VIL/WTConv Abstract 近年来&#xff0c;人们一直试图增加卷积神经网络&#xff08;CNN&#xff09;的核大小&#xff0c;以模拟Vision Transfo…

基于深度学习的车辆车型检测识别系统(YOLOV5)

界面图&#xff1a; 项目简介&#xff1a; 网络&#xff1a;深度学习网络 yoloV5 软件&#xff1a;PycharmAnaconda 环境&#xff1a;python3.8 opencv PyQt5 torch1.9 文件&#xff1a;训练集8000张图片 测试集1000张图片 系统包含所有文件夹 环境文件 UI文件 功能&a…

javascript中`Math.ceil` 和 `Math.floor`的区别

Math.ceil 和 Math.floor 都是 JavaScript 中的内置函数&#xff0c;用于对数字进行取整&#xff0c;但它们的行为有所不同&#xff1a; Math.ceil&#xff1a;向上取整。它返回大于或等于一个给定数字的最小整数。例如&#xff0c;Math.ceil(4.2) 返回 5&#xff0c;Math.ceil…

解决php连接本地mysql连接错误的问题

我的服务器启用的nginx&#xff0c;配置了php的连接mysql的配置文件connect.php&#xff1a; <?php$server"localhost";//主机$db_username"root";//你的数据库用户名$db_password"root";//你的数据库密码$dbname "users";$conn…

Zookeeper快速入门:部署服务、基本概念与操作

文章目录 一、部署服务1.下载与安装2.查看并修改配置文件3.启动 二、基本概念与操作1.节点类型特性总结使用场景示例查看节点查看节点数据 2.文件系统层次结构3.watcher 一、部署服务 1.下载与安装 下载&#xff1a; 一定要下载编译后的文件&#xff0c;后缀为bin.tar.gz w…

PE结构之导出表

导出表结构中各种值的意义 ​​​​​​ 根据函数地址表遍历函数名称RVA表,和上面的图是逆过程 //函数地址表 和当前内存中的位置DWORD AddressOfFunctionsFOA RVAToFOA(LPdosHeader, LPexprotDir->AddressOfFunctions);PDWORD LPFunctionsAddressInMemary (PDWORD)((cha…

ssm基于VUE的图书馆管理系统的设计与实现+vue

系统包含&#xff1a;源码论文 所用技术&#xff1a;SpringBootVueSSMMybatisMysql 免费提供给大家参考或者学习&#xff0c;获取源码请私聊我 需要定制请私聊 目 录 目 录 III 第1章 绪论 1 1.1 课题背景 1 1.2 课题意义 1 1.3 研究内容 2 第2章 开发环境与技术 3 …

Android终端GB28181音视频实时回传设计探讨

技术背景 好多开发者&#xff0c;在调研Android平台GB28181实时回传的时候&#xff0c;对这块整体的流程&#xff0c;没有个整体的了解&#xff0c;本文以大牛直播SDK的SmartGBD设计开发为例&#xff0c;聊下如何在Android终端实现GB28181音视频数据实时回传。 技术实现 Andr…

简单说说mysql的mvcc

mvcc的实现依赖什么 事务版本号 每次事务开始之前&#xff0c;都会从数据库获取一个【自增长】的事务id&#xff0c;从这个版本号&#xff0c;可以判断事务的先后顺序 隐式字段 对于innodb存储引擎&#xff0c;每行记录都有两个隐藏列&#xff0c;分别是&#xff1a;trx_id…

java-day11

1.ArrayList 集合和数组的优势对比&#xff1a; 长度可变添加数据的时候不需要考虑索引&#xff0c;默认将数据添加到末尾 1.1 ArrayList类概述 什么是集合 ​ 提供一种存储空间可变的存储模型&#xff0c;存储的数据容量可以发生改变 ArrayList集合的特点 ​ 长度可以变化…

Canal 和 MySQL 配置指南

1. 环境依赖 在开始配置之前&#xff0c;请确保已安装并配置以下环境&#xff1a; Docker&#xff1a;用于运行 MySQL 和 Canal 的容器化服务。 MySQL&#xff1a;确保安装的是支持 binlog 的版本。 Canal&#xff1a;阿里巴巴开源的数据库增量订阅和消费组件。 2. MySQL …

基于ESP32的灌溉系统

精准灌溉优化与高效水资源利用&#xff1a;基于IoT的农业解决方案 引言 传统农业实践缺乏实时监控和高效操作&#xff0c;导致效率低下和产量不高。本项目旨在利用物联网&#xff08;IoT&#xff09;技术和低成本通信协议&#xff0c;设计一个解决方案来解决这一问题。提出的…

C++算法练习-day1——704.二分查找

题目来源&#xff1a;. - 力扣&#xff08;LeetCode&#xff09; 题目思路分析 二分查找是一种在有序数组中查找某一特定元素的搜索算法。搜索过程从数组的中间元素开始&#xff0c;如果中间元素正好是要查找的元素&#xff0c;则搜索过程结束&#xff1b;如果某一特定元素大…

Linux基础 -- 使用 cgroups 变更进程的CPU亲和性绑核

使用 cgroups 设置 CPU 绑定的教学文档 1. 使用 cgroups 设置 CPU 绑定 在 Linux 中&#xff0c;使用 cgroups 可以对进程进行 CPU 绑定&#xff0c;从而控制它们在哪些 CPU 核心上运行。以下是基本步骤&#xff1a; 创建 cgroup&#xff1a; mkdir /sys/fs/cgroup/cpuset/my…

Docker实践与应用举例

目录 1. 引言 2. Docker的基本概念 2.1 什么是Docker容器 2.2 Docker镜像 2.3 Docker架构 3. Docker的应用场景 3.1 开发与测试环境的隔离 3.2 持续集成与持续交付&#xff08;CI/CD&#xff09; 3.3 微服务架构 4. Docker的实践案例 4.1 部署Nginx反向代理 4.2 使用…

研发线上事故风险解读之缓存篇

专业在线打字练习平台-巧手打字通&#xff0c;只输出有价值的知识。 一 前言 本文继续基于《线上事故案例集》&#xff0c;进一步深入梳理线上事故缓存使用方面的问题点&#xff0c;重点关注缓存在使用和优化过程中可能出现的问题&#xff0c;旨在为读者提供具有实践指导意义的…

学习如何将Spring Boot Jar包注册成Windows服务

​ 博客主页: 南来_北往 系列专栏&#xff1a;Spring Boot实战 在开发Spring Boot应用时&#xff0c;我们通常通过命令行或IDE手动启动项目。然而&#xff0c;在生产环境中&#xff0c;为了提升效率和稳定性&#xff0c;我们更希望应用能够自动启动&#xff0c;并且作为Wi…

OpenCV高级图形用户界面(5)获取指定滑动条(trackbar)的当前位置函数getTrackbarPos()的使用

操作系统&#xff1a;ubuntu22.04 OpenCV版本&#xff1a;OpenCV4.9 IDE:Visual Studio Code 编程语言&#xff1a;C11 算法描述 返回滑动条的位置。 该函数返回指定滑动条的当前位置。 cv::getTrackbarPos() 函数用于获取指定滑动条&#xff08;trackbar&#xff09;的当前…

【H2O2|全栈】JS入门知识(二)

目录 JS 前言 准备工作 运算符 算数运算符 比较运算符 自增、自减运算符 逻辑运算符 运算符的优先级 分支语句 if-else语句 switch语句 三元表达式 结束语 JS 前言 本系列博客主要分享JavaScript的基础语法知识&#xff0c;本期为第二期&#xff0c;包含一些简…

Linux基础命令系列一小白必掌握

前言 为了有一个大概的复习框架所以先给出总的思维导图&#xff0c;如图&#xff1a; 目录 1.Linux的目录结构&#xff1f;Linux命令与命令行是什么&#xff1f;Linux命令基础格式&#xff1f; 2.ls命令 3.cd命令 4.mkdir命令 5.touch命令 6.cat命令 7.cp命令 8.mv命令…