deviceMgr.go 3.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152
  1. package tcp
  2. import (
  3. "encoding/hex"
  4. "errors"
  5. "fmt"
  6. "go.uber.org/zap"
  7. "gorm.io/gorm"
  8. "net"
  9. Dev "server/dao/devices"
  10. deviceDao "server/dao/devices"
  11. "server/model/common/request"
  12. "server/protocol"
  13. "server/utils/logger"
  14. "strings"
  15. "time"
  16. )
  17. var (
  18. devices = make(map[string]Device) // 存储连接的全局 map
  19. )
  20. type Device struct {
  21. info deviceDao.Screens
  22. conn net.Conn
  23. lastTime time.Time
  24. }
  25. func (s *Device) Start(conn net.Conn) {
  26. s.conn = conn
  27. go s.Process()
  28. go s.Handle()
  29. }
  30. func (s *Device) Process() {
  31. // 函数执行完之后关闭连接
  32. defer s.conn.Close()
  33. for {
  34. buf := make([]byte, 256)
  35. // 将tcp连接读取到的数据读取到byte数组中, 返回读取到的byte的数目
  36. n, err := s.conn.Read(buf)
  37. if err != nil {
  38. // 从客户端读取数据的过程中发生错误
  39. logger.Logger.Errorf("read from client failed, err:%v", err)
  40. break
  41. }
  42. data := hex.EncodeToString(buf[:n])
  43. if !strings.Contains(strings.ToLower(data), "fe5c4b89") {
  44. continue
  45. }
  46. switch data[16:18] {
  47. case "61":
  48. logger.Logger.Debug("登录")
  49. // fe5c4b89 2a000000 62 00000000 17000000 31 23 32303233(年) 3035(月) 3135(日) 3031(星期) 3038(时) 3334(分) 3135(秒) 23 303630(心跳包时间) 23 ffff
  50. buffer := protocol.AuthDataPack{}.AuthLogin()
  51. // 通过sn 查设备是否存在 不存在return 存在就保存con 和 info
  52. screens, err := deviceDao.QueryScreenBySn(data[34:50])
  53. if errors.Is(err, gorm.ErrRecordNotFound) {
  54. logger.Logger.Errorf("Process SN not found \n")
  55. break
  56. }
  57. s.info = screens
  58. devices[s.info.Sn] = *s
  59. s.conn.Write(buffer.Bytes())
  60. case "91":
  61. logger.Logger.Debug("心跳")
  62. if data[34:50] != s.info.Sn {
  63. continue
  64. }
  65. s.UpdateInfo(data[82:84], data[86:88], data[90:92])
  66. }
  67. }
  68. }
  69. func (s *Device) Handle() {
  70. t2 := time.NewTicker(3 * time.Minute) //在线监测
  71. for {
  72. select {
  73. case <-t2.C:
  74. state := request.DeviceStatus{
  75. Status: 1,
  76. PlayStatus: 1,
  77. DisplayStatus: 1,
  78. SourceStatus: 1,
  79. }
  80. if time.Now().Add(-2 * time.Minute).After(s.lastTime) {
  81. //离线
  82. state.Status = 0
  83. state.PlayStatus = 0
  84. state.DisplayStatus = 0
  85. state.SourceStatus = 0
  86. fmt.Println("离线了...")
  87. fmt.Println("在线状态:", state)
  88. } else {
  89. logger.Logger.Debugf("%s在线", s.info.ScreensCode)
  90. }
  91. fmt.Println("编号:" + s.info.ScreensCode)
  92. //修改数据库状态
  93. err := Dev.UpdateScreensStatus(s.info.ScreensCode, state)
  94. fmt.Println("改数据库了。。。。。")
  95. if err != nil {
  96. logger.Logger.Error("UpdateScreensStatus err", zap.Error(err))
  97. continue
  98. }
  99. break
  100. default:
  101. continue
  102. }
  103. }
  104. }
  105. func (s *Device) UpdateInfo(playStatus, displayStatus, sourceStatus string) {
  106. play, display, source := 0, 0, 0
  107. if playStatus == "31" {
  108. play = 1
  109. }
  110. if displayStatus == "30" {
  111. display = 1
  112. }
  113. if sourceStatus == "30" {
  114. source = 1
  115. }
  116. s.info.Status = 1
  117. s.info.PlayStatus = play
  118. s.info.DisplayStatus = display
  119. s.info.SourceStatus = source
  120. s.lastTime = time.Now()
  121. fmt.Println("上次在线时间,", s.lastTime.String())
  122. }
  123. func (s *Device) SwitchScreen(onOff int) error {
  124. pack := protocol.SwitchDataPack{Type: 0x52} //熄屏
  125. if onOff == 1 {
  126. pack = protocol.SwitchDataPack{Type: 0x51} //亮屏
  127. }
  128. buf := pack.SwitchScreens() //获取开关屏指令
  129. _, err := s.conn.Write(buf.Bytes())
  130. if err != nil {
  131. logger.Logger.Errorf("SwitchScreen write failed, err:%v", err)
  132. return err
  133. }
  134. return nil
  135. }
  136. func SwitchScreen(sn string, onOff int) error {
  137. device := devices[sn]
  138. err := device.SwitchScreen(onOff)
  139. if err != nil {
  140. return err
  141. }
  142. return nil
  143. }