实现 GeneralDeviceService
This commit is contained in:
@@ -39,6 +39,18 @@ const (
|
||||
SubTypeWaterCurtain DeviceSubType = "water_curtain"
|
||||
)
|
||||
|
||||
// 设备属性名大全
|
||||
var (
|
||||
|
||||
// 普通开关式设备
|
||||
BusNumber = "bus_number" // 总线号
|
||||
BusAddress = "bus_address" // 总线地址
|
||||
RelayChannel = "relay_channel" // 继电器通道号
|
||||
|
||||
// 区域主控
|
||||
LoRaAddress = "lora_address" // 区域主控 LoRa 地址, 如果使用LoRa网关也可能是LoRa网关记录的设备ID
|
||||
)
|
||||
|
||||
// --- Properties 结构体定义 ---
|
||||
|
||||
// LoraProperties 定义了区域主控的特有属性
|
||||
@@ -95,3 +107,31 @@ func (d *Device) ParseProperties(v interface{}) error {
|
||||
}
|
||||
return json.Unmarshal(d.Properties, v)
|
||||
}
|
||||
|
||||
// SelfCheck 进行参数自检, 返回检测结果
|
||||
// 方法会根据自身类型进行参数检查, 参数不全时返回false
|
||||
// TODO 没写单测
|
||||
func (d *Device) SelfCheck() bool {
|
||||
|
||||
properties := make(map[string]interface{})
|
||||
if err := d.ParseProperties(&properties); err != nil {
|
||||
return false
|
||||
}
|
||||
|
||||
has := func(key string) bool {
|
||||
_, ok := properties[key]
|
||||
return ok
|
||||
}
|
||||
|
||||
switch d.SubType {
|
||||
case SubTypeFan:
|
||||
if !has(BusNumber) || !has(BusAddress) || !has(RelayChannel) {
|
||||
return false
|
||||
}
|
||||
default:
|
||||
// 不应该有类型未知的设备
|
||||
return false
|
||||
}
|
||||
|
||||
return true
|
||||
}
|
||||
|
||||
@@ -56,7 +56,7 @@ func NewChirpStackTransport(config ChirpStackConfig, logger *logs.Logger) *Chirp
|
||||
}
|
||||
}
|
||||
|
||||
func (c *ChirpStackTransport) Send(deviceID string, payload []byte) error {
|
||||
func (c *ChirpStackTransport) Send(address string, payload []byte) error {
|
||||
// 1. 构建 API 请求体。
|
||||
// - Confirmed: true 表示确认消息, 设为false将不保证消息送达(但可以节约下行容量)。
|
||||
// - Data: 经过 Base64 编码的数据。
|
||||
@@ -75,17 +75,17 @@ func (c *ChirpStackTransport) Send(deviceID string, payload []byte) error {
|
||||
// - WithBody 设置请求体。
|
||||
params := device_service.NewDeviceServiceEnqueueParams().
|
||||
WithTimeout(10 * time.Second).
|
||||
WithQueueItemDevEui(deviceID).
|
||||
WithQueueItemDevEui(address).
|
||||
WithBody(body)
|
||||
|
||||
// 3. 调用生成的客户端方法来发送请求。
|
||||
// c.authInfo 是您在 NewChirpStackTransport 中创建的认证信息。
|
||||
_, err := c.client.DeviceService.DeviceServiceEnqueue(params, c.authInfo)
|
||||
if err != nil {
|
||||
c.logger.Errorf("设备 %s 调用ChirpStack Enqueue失败: %v", deviceID, err)
|
||||
c.logger.Errorf("设备 %s 调用ChirpStack Enqueue失败: %v", address, err)
|
||||
return err
|
||||
}
|
||||
|
||||
c.logger.Infof("设备 %s 调用ChirpStack Enqueue成功", deviceID)
|
||||
c.logger.Infof("设备 %s 调用ChirpStack Enqueue成功", address)
|
||||
return nil
|
||||
}
|
||||
|
||||
@@ -3,5 +3,5 @@ package transport
|
||||
// Communicator 用于其他设备通信
|
||||
type Communicator interface {
|
||||
// Send 用于发送一条单向数据(不等待回信)
|
||||
Send(deviceID string, payload []byte) error
|
||||
Send(address string, payload []byte) error
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user