lora mesh 发送即收到

This commit is contained in:
2025-10-20 19:31:19 +08:00
parent be8275b936
commit a32749cef8
4 changed files with 23 additions and 2 deletions

3
.gitignore vendored
View File

@@ -23,4 +23,5 @@ vendor/
.env
bin/
app_logs/
app_logs/
tmp/

View File

@@ -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 {
// 记录日志失败是一个需要关注的问题,但可能不应该中断主流程。
// 我们记录一个错误日志,然后成功返回。

View File

@@ -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 处理一个从串口解析出的完整物理帧

View File

@@ -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 用于监听其他设备发送过来的数据