deviceMgr.go 4.8 KB

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