From a2a55732eb4dd7ebe1c2c44d87cebc467f5155c0 Mon Sep 17 00:00:00 2001 From: huang <1724659546@qq.com> Date: Mon, 8 Dec 2025 19:19:11 +0800 Subject: [PATCH] =?UTF-8?q?=E4=BC=98=E5=8C=96=E4=BB=A3=E7=A0=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- internal/app/listener/lora_listener.go | 40 +++++++++----------------- internal/core/application.go | 2 +- 2 files changed, 14 insertions(+), 28 deletions(-) diff --git a/internal/app/listener/lora_listener.go b/internal/app/listener/lora_listener.go index 8f4ba93..154c224 100644 --- a/internal/app/listener/lora_listener.go +++ b/internal/app/listener/lora_listener.go @@ -8,13 +8,13 @@ import ( "path/filepath" "time" + "git.huangwc.com/pig/pig-farm-controller/internal/domain/device" "git.huangwc.com/pig/pig-farm-controller/internal/infra/logs" "git.huangwc.com/pig/pig-farm-controller/internal/infra/models" "git.huangwc.com/pig/pig-farm-controller/internal/infra/repository" "git.huangwc.com/pig/pig-farm-controller/internal/infra/transport" "git.huangwc.com/pig/pig-farm-controller/internal/infra/transport/proto" "git.huangwc.com/pig/pig-farm-controller/internal/infra/utils/file" - gproto "google.golang.org/protobuf/proto" "gorm.io/datatypes" ) @@ -29,7 +29,7 @@ type loraListener struct { sensorDataRepo repository.SensorDataRepository deviceCommandLogRepo repository.DeviceCommandLogRepository otaRepo repository.OtaRepository - comm transport.Communicator + deviceCommunicator device.DeviceCommunicator } // NewLoRaListener 创建一个新的 loraListener 实例。 @@ -42,7 +42,7 @@ func NewLoRaListener( sensorDataRepo repository.SensorDataRepository, deviceCommandLogRepo repository.DeviceCommandLogRepository, otaRepo repository.OtaRepository, - comm transport.Communicator, + deviceCommunicator device.DeviceCommunicator, ) transport.UpstreamHandler { return &loraListener{ selfCtx: logs.AddCompName(ctx, "LoRaListener"), @@ -52,7 +52,7 @@ func NewLoRaListener( sensorDataRepo: sensorDataRepo, deviceCommandLogRepo: deviceCommandLogRepo, otaRepo: otaRepo, - comm: comm, + deviceCommunicator: deviceCommunicator, } } @@ -413,14 +413,7 @@ func (l *loraListener) handleRequestFile(ctx context.Context, sourceAddr string, return fmt.Errorf("处理文件请求失败:未找到任务 %d: %w", req.GetTaskId(), err) } - // 2. 根据 AreaControllerID 查找 AreaController,获取 NetworkID - areaController, err := l.areaControllerRepo.FindByID(reqCtx, task.AreaControllerID) - if err != nil { - logger.Errorw("处理文件请求失败:未找到对应的区域主控", "error", err) - return fmt.Errorf("处理文件请求失败:未找到区域主控 %d: %w", task.AreaControllerID, err) - } - - // 3. 构造文件路径并读取文件内容 + // 2. 构造文件路径并读取文件内容 subDir := filepath.Join(models.OTADir, fmt.Sprintf("%d", req.GetTaskId())) content, err := file.ReadTempFile(subDir, req.GetFilepath()) if err != nil { @@ -428,32 +421,25 @@ func (l *loraListener) handleRequestFile(ctx context.Context, sourceAddr string, return fmt.Errorf("处理文件请求失败:读取文件 %s 失败: %w", req.GetFilepath(), err) } - // 4. 构造 FileResponse + // 3. 构造 FileResponse fileResp := &proto.FileResponse{ TaskId: req.GetTaskId(), Filepath: req.GetFilepath(), Content: content, } - // 5. 构造并序列化 Instruction - instruction := &proto.Instruction{ - Payload: &proto.Instruction_FileResponse{ - FileResponse: fileResp, - }, - } - message, err := gproto.Marshal(instruction) - if err != nil { - logger.Errorw("处理文件请求失败:序列化指令失败", "error", err) - return fmt.Errorf("处理文件请求失败:序列化指令失败: %w", err) + // 4. 将 FileResponse 包装成 InstructionPayload + payload := &proto.Instruction_FileResponse{ + FileResponse: fileResp, } - // 6. 发送指令 - _, err = l.comm.Send(reqCtx, areaController.NetworkID, message) + // 5. 使用领域层的 DeviceCommunicator 发送指令,它会处理所有底层细节 + err = l.deviceCommunicator.Send(reqCtx, task.AreaControllerID, payload, device.WithoutTracking()) if err != nil { logger.Errorw("处理文件请求失败:发送指令失败", "error", err) - return fmt.Errorf("处理文件请求失败:发送指令到 %s 失败: %w", areaController.NetworkID, err) + return fmt.Errorf("处理文件请求失败:发送指令到区域主控 %d 失败: %w", task.AreaControllerID, err) } - logger.Infow("成功处理文件请求") + logger.Infow("成功处理文件请求并发送文件响应") return nil } diff --git a/internal/core/application.go b/internal/core/application.go index 0aacafe..a3a5de1 100644 --- a/internal/core/application.go +++ b/internal/core/application.go @@ -60,7 +60,7 @@ func NewApplication(configPath string) (*Application, error) { infra.repos.sensorDataRepo, infra.repos.deviceCommandLogRepo, infra.repos.otaRepo, - infra.lora.comm, + domain.deviceCommunicator, ) // 根据 LoRa 模式完成最终的绑定