<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<meta name="renderer" content="ie-comp">
<title>websocket</title>
<script src="https://cdn.jsdelivr.net/npm/echarts@5.0.2/dist/echarts.min.js"></script> <!-- 引入ECharts -->
<style type="text/css">
#chart {
width: 600px;
height: 400px;
}
</style>
</head>
<body>
<div id="chart"></div> <!-- ECharts 容器 -->
<script type="text/javascript">
var ws = null;
var lockReconnect = false;
var chart = null; // ECharts 实例
var data = []; // 存储数据的数组
var timeData = []; // 存储时间的数组
var MAX_POINTS = 10; // 折线图显示的最大数据点数
// 页面加载时初始化 WebSocket 和 ECharts
window.onload = function () {
initChart(); // 初始化ECharts
hangClick(); // 建立WebSocket连接
}
// 初始化ECharts折线图
function initChart() {
chart = echarts.init(document.getElementById('chart'));
var option = {
title: {
text: '实时数据'
},
tooltip: {
trigger: 'axis' // 启用提示信息,鼠标悬停时显示数据
},
xAxis: {
type: 'category',
boundaryGap: false,
data: [] // X轴初始为空
},
yAxis: {
type: 'value'
},
series: [{
name: '功率1',
type: 'line',
data: [] // Y轴数据初始为空
}]
};
chart.setOption(option);
}
// 更新ECharts图表数据
function updateChart(newValue) {
var currentTime = new Date().toLocaleTimeString(); // 获取当前时间作为X轴
data.push(newValue); // 将新数据推入数组
timeData.push(currentTime); // 将当前时间推入时间数组
if (data.length > MAX_POINTS) {
data.shift(); // 超过最大点数时移除最早的数据
timeData.shift(); // 移除最早的时间
}
// 更新图表
chart.setOption({
xAxis: {
data: timeData // 用时间数组更新X轴
},
series: [{
data: data // 更新Y轴数据
}]
});
}
// WebSocket连接和通信
function hangClick() {
ws = new WebSocket("ws://192.168.124.48:8182/modbus");
ws.onopen = function (event) {
heartCheck.reset().start();
console.log("WebSocket 连接已建立...");
}
ws.onmessage = function (event) {
heartCheck.reset().start();
if (typeof (event.data) == "string") {
var newValue = parseFloat(event.data); // 将接收到的字符串数据转换为数值
//console.log("接收到的新数据: " newValue);
updateChart(newValue); // 更新图表
}
};
ws.onerror = function (event) {
console.log("WebSocket 错误");
reconnect();
}
ws.onclose = function (event) {
console.log("WebSocket 连接关闭");
reconnect();
}
}
// 心跳检测
var heartCheck = {
timeout: 3000,
timeoutObj: null,
serverTimeoutObj: null,
reset: function () {
clearTimeout(this.timeoutObj);
clearTimeout(this.serverTimeoutObj);
return this;
},
start: function () {
var self = this;
this.timeoutObj = setTimeout(function () {
if (ws.readyState == 1) ws.send("DATE111");
self.serverTimeoutObj = setTimeout(function () {
hangClick();
}, self.timeout);
}, this.timeout);
}
}
// 重连WebSocket
function reconnect() {
if (lockReconnect) return;
lockReconnect = true;
setTimeout(function () {
hangClick();
lockReconnect = false;
}, 2000);
}
</script>
</body>
</html>
网友评论
我要评论