FireLeave_tool/tcpreader/tcpreader.go
2025-12-10 14:34:57 +08:00

77 lines
2.0 KiB
Go

package tcpreader
import (
"bufio"
"encoding/json"
"fmt"
"net"
"sync"
"time"
"FireLeave_tool/logger"
)
// TemperatureResult 温度读取程序返回的数据
type TemperatureResult struct {
Tmp float64 `json:"tmp"`
}
// TCPClient TCP 客户端
type TCPClient struct {
addr string
deviceUUID string
conn net.Conn
mu sync.Mutex
}
// NewTCPClient 创建新的 TCP 客户端
func NewTCPClient(deviceUUID string, tempPort int) (*TCPClient, error) {
addr := fmt.Sprintf("127.0.0.1:%d", tempPort)
conn, err := net.DialTimeout("tcp", addr, 5*time.Second)
if err != nil {
logger.Logger.Printf("Connect TCP server %s failed (DeviceUUID=%s): %v", addr, deviceUUID, err)
return nil, fmt.Errorf("connect TCP server %s failed: %v", addr, err)
}
client := &TCPClient{
addr: addr,
deviceUUID: deviceUUID,
conn: conn,
}
logger.Logger.Printf("TCP client created successfully: DeviceUUID=%s, Address=%s", deviceUUID, addr)
return client, nil
}
// ReadTemperatureResult 读取温度程序数据
func (tc *TCPClient) ReadTemperatureResult() (TemperatureResult, error) {
tc.mu.Lock()
defer tc.mu.Unlock()
tc.conn.SetReadDeadline(time.Now().Add(10 * time.Second))
reader := bufio.NewReader(tc.conn)
message, err := reader.ReadString('\n')
if err != nil {
logger.Logger.Printf("Read temperature data failed (DeviceUUID=%s, Address=%s): %v", tc.deviceUUID, tc.addr, err)
return TemperatureResult{}, fmt.Errorf("read temperature data failed: %v", err)
}
var result TemperatureResult
if err := json.Unmarshal([]byte(message), &result); err != nil {
logger.Logger.Printf("Parse temperature data failed (DeviceUUID=%s, Address=%s): %v", tc.deviceUUID, tc.addr, err)
return TemperatureResult{}, fmt.Errorf("parse temperature data failed: %v", err)
}
return result, nil
}
// Close 关闭 TCP 连接
func (tc *TCPClient) Close() {
tc.mu.Lock()
defer tc.mu.Unlock()
if tc.conn != nil {
tc.conn.Close()
logger.Logger.Printf("Close TCP connection: DeviceUUID=%s, Address=%s", tc.deviceUUID, tc.addr)
}
}