package main import ( "encoding/hex" "fmt" "net" "time" ) // ExtractDeviceIDFromBatchRaw 从批量原始数据中提取设备ID(序列号形如 1513343-01) func ExtractDeviceIDFromBatchRaw(data string) int { for i := 0; i < len(data); i++ { if data[i] >= '0' && data[i] <= '9' { j := i for j < len(data) && data[j] >= '0' && data[j] <= '9' { j++ } if j < len(data) && data[j] == '-' { var v int for k := i; k < j; k++ { v = v*10 + int(data[k]-'0') } return v } } } return 0 } // ForwardRawData 将原始数据转发到设备配置的 TCP 目标 func ForwardRawData(deviceID int, raw string) error { if deviceID <= 0 { return nil } dev, err := GetDevice(deviceID) if err != nil || dev == nil { return err } if !dev.ForwardEnable { return nil } if !dev.Host.Valid || dev.Host.String == "" || !dev.Port.Valid || dev.Port.Int64 <= 0 { return nil } address := fmt.Sprintf("%s:%d", dev.Host.String, dev.Port.Int64) conn, err := net.DialTimeout("tcp", address, 5*time.Second) if err != nil { return err } defer conn.Close() if dev.RegCodeHex.Valid && dev.RegCodeHex.String != "" { bytes, decErr := hex.DecodeString(dev.RegCodeHex.String) if decErr == nil { _, _ = conn.Write(bytes) time.Sleep(1 * time.Second) } } _, err = conn.Write([]byte(raw)) return err }