134 lines
3.0 KiB
Go
134 lines
3.0 KiB
Go
package event
|
|
|
|
import (
|
|
"encoding/hex"
|
|
"errors"
|
|
"fmt"
|
|
"git.rosy.net.cn/jx-callback/business/model/dao"
|
|
"git.rosy.net.cn/jx-print/globals"
|
|
"io"
|
|
"net"
|
|
"strings"
|
|
"time"
|
|
)
|
|
|
|
// ConnRead 获取链接数据
|
|
func ConnRead(c net.Conn) ([]byte, int, error) {
|
|
buffer := make([]byte, 1024*2)
|
|
n, err := c.Read(buffer)
|
|
return buffer, n, err
|
|
}
|
|
|
|
// ListenTcp 入口
|
|
func ListenTcp() {
|
|
l, err := net.Listen("tcp", ":8000")
|
|
if err != nil {
|
|
fmt.Println("listen error:", err)
|
|
return
|
|
}
|
|
|
|
for {
|
|
c, err := l.Accept()
|
|
if err != nil || c == nil {
|
|
fmt.Println("accept error:", err)
|
|
break
|
|
}
|
|
|
|
fn := func() {
|
|
// 捕获异常 防止waitGroup阻塞
|
|
defer func() {
|
|
if err := recover(); err != nil {
|
|
fmt.Println("recover err = ", err)
|
|
return
|
|
}
|
|
}()
|
|
|
|
if err := handleConn(c); err != nil {
|
|
c.Close()
|
|
Pool.Wait()
|
|
Pool.Stop()
|
|
return
|
|
}
|
|
}
|
|
Pool.AddJob(fn)
|
|
}
|
|
}
|
|
|
|
func handleConn(c net.Conn) error {
|
|
if c == nil {
|
|
return errors.New("conn is nil")
|
|
}
|
|
for {
|
|
buffer, n, err := ConnRead(c)
|
|
|
|
remoteAddr := c.RemoteAddr().(*net.TCPAddr)
|
|
remoteIP := remoteAddr.IP.String() // 打印机IP
|
|
remotePort := remoteAddr.Port // 打印机端口
|
|
globals.SugarLogger.Debugf("remoteIP1: %s", remoteIP)
|
|
globals.SugarLogger.Debugf("remotePort1: %d", remotePort)
|
|
|
|
printRemoteAddr := c.RemoteAddr().String()
|
|
printRemoteAddr = strings.Split(printRemoteAddr, ":")[0]
|
|
globals.SugarLogger.Debugf("printRemoteAddr2: %s", printRemoteAddr)
|
|
|
|
if err != nil {
|
|
if err == io.EOF {
|
|
fmt.Println("connection close")
|
|
} else {
|
|
fmt.Println("ReadString err:", err)
|
|
}
|
|
|
|
return err
|
|
}
|
|
|
|
//看是心跳还是打印回调
|
|
data := hex.EncodeToString(buffer[:n])
|
|
var (
|
|
printNo string = "" //打印机编号
|
|
heartbeat bool = false
|
|
callback bool = false
|
|
t *TcpClient = nil
|
|
)
|
|
if strings.Contains(data, heartText) || strings.Contains(data, heartTextNew) {
|
|
printNoData, _ := hex.DecodeString(data[len(heartText) : len(data)-8])
|
|
printNo = string(printNoData)
|
|
heartbeat = true
|
|
} else if strings.Contains(data, printText) || strings.Contains(data, printTextNew) { //打印回调
|
|
_, printNo = getCallbackMsgInfo(data)
|
|
callback = true
|
|
}
|
|
|
|
if value, have := TcpClientList.Load(printNo); !have {
|
|
t = NewTcpClient()
|
|
TcpClientList.Store(printNo, t)
|
|
} else {
|
|
t = value.(*TcpClient)
|
|
}
|
|
if heartbeat {
|
|
// 证明是心跳
|
|
Heartbeat(c, t, data, printNo, printRemoteAddr)
|
|
} else if callback {
|
|
// 打印回调
|
|
Callback(c, t, data, printNo)
|
|
}
|
|
}
|
|
}
|
|
|
|
func (t *TcpClient) printFail() (err error) {
|
|
//新开机的打印失败和错误的
|
|
var (
|
|
db = dao.GetDB()
|
|
)
|
|
prints, _ := dao.GetPrintMsgs(db, "", []int{printMsgFail, printMsgErr, PrintMsgAlreadyLoad, printMsgAlreadySend}, time.Now().Add(-time.Hour*3), time.Now(), 0, 999)
|
|
for _, printMsg := range prints {
|
|
t.addMsgChan(printMsg)
|
|
}
|
|
return err
|
|
}
|
|
|
|
func (t *TcpClient) readTimeoutMap(key string) bool {
|
|
t.Lock()
|
|
defer t.Unlock()
|
|
return t.TimeoutMap[key]
|
|
}
|