From 186d0efd379277a2ebfd278025c19a1ec6d5e23f Mon Sep 17 00:00:00 2001 From: fengyarnom Date: Fri, 30 May 2025 19:02:58 +0800 Subject: [PATCH] =?UTF-8?q?fix:=20=E8=B0=83=E6=95=B4=E6=9C=80=E6=96=B0?= =?UTF-8?q?=E6=95=B0=E6=8D=AE=E7=9A=84=E6=98=BE=E7=A4=BA?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- tcp_server.go | 38 ++++++++++++------- templates/index.html | 87 +++++++++++++++++++++++++++++++++----------- 2 files changed, 89 insertions(+), 36 deletions(-) diff --git a/tcp_server.go b/tcp_server.go index 2536cde..5647c91 100644 --- a/tcp_server.go +++ b/tcp_server.go @@ -13,9 +13,10 @@ import ( // 客户端信息结构 type ClientInfo struct { - IP string // IP地址 - Port string // 端口 - LastSeen time.Time // 最后活跃时间 + IP string // IP地址 + Port string // 端口 + LastSeen time.Time // 最后活跃时间 + IsConnected bool // 是否当前连接 } // 客户端列表(使用互斥锁保护的映射) @@ -257,9 +258,10 @@ func addClient(addr string) { } clients[addr] = &ClientInfo{ - IP: host, - Port: port, - LastSeen: time.Now(), + IP: host, + Port: port, + LastSeen: time.Now(), + IsConnected: true, } Logger.Printf("添加新客户端: %s", addr) @@ -281,8 +283,9 @@ func removeClient(addr string) { defer clientsMutex.Unlock() if client, exists := clients[addr]; exists { - client.LastSeen = time.Now() - Logger.Printf("客户端标记为断开连接: %s", addr) + // 标记为断开连接,不更新LastSeen时间 + client.IsConnected = false + Logger.Printf("客户端断开连接: %s", addr) } } @@ -297,18 +300,21 @@ func getAllClients() []map[string]interface{} { for addr, client := range clients { lastSeenDuration := now.Sub(client.LastSeen) + // 清理24小时前的记录 if lastSeenDuration > 24*time.Hour { delete(clients, addr) continue } - // 修改连接状态判断:2小时内为保持连接,超过2小时为掉线 - isOnline := lastSeenDuration < 2*time.Hour + // 连接状态判断:当前连接且2小时内活跃为在线 + isOnline := client.IsConnected && lastSeenDuration < 2*time.Hour var connectionStatus string if isOnline { connectionStatus = "保持连接" + } else if client.IsConnected { + connectionStatus = "连接超时" } else { - connectionStatus = "已掉线" + connectionStatus = "已断开" } result = append(result, map[string]interface{}{ @@ -375,17 +381,21 @@ func triggerManualQuery() int { command := "@1602301014A*0!\n" for addr, client := range clients { - // 检查客户端是否在线(2小时内活跃,与连接状态判断保持一致) - if time.Since(client.LastSeen) < 2*time.Hour { + // 检查客户端是否在线(连接状态且2小时内活跃) + if client.IsConnected && time.Since(client.LastSeen) < 2*time.Hour { if conn, exists := clientConns[addr]; exists { if _, err := conn.Write([]byte(command)); err != nil { Logger.Printf("手动发送查询指令到客户端 %s 失败: %v", addr, err) - // 连接可能已断开,从映射中移除 + // 连接可能已断开,从映射中移除并标记为断开 delete(clientConns, addr) + client.IsConnected = false } else { TCPDataLogger.Printf("手动发送查询指令到客户端 %s: %s", addr, strings.TrimSpace(command)) sentCount++ } + } else { + // 没有连接记录,标记为断开 + client.IsConnected = false } } } diff --git a/templates/index.html b/templates/index.html index 0f25237..34a5c32 100644 --- a/templates/index.html +++ b/templates/index.html @@ -760,37 +760,59 @@ // 获取最新传感器数据 function fetchLatestData() { - console.log('正在获取最新传感器数据...'); + console.log('=== 开始获取最新传感器数据 ==='); fetch('/api/latest') .then(response => { - console.log('获取最新数据响应状态:', response.status); + console.log('API响应状态:', response.status, response.statusText); if (!response.ok) { throw new Error(`HTTP错误: ${response.status}`); } return response.json(); }) .then(data => { - console.log('获取到的最新数据:', data); - if (data && data.length > 0) { + console.log('=== API返回的原始数据 ==='); + console.log('数据类型:', typeof data); + console.log('数据内容:', data); + console.log('是否为数组:', Array.isArray(data)); + console.log('数组长度:', data ? data.length : 'null'); + + if (data && Array.isArray(data) && data.length > 0) { const latest = data[0]; + console.log('=== 最新数据详情 ==='); + console.log('latest对象:', latest); + console.log('sensor_id:', latest.sensor_id); + console.log('x:', latest.x); + console.log('y:', latest.y); + console.log('z:', latest.z); + console.log('temperature:', latest.temperature); + console.log('timestamp:', latest.timestamp); + updateLatestDataDisplay(latest); - console.log('最新数据显示更新完成'); + console.log('=== 更新显示完成 ==='); } else { - console.log('数据库中没有数据'); + console.log('=== 数据为空,显示空状态 ==='); updateLatestDataDisplayEmpty(); } }) .catch(error => { - console.error('获取最新数据失败:', error); + console.error('=== 获取最新数据出错 ==='); + console.error('错误详情:', error); updateLatestDataDisplayError(error.message); }); } // 更新最新数据显示 function updateLatestDataDisplay(data) { + console.log('=== 开始更新最新数据显示 ==='); + console.log('输入数据:', data); + try { const date = new Date(data.timestamp); + console.log('解析时间戳:', data.timestamp); + console.log('原始时间:', date.toISOString()); + date.setHours(date.getHours() - 8); + console.log('调整后时间:', date.toISOString()); const formattedDate = date.getFullYear() + '/' + @@ -800,23 +822,44 @@ date.getMinutes().toString().padStart(2, '0') + ':' + date.getSeconds().toString().padStart(2, '0'); - document.getElementById('latest-time').textContent = `(${formattedDate})`; - document.getElementById('latest-sensor-id').textContent = data.sensor_id; - document.getElementById('latest-x').textContent = data.x.toFixed(3); - document.getElementById('latest-y').textContent = data.y.toFixed(3); - document.getElementById('latest-z').textContent = data.z.toFixed(3); - document.getElementById('latest-temperature').textContent = data.temperature.toFixed(1); + console.log('格式化时间:', formattedDate); + + // 检查DOM元素是否存在 + const timeElem = document.getElementById('latest-time'); + const sensorIdElem = document.getElementById('latest-sensor-id'); + const xElem = document.getElementById('latest-x'); + const yElem = document.getElementById('latest-y'); + const zElem = document.getElementById('latest-z'); + const tempElem = document.getElementById('latest-temperature'); + + console.log('DOM元素检查:'); + console.log('- latest-time:', timeElem ? '存在' : '不存在'); + console.log('- latest-sensor-id:', sensorIdElem ? '存在' : '不存在'); + console.log('- latest-x:', xElem ? '存在' : '不存在'); + console.log('- latest-y:', yElem ? '存在' : '不存在'); + console.log('- latest-z:', zElem ? '存在' : '不存在'); + console.log('- latest-temperature:', tempElem ? '存在' : '不存在'); + + if (timeElem) timeElem.textContent = `(${formattedDate})`; + if (sensorIdElem) sensorIdElem.textContent = data.sensor_id; + if (xElem) xElem.textContent = data.x.toFixed(3); + if (yElem) yElem.textContent = data.y.toFixed(3); + if (zElem) zElem.textContent = data.z.toFixed(3); + if (tempElem) tempElem.textContent = data.temperature.toFixed(1); + + console.log('=== 数据更新成功 ==='); + console.log('更新的值:'); + console.log('- 时间:', formattedDate); + console.log('- 传感器ID:', data.sensor_id); + console.log('- X:', data.x.toFixed(3)); + console.log('- Y:', data.y.toFixed(3)); + console.log('- Z:', data.z.toFixed(3)); + console.log('- 温度:', data.temperature.toFixed(1)); - console.log('最新数据显示更新成功:', { - sensor_id: data.sensor_id, - time: formattedDate, - x: data.x, - y: data.y, - z: data.z, - temperature: data.temperature - }); } catch (error) { - console.error('更新最新数据显示时发生错误:', error); + console.error('=== 更新最新数据显示时发生错误 ==='); + console.error('错误详情:', error); + console.error('错误堆栈:', error.stack); updateLatestDataDisplayError('数据格式错误'); } }