diff --git a/README.md b/README.md index e69de29..7535ab9 100644 --- a/README.md +++ b/README.md @@ -0,0 +1 @@ +# 英卓气象站 diff --git a/config/config.yaml b/config.yaml similarity index 100% rename from config/config.yaml rename to config.yaml diff --git a/config/config.go b/config/config.go index b27c961..da78786 100644 --- a/config/config.go +++ b/config/config.go @@ -33,7 +33,7 @@ func GetConfig() *Config { } func (c *Config) loadConfig() error { - data, err := os.ReadFile("config/config.yaml") + data, err := os.ReadFile("config.yaml") if err != nil { return fmt.Errorf("读取配置文件失败: %v", err) } diff --git a/main.go b/main.go index 7e9c7e2..9607c31 100644 --- a/main.go +++ b/main.go @@ -1,15 +1,70 @@ package main import ( + "bufio" + "encoding/hex" "fmt" + "io" "log" "net" + "os" + "path/filepath" + "strings" + "time" + "unicode/utf8" "weatherstation/config" "weatherstation/model" ) +type UTF8Writer struct { + w io.Writer +} + +func NewUTF8Writer(w io.Writer) *UTF8Writer { + return &UTF8Writer{w: w} +} + +func (w *UTF8Writer) Write(p []byte) (n int, err error) { + if utf8.Valid(p) { + return w.w.Write(p) + } + + s := string(p) + s = strings.ToValidUTF8(s, "�") + return w.w.Write([]byte(s)) +} + +func setupLogger() { + logDir := "log" + if _, err := os.Stat(logDir); os.IsNotExist(err) { + os.MkdirAll(logDir, 0755) + } + + currentTime := time.Now() + logFileName := filepath.Join(logDir, fmt.Sprintf("%s.log", currentTime.Format("2006-01-02"))) + logFile, err := os.OpenFile(logFileName, os.O_CREATE|os.O_WRONLY|os.O_APPEND, 0644) + if err != nil { + log.Fatalf("无法创建日志文件: %v", err) + } + + bufferedWriter := bufio.NewWriter(logFile) + utf8Writer := NewUTF8Writer(bufferedWriter) + go func() { + for { + time.Sleep(1 * time.Second) + bufferedWriter.Flush() + } + }() + + multiWriter := io.MultiWriter(os.Stdout, utf8Writer) + log.SetOutput(multiWriter) + log.SetFlags(log.Ldate | log.Ltime | log.Lshortfile) +} + func main() { + setupLogger() + cfg := config.GetConfig() addr := fmt.Sprintf(":%d", cfg.Server.UDPPort) @@ -30,17 +85,72 @@ func main() { continue } - data := string(buffer[:n]) + rawData := buffer[:n] + data := string(rawData) log.Printf("从 %s 接收到 %d 字节数据", addr.String(), n) weatherData, err := model.ParseWeatherData(data) if err != nil { log.Printf("解析数据失败: %v", err) - log.Printf("原始数据: %s", data) + + hexDump := hexDump(rawData) + log.Printf("原始码流(十六进制):\n%s", hexDump) + asciiDump := asciiDump(rawData) + log.Printf("ASCII码:\n%s", asciiDump) + continue } - fmt.Println("成功解析气象站数据:") - fmt.Println(weatherData) + log.Println("成功解析气象站数据:") + log.Println(weatherData) } } + +func hexDump(data []byte) string { + var result strings.Builder + + for i := 0; i < len(data); i += 16 { + end := i + 16 + if end > len(data) { + end = len(data) + } + + chunk := data[i:end] + hexStr := hex.EncodeToString(chunk) + + for j := 0; j < len(hexStr); j += 2 { + if j+2 <= len(hexStr) { + result.WriteString(strings.ToUpper(hexStr[j : j+2])) + result.WriteString(" ") + } + } + + result.WriteString("\n") + } + + return result.String() +} + +func asciiDump(data []byte) string { + var result strings.Builder + + for i := 0; i < len(data); i += 64 { + end := i + 64 + if end > len(data) { + end = len(data) + } + + chunk := data[i:end] + for _, b := range chunk { + if b >= 32 && b <= 126 { + result.WriteByte(b) + } else { + result.WriteString(".") + } + } + + result.WriteString("\n") + } + + return result.String() +}