device.go 5.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172
  1. package services
  2. import (
  3. "github.com/gogf/gf/util/guid"
  4. "sparrow/pkg/models"
  5. "sparrow/pkg/rpcs"
  6. "sparrow/pkg/server"
  7. "sparrow/services/knowoapi/model"
  8. )
  9. // DeviceService device service接口
  10. type DeviceService interface {
  11. // 获取厂商已经激活的设备总数
  12. GetDeviceCount(vendorid string) (int, error)
  13. //返回厂商某天激活的设备数
  14. GetActiveNumberOfDate(vendor string, datetime string) (int, error)
  15. //获取厂商某天活跃的设备数
  16. GetLivelyCountOfDate(string, string) (int, error)
  17. //获取近N日激活设备数据
  18. GetActiveOfNumDays(string, int) ([]map[string]interface{}, error)
  19. //获取近N日活跃设备数据
  20. GetLivelyOfNumDays(string, int) ([]map[string]interface{}, error)
  21. //获取已经激活的设备列表
  22. GetDevices(vendorid, proid string, pi, ps int, deviceid string) ([]*models.Devices, int, error)
  23. //获取用户下所有设备的数量,在线设备的数量,离线设备的数量
  24. GetDevicesCountByVenderId(vendorid string) (map[string]interface{}, error)
  25. // 发起设备OTA升级
  26. Upgrade(params *models.UpgradeParams) error
  27. // GetUpgradeProgress 获取ota升级进度
  28. GetUpgradeProgress(deviceId string) (rpcs.ReplyOtaProgress, error)
  29. }
  30. type deviceservice struct {
  31. models *model.All
  32. }
  33. // NewDeviceService create device service
  34. func NewDeviceService(models *model.All) DeviceService {
  35. return deviceservice{
  36. models: models,
  37. }
  38. }
  39. func (a deviceservice) GetDevices(vendorid, proid string, pi, ps int, deviceid string) ([]*models.Devices, int, error) {
  40. data, total, err := a.models.Device.GetDevices(vendorid, proid, pi, ps, deviceid)
  41. if err != nil {
  42. return nil, 0, err
  43. }
  44. dataMap := make([]*models.Devices, 0)
  45. for _, device := range data {
  46. onlineargs := rpcs.ArgsGetDeviceOnlineStatus{
  47. Id: device.DeviceIdentifier,
  48. }
  49. onlinereply := rpcs.ReplyGetDeviceOnlineStatus{}
  50. err = server.RPCCallByName(nil, rpcs.DeviceManagerName, "DeviceManager.GetDeviceOnlineStatus", onlineargs, &onlinereply)
  51. if err != nil && err.Error() != "redigo: nil returned" {
  52. server.Log.Errorf("get devie online status error: %v", err)
  53. return nil, 0, err
  54. }
  55. devices := new(models.Devices)
  56. devices.Device = device
  57. if int(onlinereply.HeartbeatInterval) > 0 && len(onlinereply.ClientIP) > 0 {
  58. devices.Status = 1
  59. }
  60. dataMap = append(dataMap, devices)
  61. }
  62. return dataMap, total, nil
  63. }
  64. func (a deviceservice) GetDeviceCount(vendorid string) (int, error) {
  65. return a.models.Device.GetDeviceCount(vendorid)
  66. }
  67. func (a deviceservice) GetActiveNumberOfDate(vendorid string, datetime string) (int, error) {
  68. return a.models.Device.GetActiveNumberOfDate(vendorid, datetime)
  69. }
  70. func (a deviceservice) GetLivelyCountOfDate(vendorid string, datetime string) (int, error) {
  71. return a.models.Device.GetLivelyCountOfDate(vendorid, datetime)
  72. }
  73. func (a deviceservice) GetActiveOfNumDays(vendorid string, days int) ([]map[string]interface{}, error) {
  74. return a.models.Device.GetActiveOfNumDays(vendorid, days)
  75. }
  76. func (a deviceservice) GetLivelyOfNumDays(vendorid string, days int) ([]map[string]interface{}, error) {
  77. return a.models.Device.GetLivelyOfNumDays(vendorid, days)
  78. }
  79. func (a deviceservice) GetDevicesCountByVenderId(vendorid string) (map[string]interface{}, error) {
  80. data, err := a.models.Device.GetDevicesByVenderId(vendorid)
  81. if err != nil {
  82. return nil, err
  83. }
  84. var onlineCount int
  85. var offlineCount int
  86. for _, device := range data {
  87. onlineargs := rpcs.ArgsGetDeviceOnlineStatus{
  88. Id: device.DeviceIdentifier,
  89. }
  90. onlinereply := rpcs.ReplyGetDeviceOnlineStatus{}
  91. err = server.RPCCallByName(nil, rpcs.DeviceManagerName, "DeviceManager.GetDeviceOnlineStatus", onlineargs, &onlinereply)
  92. if err != nil && err.Error() != "redigo: nil returned" {
  93. server.Log.Errorf("get devie online status error: %v", err)
  94. return nil, err
  95. }
  96. if int(onlinereply.HeartbeatInterval) > 0 && len(onlinereply.ClientIP) > 0 {
  97. onlineCount += 1
  98. } else {
  99. offlineCount += 1
  100. }
  101. }
  102. deviceCount := map[string]interface{}{
  103. "TotalData": len(data),
  104. "OnlineCount": onlineCount,
  105. "OfflineCount": offlineCount,
  106. }
  107. return deviceCount, nil
  108. }
  109. func (a deviceservice) Upgrade(param *models.UpgradeParams) error {
  110. var fileArgs rpcs.ArgsOtaFile
  111. fileArgs.FileData = param.File
  112. fileArgs.FileId = guid.S()
  113. var reply rpcs.ReplyEmptyResult
  114. err := server.RPCCallByName(nil, rpcs.DeviceManagerName, "DeviceManager.SavaFile", fileArgs, &reply)
  115. if err != nil {
  116. server.Log.Errorf("OTA升级文件保存失败:%v", err)
  117. return err
  118. }
  119. var args rpcs.ArgsUpgrade4G
  120. args.DeviceId = param.DeviceID
  121. args.FileId = fileArgs.FileId
  122. args.FileSize = param.FileSize
  123. err = server.RPCCallByName(nil, rpcs.MQTTAccessName, "Access.UpgradeFor4G", args, &reply)
  124. if err != nil {
  125. server.Log.Errorf("4G模组OTA升级失败:%v", err)
  126. return err
  127. }
  128. return nil
  129. }
  130. func (a deviceservice) GetUpgradeProgress(deviceId string) (rpcs.ReplyOtaProgress, error) {
  131. var args rpcs.ArgsOtaProgress
  132. args.DeviceId = deviceId
  133. var reply rpcs.ReplyOtaProgress
  134. err := server.RPCCallByName(nil, rpcs.DeviceManagerName, "DeviceManager.GetProgress", args, &reply)
  135. if err != nil {
  136. server.Log.Errorf("OTA升级进度获取失败:%v", err)
  137. return reply, err
  138. }
  139. return reply, nil
  140. }