deviceMgr.go 2.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990
  1. package tcp
  2. import (
  3. "fmt"
  4. "go.uber.org/zap"
  5. "net"
  6. "server/dao"
  7. "server/global"
  8. "time"
  9. )
  10. var (
  11. Devices = make(map[string]*Device) // 存储连接的全局 map
  12. )
  13. type Device struct {
  14. Info dao.Screens
  15. Conn net.Conn
  16. IsLogin bool
  17. LastTime time.Time
  18. }
  19. // 实例所有设备
  20. func InitDevices() {
  21. //// 将数据库中的设备全部离线
  22. //screens, _ := dao.QueryAllScreens()
  23. //for _, screen := range screens {
  24. // Devices[screen.Sn] = &Device{Info: screen}
  25. //}
  26. }
  27. func (s *Device) Start(conn net.Conn) {
  28. s.Conn = conn
  29. go s.Process()
  30. }
  31. func (s *Device) Process() {
  32. // 函数执行完之后关闭连接
  33. defer s.Conn.Close()
  34. for {
  35. buf := make([]byte, 256)
  36. // 将tcp连接读取到的数据读取到byte数组中, 返回读取到的byte的数目
  37. n, err := s.Conn.Read(buf)
  38. if err != nil {
  39. // 从客户端读取数据的过程中发生错误 这里如果没读到可以视为设备离线了
  40. global.GVA_LOG.Error("read err,dev offLine")
  41. break
  42. }
  43. data := string(buf[:n])
  44. fmt.Println("读取", string(buf[:n]))
  45. if data[2:7] == "login" {
  46. s.Conn.Write([]byte("login:successful"))
  47. }
  48. if data[2:11] == "heartbeat" { //默认一分钟发一次心跳
  49. s.LastTime = time.Now()
  50. if !s.IsLogin {
  51. screen, _ := dao.QueryScreensBySn(data[20:44])
  52. s.Info = screen
  53. s.IsLogin = true
  54. Devices[data[20:44]] = s
  55. _ = dao.UpdateScreensStatusBySn(s.Info.Sn, 1)
  56. } //更新上次发送心跳时间
  57. global.GVA_LOG.Info("设备心跳", zap.String("ScreensName", s.Info.ScreensName))
  58. }
  59. }
  60. }
  61. func IsOnline() {
  62. t := time.NewTicker(1 * time.Minute) //每分钟
  63. for {
  64. select {
  65. case <-t.C:
  66. for _, device := range Devices {
  67. //符合条件
  68. if time.Now().Add(-2*time.Minute).After(device.LastTime) || device.LastTime.IsZero() {
  69. state := 0
  70. err := dao.UpdateScreensStatusBySn(device.Info.Sn, state)
  71. delete(Devices, device.Info.Sn)
  72. if err != nil {
  73. continue
  74. }
  75. device.Info.Status = 0
  76. global.GVA_LOG.Info("设备离线了", zap.String("ScreensName", device.Info.ScreensName))
  77. }
  78. }
  79. }
  80. }
  81. }