xu 2 месяцев назад
Родитель
Сommit
ab6a028a4d
2 измененных файлов с 42 добавлено и 7 удалено
  1. 0 1
      initialize/myData.go
  2. 42 6
      utils/myTool.go

+ 0 - 1
initialize/myData.go

@@ -217,7 +217,6 @@ func parseData(data *model.QueueData) {
 	case "11":
 		switch toString[2:6] {
 		case "0336":
-			logger.Get().Println(data.Id + "太阳能" + toString)
 			batteryVoltage, _ := strconv.ParseInt(toString[6:10], 16, 64)
 			batteryCurrent, _ := strconv.ParseInt(toString[10:14], 16, 64)
 			batteryPlateVoltage, _ := strconv.ParseInt(toString[38:42], 16, 64)

+ 42 - 6
utils/myTool.go

@@ -155,14 +155,50 @@ func SaveData(path string, parameter interface{}) error {
 	return nil
 }
 
-// WriteDevice 纯写
+const (
+	maxRetries   = 3               // 最大重试次数
+	writeTimeout = 5 * time.Second // 写入超时时间
+)
+
 func WriteDevice(frame []byte, conn net.Conn) error {
-	_, err := conn.Write(frame)
-	if err != nil {
-		logger.Get().Errorln("Error writing to connection:", err)
-		return err
+	for attempts := 0; attempts < maxRetries; attempts++ {
+		if err := conn.SetWriteDeadline(time.Now().Add(writeTimeout)); err != nil {
+			logger.Get().Errorf("Set write deadline failed: %v", err)
+			return err
+		}
+
+		_, err := conn.Write(frame)
+		if err == nil {
+			logger.Get().Infof("Successfully wrote frame to device")
+			return nil
+		}
+
+		// 检查是否是 broken pipe 或 connection reset by peer 错误
+		if ne, ok := err.(*net.OpError); ok && (ne.Err.Error() == "broken pipe" || ne.Err.Error() == "connection reset by peer") {
+			logger.Get().Warnf("Connection closed by peer or broken pipe, retrying (%d/%d)", attempts+1, maxRetries)
+
+			// 关闭旧连接
+			if err := conn.Close(); err != nil {
+				logger.Get().Errorf("Failed to close connection: %v", err)
+			}
+
+			// 尝试重新建立连接
+			var newConn net.Conn
+			newConn, err = net.Dial("tcp", conn.RemoteAddr().String())
+			if err != nil {
+				logger.Get().Errorf("Reconnect failed: %v", err)
+				continue // 继续下一次重试
+			}
+			conn = newConn
+			continue // 重试写入
+		}
+
+		// 如果不是 broken pipe 或 connection reset by peer,则直接返回错误
+		logger.Get().Errorf("Write failed: %v", err)
+		return fmt.Errorf("write failed after %d retries: %v", attempts+1, err)
 	}
-	return nil
+
+	return fmt.Errorf("failed to write after %d retries", maxRetries)
 }
 
 func WriteAndReadDevice(frame []byte, conn net.Conn, former, after int) (data []byte, err error) {