diff --git a/.gitignore b/.gitignore index 3c379ef..6cda2fa 100644 --- a/.gitignore +++ b/.gitignore @@ -1,3 +1,4 @@ tty* telegram.db -.idea \ No newline at end of file +.idea +log_* \ No newline at end of file diff --git a/cmd/start.go b/cmd/start.go index 1886d1d..6e98eda 100644 --- a/cmd/start.go +++ b/cmd/start.go @@ -91,10 +91,10 @@ func start() { } logger.Info("starting read") } - buffer, count := utils.ReadPort() - if count > 0 { + buffer, err := utils.ReadPort() + if err == nil { if lograw && len(buffer) > 0 { - fmt.Print(string(buffer)) + fmt.Println(buffer) } if utils.Append(buffer) { fmt.Println() diff --git a/go.mod b/go.mod index cd5564d..759677a 100644 --- a/go.mod +++ b/go.mod @@ -3,12 +3,14 @@ module it2000.com.cn/tele-recv go 1.15 require ( + github.com/argandas/serial v0.0.0-20160316175758-889a5ad85462 github.com/fsnotify/fsnotify v1.4.9 // indirect github.com/lestrrat-go/file-rotatelogs v2.4.0+incompatible github.com/lestrrat-go/strftime v1.0.3 // indirect github.com/magiconair/properties v1.8.4 // indirect github.com/mattn/go-sqlite3 v1.14.5 github.com/mitchellh/mapstructure v1.4.0 // indirect + github.com/nsf/gocode v0.0.0-20190302080247-5bee97b48836 // indirect github.com/pelletier/go-toml v1.8.1 // indirect github.com/spf13/afero v1.5.1 // indirect github.com/spf13/cast v1.3.1 // indirect diff --git a/go.sum b/go.sum index eb16feb..5c81a6b 100644 --- a/go.sum +++ b/go.sum @@ -17,6 +17,8 @@ github.com/BurntSushi/xgb v0.0.0-20160522181843-27f122750802/go.mod h1:IVnqGOEym github.com/OneOfOne/xxhash v1.2.2/go.mod h1:HSdplMjZKSmBqAxg5vPj2TmRDmfkzw+cTzAElWljhcU= github.com/alecthomas/template v0.0.0-20160405071501-a0175ee3bccc/go.mod h1:LOuyumcjzFXgccqObfd/Ljyb9UuFJ6TxHnclSeseNhc= github.com/alecthomas/units v0.0.0-20151022065526-2efee857e7cf/go.mod h1:ybxpYRFXyAe+OPACYpWeL0wqObRcbAqCMya13uyzqw0= +github.com/argandas/serial v0.0.0-20160316175758-889a5ad85462 h1:Hl0NBpA4cJvqHyrm3mhAb+g9bzimPr6pmb9JhfV5PhA= +github.com/argandas/serial v0.0.0-20160316175758-889a5ad85462/go.mod h1:IPXZreh+vkWR8Dr8jwAZJo/L9Kpsw9zSkwYFEJ7eVro= github.com/armon/circbuf v0.0.0-20150827004946-bbbad097214e/go.mod h1:3U/XgcO3hCbHZ8TKRvWD2dDTCfh9M9ya+I9JpbB7O8o= github.com/armon/go-metrics v0.0.0-20180917152333-f0300d1749da/go.mod h1:Q73ZrmVTwzkszR9V5SSuryQ31EELlFMUz1kKyl939pY= github.com/armon/go-radix v0.0.0-20180808171621-7fddfc383310/go.mod h1:ufUuZ+zHj4x4TnLV4JWEpy2hxWSpsRywHrMgIH9cCH8= @@ -143,6 +145,8 @@ github.com/mitchellh/mapstructure v1.4.0/go.mod h1:bFUtVrKA4DC2yAKiSyO/QUcy7e+RR github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q= github.com/modern-go/reflect2 v1.0.1/go.mod h1:bx2lNnkwVCuqBIxFjflWJWanXIb3RllmbCylyMrvgv0= github.com/mwitkow/go-conntrack v0.0.0-20161129095857-cc309e4a2223/go.mod h1:qRWi+5nqEBWmkhHvq77mSJWrCKwh8bxhgT7d/eI7P4U= +github.com/nsf/gocode v0.0.0-20190302080247-5bee97b48836 h1:oc3CL18CoGhyOQJ7HDa9gJAde33bwI8Vi28zLdIzJVc= +github.com/nsf/gocode v0.0.0-20190302080247-5bee97b48836/go.mod h1:6Q8/OMaaKAgTX7/jt2bOXVDrm1eJhoNd+iwzghR7jvs= github.com/oklog/ulid v1.3.1/go.mod h1:CirwcVhetQ6Lv90oh/F+FBtV6XMibvdAFo93nm5qn4U= github.com/pascaldekloe/goe v0.0.0-20180627143212-57f6aae5913c/go.mod h1:lzWF7FIEvWOWxwDKqyGYQf6ZUaNfKdP144TG7ZOy1lc= github.com/pelletier/go-toml v1.2.0 h1:T5zMGML61Wp+FlcbWjRDT7yAxhJNAiPPLOFECq181zc= diff --git a/log_serial_1609210559.txt b/log_serial_1609210559.txt new file mode 100644 index 0000000..e69de29 diff --git a/log_serial_1609210613.txt b/log_serial_1609210613.txt new file mode 100644 index 0000000..cfbdddb --- /dev/null +++ b/log_serial_1609210613.txt @@ -0,0 +1 @@ +[ttyS1] 2020/12/29 10:56:53 Serial port ttyS1@9600 open diff --git a/utils/serial.go b/utils/serial.go index 83b671a..5f646e8 100644 --- a/utils/serial.go +++ b/utils/serial.go @@ -1,19 +1,19 @@ package utils import ( - "io" "time" - "github.com/tarm/serial" + "github.com/argandas/serial" "go.uber.org/zap" ) var ( - device string - baudrate int - bytesize byte - stopbits byte - port *serial.Port + device string + baudrate int + bytesize byte + stopbits byte + // port *serial.Port + sp *serial.SerialPort portOpened = false Log *zap.Logger ) @@ -27,34 +27,40 @@ func OpenPort(device string, baudrate int, bytesize byte, stopbits byte) error { zap.Int("baudrate", baudrate), zap.Int("bytesize", int(bytesize)), zap.Int("stopbits", int(stopbits))) - config := &serial.Config{Name: device, - Baud: baudrate, - Size: bytesize, - StopBits: serial.StopBits(stopbits), - ReadTimeout: readDuration} - var err error - port, err = serial.OpenPort(config) - if err != nil { - Log.Fatal("error in open serial port ", zap.Error(err)) - return err + sp = serial.New() + sp.EOL('\r') + sp.Verbose = false + err := sp.Open(device, baudrate, time.Second*3) + Log.Info("open ", zap.String("device", device), zap.Error(err)) + if err == nil { + portOpened = true } - Log.Info("opened ", zap.String("port", device)) - portOpened = true - return nil + return err + + // config := &serial.Config{Name: device, + // Baud: baudrate, + // Size: bytesize, + // StopBits: serial.StopBits(stopbits), + // ReadTimeout: readDuration} + // var err error + // port, err = serial.OpenPort(config) + // if err != nil { + // Log.Fatal("error in open serial port ", zap.Error(err)) + // return err + // } + // Log.Info("opened ", zap.String("port", device)) + // portOpened = true + // return nil } //ReadPort read byte array from port -func ReadPort() ([]byte, int) { - buffer := make([]byte, 1) - if !ServerRunning { - return buffer, 0 - } - count, err := port.Read(buffer) - if err != nil && err != io.EOF { - Log.Error("error in read port ", zap.Error(err)) - //TODO: 3 time fail try to - } - return buffer, count +func ReadPort() (string, error) { + // buffer := make([]byte, 1) + // if !ServerRunning { + // return buffer, 0 + // } + + return sp.ReadLine() } //IsPortOpen check serial port status diff --git a/utils/socket.go b/utils/socket.go index 7a9e89e..d1753c4 100644 --- a/utils/socket.go +++ b/utils/socket.go @@ -35,10 +35,9 @@ func Listen(address string) { Log.Info("client connected on ", zap.Any("address", client.RemoteAddr())) LoadUnprocessed() } else { - Log.Info("client already connected, close") - client.Close() - client = nil - conn.Close() + Log.Info("remove old client") + closeClient() + client = conn } if IsClientConnected() { connCheck() @@ -48,12 +47,15 @@ func Listen(address string) { } func WriteToClient(data string) error { - _, err := client.Write([]byte(data + "\r\n")) - if err != nil { - Log.Error("error in write data to client socket ", zap.Error(err)) - closeClient() + if client != nil { + _, err := client.Write([]byte(data + "\r\n")) + if err != nil { + Log.Error("error in write data to client socket ", zap.Error(err)) + closeClient() + } + return err } - return err + return nil } func connCheck() bool { diff --git a/utils/telegram.go b/utils/telegram.go index 3674111..032a126 100644 --- a/utils/telegram.go +++ b/utils/telegram.go @@ -12,28 +12,25 @@ const ( Expression = "(?s)ZCZC.*NNNN" ) -var buffer []byte +var buffer string +var exp, _ = regexp.Compile(Expression) var RawLog *rotatelogs.RotateLogs -func Append(data []byte) bool { - buffer = append(buffer, data...) - if buffer[len(buffer)-1] == '\r' { - buffer = append(buffer, '\n') - } +func Append(data string) bool { + buffer += (data + "\n") return check() } func check() bool { - teleString := string(buffer) + teleString := buffer if strings.Index(teleString, EndTag) > 0 { - exp, _ := regexp.Compile(Expression) - telegram := exp.FindString(string(buffer)) - + telegram := exp.FindString(teleString) if len(telegram) > 0 { // Log.Info("telegram ", zap.String("text", telegram)) telegram = removeEmpty(telegram) + "\n\n" - RawLog.Write([]byte(telegram)) - buffer = nil + telegram += "\n" + RawLog.Write([]byte(telegram + "\n")) + buffer = "" InsertTelegram(telegram) return true }