Просмотр исходного кода

传感器数据上传失败时,暂存到本地JSON文件,存储最近的1000条

niujiuru 2 недель назад
Родитель
Сommit
ae9089bbea

BIN
docs/拍照性诱智能监测设备与大数据平台间的通信协议.docx


+ 49 - 3
reporter/envdata.go

@@ -4,6 +4,8 @@ import (
 	"context"
 	"encoding/json"
 	"fmt"
+	"io"
+	"os"
 	"time"
 
 	"hnyfkj.com.cn/rtu/linux/baseapp"
@@ -32,7 +34,8 @@ func (r *MQTTReporter) reportSensorData(envData *mcu.EnvSensorData) {
 
 	now := time.Now()
 
-	req, err := jsonrpc2.BuildNotification("report_sensor_data", envData)
+	envDataSlice := []*mcu.EnvSensorData{envData}
+	req, err := jsonrpc2.BuildNotification("report_sensor_data", envDataSlice)
 	if err != nil {
 		baseapp.Logger.Errorf("[%s] 构建通知失败: %v!!", MODULE_NAME, err)
 		return
@@ -53,10 +56,53 @@ func (r *MQTTReporter) reportSensorData(envData *mcu.EnvSensorData) {
 	}
 
 	if token.Error() != nil {
-		baseapp.Logger.Errorf("[%s] 环境数据上传失败: %v!!", MODULE_NAME, token.Error())
+		baseapp.Logger.Errorf("[%s] 传感器数据上传失败: %v!!", MODULE_NAME, token.Error())
+		err := r.saveFailedData(envData, "failed_data.json")
+		if err != nil {
+			baseapp.Logger.Errorf("[%s] 保存上传失败的传感器数据时发生错误: %v!!", MODULE_NAME, err)
+		}
 		return
 	}
 
 	elapsed := time.Since(now).Milliseconds()
-	baseapp.Logger.Infof("[%s] 环境数据上传成功, 用时: %d毫秒", MODULE_NAME, elapsed)
+	baseapp.Logger.Infof("[%s] 传感器数据上传成功, 用时: %d毫秒", MODULE_NAME, elapsed)
+}
+
+func (r *MQTTReporter) saveFailedData(envData *mcu.EnvSensorData, failedDataFile string) error {
+	var existingData []*mcu.EnvSensorData
+
+	file, err := os.OpenFile(failedDataFile, os.O_RDWR|os.O_CREATE, 0644)
+	if err != nil {
+		return err
+	}
+	defer file.Close()
+
+	decoder := json.NewDecoder(file)
+	if err := decoder.Decode(&existingData); err != nil && err != io.EOF {
+		return err
+	}
+
+	if len(existingData) >= 1000 {
+		existingData = existingData[1:] // 删除最早的一条记录
+	}
+
+	existingData = append(existingData, envData)
+
+	err = file.Truncate(0)
+	if err != nil { // 清空现有的文件内容
+		return err
+	}
+
+	_, err = file.Seek(0, 0)
+	if err != nil { // 移动文件指针到开头
+		return err
+	}
+
+	encoder := json.NewEncoder(file)
+	encoder.SetIndent("", "  ") // 美化输出格式
+	if err := encoder.Encode(existingData); err != nil {
+		return err
+	}
+
+	return nil
 }