device.go 11 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374
  1. package services
  2. import (
  3. "github.com/gogf/gf/encoding/gjson"
  4. "math/rand"
  5. "sparrow/pkg/models"
  6. "sparrow/pkg/rpcs"
  7. "sparrow/pkg/server"
  8. "sparrow/services/knowoapi/model"
  9. )
  10. // DeviceService device service接口
  11. type DeviceService interface {
  12. // 获取厂商已经激活的设备总数
  13. GetDeviceCount(vendorid string) (int, error)
  14. //返回厂商某天激活的设备数
  15. GetActiveNumberOfDate(vendor string, datetime string) (int, error)
  16. //获取厂商某天活跃的设备数
  17. GetLivelyCountOfDate(string, string) (int, error)
  18. //获取近N日激活设备数据
  19. GetActiveOfNumDays(string, int) ([]map[string]interface{}, error)
  20. //获取近N日活跃设备数据
  21. GetLivelyOfNumDays(string, int) ([]map[string]interface{}, error)
  22. //获取已经激活的设备列表
  23. GetDevices(vendorid, proid string, pi, ps int, deviceid string) ([]*models.Devices, int, error)
  24. //获取用户下所有设备的数量,在线设备的数量,离线设备的数量
  25. GetDevicesCountByVenderId(vendorid string) (map[string]interface{}, error)
  26. // Update 更新设备信息
  27. Update(Device *models.Device) error
  28. // Upgrade 发起设备OTA升级
  29. Upgrade(params *models.UpgradeParams) error
  30. // GetUpgradeProgress 获取ota升级进度
  31. GetUpgradeProgress(deviceId string) (rpcs.ReplyOtaProgress, error)
  32. // GetDeviceStatus 获取设备状态数据
  33. GetDeviceStatus(deviceId string) (*gjson.Json, error)
  34. // SetReport 获取设备状态
  35. SetReport(params models.SendCommandParams) (*gjson.Json, error)
  36. // Restart 重启设备
  37. Restart(params models.SendCommandParams) error
  38. // ClearData 清除设备配置数据
  39. ClearData(params models.SendCommandParams) error
  40. // SetDataTrans 设备端自动上报配置
  41. SetDataTrans(params models.SendCommandParams) error
  42. // GetInfo 获取网关信息
  43. GetInfo(params models.SendCommandParams) (*gjson.Json, error)
  44. // ForceRun 远程控制某个模块强制运行
  45. ForceRun(params models.SendCommandParams) error
  46. // SetDeviceId 写入设备id
  47. SetDeviceId(params models.SendCommandParams) error
  48. // SetFjsqStatus 智能分集水器控制
  49. SetFjsqStatus(params models.SendCommandParams) error
  50. // SetOutdoorPower 设置水系统外机电源状态
  51. SetOutdoorPower(params models.SendCommandParams) error
  52. // SetOutdoorTemp 设置水系统外机出水温度
  53. SetOutdoorTemp(params models.SendCommandParams) error
  54. // SetOutdoorLinkage 开启/关闭水系统联动
  55. SetOutdoorLinkage(params models.SendCommandParams) error
  56. // SetMixedWaterLinkage 开启/关闭调温中心联动
  57. SetMixedWaterLinkage(params models.SendCommandParams) error
  58. }
  59. type deviceservice struct {
  60. models *model.All
  61. }
  62. // NewDeviceService create device service
  63. func NewDeviceService(models *model.All) DeviceService {
  64. return deviceservice{
  65. models: models,
  66. }
  67. }
  68. func (a deviceservice) Update(Device *models.Device) error {
  69. _, err := a.models.Device.Update(Device)
  70. return err
  71. }
  72. func (a deviceservice) GetDevices(vendorid, proid string, pi, ps int, deviceid string) ([]*models.Devices, int, error) {
  73. data, total, err := a.models.Device.GetDevices(vendorid, proid, pi, ps, deviceid)
  74. if err != nil {
  75. return nil, 0, err
  76. }
  77. dataMap := make([]*models.Devices, 0)
  78. for _, device := range data {
  79. onlineargs := rpcs.ArgsGetDeviceOnlineStatus{
  80. Id: device.DeviceIdentifier,
  81. }
  82. onlinereply := rpcs.ReplyGetDeviceOnlineStatus{}
  83. err = server.RPCCallByName(nil, rpcs.DeviceManagerName, "DeviceManager.GetDeviceOnlineStatus", onlineargs, &onlinereply)
  84. if err != nil && err.Error() != "redigo: nil returned" {
  85. server.Log.Errorf("get devie online status error: %v", err)
  86. return nil, 0, err
  87. }
  88. devices := new(models.Devices)
  89. devices.Device = device
  90. if int(onlinereply.HeartbeatInterval) > 0 && len(onlinereply.ClientIP) > 0 {
  91. devices.Status = 1
  92. }
  93. dataMap = append(dataMap, devices)
  94. }
  95. return dataMap, total, nil
  96. }
  97. func (a deviceservice) GetDeviceCount(vendorid string) (int, error) {
  98. return a.models.Device.GetDeviceCount(vendorid)
  99. }
  100. func (a deviceservice) GetActiveNumberOfDate(vendorid string, datetime string) (int, error) {
  101. return a.models.Device.GetActiveNumberOfDate(vendorid, datetime)
  102. }
  103. func (a deviceservice) GetLivelyCountOfDate(vendorid string, datetime string) (int, error) {
  104. return a.models.Device.GetLivelyCountOfDate(vendorid, datetime)
  105. }
  106. func (a deviceservice) GetActiveOfNumDays(vendorid string, days int) ([]map[string]interface{}, error) {
  107. return a.models.Device.GetActiveOfNumDays(vendorid, days)
  108. }
  109. func (a deviceservice) GetLivelyOfNumDays(vendorid string, days int) ([]map[string]interface{}, error) {
  110. return a.models.Device.GetLivelyOfNumDays(vendorid, days)
  111. }
  112. func (a deviceservice) GetDevicesCountByVenderId(vendorid string) (map[string]interface{}, error) {
  113. data, err := a.models.Device.GetDevicesByVenderId(vendorid)
  114. if err != nil {
  115. return nil, err
  116. }
  117. var onlineCount int
  118. var offlineCount int
  119. for _, device := range data {
  120. onlineargs := rpcs.ArgsGetDeviceOnlineStatus{
  121. Id: device.DeviceIdentifier,
  122. }
  123. onlinereply := rpcs.ReplyGetDeviceOnlineStatus{}
  124. err = server.RPCCallByName(nil, rpcs.DeviceManagerName, "DeviceManager.GetDeviceOnlineStatus", onlineargs, &onlinereply)
  125. if err != nil && err.Error() != "redigo: nil returned" {
  126. server.Log.Errorf("get devie online status error: %v", err)
  127. return nil, err
  128. }
  129. if int(onlinereply.HeartbeatInterval) > 0 && len(onlinereply.ClientIP) > 0 {
  130. onlineCount += 1
  131. } else {
  132. offlineCount += 1
  133. }
  134. }
  135. deviceCount := map[string]interface{}{
  136. "TotalData": len(data),
  137. "OnlineCount": onlineCount,
  138. "OfflineCount": offlineCount,
  139. }
  140. return deviceCount, nil
  141. }
  142. func (a deviceservice) Upgrade(params *models.UpgradeParams) error {
  143. var fileArgs rpcs.ArgsOtaFile
  144. fileArgs.FileData = params.File
  145. fileArgs.FileId = rand.Intn(9000) + 1000
  146. var reply rpcs.ReplyEmptyResult
  147. err := server.RPCCallByName(nil, rpcs.DeviceManagerName, "DeviceManager.SavaFile", fileArgs, &reply)
  148. if err != nil {
  149. server.Log.Errorf("OTA升级文件保存失败:%v", err)
  150. return err
  151. }
  152. var args rpcs.ArgsSendCommand
  153. args.Cmd = string(models.OtaUpgrade)
  154. args.DeviceId = params.DeviceID
  155. args.Params = map[string]interface{}{
  156. "fileId": fileArgs.FileId,
  157. "fileSize": params.FileSize,
  158. }
  159. err = a.sendCommand(args)
  160. if err != nil {
  161. return err
  162. }
  163. server.Log.Debugf("ota升级请求成功")
  164. return nil
  165. }
  166. func (a deviceservice) GetUpgradeProgress(deviceId string) (rpcs.ReplyOtaProgress, error) {
  167. var args rpcs.ArgsOtaProgress
  168. args.DeviceId = deviceId
  169. var reply rpcs.ReplyOtaProgress
  170. err := server.RPCCallByName(nil, rpcs.DeviceManagerName, "DeviceManager.GetProgress", args, &reply)
  171. if err != nil {
  172. server.Log.Errorf("OTA升级进度获取失败:%v", err)
  173. return reply, err
  174. }
  175. server.Log.Debugf("获取升级进度请求成功")
  176. return reply, nil
  177. }
  178. func (a deviceservice) GetDeviceStatus(deviceId string) (*gjson.Json, error) {
  179. var args rpcs.ArgsGetStatus
  180. args.Id = deviceId
  181. var reply rpcs.ReplyStatus
  182. err := server.RPCCallByName(nil, rpcs.DeviceManagerName, "DeviceManager.GetDeviceStatus", args, &reply)
  183. if err != nil {
  184. server.Log.Errorf("设备状态数据获取失败:%v", err)
  185. return nil, err
  186. }
  187. return gjson.New(reply.Status), nil
  188. }
  189. // SetReport 获取设备状态
  190. func (a deviceservice) SetReport(params models.SendCommandParams) (*gjson.Json, error) {
  191. var args rpcs.ArgsSendCommand
  192. args.DeviceId = params.DeviceId
  193. args.Cmd = string(models.Report)
  194. err := a.sendCommand(args)
  195. if err != nil {
  196. return nil, err
  197. }
  198. return a.GetDeviceStatus(params.DeviceId)
  199. }
  200. // Restart 重启设备
  201. func (a deviceservice) Restart(params models.SendCommandParams) error {
  202. var args rpcs.ArgsSendCommand
  203. args.DeviceId = params.DeviceId
  204. args.Cmd = string(models.Restart)
  205. return a.sendCommand(args)
  206. }
  207. // ClearData 清除设备配置数据
  208. func (a deviceservice) ClearData(params models.SendCommandParams) error {
  209. var args rpcs.ArgsSendCommand
  210. args.DeviceId = params.DeviceId
  211. args.Cmd = string(models.ClearData)
  212. return a.sendCommand(args)
  213. }
  214. // SetDataTrans 设备端自动上报配置
  215. func (a deviceservice) SetDataTrans(params models.SendCommandParams) error {
  216. var args rpcs.ArgsSendCommand
  217. args.DeviceId = params.DeviceId
  218. args.Params = map[string]interface{}{
  219. "enable": params.Enable,
  220. "internal": params.Internal,
  221. }
  222. args.Cmd = string(models.SetDataTrans)
  223. return a.sendCommand(args)
  224. }
  225. // GetInfo 获取网关信息
  226. func (a deviceservice) GetInfo(params models.SendCommandParams) (*gjson.Json, error) {
  227. var args rpcs.ArgsSendCommand
  228. args.DeviceId = params.DeviceId
  229. args.Cmd = string(models.GetInfo)
  230. err := a.sendCommand(args)
  231. if err != nil {
  232. return nil, err
  233. }
  234. var newArgs rpcs.ArgsGetStatus
  235. newArgs.Id = params.DeviceId
  236. var reply rpcs.ReplayInfo
  237. err = server.RPCCallByName(nil, rpcs.DeviceManagerName, "DeviceManager.GetDeviceInfo", newArgs, &reply)
  238. if err != nil {
  239. server.Log.Errorf("设备状态数据获取失败:%v", err)
  240. return nil, err
  241. }
  242. return gjson.New(reply.Info), nil
  243. }
  244. // ForceRun 远程控制某个模块强制运行
  245. func (a deviceservice) ForceRun(params models.SendCommandParams) error {
  246. var args rpcs.ArgsSendCommand
  247. args.DeviceId = params.DeviceId
  248. args.Cmd = string(models.ForceRun)
  249. args.Params = map[string]interface{}{
  250. "module": params.Module,
  251. "power": params.ModulePower,
  252. }
  253. return a.sendCommand(args)
  254. }
  255. // SetDeviceId 写入设备id
  256. func (a deviceservice) SetDeviceId(params models.SendCommandParams) error {
  257. var args rpcs.ArgsSendCommand
  258. args.DeviceId = params.DeviceId
  259. args.Cmd = string(models.SetDeviceId)
  260. args.Params = map[string]interface{}{
  261. "id": params.Id,
  262. "prefix": params.Prefix,
  263. }
  264. return a.sendCommand(args)
  265. }
  266. // SetFjsqStatus 智能分集水器控制
  267. func (a deviceservice) SetFjsqStatus(params models.SendCommandParams) error {
  268. var args rpcs.ArgsSendCommand
  269. args.DeviceId = params.DeviceId
  270. args.Cmd = string(models.SetFjsqStatus)
  271. args.Params = map[string]interface{}{
  272. "num": params.Num,
  273. "power": params.NumPower,
  274. }
  275. return a.sendCommand(args)
  276. }
  277. // SetOutdoorPower 设置水系统外机电源状态
  278. func (a deviceservice) SetOutdoorPower(params models.SendCommandParams) error {
  279. var args rpcs.ArgsSendCommand
  280. args.DeviceId = params.DeviceId
  281. args.Cmd = string(models.SetOutdoorPower)
  282. args.Params = map[string]interface{}{
  283. "power": params.OutdoorPower,
  284. }
  285. return a.sendCommand(args)
  286. }
  287. // SetOutdoorTemp 设置水系统外机出水温度
  288. func (a deviceservice) SetOutdoorTemp(params models.SendCommandParams) error {
  289. var args rpcs.ArgsSendCommand
  290. args.DeviceId = params.DeviceId
  291. args.Cmd = string(models.SetOutdoorTemp)
  292. args.Params = map[string]interface{}{
  293. "cool_mode_temp": params.CoolModeTemp,
  294. "heat_mode_temp": params.HeatModeTemp,
  295. }
  296. return a.sendCommand(args)
  297. }
  298. // SetOutdoorLinkage 开启/关闭水系统联动
  299. func (a deviceservice) SetOutdoorLinkage(params models.SendCommandParams) error {
  300. var args rpcs.ArgsSendCommand
  301. args.DeviceId = params.DeviceId
  302. args.Cmd = string(models.SetOutdoorTemp)
  303. args.Params = map[string]interface{}{
  304. "enable": params.Enable,
  305. }
  306. return a.sendCommand(args)
  307. }
  308. // SetMixedWaterLinkage 开启/关闭调温中心联动
  309. func (a deviceservice) SetMixedWaterLinkage(params models.SendCommandParams) error {
  310. var args rpcs.ArgsSendCommand
  311. args.DeviceId = params.DeviceId
  312. args.Cmd = string(models.SetOutdoorTemp)
  313. args.Params = map[string]interface{}{
  314. "enable": params.Enable,
  315. }
  316. return a.sendCommand(args)
  317. }
  318. // SendCommand 下发指令
  319. func (a deviceservice) sendCommand(args rpcs.ArgsSendCommand) error {
  320. var reply rpcs.ReplySendCommand
  321. err := server.RPCCallByName(nil, rpcs.ControllerName, "Controller.SendCommand", args, &reply)
  322. if err != nil {
  323. server.Log.Errorf("指令下发失败:%v", err)
  324. return err
  325. }
  326. return nil
  327. }