device.go 13 KB

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