radar.go 2.2 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394
  1. package main
  2. //雷达
  3. import (
  4. "github.com/sirupsen/logrus"
  5. "lc/common/protocol"
  6. "lc/edge/ipole/modbus"
  7. "math"
  8. "net"
  9. "strconv"
  10. "strings"
  11. )
  12. const (
  13. PORT = 1026
  14. )
  15. func RadarReceive(args ...interface{}) interface{} {
  16. UDPConn, err := net.ListenUDP("udp", &net.UDPAddr{
  17. IP: net.IPv4(0, 0, 0, 0),
  18. Port: PORT,
  19. })
  20. if err != nil {
  21. logrus.Fatal("Listen failed,", err)
  22. return 0
  23. }
  24. for {
  25. var data [1024]byte
  26. n, addr, err := UDPConn.ReadFromUDP(data[:]) //同步读
  27. if err != nil {
  28. logrus.Warningf("Read from udp server:%s failed,err:%s", addr, err)
  29. continue
  30. }
  31. logrus.Debugf("Read from udp server addr: %s", addr)
  32. if b, sa := verify(data[:n-2]); !b {
  33. logrus.Warningf("解析来自:%s 的数据出错,===%v ==== err:%s", addr, string(data[:n]), sa)
  34. continue
  35. } else {
  36. l := len(sa)
  37. for _, s := range sa[:l-1] {
  38. d := strings.Split(s, ",")
  39. if len(d) != 5 {
  40. logrus.Warningf("解析的数据出错, 长度不为5")
  41. continue
  42. }
  43. go func() {
  44. data1 := make(map[uint16]float64)
  45. data1[0], _ = strconv.ParseFloat(d[0], 64)
  46. data1[1], _ = strconv.ParseFloat(d[1], 64)
  47. data1[2], _ = strconv.ParseFloat(d[2], 64)
  48. data1[3], _ = strconv.ParseFloat(d[3], 64)
  49. data1[4], _ = strconv.ParseFloat(d[4], 64)
  50. data1[3] = math.Abs(data1[3])
  51. var obj protocol.Pack_UploadData
  52. if str, err := obj.EnCode(addr.String(), appConfig.GID, GetNextUint64(), nil, 0, data1); err == nil {
  53. logrus.Debugf("Publish TP_RADAR_DATA")
  54. topic := GetTopic(protocol.DT_Radar, appConfig.GID, protocol.TP_RADAR_DATA)
  55. GetMQTTMgr().Publish(topic, str, 0, ToCloud) //上传消息 雷达
  56. }
  57. }()
  58. }
  59. }
  60. }
  61. }
  62. func verify(b []byte) (bool, []string) {
  63. strsplit := strings.Split(string(b), ";")
  64. slen := len(strsplit)
  65. if slen < 2 {
  66. return false, nil
  67. }
  68. be := strings.Split(strsplit[0], "=")
  69. if len(be) != 2 {
  70. return false, nil
  71. }
  72. c := strings.Split(be[1], ":")
  73. if len(c) != 2 {
  74. return false, nil
  75. }
  76. if n, err := strconv.Atoi(c[0]); err == nil {
  77. if n != slen-1 {
  78. return false, nil
  79. }
  80. strsplit[0] = c[1]
  81. crc16 := modbus.CRC16(b[:len(b)-4])
  82. if n1, err := strconv.ParseInt(strsplit[slen-1], 16, 32); err == nil {
  83. if uint16(n1) == crc16 {
  84. return true, strsplit
  85. }
  86. }
  87. }
  88. return false, nil
  89. }