operate.go 2.1 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. // 返回 true 继续遍历,返回 false 提前终止遍历
  34. return true
  35. })
  36. }
  37. // DealWithOffline 处理离线
  38. func DealWithOffline() {
  39. regions, err := utils.LoadData()
  40. if err != nil {
  41. logger.Get().Errorln("离线" + err.Error())
  42. return
  43. }
  44. datafb, err := os.ReadFile("static/data-fb.json")
  45. var regionsfb []dao.Region
  46. if err := json.Unmarshal(datafb, &regionsfb); err != nil {
  47. // 提供更多的上下文信息来帮助调试
  48. logger.Get().Errorf("解析 JSON 失败: %v, 原始数据: %s", err, regions)
  49. }
  50. // 检查文件是否为空
  51. if len(regions) == 0 {
  52. regions = regionsfb // 如果文件为空,返回空数组
  53. }
  54. // 确保 regions 不为 nil
  55. if regions == nil {
  56. regions = regionsfb
  57. }
  58. now := time.Now()
  59. for i, region := range regions {
  60. // 确保 region.Devices 不为 nil
  61. if region.Devices == nil {
  62. continue
  63. }
  64. for i2, device := range region.Devices {
  65. if now.After(device.OnlineTime.Add(13*time.Minute)) && device.State != 0 {
  66. regions[i].Devices[i2].State = 0
  67. }
  68. }
  69. }
  70. if len(regions) == 0 {
  71. return
  72. }
  73. err = utils.SaveData("static/data.json", regions)
  74. if err != nil {
  75. logger.Get().Errorf("离线保存失败: %v", err)
  76. }
  77. }