diff --git a/pkg/shadow/device.go b/pkg/shadow/device.go index 5629a47..13cfc39 100644 --- a/pkg/shadow/device.go +++ b/pkg/shadow/device.go @@ -2,21 +2,41 @@ package shadow import "time" +const ( + PointAttributesType = "Attributes" + PointTelemetryType = "Telemetry" +) + // Device 设备结构 type Device struct { - Name string // 设备名称 - ProductName string // 设备模型名称 - Points map[string]any // 设备点位列表 key参数名 value 值 - online bool // 在线状态 - disconnectTimes int // 断开连接次数,60秒内超过3次判定离线 - updatedAt time.Time // 更新时间 + Name string // 设备名称 + ProductName string // 设备模型名称 + AttributesPoints map[string]DevicePoint // 设备属性点位列表 key 作为属性 + TelemetryPoints map[string]DevicePoint // 设备遥测点位列表 key 作为属性 + online bool // 在线状态 + disconnectTimes int // 断开连接次数,60秒内超过3次判定离线 + updatedAt time.Time // 更新时间 } -func NewDevice(deviceName string, productName string, points map[string]any) Device { +// DevicePoint 设备点位结构 +type DevicePoint struct { + Name string // 点位名称 + Value interface{} // 点位值 +} + +func NewDevice(deviceName string, productName string, attributes, telemetry map[string]DevicePoint) Device { return Device{ - Name: deviceName, - ProductName: productName, - Points: points, - online: true, + Name: deviceName, + ProductName: productName, + AttributesPoints: attributes, + TelemetryPoints: telemetry, + online: true, + } +} + +func NewDevicePoint(pointName string, value interface{}) DevicePoint { + return DevicePoint{ + Name: pointName, + Value: value, } } diff --git a/pkg/shadow/shadow.go b/pkg/shadow/shadow.go index 38d9552..b088d9e 100644 --- a/pkg/shadow/shadow.go +++ b/pkg/shadow/shadow.go @@ -18,9 +18,9 @@ type DeviceShadow interface { AddDevice(device Device) (err error) GetDevice(deviceName string) (device Device, err error) - SetDevicePoint(deviceName, pointName string, value interface{}) (err error) - GetDevicePoint(deviceName, pointName string) (value interface{}, err error) - GetDevicePoints(deviceName string) (points map[string]any, err error) + SetDevicePoint(deviceName, pointType, pointName string, value interface{}) (err error) + GetDevicePoint(deviceName, pointType, pointName string) (value DevicePoint, err error) + GetDevicePoints(deviceName, pointType string) (points map[string]DevicePoint, err error) GetDeviceUpdateAt(deviceName string) (time.Time, error) @@ -78,39 +78,55 @@ func (d *deviceShadow) GetDevice(deviceName string) (device Device, err error) { } } -func (d *deviceShadow) SetDevicePoint(deviceName, pointName string, value interface{}) (err error) { +func (d *deviceShadow) SetDevicePoint(deviceName, pointType, pointName string, value interface{}) (err error) { deviceAny, ok := d.m.Load(deviceName) if !ok { return UnknownDeviceErr } device := deviceAny.(Device) - if device.Points == nil { - device.Points = make(map[string]any) - } // update point value device.updatedAt = time.Now() device.disconnectTimes = 0 - device.Points[pointName] = value + + if pointType == PointAttributesType { + device.AttributesPoints[pointName] = NewDevicePoint(pointName, value) + } else if pointType == PointTelemetryType { + device.TelemetryPoints[pointName] = NewDevicePoint(pointName, value) + } else { + return errors.New("设备属性类型错误") + } // update d.m.Store(deviceName, device) return } -func (d *deviceShadow) GetDevicePoint(deviceName, pointName string) (value interface{}, err error) { +func (d *deviceShadow) GetDevicePoint(deviceName, pointType, pointName string) (value DevicePoint, err error) { if deviceAny, ok := d.m.Load(deviceName); ok { device := deviceAny.(Device) if device.online == false || time.Now().Sub(device.updatedAt) > time.Duration(d.ttl)*time.Second { return } - return device.Points[pointName], nil + if pointType == PointAttributesType { + return device.AttributesPoints[pointName], nil + } else if pointType == PointTelemetryType { + return device.TelemetryPoints[pointName], nil + } else { + return value, errors.New("设备属性类型错误") + } } else { - return nil, UnknownDeviceErr + return value, UnknownDeviceErr } } -func (d *deviceShadow) GetDevicePoints(deviceName string) (points map[string]any, err error) { +func (d *deviceShadow) GetDevicePoints(deviceName, pointType string) (points map[string]DevicePoint, err error) { if deviceAny, ok := d.m.Load(deviceName); ok { - return deviceAny.(Device).Points, nil + if pointType == PointAttributesType { + return deviceAny.(Device).AttributesPoints, nil + } else if pointType == PointTelemetryType { + return deviceAny.(Device).TelemetryPoints, nil + } else { + return points, errors.New("设备属性类型错误") + } } else { return nil, UnknownDeviceErr }