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)
|
}
|