deviceMgr.go 3.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137
  1. package service
  2. import (
  3. "fmt"
  4. "net"
  5. "regexp"
  6. "smartIntersection_edge/util/config"
  7. "smartIntersection_edge/util/logger"
  8. "strconv"
  9. "strings"
  10. "time"
  11. )
  12. var (
  13. Devices = make(map[string]*Device)
  14. )
  15. type Device struct {
  16. Info *config.Screens
  17. Conn net.Conn
  18. IsLogin bool
  19. LastTime time.Time
  20. SumHighSpeed int
  21. SumLowSpeed int
  22. }
  23. // 实例所有设备
  24. func InitDevices() {
  25. //// 将数据库中的设备全部离线
  26. //screens, _ := dao.QueryAllScreens()
  27. //for _, screen := range screens {
  28. // Devices[screen.Sn] = &Device{Info: screen}
  29. //}
  30. }
  31. func (s *Device) Start(conn net.Conn) {
  32. s.Conn = conn
  33. go s.Process()
  34. }
  35. func (s *Device) Process() {
  36. // 函数执行完之后关闭连接
  37. defer s.Conn.Close()
  38. for {
  39. buf := make([]byte, 256)
  40. // 将tcp连接读取到的数据读取到byte数组中, 返回读取到的byte的数目
  41. n, err := s.Conn.Read(buf)
  42. if err != nil {
  43. // 从客户端读取数据的过程中发生错误 这里如果没读到可以视为设备离线了
  44. logger.Logger.Errorf("read err,dev offLine")
  45. break
  46. }
  47. data := string(buf[:n])
  48. fmt.Println("读取", string(buf[:n]), time.Now())
  49. if data[2:7] == "login" {
  50. s.Conn.Write([]byte("login:successful"))
  51. }
  52. if data[2:11] == "heartbeat" { //默认一分钟发一次心跳
  53. s.LastTime = time.Now()
  54. if !s.IsLogin {
  55. s.Conn.Write([]byte("{'trans':'on'}")) //开启上传状态
  56. screens := FindScreenBySN(data[20:44])
  57. s.Info = screens
  58. s.IsLogin = true
  59. Devices[data[20:44]] = s
  60. topic := MqttService.GetTopic(s.Info.Sn, TopicChanStatus)
  61. err := MqttService.Publish(topic, 1)
  62. if err != nil {
  63. continue
  64. }
  65. }
  66. Devices[data[20:44]].Conn = s.Conn
  67. logger.Logger.Infof("%v 设备心跳", s.Info.ScreensName)
  68. }
  69. //判断超速
  70. if strings.Contains(data, `"status":"highspeed"`) {
  71. s.SumLowSpeed = 0
  72. re := regexp.MustCompile(`"speed1":"(\d+)"`)
  73. match := re.FindStringSubmatch(data)
  74. if len(match) > 1 {
  75. speed1, _ := strconv.Atoi(match[1])
  76. if speed1 > 50 { //大于50认为超速
  77. s.SumHighSpeed++
  78. if s.SumHighSpeed >= 3 { //连续三次认为超速
  79. topic := MqttService.GetTopic(s.Info.Sn, TopicHighSpeed)
  80. MqttService.Publish(topic, time.Now()) //上报当前超速时间
  81. }
  82. } else {
  83. s.SumHighSpeed = 0
  84. }
  85. } else {
  86. fmt.Println("Speed1 not found")
  87. continue
  88. }
  89. }
  90. //判断低速
  91. if strings.Contains(data, `"status":"normalspeed"`) {
  92. s.SumHighSpeed = 0
  93. re := regexp.MustCompile(`"speed1":"(\d+)"`)
  94. match := re.FindStringSubmatch(data)
  95. if len(match) > 1 {
  96. speed1, _ := strconv.Atoi(match[1])
  97. if speed1 < 10 { //小于10认为低速
  98. s.SumLowSpeed++
  99. if s.SumLowSpeed >= 6 { //连续8次认为低速
  100. topic := MqttService.GetTopic(s.Info.Sn, TopicLowSpeed)
  101. MqttService.Publish(topic, time.Now()) //上报当前低俗时间
  102. }
  103. } else {
  104. s.SumLowSpeed = 0
  105. }
  106. } else {
  107. fmt.Println("Speed1 not found")
  108. continue
  109. }
  110. }
  111. //if strings.Contains(data, `"status":"none"`) {
  112. // s.SumHighSpeed = 0
  113. // s.SumLowSpeed = 0
  114. //}
  115. }
  116. }
  117. func FindScreenBySN(sn string) *config.Screens {
  118. for _, screen := range config.DevConfig.Screens {
  119. if screen != nil && screen.Sn == sn {
  120. return screen
  121. }
  122. }
  123. return nil
  124. }