|
|
@@ -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
|
|
|
}
|