From a335f66c4c520728be640ca4e7029ce6f45b8f3d Mon Sep 17 00:00:00 2001
From: zhangzengfei <zhangzengfei@smartai.com>
Date: 星期五, 11 八月 2023 11:21:32 +0800
Subject: [PATCH] web 接口添加token

---
 collector/collector.go |   85 ++++++++++++++++++++++++++++--------------
 1 files changed, 57 insertions(+), 28 deletions(-)

diff --git a/collector/collector.go b/collector/collector.go
index e70421d..12e8f2e 100644
--- a/collector/collector.go
+++ b/collector/collector.go
@@ -11,7 +11,7 @@
 	plc4go "github.com/apache/plc4x/plc4go/pkg/api"
 )
 
-var mapTask sync.Map
+var tasksStore sync.Map
 
 type collectorProc struct {
 	device *msg.PLCDevice
@@ -19,41 +19,60 @@
 }
 
 func InitTask() {
-	device := msg.PLCDevice{
-		Id:       "0",
-		Ip:       "192.168.1.188",
-		Address:  []int{17021},
-		Interval: 1,
+	logger.Debug("init task")
+	devices, err := getDeviceList()
+	if err != nil {
+		return
 	}
 
+	for idx, dev := range devices {
+		// 鍒ゆ柇璁惧鐘舵��, 濡傛灉閰嶇疆鏈紑鍚噰闆嗘暟鎹垨鍏朵粬鏂瑰紡, 鐜板湪鍋囪瀛楁status涓�0鏃朵唬琛ㄩ噰闆�
+		if dev.Status != 0 {
+			continue
+		}
+
+		logger.Debug("add collector task,device %s", dev.DeviceName)
+		addTask(&devices[idx])
+	}
+}
+
+func stopTask(device *msg.PLCDevice) {
+	if task, ok := tasksStore.Load(device.DeviceID); ok {
+		// 瀛樺湪鐨勪换鍔�, 鍏堝仠姝㈡帀, 鐒跺悗閲嶆柊寮�鍚竴涓�
+		task.(collectorProc).cancel()
+		tasksStore.Delete(device.DeviceID)
+	}
+}
+
+func addTask(device *msg.PLCDevice) {
 	ctx, cancel := context.WithCancel(context.Background())
 	proc := collectorProc{
-		device: &device,
+		device: device,
 		cancel: cancel,
 	}
 
-	mapTask.Store(device.Id, &proc)
+	tasksStore.Store(device.DeviceID, &proc)
 
-	go connectingDevice(ctx, &device)
+	go connectingDevice(ctx, device)
 }
 
 func connectingDevice(ctx context.Context, dev *msg.PLCDevice) {
 	plcResponse := msg.PLCResponse{
-		Id:     dev.Id,
-		Name:   dev.Name,
-		Ip:     dev.Ip,
-		Online: false,
+		DeviceID:   dev.DeviceID,
+		DeviceName: dev.DeviceName,
+		DeviceIP:   dev.DeviceIP,
+		Online:     false,
 	}
 
 	for {
 		select {
 		case <-ctx.Done():
-			logger.Warn("plc device %s, ip: %s, end of connecting.", dev.Name, dev.Ip)
+			logger.Warn("plc device %s, ip: %s, end of connecting.", dev.DeviceName, dev.DeviceIP)
 			return
 		default:
-			plcConnection, err := NewModbusConnection(dev.Ip)
+			plcConnection, err := NewModbusConnection(dev.DeviceIP)
 			if err != nil {
-				logger.Warn("error connecting to PLC: %s, ip: %s", dev.Name, dev.Ip)
+				logger.Warn("error connecting to PLC: %s, ip: %s", dev.DeviceName, dev.DeviceIP)
 				plcResponse.Online = false
 				msg.SendDeviceLiveData(&plcResponse)
 				time.Sleep(30 * time.Second)
@@ -68,39 +87,49 @@
 func runCollectionTask(ctx context.Context, dev *msg.PLCDevice, conn plc4go.PlcConnection) {
 	// 鍒涘缓modbusTCP杩炴帴, 寰幆鏌ヨ鏁版嵁骞朵笂鎶�
 	plcResponse := msg.PLCResponse{
-		Id:     dev.Id,
-		Name:   dev.Name,
-		Ip:     dev.Ip,
-		Online: true,
-		Data:   nil,
+		DeviceID:   dev.DeviceID,
+		DeviceName: dev.DeviceName,
+		DeviceIP:   dev.DeviceIP,
+		Online:     true,
 	}
 
 	for {
 		select {
 		case <-ctx.Done():
-			logger.Warn("plc device %s, ip: %s, end of collection.", dev.Name, dev.Ip)
+			logger.Warn("plc device %s, ip: %s, end of collection.", dev.DeviceName, dev.DeviceIP)
 			conn.Close()
 			return
 		default:
 			if !conn.IsConnected() {
-				logger.Warn("plc device %s, ip: %s, disconnected.", dev.Name, dev.Ip)
+				logger.Warn("plc device %s, ip: %s, disconnected.", dev.DeviceName, dev.DeviceIP)
 				return
 			}
 
 			// 鏍规嵁璁剧疆鐨勫湴鍧�鏌ヨ鏁版嵁锛屼笂鎶�
-			plcResponse.Data = make(map[int][]byte, 0)
-			for _, addr := range dev.Address {
-				result, err := ReadHoldingRegister(conn, addr)
+			plcResponse.Message = ""
+			for _, addr := range dev.Details {
+				result, err := ReadHoldingRegister(conn, addr.StartAddress, addr.Length)
 				if err != nil {
 					logger.Warn("plc device Read Holding Register error, %s", err.Error())
+					plcResponse.Message = err.Error()
 				} else {
-					plcResponse.Data[addr] = result
+					plcResponse.PLCData = append(plcResponse.PLCData, msg.PLCData{
+						StartAddress: addr.StartAddress,
+						Length:       addr.Length,
+						Type:         addr.Type,
+						FieldName:    addr.FieldName,
+						RawData:      result,
+					})
 				}
 			}
 
 			msg.SendDeviceLiveData(&plcResponse)
+			if plcResponse.Message != "" {
+				return
+			}
+
 			// 闂撮殧鏃堕棿
-			time.Sleep(time.Duration(dev.Interval) * time.Second)
+			time.Sleep(time.Duration(dev.Frequency) * time.Second)
 		}
 	}
 }

--
Gitblit v1.8.0