package modbus import ( "encoding/hex" "encoding/json" "os" "server/dao" "server/logger" "server/model" "server/utils" "time" ) // GetSunPowerInfo 获取太阳能信息 func GetSunPowerInfo() error { for id, conn := range model.ConnectionMap { _, dev, err := utils.GetDataByDeviceId(id) if dev.IsSun && dev.State == 1 { //打开 并且在线 err = utils.WriteDevice(SolarEnergyData(), conn) if err != nil { return err } } } return nil } // GetDeviceInfo 获取设备信息 func GetDeviceInfo() { for id, conn := range model.ConnectionMap { _, dev, _ := utils.GetDataByDeviceId(id) utils.WriteDevice(ReadDeviceInfo(dev.LoopNumber), conn) } } // CommandPub 命令发布 func CommandPub(id, hexStr string) { bytes, err := hex.DecodeString(hexStr) if err != nil { logger.Get().Errorln("Error decoding hex string:", err) return } err = utils.WriteDevice(bytes, model.ConnectionMap[id]) if err != nil { return } } // 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 } err = utils.SaveData("static/data.json", regions) if err != nil { logger.Get().Errorf("离线保存失败: %v", err) } }