| 12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394 |
- 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
- }
|