fix:修复一些问题
This commit is contained in:
parent
79f5ae89df
commit
ed8048c111
35
forwarder.go
35
forwarder.go
@ -12,42 +12,71 @@ import (
|
|||||||
func ExtractDeviceIDFromBatchRaw(data string) string {
|
func ExtractDeviceIDFromBatchRaw(data string) string {
|
||||||
m := regexp.MustCompile(`([A-Za-z0-9]+)-\d+`).FindStringSubmatch(data)
|
m := regexp.MustCompile(`([A-Za-z0-9]+)-\d+`).FindStringSubmatch(data)
|
||||||
if len(m) == 2 {
|
if len(m) == 2 {
|
||||||
|
Logger.Printf("从原始数据提取到设备ID: %s", m[1])
|
||||||
return m[1]
|
return m[1]
|
||||||
}
|
}
|
||||||
|
Logger.Printf("未能从原始数据中提取设备ID,跳过转发")
|
||||||
return ""
|
return ""
|
||||||
}
|
}
|
||||||
|
|
||||||
// ForwardRawData 将原始数据转发到设备配置的 TCP 目标
|
// ForwardRawData 将原始数据转发到设备配置的 TCP 目标
|
||||||
func ForwardRawData(deviceID string, raw string) error {
|
func ForwardRawData(deviceID string, raw string) error {
|
||||||
if deviceID == "" {
|
if deviceID == "" {
|
||||||
|
Logger.Printf("转发跳过:deviceID 为空")
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
dev, err := GetDevice(deviceID)
|
dev, err := GetDevice(deviceID)
|
||||||
if err != nil || dev == nil {
|
if err != nil {
|
||||||
|
Logger.Printf("查询设备配置失败 deviceID=%s: %v", deviceID, err)
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
if dev == nil {
|
||||||
|
Logger.Printf("未找到设备配置 deviceID=%s,跳过转发", deviceID)
|
||||||
|
return nil
|
||||||
|
}
|
||||||
if !dev.ForwardEnable {
|
if !dev.ForwardEnable {
|
||||||
|
Logger.Printf("设备未启用转发 deviceID=%s,跳过转发", deviceID)
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
if !dev.Host.Valid || dev.Host.String == "" || !dev.Port.Valid || dev.Port.Int64 <= 0 {
|
if !dev.Host.Valid || dev.Host.String == "" || !dev.Port.Valid || dev.Port.Int64 <= 0 {
|
||||||
|
Logger.Printf("设备转发目标未配置完整 deviceID=%s host=%v port=%v,跳过转发", deviceID, dev.Host, dev.Port)
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
address := fmt.Sprintf("%s:%d", dev.Host.String, dev.Port.Int64)
|
address := fmt.Sprintf("%s:%d", dev.Host.String, dev.Port.Int64)
|
||||||
|
Logger.Printf("准备连接转发目标 deviceID=%s addr=%s", deviceID, address)
|
||||||
|
|
||||||
conn, err := net.DialTimeout("tcp", address, 5*time.Second)
|
conn, err := net.DialTimeout("tcp", address, 5*time.Second)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
|
Logger.Printf("连接转发目标失败 deviceID=%s addr=%s: %v", deviceID, address, err)
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
defer conn.Close()
|
defer conn.Close()
|
||||||
|
Logger.Printf("连接转发目标成功 deviceID=%s addr=%s", deviceID, address)
|
||||||
|
|
||||||
if dev.RegCodeHex.Valid && dev.RegCodeHex.String != "" {
|
if dev.RegCodeHex.Valid && dev.RegCodeHex.String != "" {
|
||||||
bytes, decErr := hex.DecodeString(dev.RegCodeHex.String)
|
bytes, decErr := hex.DecodeString(dev.RegCodeHex.String)
|
||||||
if decErr == nil {
|
if decErr != nil {
|
||||||
_, _ = conn.Write(bytes)
|
Logger.Printf("注册码HEX解码失败 deviceID=%s hex=%s: %v(将继续发送原始数据)", deviceID, dev.RegCodeHex.String, decErr)
|
||||||
|
} else {
|
||||||
|
Logger.Printf("发送注册码 deviceID=%s bytes=%d", deviceID, len(bytes))
|
||||||
|
if _, werr := conn.Write(bytes); werr != nil {
|
||||||
|
Logger.Printf("发送注册码失败 deviceID=%s: %v", deviceID, werr)
|
||||||
|
return werr
|
||||||
|
}
|
||||||
time.Sleep(1 * time.Second)
|
time.Sleep(1 * time.Second)
|
||||||
}
|
}
|
||||||
|
} else {
|
||||||
|
Logger.Printf("未配置注册码 deviceID=%s,直接发送原始数据", deviceID)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Logger.Printf("发送原始数据 deviceID=%s bytes=%d", deviceID, len(raw))
|
||||||
_, err = conn.Write([]byte(raw))
|
_, err = conn.Write([]byte(raw))
|
||||||
|
if err != nil {
|
||||||
|
Logger.Printf("发送原始数据失败 deviceID=%s: %v", deviceID, err)
|
||||||
return err
|
return err
|
||||||
|
}
|
||||||
|
Logger.Printf("完成转发 deviceID=%s", deviceID)
|
||||||
|
return nil
|
||||||
}
|
}
|
||||||
|
|||||||
@ -58,6 +58,7 @@ func handleUDPPacket(conn *net.UDPConn, addr *net.UDPAddr, data []byte) {
|
|||||||
|
|
||||||
// 尝试提取设备ID并透传原始数据
|
// 尝试提取设备ID并透传原始数据
|
||||||
if deviceID := ExtractDeviceIDFromBatchRaw(rawData); deviceID != "" {
|
if deviceID := ExtractDeviceIDFromBatchRaw(rawData); deviceID != "" {
|
||||||
|
Logger.Printf("准备转发 deviceID=%s 原始长度=%d", deviceID, len(rawData))
|
||||||
go func(id string, payload string) {
|
go func(id string, payload string) {
|
||||||
if fErr := ForwardRawData(id, payload); fErr != nil {
|
if fErr := ForwardRawData(id, payload); fErr != nil {
|
||||||
Logger.Printf("转发设备 %s 数据失败: %v", id, fErr)
|
Logger.Printf("转发设备 %s 数据失败: %v", id, fErr)
|
||||||
@ -84,6 +85,7 @@ func handleUDPPacket(conn *net.UDPConn, addr *net.UDPAddr, data []byte) {
|
|||||||
// 从原始字符串尝试提取设备ID并透传
|
// 从原始字符串尝试提取设备ID并透传
|
||||||
if m := regexp.MustCompile(`([A-Za-z0-9]+)-\d+`).FindStringSubmatch(rawData); len(m) == 2 {
|
if m := regexp.MustCompile(`([A-Za-z0-9]+)-\d+`).FindStringSubmatch(rawData); len(m) == 2 {
|
||||||
id := m[1]
|
id := m[1]
|
||||||
|
Logger.Printf("准备转发 deviceID=%s 原始长度=%d", id, len(rawData))
|
||||||
go func(id string, payload string) {
|
go func(id string, payload string) {
|
||||||
if fErr := ForwardRawData(id, payload); fErr != nil {
|
if fErr := ForwardRawData(id, payload); fErr != nil {
|
||||||
Logger.Printf("转发设备 %s 数据失败: %v", id, fErr)
|
Logger.Printf("转发设备 %s 数据失败: %v", id, fErr)
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user