首页 > 其他分享 >Web组态数据联动

Web组态数据联动

时间:2024-10-16 10:49:32浏览次数:1  
标签:Web mqttClient value 组态 联动 error id data response

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); // 生成唯一客户端 ID
                    const 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>

 

标签:Web,mqttClient,value,组态,联动,error,id,data,response
From: https://www.cnblogs.com/chen1880/p/18469359

相关文章

  • 一个基于若依的超级漂亮的博客系统,可用于所有Web应用(带私活源码)
     今天分享的开源项目是:RuoYiBlog-一个基于若依的超级漂亮的博客系统 。一、项目介绍     如果你一直想做一个博客平台,看过许多优秀的开源项目,但没有找到合适的,那么今天可以参考这个项目。作者利用业余时间把若依后台管理和pb-cms结合起来,在自己的参考中开发了一......
  • 【web服务】耗时任务基于API与worker模式
    场景:当我们爬虫或者获取数据需要很长的时间计算或者等待,这种情况情况下基于API与worker模式完成交付1.API端:用flask框架importjsonimportuuidimportredisfromflaskimportFlask,request,jsonifyapp=Flask(__name__)pool=redis.ConnectionPool(host='127.0.0......
  • 基于web的医疗设备管理系统
    开发语言:Java框架:springbootJDK版本:JDK1.8服务器:tomcat7数据库:mysql5.7(一定要5.7版本)数据库工具:Navicat11开发软件:eclipse/myeclipse/ideaMaven包:Maven3.3.9浏览器:谷歌浏览器后台路径地址:localhost:8080/项目名称/admin/dist/index.html前台路径地址:localhost:80......
  • 【JavaWeb】一文读懂Cookie、Session&Token 的区别和联系
    大佬精心打造:JavaWeb进阶学习资料》》点击免费获取【javaWeb】Cookie&Session&SpringSession原理分析简介Cookie、Session、Token这三者是不同发展阶段的产物,都是为了解决无状态的HTTP协议,提升网站的交互体验。但是他们各有优缺点,三者也没有明显的对立关系,反而常常......
  • 【JavaWeb】Spring Boot中@Import多种使用方式
    @Import是一个非常有用的注解,它的长处在于你可以通过配置来控制是否注入该Bean,也可以通过条件来控制注入哪些Bean到Spring容器中。比如我们熟悉的:@EnableAsync 、@EnableCaching、@EnableScheduling等等统一采用的都是借助@Import注解来实现的。  需要注意的是:ImportSele......
  • 【攻防世界】Web_python_template_injection
    Web_python_template_injection:python模板漏洞python的flask模板注入的题思路比较固定,Jinja2模板引擎中,{{}}是变量包裹标识符。{{}}并不仅仅可以传递变量,还可以执行一些简单的表达式。1.先判断是否存在注入{{config}}2.获取基本类:{{''.__class__.__mro__}}.__class......
  • nginx web代理
    目录1.nginx的简单介绍2.正向代理的应用场景2.1做访问控制 2.2审计 2.3负载分散2.4隐私保护和匿名性3.反向代理的应用场景如下 3.1.负载均衡2.缓存静态内容3.压缩和优化内容4.提供故障转移5.安全性和匿名性4.正向代理 4.1web端4.2lb01代理服务器配置 5.反......
  • DAY50WEB 攻防-PHP 应用&文件包含&LFI&RFI&伪协议编码算法&无文件利用&黑白盒
    知识点:1、文件包含-原理&分类&危害-LFI&RFI2、文件包含-利用-黑白盒&无文件&伪协议文件包含-原理&分类&利用&修复原理:程序开发人员通常会把可重复使用的函数写到单个文件中,在使用某些函数时,直接调用此文件,而无须再次编写,这种调用文件的过程一般被称为文件包含。在包含文......
  • 通过 chatgpt 修复org.springframework:spring-webmvc 安全漏洞过程记录(chatgpt有时候
    1,首先我把这个安全漏洞的trivy完整描述send给了chatgpt并且随后把我的pom.xml也完整的send给了它。chatgpt给出的答案还算比较靠谱。 图一 图二 图三 图四 2,根据chatgpt的回复,我把<parent><groupId>org.springframework.boot</groupId><artifactId>sp......
  • 基于XP架设Web和FTP服务器基于XP架设Web和FTP服务器真没想到
    网络的迅速发展使宽带走入寻常百姓家,广大网络爱好者也勇于尝试,在自己的爱机上建设自己的网站,那么选择什么系统呢?Win2000漏洞百出,Win2003又专门为服务器设计,没有太适合普通的家用,相反WinXP是微软继Win98后最受欢迎的操作系统,今天我就介绍1下,在XP环境中利用IIS架构自己的网站。......