Browse Source

实时发送每一个设备的温湿度

huangyan 7 months ago
parent
commit
2724795297
2 changed files with 43 additions and 37 deletions
  1. 2 3
      app/controller/temperature.go
  2. 41 34
      utils/modbus.go

+ 2 - 3
app/controller/temperature.go

@@ -43,9 +43,8 @@ func WebSocketHandler(c *gin.Context) {
 
 	for {
 		// 发送最新一周内的温度湿度数据
-		temperatureHumidity := utils.Gettemperature()
-		if len(temperatureHumidity) > 0 {
-			err := conn.WriteJSON(temperatureHumidity)
+		if len(utils.LatestData) > 0 {
+			err := conn.WriteJSON(utils.LatestData)
 			if err != nil {
 				log.Println(err)
 				break

+ 41 - 34
utils/modbus.go

@@ -18,60 +18,70 @@ type Temperature struct {
 	UploadTime       Time    `gorm:"type:datetime" json:"upload_time"`      //上传时间
 	TemperatureAlarm int     `gorm:"type:int(11)" json:"temperature_alarm"` //温度报警 1报警
 	HumidityAlarm    int     `gorm:"type:int(11)" json:"humidity_alarm"`    //湿度报警 1报警
-
 }
 
+var LatestData map[int]Temperature
+
 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)
+
+	// 创建并配置Modbus客户端
 	client, err = modbus.NewClient(&modbus.ClientConfiguration{
-		URL: configs.Config.GetString("Modbus.url"),
-		//Speed:   19200, // serial link speed
+		URL:     configs.Config.GetString("Modbus.url"),
 		Timeout: 3 * time.Second,
 	})
-	// note: use rtuoverudp:// for modbus RTU over UDP
+
 	if err != nil {
-		// error out if client creation failed
 		simple_zap.WithCtx(context.Background()).Sugar().Error(err, "连接失败")
 		return 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
+
+	ticker := time.NewTicker(1 * time.Second)     // 每秒获取一次数据
+	hourlyTicker := time.NewTicker(1 * time.Hour) // 每小时记录一次数据
+
+	LatestData = make(map[int]Temperature)
+
 	for {
-		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 {
-				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,
+		select {
+		case <-ticker.C:
+			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 {
+					simple_zap.WithCtx(context.Background()).Sugar().Error(err, "读取失败")
+					break
+				}
+
+				fmt.Printf("设备:%v 温度: %v\n", i, int16(temperature))
+				fmt.Printf("设备:%v 湿度: %v\n", i, int16(humidity))
+
+				// 存储最新的数据
+				LatestData[i] = Temperature{
+					SlaveID:     i,
+					Temperature: float64(temperature) / 10,
+					Humidity:    float64(humidity) / 10,
+					UploadTime:  Time(time.Now()),
 				}
-				if err := global.DBLink.Create(&temperatures).Error; err != nil {
+			}
+		case <-hourlyTicker.C:
+			// 每小时保存最新数据
+			for _, data := range LatestData {
+				if err := global.DBLink.Create(&data).Error; err != nil {
 					simple_zap.WithCtx(context.Background()).Sugar().Error(err, "写入失败")
 					break
 				}
 			}
-			time.Sleep(1 * time.Second)
 		}
 	}
 }
@@ -79,13 +89,10 @@ func ModBus() error {
 // 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