deviceMgr.go 2.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118
  1. package tcp
  2. import (
  3. "encoding/hex"
  4. "go.uber.org/zap"
  5. "net"
  6. "server/dao/devices"
  7. Dev "server/dao/devices"
  8. "server/model/common/request"
  9. "server/protocol"
  10. "server/utils/logger"
  11. "strings"
  12. "time"
  13. )
  14. var ScreenList []devices.Screens
  15. type Device struct {
  16. info devices.Screens
  17. conn net.Conn
  18. lastTime time.Time
  19. }
  20. func (s *Device) Start(conn net.Conn) {
  21. s.conn = conn
  22. go s.Process()
  23. go s.Handle()
  24. }
  25. func (s *Device) Process() {
  26. // 函数执行完之后关闭连接
  27. defer s.conn.Close()
  28. for {
  29. buf := make([]byte, 256)
  30. // 将tcp连接读取到的数据读取到byte数组中, 返回读取到的byte的数目
  31. n, err := s.conn.Read(buf)
  32. if err != nil {
  33. // 从客户端读取数据的过程中发生错误
  34. logger.Logger.Errorf("read from client failed, err:%v", err)
  35. break
  36. }
  37. data := hex.EncodeToString(buf[:n])
  38. if !strings.Contains(strings.ToLower(data), "fe5c4b89") {
  39. continue
  40. }
  41. if len(data) > 51 {
  42. logger.Logger.Debugf("led sn = %v", data[34:50])
  43. ScreenList = devices.QueryAllScreens()
  44. for _, v := range ScreenList {
  45. if v.Sn == data[34:50] {
  46. s.info = v
  47. break
  48. }
  49. }
  50. }
  51. switch data[16:18] {
  52. case "61":
  53. logger.Logger.Debug("登录")
  54. // fe5c4b89 2a000000 62 00000000 17000000 31 23 32303233(年) 3035(月) 3135(日) 3031(星期) 3038(时) 3334(分) 3135(秒) 23 303630(心跳包时间) 23 ffff
  55. buffer := protocol.AuthDataPack{}.AuthLogin()
  56. s.conn.Write(buffer.Bytes())
  57. case "91":
  58. logger.Logger.Debug("心跳")
  59. if data[34:50] != s.info.Sn {
  60. continue
  61. }
  62. s.UpdateInfo(data[82:84], data[86:88], data[90:92])
  63. }
  64. }
  65. }
  66. func (s *Device) Handle() {
  67. t2 := time.NewTicker(3 * time.Minute) //在线监测
  68. for {
  69. select {
  70. case <-t2.C:
  71. state := request.DeviceStatus{
  72. Status: 1,
  73. PlayStatus: s.info.PlayStatus,
  74. DisplayStatus: s.info.DisplayStatus,
  75. SourceStatus: s.info.SourceStatus,
  76. }
  77. if time.Now().Add(-2 * time.Minute).After(s.lastTime) {
  78. //离线
  79. state.Status = 0
  80. } else {
  81. logger.Logger.Debugf("%s在线", s.info.ScreensCode)
  82. }
  83. //修改数据库状态
  84. err := Dev.UpdateScreensStatus(s.info.ScreensCode, state)
  85. if err != nil {
  86. logger.Logger.Error("UpdateScreensStatus err", zap.Error(err))
  87. continue
  88. }
  89. break
  90. default:
  91. continue
  92. }
  93. }
  94. }
  95. func (s *Device) UpdateInfo(playStatus, displayStatus, sourceStatus string) {
  96. play, display, source := 0, 0, 0
  97. if playStatus == "31" {
  98. play = 1
  99. }
  100. if displayStatus == "30" {
  101. display = 1
  102. }
  103. if sourceStatus == "30" {
  104. source = 1
  105. }
  106. s.info.Status = 1
  107. s.info.PlayStatus = play
  108. s.info.DisplayStatus = display
  109. s.info.SourceStatus = source
  110. s.lastTime = time.Now()
  111. }