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