zhangzengfei
2024-05-22 2ef7bb54e8cdfea386fb5d09c48700bc2201b71f
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
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
package service
 
import (
    "bytes"
    "encoding/json"
    "fmt"
    "io/ioutil"
    "net"
    "time"
 
    "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"`
}
 
const (
    RunStop = iota
    RunUp
    RunDown
)
 
// 对接网络视频字符叠加器,接收udp发送的楼层信息, 更新device地址
func NVCSA1UDPServer() {
    // 指定监听的端口
    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
        err = json.Unmarshal(decodedBytes, &data)
        if err != nil {
            logger.Warn("ElevatorData unmarshal error:%s", err.Error())
            continue
        }
        logger.Debug("Received %d bytes from %s, %+v", numBytes, clientAddr, data)
 
        if len(data.Elevator) == 0 {
            continue
        }
 
        // 设置osd  格式 "1F 固 枪"
        if config.NVCSConf.OSD != "" {
            floorText := data.Elevator[0].Status.FloorName
            //if data.Elevator[0].Status.RunDir == RunStop {
            //    floorText = floorText + "停"
            //} else if data.Elevator[0].Status.RunDir == RunUp {
            //    floorText = floorText + "上"
            //} else {
            //    floorText = floorText + "下"
            //}
 
            floorText = floorText + " " + config.NVCSConf.OSD
 
            // 调用hik api 将文字添加到osd的左下角
            AddFloorToOSD(floorText)
        }
 
        if data.Elevator[0].Status.RunDir > 0 {
            continue
        }
 
        elevator := data.Elevator[0]
 
        // 程序部署在设备端, 字符叠加器上报的名称允许为空. 在云端, 名称必须与摄像机相同
        if elevator.Name == "" {
            elevator.Name = "1"
        }
 
        var d = models.Positions{
            DeviceId:   elevator.Name,
            Pos:        elevator.Status.FloorName,
            CreateTime: time.Now().Unix(),
            TimeString: time.Now().Format("2006-01-02 15:04:05"),
        }
 
        err = d.Save()
        if err != nil {
            logger.Warn("Device position update error:%s", err.Error())
        }
    }
}
 
func StartNVCSServer() {
    if config.NVCSConf.Model == "A1" {
        go NVCSA1UDPServer()
    }
}