package modbus import ( "encoding/json" "net" "os" "server/dao" "server/logger" "server/model" "server/utils" "time" ) // GetSunPowerInfo 获取太阳能信息 func GetSunPowerInfo() error { model.ConnectionMap1.Range(func(key, value interface{}) bool { addr := key.(string) // 假设键是 string 类型 conn := value.(net.Conn) // 假设值是 net.Conn 类型 _, dev, _ := utils.GetDataByDeviceId(addr) if dev.IsSun && dev.State == 1 { //打开 并且在线 utils.WriteDevice(SolarEnergyData(), conn) } // 返回 true 继续遍历,返回 false 提前终止遍历 return true }) return nil } // GetDeviceInfo 获取设备信息 func GetDeviceInfo() { model.ConnectionMap1.Range(func(key, value interface{}) bool { addr := key.(string) // 假设键是 string 类型 conn := value.(net.Conn) // 假设值是 net.Conn 类型 _, dev, _ := utils.GetDataByDeviceId(addr) utils.WriteDevice(ReadDeviceInfo(dev.LoopNumber), conn) time.Sleep(1 * time.Second) // 返回 true 继续遍历,返回 false 提前终止遍历 return true }) } // DealWithOffline 处理离线 func DealWithOffline() { regions, err := utils.LoadData() if err != nil { logger.Get().Errorln("离线" + err.Error()) return } datafb, err := os.ReadFile("static/data-fb.json") var regionsfb []dao.Region if err := json.Unmarshal(datafb, ®ionsfb); err != nil { // 提供更多的上下文信息来帮助调试 logger.Get().Errorf("解析 JSON 失败: %v, 原始数据: %s", err, regions) } // 检查文件是否为空 if len(regions) == 0 { regions = regionsfb // 如果文件为空,返回空数组 } // 确保 regions 不为 nil if regions == nil { regions = regionsfb } now := time.Now() for i, region := range regions { // 确保 region.Devices 不为 nil if region.Devices == nil { continue } for i2, device := range region.Devices { if now.After(device.OnlineTime.Add(13*time.Minute)) && device.State != 0 { regions[i].Devices[i2].State = 0 } } } if len(regions) == 0 { return } utils.SaveRegions(regions) //err = utils.SaveData("static/data.json", regions) if err != nil { logger.Get().Errorf("离线保存失败: %v", err) } }