device.go 3.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126
  1. package iotDb
  2. import (
  3. "IotAdmin/app/iot/models"
  4. "IotAdmin/core/logger"
  5. "IotAdmin/core/sdk"
  6. "IotAdmin/core/storage"
  7. "IotAdmin/iot/constant"
  8. iotMap "IotAdmin/iot/map"
  9. iotStruct "IotAdmin/iot/struct"
  10. "encoding/json"
  11. "errors"
  12. "fmt"
  13. "gorm.io/gorm"
  14. )
  15. // LoadDtuDeviceMap 加载DTU设备
  16. func LoadDtuDeviceMap() error {
  17. deviceArr := make([]models.IotDevice, 0)
  18. for _, db := range dbMap {
  19. gatewayArr := make([]models.IotDevice, 0)
  20. d := &models.IotDevice{}
  21. err := db.Model(d).Select("id,sn,name,type,mode,cycle").Where("type = ?", constant.IotDeviceTypeGateway).Find(&gatewayArr).Error
  22. if err != nil {
  23. continue
  24. }
  25. deviceArr = append(deviceArr, gatewayArr...)
  26. err = loadDtuDeviceMap(db, &deviceArr)
  27. if err != nil {
  28. return err
  29. }
  30. }
  31. return nil
  32. }
  33. func loadDtuDeviceMap(db *gorm.DB, arr *[]models.IotDevice) error {
  34. iotMap.MapDtuDevice.Clean()
  35. if len(*arr) == 0 {
  36. return nil
  37. }
  38. for _, v := range *arr {
  39. err := addDtuDevice(db, v)
  40. if err != nil {
  41. return err
  42. }
  43. }
  44. return nil
  45. }
  46. func addDtuDevice(db *gorm.DB, device models.IotDevice) error {
  47. if device.Type == 0 {
  48. iotMap.MapDtuDevice.Remove(device.Sn)
  49. return nil
  50. }
  51. if device.Type != constant.IotDeviceTypeGateway {
  52. return errors.New("type is not gateway")
  53. }
  54. children := make([]models.IotDevice, 0)
  55. db.Model(&models.IotDevice{}).Select("id,sn,dsn,protocol,address,bm_yz,other_config").Where("parent_id = ?", device.Id).Find(&children)
  56. if len(children) == 0 {
  57. return errors.New("children is nil")
  58. }
  59. cfg := device.ToDtuConfig(&children)
  60. var dtu = &iotStruct.DtuDevice{
  61. SN: device.Sn,
  62. Name: device.Name,
  63. Config: cfg,
  64. }
  65. logger.Info("加载DTU设备[%s]: %v", device.Sn, dtu)
  66. iotMap.MapDtuDevice.Add(device.Sn, dtu)
  67. return nil
  68. }
  69. func DtuChangeStatus(message storage.Message) (err error) {
  70. db := sdk.Runtime.GetDbByKey(message.GetPrefix())
  71. if db == nil {
  72. err = errors.New("db not exist")
  73. logger.Errorf("host[%s]'s %s", message.GetPrefix(), err.Error())
  74. return
  75. }
  76. var rb []byte
  77. rb, err = json.Marshal(message.GetValues())
  78. if err != nil {
  79. err = fmt.Errorf("json Marshal error,%s, %v", string(rb), err.Error())
  80. return
  81. }
  82. status := iotStruct.DtuStatus{}
  83. err = json.Unmarshal(rb, &status)
  84. if err != nil {
  85. err = fmt.Errorf("json Unmarshal error,%s, %v", string(rb), err.Error())
  86. return
  87. }
  88. mp := make(map[string]interface{})
  89. mp["online_status"] = status.Status
  90. if status.Status == constant.IotDeviceOffline {
  91. mp["time_offline"] = status.Time
  92. } else {
  93. mp["time_online"] = status.Time
  94. }
  95. err = db.Model(&models.IotDevice{}).Where("sn = ?", status.SN).Updates(mp).Error
  96. return err
  97. }
  98. func DtuDeviceChange(message storage.Message) (err error) {
  99. db := sdk.Runtime.GetDbByKey(message.GetPrefix())
  100. if db == nil {
  101. err = errors.New("db not exist")
  102. logger.Errorf("host[%s]'s %s", message.GetPrefix(), err.Error())
  103. return nil
  104. }
  105. var rb []byte
  106. val := &models.IotDevice{}
  107. err = json.Unmarshal(rb, val)
  108. if err != nil {
  109. err = fmt.Errorf("json Unmarshal error,%s, %v", string(rb), err.Error())
  110. return err
  111. }
  112. device := &models.IotDevice{}
  113. err = db.Model(device).Where("id = ?", val.Id).Find(device).Error
  114. if err != nil {
  115. return
  116. }
  117. err = addDtuDevice(db, *device)
  118. return err
  119. }