diff --git a/.gitignore b/.gitignore index 6823da4..0dcf0d7 100644 --- a/.gitignore +++ b/.gitignore @@ -23,4 +23,5 @@ vendor/ .env bin/ -app_logs/ \ No newline at end of file +app_logs/ +tmp/ \ No newline at end of file diff --git a/internal/domain/device/general_device_service.go b/internal/domain/device/general_device_service.go index 342d9d2..54c37f4 100644 --- a/internal/domain/device/general_device_service.go +++ b/internal/domain/device/general_device_service.go @@ -113,6 +113,13 @@ func (g *GeneralDeviceService) Switch(device *models.Device, action DeviceAction DeviceID: areaController.ID, SentAt: time.Now(), } + if sendResult.AcknowledgedAt != nil { + logRecord.AcknowledgedAt = sendResult.AcknowledgedAt + } + if sendResult.ReceivedSuccess != nil { + logRecord.ReceivedSuccess = *sendResult.ReceivedSuccess + } + if err := g.deviceCommandLogRepo.Create(logRecord); err != nil { // 记录日志失败是一个需要关注的问题,但可能不应该中断主流程。 // 我们记录一个错误日志,然后成功返回。 diff --git a/internal/infra/transport/lora/lora_mesh_uart_passthrough_transport.go b/internal/infra/transport/lora/lora_mesh_uart_passthrough_transport.go index df9e7dc..7212f77 100644 --- a/internal/infra/transport/lora/lora_mesh_uart_passthrough_transport.go +++ b/internal/infra/transport/lora/lora_mesh_uart_passthrough_transport.go @@ -265,7 +265,10 @@ func (t *LoRaMeshUartPassthroughTransport) executeSend(req *sendRequest) (*trans } msgID := uuid.New().String() - return &transport.SendResult{MessageID: msgID}, nil + // LoRa mesh 是单向通信, 发送方不知道也不关心接收方是否收到, 所以发送成功就当作接收成功 + acknowledgedAt := time.Now() + receivedSuccess := true + return &transport.SendResult{MessageID: msgID, AcknowledgedAt: &acknowledgedAt, ReceivedSuccess: &receivedSuccess}, nil } // handleFrame 处理一个从串口解析出的完整物理帧 diff --git a/internal/infra/transport/transport.go b/internal/infra/transport/transport.go index aee61a8..fc29ab8 100644 --- a/internal/infra/transport/transport.go +++ b/internal/infra/transport/transport.go @@ -1,5 +1,7 @@ package transport +import "time" + // Communicator 用于其他设备通信 type Communicator interface { // Send 用于发送一条单向数据(不等待回信) @@ -12,6 +14,14 @@ type SendResult struct { // MessageID 是通信服务为此次发送分配的唯一标识符。 // 调用方需要保存此 ID,以便后续关联 ACK 等事件。 MessageID string + + // AcknowledgedAt 记录设备确认收到下行消息的时间。 + // 并非所有发送实现都会同步返回收到时间 + AcknowledgedAt *time.Time + + // ReceivedSuccess 表示设备是否成功接收到下行消息。 + // 并非所有发送实现都会同步返回是否送达 + ReceivedSuccess *bool } // Listener 用于监听其他设备发送过来的数据