64 lines
1.3 KiB
Go
64 lines
1.3 KiB
Go
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
|
||
}
|