package event import ( "encoding/hex" "fmt" "git.rosy.net.cn/jx-callback/business/model/dao" "git.rosy.net.cn/jx-callback/globals" "github.com/astaxie/beego/client/orm" "io" "net" "strconv" "strings" "sync" ) const ( heartText = "1e000f02000151" printText = "1e00180200" printSuccessText = "1e001802000150" ) var ( tcpClient = &TcpClient{} ) //连接的客户端,吧每个客户端都放进来 type TcpClient struct { Clients map[string]net.Conn s *sync.RWMutex } func Init() { listenTcp() go handleTcpMessages() } func listenTcp() { tcpClient.Clients = make(map[string]net.Conn) l, err := net.Listen("tcp", ":8000") if err != nil { fmt.Println("listen error:", err) return } for { c, err := l.Accept() if err != nil { fmt.Println("accept error:", err) break } go handleConn(c) } } func handleConn(c net.Conn) { var ( printNo string //打印机编号 db = dao.GetDB() ) db.Db = orm.NewOrmUsingDB("api") //读写这个库 if c == nil { globals.SugarLogger.Debugf("conn is nil") return } defer c.Close() buffer := make([]byte, 1024) for { n, err := c.Read(buffer) if err != nil { if err == io.EOF { fmt.Println("connection close") } else { fmt.Println("ReadString err", err) } return } //看是心跳还是打印返回 data := hex.EncodeToString(buffer[:n]) //证明是心跳 if strings.Contains(data, heartText) { printNo = data[len(heartText) : len(data)-8] if tcpClient.Clients[printNo] == nil { tcpClient.Clients[printNo] = c } else { //改变打印机状态 } } else if strings.Contains(data, printText) { //证明是打印成功 if strings.Contains(data, printSuccessText) { //打印成功改变打印表的状态 } else { //打印失败也改变状态并更新失败原因 } } } } func handleTcpMessages() { for { } } func Hextob(str string) []byte { slen := len(str) bHex := make([]byte, len(str)/2) ii := 0 for i := 0; i < len(str); i = i + 2 { if slen != 1 { ss := string(str[i]) + string(str[i+1]) bt, _ := strconv.ParseInt(ss, 16, 32) bHex[ii] = byte(bt) ii = ii + 1 slen = slen - 2 } } return bHex } func int2h8l8(i int64) (h, l string) { origin2 := fmt.Sprintf("%b", i) flag := 16 - len(origin2) for i := 0; i < flag; i++ { origin2 = "0" + origin2 } begin8 := origin2[:8] end8 := origin2[8:] r1, _ := strconv.ParseInt(begin8, 2, 32) r2, _ := strconv.ParseInt(end8, 2, 32) h = fmt.Sprintf("%x", r1) l = fmt.Sprintf("%x", r2) if len(h) < 2 { h = "0" + h } if len(l) < 2 { l = "0" + l } return h, l }