operate.go 2.2 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192
  1. package modbus
  2. import (
  3. "encoding/json"
  4. "net"
  5. "os"
  6. "server/dao"
  7. "server/logger"
  8. "server/model"
  9. "server/utils"
  10. "time"
  11. )
  12. // GetSunPowerInfo 获取太阳能信息
  13. func GetSunPowerInfo() error {
  14. model.ConnectionMap1.Range(func(key, value interface{}) bool {
  15. addr := key.(string) // 假设键是 string 类型
  16. conn := value.(net.Conn) // 假设值是 net.Conn 类型
  17. _, dev, _ := utils.GetDataByDeviceId(addr)
  18. if dev.IsSun && dev.State == 1 { //打开 并且在线
  19. utils.WriteDevice(SolarEnergyData(), conn)
  20. }
  21. // 返回 true 继续遍历,返回 false 提前终止遍历
  22. return true
  23. })
  24. return nil
  25. }
  26. // GetDeviceInfo 获取设备信息
  27. func GetDeviceInfo() {
  28. model.ConnectionMap1.Range(func(key, value interface{}) bool {
  29. addr := key.(string) // 假设键是 string 类型
  30. conn := value.(net.Conn) // 假设值是 net.Conn 类型
  31. _, dev, _ := utils.GetDataByDeviceId(addr)
  32. utils.WriteDevice(ReadDeviceInfo(dev.LoopNumber), conn)
  33. time.Sleep(1 * time.Second)
  34. // 返回 true 继续遍历,返回 false 提前终止遍历
  35. return true
  36. })
  37. }
  38. // DealWithOffline 处理离线
  39. func DealWithOffline() {
  40. regions, err := utils.LoadData()
  41. if err != nil {
  42. logger.Get().Errorln("离线" + err.Error())
  43. return
  44. }
  45. datafb, err := os.ReadFile("static/data-fb.json")
  46. var regionsfb []dao.Region
  47. if err := json.Unmarshal(datafb, &regionsfb); err != nil {
  48. // 提供更多的上下文信息来帮助调试
  49. logger.Get().Errorf("解析 JSON 失败: %v, 原始数据: %s", err, regions)
  50. }
  51. // 检查文件是否为空
  52. if len(regions) == 0 {
  53. regions = regionsfb // 如果文件为空,返回空数组
  54. }
  55. // 确保 regions 不为 nil
  56. if regions == nil {
  57. regions = regionsfb
  58. }
  59. now := time.Now()
  60. for i, region := range regions {
  61. // 确保 region.Devices 不为 nil
  62. if region.Devices == nil {
  63. continue
  64. }
  65. for i2, device := range region.Devices {
  66. if now.After(device.OnlineTime.Add(13*time.Minute)) && device.State != 0 {
  67. regions[i].Devices[i2].State = 0
  68. }
  69. }
  70. }
  71. if len(regions) == 0 {
  72. return
  73. }
  74. utils.SaveRegions(regions)
  75. //err = utils.SaveData("static/data.json", regions)
  76. if err != nil {
  77. logger.Get().Errorf("离线保存失败: %v", err)
  78. }
  79. }