device.go 4.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172
  1. package iotDb
  2. import (
  3. "IotAdmin/app/iot/models"
  4. "IotAdmin/core/logger"
  5. "IotAdmin/core/sdk"
  6. "IotAdmin/core/sdk/config"
  7. "IotAdmin/core/storage"
  8. "IotAdmin/core/tools/writer"
  9. "IotAdmin/iot/constant"
  10. iotMap "IotAdmin/iot/map"
  11. iotStruct "IotAdmin/iot/struct"
  12. "encoding/json"
  13. "errors"
  14. "fmt"
  15. "log"
  16. "gorm.io/gorm"
  17. )
  18. // LoadDtuDeviceMap 加载DTU设备
  19. func LoadDtuDeviceMap() error {
  20. iotMap.MapDtuDevice.Clean()
  21. deviceArr := make([]models.IotDevice, 0)
  22. for _, db := range dbMap {
  23. gatewayArr := make([]models.IotDevice, 0)
  24. d := &models.IotDevice{}
  25. err := db.Model(d).Select("id,sn,name,type,mode,status,cycle").Where("type = ? AND status = ?", constant.IotDeviceTypeGateway, constant.IotDeviceOnline).Find(&gatewayArr).Error
  26. if err != nil {
  27. continue
  28. }
  29. deviceArr = append(deviceArr, gatewayArr...)
  30. err = loadDtuDeviceMap(db, &deviceArr)
  31. if err != nil {
  32. return err
  33. }
  34. }
  35. return nil
  36. }
  37. func loadDtuDeviceMap(db *gorm.DB, arr *[]models.IotDevice) error {
  38. if len(*arr) == 0 {
  39. return nil
  40. }
  41. for _, v := range *arr {
  42. err := addDtuDevice(db, v)
  43. if err != nil {
  44. return err
  45. }
  46. }
  47. return nil
  48. }
  49. func addDtuDevice(db *gorm.DB, device models.IotDevice) error {
  50. if device.Type != constant.IotDeviceTypeGateway {
  51. return errors.New("type is not gateway")
  52. }
  53. children := make([]models.IotDevice, 0)
  54. 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)
  55. if len(children) == 0 {
  56. return nil
  57. }
  58. cfg := device.ToDtuConfig(&children)
  59. var dtu = &iotStruct.DtuDevice{
  60. SN: device.Sn,
  61. Name: device.Name,
  62. Config: cfg,
  63. Logger: logger.NewHelper(setupDeviceLogger(device.Sn)),
  64. }
  65. logger.Infof("加载DTU设备: %s %v", dtu.SN, dtu.Config)
  66. dtu.Logger.Infof("加载DTU设备 %v", *dtu.Config)
  67. iotMap.MapDtuDevice.Add(device.Sn, dtu)
  68. return nil
  69. }
  70. func DtuChangeStatus(message storage.Message) (err error) {
  71. db := sdk.Runtime.GetDbByKey(message.GetPrefix())
  72. if db == nil {
  73. err = errors.New("db not exist")
  74. logger.Errorf("host[%s]'s %s", message.GetPrefix(), err.Error())
  75. return
  76. }
  77. var rb []byte
  78. rb, err = json.Marshal(message.GetValues())
  79. if err != nil {
  80. err = fmt.Errorf("json Marshal error,%s, %v", string(rb), err.Error())
  81. return
  82. }
  83. status := iotStruct.DtuStatus{}
  84. err = json.Unmarshal(rb, &status)
  85. if err != nil {
  86. err = fmt.Errorf("json Unmarshal error,%s, %v", string(rb), err.Error())
  87. return
  88. }
  89. mp := make(map[string]interface{})
  90. mp["online_status"] = status.Status
  91. if status.Status == constant.IotDeviceOffline {
  92. mp["time_offline"] = status.Time
  93. } else {
  94. mp["time_online"] = status.Time
  95. }
  96. err = db.Model(&models.IotDevice{}).Where("sn = ?", status.SN).Updates(mp).Error
  97. return err
  98. }
  99. func DtuDeviceChange(message storage.Message) (err error) {
  100. db := sdk.Runtime.GetDbByKey(message.GetPrefix())
  101. if db == nil {
  102. err = errors.New("db not exist")
  103. logger.Errorf("host[%s]'s %s", message.GetPrefix(), err.Error())
  104. return nil
  105. }
  106. var rb []byte
  107. rb, err = json.Marshal(message.GetValues())
  108. if err != nil {
  109. err = fmt.Errorf("json Marshal error,%s, %v", string(rb), err.Error())
  110. return err
  111. }
  112. val := &iotStruct.DtuChange{}
  113. err = json.Unmarshal(rb, val)
  114. if err != nil {
  115. err = fmt.Errorf("json Unmarshal error,%s, %v", string(rb), err.Error())
  116. return err
  117. }
  118. if val.Type == constant.IotDeviceRefresh {
  119. err = LoadDtuDeviceMap()
  120. } else if val.Type == constant.IotDeviceDelete {
  121. device := &models.IotDevice{}
  122. err = db.Model(device).Where("id = ? ", val.Id).Find(device).Error
  123. if err != nil {
  124. return
  125. }
  126. iotMap.MapDtuDevice.Remove(device.Sn)
  127. } else {
  128. device := &models.IotDevice{}
  129. err = db.Model(device).Where("id = ? AND status = ?", val.Id, constant.IotDeviceEnabled).Find(device).Error
  130. if err != nil {
  131. return
  132. }
  133. err = addDtuDevice(db, *device)
  134. }
  135. return
  136. }
  137. // setupDeviceLogger 设置设备日志组件
  138. func setupDeviceLogger(sn string) logger.Logger {
  139. path := config.LoggerConfig.Path
  140. logCap := config.LoggerConfig.Cap
  141. if path == "" {
  142. path = "_logs/"
  143. } else if path[len(path)-1] != '/' {
  144. path += "/"
  145. }
  146. path += "device/" + sn
  147. if logCap == 0 {
  148. logCap = 1024
  149. }
  150. output, err := writer.NewFileWriter(
  151. writer.WithPath(path),
  152. writer.WithCap(logCap<<10),
  153. )
  154. if err != nil {
  155. log.Printf("device logger setup error: %s \r\n", err.Error())
  156. }
  157. level := logger.DebugLevel
  158. if config.ApplicationConfig.Mode == "prod" {
  159. level = logger.InfoLevel
  160. }
  161. return logger.NewLogger(logger.WithLevel(level), logger.WithOutput(output), logger.WithName(sn))
  162. }