zhangzengfei
2024-03-29 d5769136a6e78b1a825fa390fb2c8b710b1e064b
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
package service
 
import (
    "bytes"
    "encoding/json"
    "fmt"
    "io/ioutil"
    "net"
 
    "gat1400Exchange/config"
    "gat1400Exchange/models"
    "gat1400Exchange/pkg/logger"
 
    "golang.org/x/text/encoding/simplifiedchinese"
    "golang.org/x/text/transform"
)
 
type ElevatorStatus struct {
    TotalFloors int    `json:"TotalFloors"`
    Floor       int    `json:"Floor"`
    FloorName   string `json:"FloorName"`
    RunDir      int    `json:"RunDir"`
    Speed       string `json:"Speed"`
}
 
type Elevator struct {
    Name   string         `json:"Name"`
    IP     string         `json:"IP"`
    Status ElevatorStatus `json:"Status"`
    Alarm  []interface{}  `json:"Alarm"` // You might want to define a specific type for alarms
}
 
type ElevatorData struct {
    Elevator []Elevator `json:"Elevator"`
}
 
// 对接网络视频字符叠加器,接收udp发送的楼层信息, 更新device地址
func NVCSServer() {
    // 指定监听的端口
    port := config.ServeConf.Port
 
    // 创建一个UDP地址
    address, err := net.ResolveUDPAddr("udp", fmt.Sprintf(":%s", port))
    if err != nil {
        logger.Error("Error resolving address:", err)
        return
    }
 
    // 创建一个UDP连接
    conn, err := net.ListenUDP("udp", address)
    if err != nil {
        logger.Error("Error listening:", err)
        return
    }
    defer conn.Close()
 
    logger.Info("UDP server listening on port %s...", port)
 
    // 无限循环等待接收数据
    for {
        // 创建一个缓冲区来存储接收的数据
        buffer := make([]byte, 256)
 
        // 从连接中读取数据
        numBytes, clientAddr, err := conn.ReadFromUDP(buffer)
        if err != nil {
            logger.Warn("Error reading from UDP connection:%s", err.Error())
            continue
        }
 
        // 设备上传的中文数据为GBK编码, 转换为utf8
        decoder := simplifiedchinese.GBK.NewDecoder()
        reader := transform.NewReader(bytes.NewReader(buffer[:numBytes]), decoder)
        decodedBytes, err := ioutil.ReadAll(reader)
 
        var data ElevatorData
        // Unmarshal JSON into the struct
        err = json.Unmarshal(decodedBytes, &data)
        if err != nil {
            logger.Warn("ElevatorData unmarshal error:%s", err.Error())
            continue
        }
 
        if len(data.Elevator) == 0 {
            continue
        }
 
        elevator := data.Elevator[0]
        var d = models.Device{
            Id:  elevator.Name,
            Pos: elevator.Status.FloorName,
            Ip:  elevator.IP,
        }
 
        err = d.Upsert()
        if err != nil {
            logger.Warn("Device db update error:%s", err.Error())
        }
 
        deviceAliveCache.Add(elevator.Name, true)
 
        logger.Debug("Received %d bytes from %s, %+v", numBytes, clientAddr, data)
    }
}