Browse Source

获取海康威视门禁记录并存储

huangyan 7 months ago
parent
commit
95d2de032c
14 changed files with 398 additions and 48 deletions
  1. 180 0
      app/controller/monitor.go
  2. 66 0
      app/controller/temperature.go
  3. 14 0
      app/e/R.go
  4. 0 1
      app/model/temperature.go
  5. 6 0
      app/router.go
  6. 12 0
      app/routers/monitor.go
  7. 11 0
      app/routers/temperature.go
  8. 3 2
      config.yaml
  9. 4 0
      database/migrate.go
  10. 2 0
      go.mod
  11. 4 0
      go.sum
  12. 1 1
      main.go
  13. 31 0
      unity/unity.go
  14. 64 44
      utils/modbus.go

+ 180 - 0
app/controller/monitor.go

@@ -0,0 +1,180 @@
+package controller
+
+import (
+	"bigdata_archives/app/e"
+	"bigdata_archives/global"
+	"bigdata_archives/simple_zap"
+	"bigdata_archives/unity"
+	"bigdata_archives/utils"
+	"context"
+	"encoding/json"
+	"github.com/gin-gonic/gin"
+	"io"
+	"log"
+	"os"
+	"path/filepath"
+	"strconv"
+	"time"
+)
+
+type EventLog struct {
+	utils.BaseModel
+	IPAddress             string                `gorm:"column:ip_address" json:"ipAddress"`
+	IPv6Address           string                `gorm:"column:ipv6_address" json:"ipv6Address"`
+	PortNo                int                   `gorm:"column:port_no" json:"portNo"`
+	Protocol              string                `gorm:"column:protocol" json:"protocol"`
+	MacAddress            string                `gorm:"column:mac_address" json:"macAddress"`
+	ChannelID             int                   `gorm:"column:channel_id" json:"channelID"`
+	DateTime              string                `gorm:"column:date_time" json:"dateTime"`
+	ActivePostCount       int                   `gorm:"column:active_post_count" json:"activePostCount"`
+	EventType             string                `gorm:"column:event_type" json:"eventType"`
+	EventState            string                `gorm:"column:event_state" json:"eventState"`
+	EventDescription      string                `gorm:"column:event_description" json:"eventDescription"`
+	ShortSerialNumber     string                `gorm:"column:short_serial_number" json:"shortSerialNumber"`
+	AccessControllerEvent AccessControllerEvent `gorm:"-" json:"AccessControllerEvent"`
+}
+
+type AccessControllerEvent struct {
+	utils.BaseModel
+	DeviceName          string   `gorm:"column:device_name" json:"deviceName"`
+	MajorEventType      int      `gorm:"column:major_event_type" json:"majorEventType"`
+	SubEventType        int      `gorm:"column:sub_event_type" json:"subEventType"`
+	CardReaderKind      int      `gorm:"column:card_reader_kind" json:"cardReaderKind"`
+	CardReaderNo        int      `gorm:"column:card_reader_no" json:"cardReaderNo"`
+	VerifyNo            int      `gorm:"column:verify_no" json:"verifyNo"`
+	SerialNo            int      `gorm:"column:serial_no" json:"serialNo"`
+	CurrentVerifyMode   string   `gorm:"column:current_verify_mode" json:"currentVerifyMode"`
+	FrontSerialNo       int      `gorm:"column:front_serial_no" json:"frontSerialNo"`
+	AttendanceStatus    string   `gorm:"column:attendance_status" json:"attendanceStatus"`
+	Label               string   `gorm:"column:label" json:"label"`
+	StatusValue         int      `gorm:"column:status_value" json:"statusValue"`
+	Mask                string   `gorm:"column:mask" json:"mask"`
+	Helmet              string   `gorm:"column:helmet" json:"helmet"`
+	PicturesNumber      int      `gorm:"column:pictures_number" json:"picturesNumber"`
+	PurePwdVerifyEnable bool     `gorm:"column:pure_pwd_verify_enable" json:"purePwdVerifyEnable"`
+	FaceImagePath       string   `gorm:"column:face_image_path" json:"faceImagePath"`
+	IPAddress           string   `gorm:"column:ip_address" json:"ipAddress"`
+	FaceRect            FaceRect `gorm:"-" json:"FaceRect"`
+}
+
+func (acc *AccessControllerEvent) TableName() string {
+	return "access_controller_events"
+}
+
+type FaceRect struct {
+	Height float64 `gorm:"column:height" json:"height"`
+	Width  float64 `gorm:"column:width" json:"width"`
+	X      float64 `gorm:"column:x" json:"x"`
+	Y      float64 `gorm:"column:y" json:"y"`
+}
+
+func Monitor(c *gin.Context) {
+	// 解析 multipart/form-data 请求
+	err := c.Request.ParseMultipartForm(10 << 20) // 设置最大文件大小为 10MB
+	if err != nil {
+		//e.ResponseWithMsg(c, e.ERROR, "读取表单失败")
+		simple_zap.WithCtx(context.Background()).Sugar().Error(err, "读取表单失败")
+		return
+	}
+
+	// 处理 JSON 数据
+	jsonData, ok := c.Request.Form["event_log"]
+	if !ok {
+		//e.ResponseWithMsg(c, e.ERROR, "缺少 event_log 参数")
+		simple_zap.WithCtx(context.Background()).Sugar().Error(err, "缺少 event_log 参数")
+		return
+	}
+	jsonStr := jsonData[0]
+
+	// 解析 JSON
+	var eventLog EventLog
+	err = json.Unmarshal([]byte(jsonStr), &eventLog)
+	if err != nil {
+		//e.ResponseWithMsg(c, e.ERROR, "json解析失败")
+		simple_zap.WithCtx(context.Background()).Sugar().Error(err, "json解析失败")
+		return
+	}
+	// 处理图片
+	fileHeader, err := c.FormFile("Picture")
+	if err != nil {
+		//e.ResponseWithMsg(c, e.ERROR, "未获取文件图片")
+		simple_zap.WithCtx(context.Background()).Sugar().Error(err, "未获取文件图片")
+		return
+	}
+	open, err := fileHeader.Open()
+	// 打开文件
+	if err != nil {
+		//e.ResponseWithMsg(c, e.ERROR, "打开文件失败")
+		simple_zap.WithCtx(context.Background()).Sugar().Error(err, "打开文件失败")
+		return
+	}
+	// 读取文件内容
+	fileBytes, err := io.ReadAll(open)
+	if err != nil {
+		//e.ResponseWithMsg(c, e.ERROR, "读取文件失败")
+		simple_zap.WithCtx(context.Background()).Sugar().Error(err, "读取文件失败")
+		return
+	}
+
+	// 保存图片到本地文件
+	err, path := savePicture(fileBytes)
+	if err != nil {
+		log.Println(err)
+		//e.ResponseWithMsg(c, e.ERROR, "保存文件失败")
+		simple_zap.WithCtx(context.Background()).Sugar().Error(err, "保存文件失败")
+		return
+	}
+	var access AccessControllerEvent
+	access = eventLog.AccessControllerEvent
+	access.FaceImagePath = path
+	access.IPAddress = eventLog.IPAddress
+	tx := global.DBLink.Create(&eventLog)
+	tx = global.DBLink.Create(&access)
+	if tx.Error == nil && tx.RowsAffected > 0 {
+		//e.ResponseSuccess(c, "200")
+		return
+	}
+	// 返回响应
+	//e.ResponseSuccess(c, "200")
+}
+
+// Getmonitor 获取门禁记录
+func Getmonitor(c *gin.Context) {
+	var params unity.TimePageParams
+	var access AccessControllerEvent
+	err := c.ShouldBindJSON(&params)
+	if err != nil {
+		simple_zap.WithCtx(context.Background()).Sugar().Error(err, "参数解析失败")
+		e.ResponseWithMsg(c, e.JSONParsingFailed, e.JSONParsingFailed.GetMsg())
+		return
+	}
+	result, total, err := unity.PaginateWithTime(params, access.TableName(), &access)
+	if err != nil {
+		e.ResponseWithMsg(c, e.PaginationFailed, e.PaginationFailed.GetMsg())
+		return
+	}
+	e.ResPonsePageTime(c, result, total, params)
+}
+
+// 保存图片到本地文件
+func savePicture(data []byte) (error, string) {
+	// 指定保存图片的路径
+	unix := time.Now().Unix()
+	picturePath := "/image/" + strconv.FormatInt(unix, 10) + ".jpg"
+	// 创建目录
+	if err := os.MkdirAll(filepath.Dir(picturePath), os.ModePerm); err != nil {
+		return err, ""
+	}
+	// 创建文件
+	file, err := os.Create(picturePath)
+	if err != nil {
+		return err, ""
+	}
+	defer file.Close()
+	// 写入图片数据
+	_, err = file.Write(data)
+	if err != nil {
+		return err, ""
+	}
+	return nil, picturePath
+}

