From b183ad660f2df75097c6f17f25c49aa9b7cb412b Mon Sep 17 00:00:00 2001 From: huang <1724659546@qq.com> Date: Mon, 15 Sep 2025 21:27:54 +0800 Subject: [PATCH] =?UTF-8?q?=E5=AE=9E=E7=8E=B0=20chirp=20stack=20transport?= =?UTF-8?q?=20=E7=9A=84Send=E6=96=B9=E6=B3=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- internal/infra/transport/lora/chirp_stack.go | 39 ++++++++++++++++++++ internal/infra/transport/transport.go | 2 + 2 files changed, 41 insertions(+) diff --git a/internal/infra/transport/lora/chirp_stack.go b/internal/infra/transport/lora/chirp_stack.go index 84af5e5..04753df 100644 --- a/internal/infra/transport/lora/chirp_stack.go +++ b/internal/infra/transport/lora/chirp_stack.go @@ -1,7 +1,10 @@ package lora import ( + "time" + "git.huangwc.com/pig/pig-farm-controller/internal/infra/logs" + "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" @@ -15,6 +18,8 @@ type ChirpStackConfig struct { ServerAddress string // APIKey 是用于认证的 API 密钥。 APIKey string + // LoRaWAN 端口, 需要和设备一致 + Fport int64 } // GenerateAPIKey 用于补齐API Key作为请求头时缺失的部分 @@ -50,3 +55,37 @@ func NewChirpStackTransport(config ChirpStackConfig, logger *logs.Logger) *Chirp logger: logger, } } + +func (c *ChirpStackTransport) Send(deviceID string, payload []byte) error { + // 1. 构建 API 请求体。 + // - Confirmed: true 表示确认消息, 设为false将不保证消息送达(但可以节约下行容量)。 + // - Data: 经过 Base64 编码的数据。 + // - FPort: LoRaWAN 端口。 + body := device_service.DeviceServiceEnqueueBody{ + QueueItem: &device_service.DeviceServiceEnqueueParamsBodyQueueItem{ + Confirmed: true, + Data: payload, + FPort: c.config.Fport, + }, + } + + // 2. 构建 API 请求参数。 + // - WithTimeout 设置一个合理的请求超时。 + // - WithQueueItemDevEui 指定目标设备的 EUI。 + // - WithBody 设置请求体。 + params := device_service.NewDeviceServiceEnqueueParams(). + WithTimeout(10 * time.Second). + WithQueueItemDevEui(deviceID). + 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) + return err + } + + c.logger.Infof("设备 %s 调用ChirpStack Enqueue成功", deviceID) + return nil +} diff --git a/internal/infra/transport/transport.go b/internal/infra/transport/transport.go index f75e849..2694931 100644 --- a/internal/infra/transport/transport.go +++ b/internal/infra/transport/transport.go @@ -2,4 +2,6 @@ package transport // Communicator 用于其他设备通信 type Communicator interface { + // Send 用于发送一条单向数据(不等待回信) + Send(deviceID string, payload []byte) error }