package main //雷达 import ( "github.com/sirupsen/logrus" "lc/common/protocol" "lc/edge/ipole/modbus" "math" "net" "strconv" "strings" ) const ( PORT = 1026 ) func RadarReceive(args ...interface{}) interface{} { UDPConn, err := net.ListenUDP("udp", &net.UDPAddr{ IP: net.IPv4(0, 0, 0, 0), Port: PORT, }) if err != nil { logrus.Fatal("Listen failed,", err) return 0 } for { var data [1024]byte n, addr, err := UDPConn.ReadFromUDP(data[:]) //同步读 if err != nil { logrus.Warningf("Read from udp server:%s failed,err:%s", addr, err) continue } logrus.Debugf("Read from udp server addr: %s", addr) if b, sa := verify(data[:n-2]); !b { logrus.Warningf("解析来自:%s 的数据出错,===%v ==== err:%s", addr, string(data[:n]), sa) continue } else { l := len(sa) for _, s := range sa[:l-1] { d := strings.Split(s, ",") if len(d) != 5 { logrus.Warningf("解析的数据出错, 长度不为5") continue } go func() { data1 := make(map[uint16]float64) data1[0], _ = strconv.ParseFloat(d[0], 64) data1[1], _ = strconv.ParseFloat(d[1], 64) data1[2], _ = strconv.ParseFloat(d[2], 64) data1[3], _ = strconv.ParseFloat(d[3], 64) data1[4], _ = strconv.ParseFloat(d[4], 64) data1[3] = math.Abs(data1[3]) var obj protocol.Pack_UploadData if str, err := obj.EnCode(addr.String(), appConfig.GID, GetNextUint64(), nil, 0, data1); err == nil { logrus.Debugf("Publish TP_RADAR_DATA") topic := GetTopic(protocol.DT_Radar, appConfig.GID, protocol.TP_RADAR_DATA) GetMQTTMgr().Publish(topic, str, 0, ToCloud) //上传消息 雷达 } }() } } } } func verify(b []byte) (bool, []string) { strsplit := strings.Split(string(b), ";") slen := len(strsplit) if slen < 2 { return false, nil } be := strings.Split(strsplit[0], "=") if len(be) != 2 { return false, nil } c := strings.Split(be[1], ":") if len(c) != 2 { return false, nil } if n, err := strconv.Atoi(c[0]); err == nil { if n != slen-1 { return false, nil } strsplit[0] = c[1] crc16 := modbus.CRC16(b[:len(b)-4]) if n1, err := strconv.ParseInt(strsplit[slen-1], 16, 32); err == nil { if uint16(n1) == crc16 { return true, strsplit } } } return false, nil }