+ 66 - 0
app/controller/temperature.go

@@ -0,0 +1,66 @@
+package controller
+
+import (
+	"bigdata_archives/app/e"
+	"bigdata_archives/global"
+	"bigdata_archives/utils"
+	"github.com/gin-gonic/gin"
+	"github.com/gorilla/websocket"
+	"log"
+	"time"
+)
+
+// GetTemperatureHumidity 获取近一周内所有温湿度情况
+func GetTemperatureHumidity(c *gin.Context) {
+	var temperatureHumidity []utils.Temperature
+	// 获取当前时间
+	now := time.Now()
+	// 计算一周前的时间
+	oneWeekAgo := now.AddDate(0, 0, -7)
+	// 格式化时间
+	formattedTime := oneWeekAgo.Format("2006-01-02 15:04:05")
+	// 查询最近一周的数据
+	tx := global.DBLink.Where("upload_time >= ?", formattedTime).Find(&temperatureHumidity)
+	if tx.Error == nil && tx.RowsAffected >= 0 {
+		e.ResponseSuccess(c, temperatureHumidity)
+		return
+	}
+	e.ResponseWithMsg(c, e.FIndFail, e.FIndFail.GetMsg())
+}
+
+var upgrader = websocket.Upgrader{
+	ReadBufferSize:  1024,
+	WriteBufferSize: 1024,
+}
+
+func WebSocketHandler(c *gin.Context) {
+	conn, err := upgrader.Upgrade(c.Writer, c.Request, nil)
+	if err != nil {
+		log.Println(err)
+		return
+	}
+	defer conn.Close()
+
+	for {
+		// 发送最新一周内的温度湿度数据
+		temperatureHumidity := utils.Gettemperature()
+		if len(temperatureHumidity) > 0 {
+			err := conn.WriteJSON(temperatureHumidity)
+			if err != nil {
+				log.Println(err)
+				break
+			}
+		}
+		time.Sleep(1 * time.Second) // 每分钟发送一次数据
+	}
+}
+
+// GetTemperatureHumidityInRange 获取指定时间范围内温湿度情况
+func GetTemperatureHumidityInRange(c *gin.Context, startTime, endTime string) {
+	var temperatureHumidity []utils.Temperature
+
+	// 使用传入的起始时间和结束时间查询数据
+	global.DBLink.Where("upload_time BETWEEN ? AND ?", startTime, endTime).Find(&temperatureHumidity)
+
+	// 可以进一步处理temperatureHumidity数据或者直接返回给客户端
+}

