deviceMgr.go 3.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161
  1. package tcp
  2. import (
  3. "fmt"
  4. "go.uber.org/zap"
  5. "net"
  6. "regexp"
  7. "server/dao"
  8. "server/global"
  9. "strconv"
  10. "strings"
  11. "time"
  12. )
  13. var (
  14. Devices = make(map[string]*Device) // 存储连接的全局 map
  15. )
  16. type Device struct {
  17. Info dao.Screens
  18. Conn net.Conn
  19. IsLogin bool
  20. LastTime time.Time
  21. SumHighSpeed int
  22. SumLowSpeed int
  23. }
  24. // 实例所有设备
  25. func InitDevices() {
  26. //// 将数据库中的设备全部离线
  27. //screens, _ := dao.QueryAllScreens()
  28. //for _, screen := range screens {
  29. // Devices[screen.Sn] = &Device{Info: screen}
  30. //}
  31. }
  32. func (s *Device) Start(conn net.Conn) {
  33. s.Conn = conn
  34. go s.Process()
  35. }
  36. func (s *Device) Process() {
  37. // 函数执行完之后关闭连接
  38. defer s.Conn.Close()
  39. for {
  40. buf := make([]byte, 256)
  41. // 将tcp连接读取到的数据读取到byte数组中, 返回读取到的byte的数目
  42. n, err := s.Conn.Read(buf)
  43. if err != nil {
  44. // 从客户端读取数据的过程中发生错误 这里如果没读到可以视为设备离线了
  45. global.GVA_LOG.Error("read err,dev offLine")
  46. break
  47. }
  48. data := string(buf[:n])
  49. fmt.Println("读取", string(buf[:n]))
  50. if data[2:7] == "login" {
  51. s.Conn.Write([]byte("login:successful"))
  52. }
  53. if data[2:11] == "heartbeat" { //默认一分钟发一次心跳
  54. s.LastTime = time.Now()
  55. if !s.IsLogin {
  56. s.Conn.Write([]byte("{'trans':'on'}")) //开启上传状态
  57. screen, _ := dao.QueryScreensBySn(data[20:44])
  58. s.Info = screen
  59. s.IsLogin = true
  60. Devices[data[20:44]] = s
  61. _ = dao.UpdateScreensStatusBySn(s.Info.Sn, 1)
  62. } //更新上次发送心跳时间
  63. Devices[data[20:44]].Conn = s.Conn
  64. global.GVA_LOG.Info("设备心跳", zap.String("ScreensName", s.Info.ScreensName))
  65. }
  66. if strings.Contains(data, `"status":"highspeed"`) {
  67. s.SumLowSpeed = 0
  68. re := regexp.MustCompile(`"speed1":"(\d+)"`)
  69. match := re.FindStringSubmatch(data)
  70. if len(match) > 1 {
  71. speed1, _ := strconv.Atoi(match[1])
  72. if speed1 > 30 { //大于40认为超速
  73. s.SumHighSpeed++
  74. if s.SumHighSpeed >= 3 {
  75. fmt.Println("********************************************************************超速了")
  76. }
  77. } else {
  78. s.SumHighSpeed = 0
  79. }
  80. } else {
  81. fmt.Println("Speed1 not found")
  82. continue
  83. }
  84. }
  85. //判断低速
  86. if strings.Contains(data, `"status":"normalspeed"`) {
  87. s.SumHighSpeed = 0
  88. re := regexp.MustCompile(`"speed1":"(\d+)"`)
  89. match := re.FindStringSubmatch(data)
  90. if len(match) > 1 {
  91. speed1, _ := strconv.Atoi(match[1])
  92. if speed1 < 20 { //小于10认为低速
  93. s.SumLowSpeed++
  94. if s.SumLowSpeed >= 8 {
  95. fmt.Println("********************************************************************低低速了")
  96. }
  97. } else {
  98. s.SumLowSpeed = 0
  99. }
  100. } else {
  101. fmt.Println("Speed1 not found")
  102. continue
  103. }
  104. }
  105. //if strings.Contains(data, `"status":"none"`) {
  106. // s.SumHighSpeed = 0
  107. // s.SumLowSpeed = 0
  108. //}
  109. }
  110. }
  111. func IsOnline() {
  112. t := time.NewTicker(5 * time.Second) //每分钟
  113. for {
  114. select {
  115. case <-t.C:
  116. for _, device := range Devices {
  117. commond := `{
  118. "setdiscontent0": {
  119. "num": "5",
  120. "effect": "11",
  121. "speed": "3",
  122. "stay": "5",
  123. "total": "100",
  124. "color": "1",
  125. "content": "[24M]abc"
  126. }
  127. }`
  128. n, err := Devices[device.Info.Sn].Conn.Write([]byte(commond))
  129. fmt.Println("我是n,", n)
  130. if err != nil {
  131. fmt.Println("err:", err)
  132. }
  133. fmt.Println("发送了。。。。。。。。。。。。。。。。。。。。。。")
  134. //符合条件
  135. if time.Now().Add(-2*time.Minute).After(device.LastTime) || device.LastTime.IsZero() {
  136. state := 0
  137. err := dao.UpdateScreensStatusBySn(device.Info.Sn, state)
  138. delete(Devices, device.Info.Sn)
  139. if err != nil {
  140. continue
  141. }
  142. device.Info.Status = 0
  143. global.GVA_LOG.Info("设备离线了", zap.String("ScreensName", device.Info.ScreensName))
  144. }
  145. }
  146. }
  147. }
  148. }