package tcp import ( "encoding/hex" "fmt" "net" "server/dao" "time" ) var ( Devices = make(map[string]*Device) // 存储连接的全局 map ) type Device struct { Info dao.Screens Conn net.Conn LastTime time.Time } // 实例所有设备 //func InitDevices() { // // 将数据库中的设备全部离线 // devs, _ := deviceDao.QueryAllScreens() // for _, screen := range devs { // if screen.Status != 0 { // screen.Status = 0 // now := time.Now() // screen.LastOfflineTime = &now // } // Devices[screen.Sn] = &Device{Info: screen} // } //} func (s *Device) Start(conn net.Conn) { s.Conn = conn go s.Process() } func (s *Device) Process() { // 函数执行完之后关闭连接 defer s.Conn.Close() for { buf := make([]byte, 256) // 将tcp连接读取到的数据读取到byte数组中, 返回读取到的byte的数目 n, err := s.Conn.Read(buf) if err != nil { // 从客户端读取数据的过程中发生错误 这里如果没读到可以视为设备离线了 //logger.Error.Errorf("read from client failed [离线了], err:%v", err) break } data := hex.EncodeToString(buf[:n]) fmt.Println("读取:", data) //if !strings.Contains(strings.ToLower(data), "fe5c4b89") { // continue //} //switch data[16:18] { //case "61": // // fe5c4b89 2a000000 62 00000000 17000000 31 23 32303233(年) 3035(月) 3135(日) 3031(星期) 3038(时) 3334(分) 3135(秒) 23 303630(心跳包时间) 23 ffff // //目前登录只做查找设备的操作 (假登录) // buffer := protocol.AuthDataPack{}.AuthLogin() // // 通过sn 查设备是否存在 不存在return 存在就保存con 和 info // _, err := deviceDao.QueryScreenBySn(data[34:50]) // if errors.Is(err, gorm.ErrRecordNotFound) { // logger.Logger.Errorf("Process[case '61'] SN not found \n") // break // } // s.Conn.Write(buffer.Bytes()) //case "91": // dev := Devices[data[34:50]] // if dev.Info.Status == 0 { // state := 1 // //上线 则修改数据库上线时间 // err := Dev.UpdateScreensStatusAndOnline(dev.Info.Sn, state) // if err != nil { // logger.Logger.Error("Process[case '91'] UpdateScreensStatusAndOnline err", zap.Error(err)) // continue // } // dev.Info.Status = 1 // now := time.Now() // dev.Info.LastOnlineTime = &now // logger.Logger.Debugf("设备 [%v] 上线", dev.Info.ScreensName) // 登录 // } // dev.Conn = s.Conn // dev.LastTime = time.Now() // logger.Logger.Debugf("设备 [%v] 心跳", dev.Info.ScreensName) //default: // fmt.Println("读取:", data) //} } } //func IsOnline() { // t := time.NewTicker(1 * time.Minute) //每分钟 // for { // select { // case <-t.C: // for _, device := range Devices { // //符合条件 // if (time.Now().Add(-5*time.Minute).After(device.LastTime) || device.LastTime.IsZero()) && device.Info.Status != 0 { // //修改数据库和内存 // //离线 // state := 0 // err := Dev.UpdateScreensStatusAndOffline(device.Info.Sn, state) // if err != nil { // logger.Logger.Error("[Handle] UpdateScreensStatus err", zap.Error(err)) // continue // } // device.Info.Status = 0 // now := time.Now() // device.Info.LastOfflineTime = &now // logger.Logger.Debugf("设备 [%v] 离线了...", device.Info.ScreensName) // } // } // } // } //} //func (s *Device) SwitchScreen(onOff int) error { // if s.Conn == nil { // return errors.New("connection is nil") // } // pack := protocol.SwitchDataPack{Type: 0x52} //熄屏 // if onOff == 1 { // pack = protocol.SwitchDataPack{Type: 0x51} //亮屏 // } // buf := pack.SwitchScreens() //获取开关屏指令 // _, err := s.Conn.Write(buf.Bytes()) // if err != nil { // logger.Logger.Errorf("SwitchScreen write failed, err:%v", err) // return err // } // return nil //} // //func (s *Device) SendInternalCode(content []promodel.InternalCodeContent) error { // if s.Conn == nil { // return errors.New("connection is nil") // } // pack := protocol.InternalCodeDataPack{} // //获取要写入连接的字节数组 // buf := pack.SendInternalCode(content) // _, err := s.Conn.Write(buf.Bytes()) // if err != nil { // logger.Logger.Errorf("SendInternalCode write failed, err:%v", err) // return err // } // // return nil //} // //func (s *Device) VoiceBroad(broad string) error { // if s.Conn == nil { // return errors.New("connection is nil") // } // pack := protocol.VoiceBroadDataPack{} // buf := pack.VoiceBroad(broad) // _, err := s.Conn.Write(buf.Bytes()) // if err != nil { // logger.Logger.Errorf("VoiceBroad write failed, err:%v", err) // return err // } // return nil //} // //func (s *Device) SetBrightness(bright byte) error { // if s.Conn == nil { // return errors.New("connection is nil") // } // pack := protocol.SetBrightnessDataPack{} // buf := pack.SetBrightness(bright) // _, err := s.Conn.Write(buf.Bytes()) // if err != nil { // logger.Logger.Errorf("SetBrightness write failed, err:%v", err) // return err // } // return nil //} // //func SwitchScreen(sn string, onOff int) error { // device := Devices[sn] // err := device.SwitchScreen(onOff) // if err != nil { // return err // } // return nil //} // //func SendInternalCode(sn string, content []promodel.InternalCodeContent) error { // device := Devices[sn] // err := device.SendInternalCode(content) // if err != nil { // return err // } // return nil //} // //func VoiceBroad(sn string, broad string) error { // device := Devices[sn] // err := device.VoiceBroad(broad) // if err != nil { // return err // } // return nil //} // //func SetBrightness(sn string, bright int) error { // device := Devices[sn] // err := device.SetBrightness(brightnessMap[bright]) // if err != nil { // return err // } // return nil //} var brightnessMap = map[int]byte{ 0: 0x19, 10: 0x18, 20: 0x16, 30: 0x14, 40: 0x12, 50: 0x10, 60: 0x08, 70: 0x06, 80: 0x04, 90: 0x02, 100: 0x00, }