+ 14 - 0
app/e/R.go

@@ -45,3 +45,17 @@ func ResPonsePage(c *gin.Context, data interface{}, total int64, params unity.Qu
 		},
 	})
 }
+func ResPonsePageTime(c *gin.Context, data interface{}, total int64, params unity.TimePageParams) {
+	c.JSON(http.StatusOK, &R{
+		Code:    SUCCESS,
+		Message: SUCCESS.GetMsg(),
+		Data: gin.H{
+			"result":    data,
+			"total":     total,
+			"current":   params.Page,
+			"page_size": params.Size,
+			"startTime": params.StartTime,
+			"endTime":   params.EndTime,
+		},
+	})
+}

+ 0 - 1
app/model/temperature.go

@@ -1 +0,0 @@
-package model

+ 6 - 0
app/router.go

@@ -1,6 +1,7 @@
 package app
 
 import (
+	"bigdata_archives/app/controller"
 	middlewares "bigdata_archives/app/middleware"
 	"bigdata_archives/app/routers"
 	"bigdata_archives/configs"
@@ -16,8 +17,13 @@ func InitRouter() error {
 	engine.Static("/assets", "./frontend/dist/assets")
 	engine.Static("/libs", "./frontend/dist/libs")
 	engine.StaticFile("/favicon.ico", "./frontend/dist/favicon.ico")
+	//图片静态资源访问
+	engine.Static("/image", "./image")
+	engine.GET("/ws/temperature-humidity", controller.WebSocketHandler)
 	routers.UserRouter(engine)
+	routers.MonitorRouter(engine)
 	engine.Use(middlewares.AdminMiddleware())
 	routers.SystemRouter(engine)
+	routers.TemperatureRouter(engine)
 	return engine.Run(configs.Config.GetString("server.port"))
 }

+ 12 - 0
app/routers/monitor.go

@@ -0,0 +1,12 @@
+package routers
+
+import (
+	"bigdata_archives/app/controller"
+	middlewares "bigdata_archives/app/middleware"
+	"github.com/gin-gonic/gin"
+)
+
+func MonitorRouter(r *gin.Engine) {
+	r.Any("/listen", controller.Monitor)
+	r.POST("/api/monitor", controller.Getmonitor).Use(middlewares.AdminMiddleware())
+}

+ 11 - 0
app/routers/temperature.go

@@ -0,0 +1,11 @@
+package routers
+
+import (
+	"bigdata_archives/app/controller"
+	"github.com/gin-gonic/gin"
+)
+
+func TemperatureRouter(r *gin.Engine) {
+	group := r.Group("/api")
+	group.GET("/temperature", controller.GetTemperatureHumidity)
+}

+ 3 - 2
config.yaml

@@ -30,7 +30,7 @@ server:
   # http服务信息
   insecureServingInfo:
   # 监听端口
-  port: ":8080"
+  port: ":8181"
 subMail:
   appid: "97173"
   signature: "f639a60e41ee0554921d89884f5ff87e"
@@ -46,8 +46,9 @@ swag:
 archives:
   arc: "http://45.251.93.106:8082/api/statistics"
 modbus:
-  address: "COM3"
+  address: "COM4"
   baudrate: 4800
   databits: 8
   parity: "N"
+  url: "rtuovertcp://192.168.1.100:502"
 

+ 4 - 0
database/migrate.go

@@ -1,6 +1,7 @@
 package database
 
 import (
+	"bigdata_archives/app/controller"
 	"bigdata_archives/app/model"
 	"bigdata_archives/utils"
 	"gorm.io/gorm"
@@ -10,6 +11,9 @@ func Migrate(db *gorm.DB) {
 	db.Set("gorm:table_options", "ENGINE=InnoDB").AutoMigrate(
 		model.User{},
 		model.SystemSettings{},
+		controller.FaceRect{},
+		controller.AccessControllerEvent{},
 		utils.Temperature{},
+		controller.EventLog{},
 	)
 }

+ 2 - 0
go.mod

@@ -31,6 +31,7 @@ require (
 	github.com/goburrow/serial v0.1.0 // indirect
 	github.com/goccy/go-json v0.10.2 // indirect
 	github.com/golang-jwt/jwt/v4 v4.5.0 // indirect
+	github.com/gorilla/websocket v1.5.3 // indirect
 	github.com/hashicorp/hcl v1.0.0 // indirect
 	github.com/jinzhu/inflection v1.0.0 // indirect
 	github.com/jinzhu/now v1.1.5 // indirect
@@ -49,6 +50,7 @@ require (
 	github.com/pion/sdp/v3 v3.0.5 // indirect
 	github.com/sagikazarmark/locafero v0.4.0 // indirect
 	github.com/sagikazarmark/slog-shim v0.1.0 // indirect
+	github.com/simonvetter/modbus v1.6.1 // indirect
 	github.com/sourcegraph/conc v0.3.0 // indirect
 	github.com/spf13/afero v1.11.0 // indirect
 	github.com/spf13/cast v1.6.0 // indirect

+ 4 - 0
go.sum

@@ -49,6 +49,8 @@ github.com/golang-jwt/jwt/v4 v4.5.0/go.mod h1:m21LjoU+eqJr34lmDMbreY2eSTRJ1cv77w
 github.com/google/go-cmp v0.5.9 h1:O2Tfq5qg4qc4AmwVlvv0oLiVAGB7enBSJ2x2DqQFi38=
 github.com/google/go-cmp v0.5.9/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY=
 github.com/google/gofuzz v1.0.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg=
+github.com/gorilla/websocket v1.5.3 h1:saDtZ6Pbx/0u+bgYQ3q96pZgCzfhKXGPqt7kZ72aNNg=
+github.com/gorilla/websocket v1.5.3/go.mod h1:YR8l580nyteQvAITg2hZ9XVh4b55+EU/adAjf1fMHhE=
 github.com/hashicorp/hcl v1.0.0 h1:0Anlzjpi4vEasTeNFn2mLJgTSwt0+6sfsiTG8qcWGx4=
 github.com/hashicorp/hcl v1.0.0/go.mod h1:E5yfLk+7swimpb2L/Alb/PJmXilQ/rhwaUYs4T20WEQ=
 github.com/jinzhu/inflection v1.0.0 h1:K317FqzuhWc8YvSVlFMCCUb36O/S9MCKRDI7QkRKD/E=
@@ -103,6 +105,8 @@ github.com/sagikazarmark/locafero v0.4.0 h1:HApY1R9zGo4DBgr7dqsTH/JJxLTTsOt7u6ke
 github.com/sagikazarmark/locafero v0.4.0/go.mod h1:Pe1W6UlPYUk/+wc/6KFhbORCfqzgYEpgQ3O5fPuL3H4=
 github.com/sagikazarmark/slog-shim v0.1.0 h1:diDBnUNK9N/354PgrxMywXnAwEr1QZcOr6gto+ugjYE=
 github.com/sagikazarmark/slog-shim v0.1.0/go.mod h1:SrcSrq8aKtyuqEI1uvTDTK1arOWRIczQRv+GVI1AkeQ=
+github.com/simonvetter/modbus v1.6.1 h1:ibD6BMyo/igG3CNrSUKBalvWGwurPnQtYqRgjYCDqqM=
+github.com/simonvetter/modbus v1.6.1/go.mod h1:hh90ZaTaPLcK2REj6/fpTbiV0J6S7GWmd8q+GVRObPw=
 github.com/sourcegraph/conc v0.3.0 h1:OQTbbt6P72L20UqAkXXuLOj79LfEanQ+YQFNpLA9ySo=
 github.com/sourcegraph/conc v0.3.0/go.mod h1:Sdozi7LEKbFPqYX2/J+iBAM6HpqSLTASQIKqDmF7Mt0=
 github.com/spf13/afero v1.11.0 h1:WJQKhtpdm3v2IzqG8VMqrr6Rf3UYpEF239Jy9wNepM8=

+ 1 - 1
main.go

@@ -22,7 +22,7 @@ func init() {
 	//初始化系统设置
 	model.CreateSystemSettings()
 
-	//utils.ModBus()
+	//go utils.ModBus()
 
 }
 func main() {

+ 31 - 0
unity/unity.go

@@ -16,6 +16,13 @@ type QueryPageParams struct {
 	Query string `json:"query" form:"query"`
 	Desc  string `json:"desc" form:"desc"`
 }
+type TimePageParams struct {
+	Page      int    `json:"page" form:"page"`
+	Size      int    `json:"size" form:"size"`
+	StartTime string `json:"startTime" form:"startTime"`
+	EndTime   string `json:"endTime" form:"endTime"`
+	Desc      string `json:"desc" form:"desc"`
+}
 
 // Paginate 使用给定的DB连接执行分页查询
 func Paginate[T any](params PageParams, model T) (result []T, total int64, current int, err error) {
@@ -61,6 +68,30 @@ func PaginateWithCondition[T any](params QueryPageParams, model T, queryCond int
 	return result, count, nil
 }
 
+// PaginateWithTime 给定时间范围查询
+func PaginateWithTime[T any](params TimePageParams, tableName string, model T) (result []T, total int64, err error) {
+	table := global.DBLink.Table(tableName)
+
+	// 确保 total 初始化为 0
+	total = 0
+
+	if params.StartTime != "" && params.EndTime != "" {
+		table = table.Where("created_at BETWEEN ? AND ?", params.StartTime, params.EndTime)
+	}
+
+	if err = table.Count(&total).Error; err != nil {
+		return nil, 0, err
+	}
+
+	offset := (params.Page - 1) * params.Size
+
+	if err := table.Offset(offset).Limit(params.Size).Order(params.Desc).Find(&result).Error; err != nil {
+		return nil, 0, err
+	}
+
+	return result, total, nil
+}
+
 func AddGenericItem[T any](item T, mapper func(T) interface{}) error {
 	dbModel := mapper(item)
 	if err := global.DBLink.Create(dbModel).Error; err != nil {

+ 64 - 44
utils/modbus.go

@@ -1,15 +1,12 @@
 package utils
 
 import (
-	//"bigdata_archives/app/model"
 	"bigdata_archives/configs"
 	"bigdata_archives/global"
 	"bigdata_archives/simple_zap"
 	"context"
 	"fmt"
-	"github.com/goburrow/serial"
-	modbus "github.com/thinkgos/gomodbus/v2"
-	"log"
+	"github.com/simonvetter/modbus"
 	"time"
 )
 
@@ -24,51 +21,74 @@ type Temperature struct {
 
 }
 
-func ModBus() {
-	provider := modbus.NewRTUClientProvider(
-		modbus.WithEnableLogger(),
-		modbus.WithSerialConfig(serial.Config{
-			Address:  configs.Config.GetString("modbus.address"),
-			BaudRate: configs.Config.GetInt("modbus.baudrate"),
-			DataBits: configs.Config.GetInt("modbus.databits"),
-			Parity:   configs.Config.GetString("modbus.parity"),
-			Timeout:  5 * time.Second, //连接超时时间
-		}),
-	)
-	client := modbus.NewClient(provider)
-	err := client.Connect()
+func ModBus() error {
+	var client *modbus.ModbusClient
+	var err error
+	// for an RTU over TCP device/bus (remote serial port or
+	// simple TCP-to-serial bridge)
+	client, err = modbus.NewClient(&modbus.ClientConfiguration{
+		URL: configs.Config.GetString("Modbus.url"),
+		//Speed:   19200, // serial link speed
+		Timeout: 3 * time.Second,
+	})
+	// note: use rtuoverudp:// for modbus RTU over UDP
 	if err != nil {
-		simple_zap.WithCtx(context.Background()).Sugar().Error("modbus连接失败", err)
+		// error out if client creation failed
+		simple_zap.WithCtx(context.Background()).Sugar().Error(err, "连接失败")
+		return err
 	}
-	defer func() {
-		if err := client.Close(); err != nil {
-			simple_zap.WithCtx(context.Background()).Sugar().Error("modbus关闭失败", err)
-		}
-	}()
+	defer client.Close()
+	// now that the client is created and configured, attempt to connect
+	err = client.Open()
+	if err != nil {
+		simple_zap.WithCtx(context.Background()).Sugar().Error(err, "连接打开失败")
+		return err
+	}
+	// read a single 16-bit holding register at address 100
 	for {
-		for i := 1; i < 4; i++ {
-			results, err := client.ReadInputRegisters(byte(i), 0, 2)
+		var temperature uint16
+		var humidity uint16
+		for i := 1; i <= 6; i++ {
+			client.SetUnitId(uint8(i))
+			temperature, err = client.ReadRegister(0, modbus.INPUT_REGISTER)
+			humidity, err = client.ReadRegister(1, modbus.INPUT_REGISTER)
 			if err != nil {
-				log.Printf("modbus读取失败:%v", err)
-				continue
-			}
-
-			temperature := Temperature{
-				SlaveID:          i,
-				Humidity:         float64(results[1] / 10.0),
-				Temperature:      float64(results[0] / 10.0),
-				UploadTime:       Time(time.Now()),
-				HumidityAlarm:    0,
-				TemperatureAlarm: 0,
+				simple_zap.WithCtx(context.Background()).Sugar().Error(err, "读取失败")
+				break
+			} else {
+				fmt.Printf("设备:%v 温度: %v", i, int16(temperature))
+				fmt.Printf("设备:%v 湿度: %v", i, int16(humidity))
+				temperatures := Temperature{
+					SlaveID:          i,
+					Temperature:      float64(int16(temperature) / 10),
+					Humidity:         float64(int16(humidity) / 10),
+					UploadTime:       Time(time.Now()),
+					TemperatureAlarm: 0,
+					HumidityAlarm:    0,
+				}
+				if err := global.DBLink.Create(&temperatures).Error; err != nil {
+					simple_zap.WithCtx(context.Background()).Sugar().Error(err, "写入失败")
+					break
+				}
 			}
-			//保存温湿度到数据库
-			global.DBLink.Create(&temperature)
-			fmt.Println("温湿度:", temperature)
-			log.Printf("设备%v,温度: %v", i, results[0]/10.0)
-			log.Printf("设备%v 湿度度: %v", i, results[1]/10.0)
-			log.Printf("客户端状态: %v\n", &client)
-
+			time.Sleep(1 * time.Second)
 		}
-		time.Sleep(60 * time.Second)
 	}
 }
+
+// Gettemperature 获取最近一周的数据
+func Gettemperature() []Temperature {
+	var temperatureHumidity []Temperature
+	// 获取当前时间
+	now := time.Now()
+	// 计算一周前的时间
+	oneWeekAgo := now.AddDate(0, 0, -7)
+	// 格式化时间
+	formattedTime := oneWeekAgo.Format("2006-01-02 15:04:05")
+	// 查询最近一周的数据
+	tx := global.DBLink.Where("upload_time >= ?", formattedTime).Find(&temperatureHumidity)
+	if tx.Error == nil && tx.RowsAffected >= 0 {
+		return temperatureHumidity
+	}
+	return nil
+}