operate.go 2.5 KB

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