package collector import ( "encoding/json" "plc-recorder/config" "plc-recorder/logger" "plc-recorder/msg" "plc-recorder/util" ) func getDeviceList() ([]msg.PLCDevice, error) { token, _ := util.CreateToken() responseBody, err := util.HttpPost(config.Options.DeviceListWebApi, nil, token) if err != nil { logger.Warn("get device list from aps error:%s", err.Error()) return nil, err } var response msg.ApsDeviceApiResponse err = json.Unmarshal(responseBody, &response) if err != nil { logger.Warn("unmarshal aps response error:%s", err.Error()) return nil, err } logger.Debug("get device list total:%d", response.Total) return response.Data, nil } // 设备信息发生改变时更新采集的任务, 删除, 修改, 或者重新启动 func HandleDeviceUpdate(message []byte) error { var device msg.PLCDevice logger.Debug("receive device update msg: %s", string(message)) err := json.Unmarshal(message, &device) if err != nil { logger.Error("unmarshal device update msg error:%s", err.Error()) return err } // 先停掉正在执行的任务 stopTask(&device) // 判断是否是重新启动的状态, 启动一个新的任务 if device.Status == 0 { addTask(&device) } return nil } func HandleDeviceReadRequest(device *msg.PLCDevice) *msg.PLCResponse { procCache, ok := tasksStore.Load(device.DeviceID) if ok { if procCache.(*collectorProc).device.DeviceIP == device.DeviceIP { return plc4xRequest(procCache.(*collectorProc)) } } plcConnection, err := NewModbusConnection(device.DeviceIP) if err != nil { logger.Warn("error connecting to PLC: %s, ip: %s", device.DeviceName, device.DeviceIP) // 上报设备离线 return &msg.PLCResponse{ DeviceID: device.DeviceID, DeviceName: device.DeviceName, DeviceIP: device.DeviceIP, Online: false, } } proc := collectorProc{ device: device, cancel: nil, plcConn: &plcConnection, } return plc4xRequest(&proc) }