device.go 3.8 KB

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