修改infra除repository包

This commit is contained in:
2025-11-05 22:22:46 +08:00
parent 07d8c719ac
commit 97aea66f7c
13 changed files with 293 additions and 242 deletions

View File

@@ -1,32 +1,33 @@
package lora
import (
"context"
"errors"
"time"
"git.huangwc.com/pig/pig-farm-controller/internal/infra/config"
"git.huangwc.com/pig/pig-farm-controller/internal/infra/logs"
"git.huangwc.com/pig/pig-farm-controller/internal/infra/transport"
"git.huangwc.com/pig/pig-farm-controller/internal/infra/transport/lora/chirp_stack_proto/client"
"git.huangwc.com/pig/pig-farm-controller/internal/infra/transport/lora/chirp_stack_proto/client/device_service"
"github.com/go-openapi/runtime"
httptransport "github.com/go-openapi/runtime/client"
"github.com/go-openapi/strfmt"
"git.huangwc.com/pig/pig-farm-controller/internal/infra/transport/lora/chirp_stack_proto/client"
)
// ChirpStackTransport 是一个客户端,用于封装与 ChirpStack REST API 的交互。
type ChirpStackTransport struct {
ctx context.Context
client *client.ChirpStackRESTAPI
authInfo runtime.ClientAuthInfoWriter
config config.ChirpStackConfig
logger *logs.Logger
}
// NewChirpStackTransport 创建一个新的通信实例,用于与 ChirpStack 通信。
func NewChirpStackTransport(
ctx context.Context,
config config.ChirpStackConfig,
logger *logs.Logger,
) *ChirpStackTransport {
// 使用配置中的服务器地址创建一个 HTTP transport。
// 它会使用生成的客户端中定义的默认 base path 和 schemes。
@@ -39,14 +40,15 @@ func NewChirpStackTransport(
authInfo := httptransport.APIKeyAuth("grpc-metadata-authorization", "header", config.GenerateAPIKey())
return &ChirpStackTransport{
ctx: ctx,
client: apiClient,
authInfo: authInfo,
config: config,
logger: logger,
}
}
func (c *ChirpStackTransport) Send(address string, payload []byte) (*transport.SendResult, error) {
func (c *ChirpStackTransport) Send(ctx context.Context, address string, payload []byte) (*transport.SendResult, error) {
logger := logs.TraceLogger(ctx, c.ctx, "Send")
// 1. 构建 API 请求体。
// - Confirmed: true 表示确认消息, 设为false将不保证消息送达(但可以节约下行容量)。
// - Data: 经过 Base64 编码的数据。
@@ -72,18 +74,18 @@ func (c *ChirpStackTransport) Send(address string, payload []byte) (*transport.S
// c.authInfo 是您在 NewChirpStackTransport 中创建的认证信息。
resp, err := c.client.DeviceService.DeviceServiceEnqueue(params, c.authInfo)
if err != nil {
c.logger.Errorf("设备 %s 调用ChirpStack Enqueue失败: %v", address, err)
logger.Errorf("设备 %s 调用ChirpStack Enqueue失败: %v", address, err)
return nil, err
}
if resp == nil || resp.Payload == nil || resp.Payload.ID == "" {
// 这是一个需要明确处理的错误情况,因为调用方依赖 MessageID。
errMsg := "ChirpStack Enqueue 响应未包含 MessageID (ID)"
c.logger.Errorf(errMsg)
logger.Errorf(errMsg)
return nil, errors.New(errMsg)
}
c.logger.Infof("成功将 payload 发送到设备 %s 的队列 (MessageID: %s)", address, resp.Payload.ID)
logger.Infof("成功将 payload 发送到设备 %s 的队列 (MessageID: %s)", address, resp.Payload.ID)
// 将 MessageID 包装在 SendResult 中返回
result := &transport.SendResult{