ota.go 2.5 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697
  1. package services
  2. import (
  3. "fmt"
  4. "github.com/gogf/gf/net/ghttp"
  5. "github.com/gogf/gf/util/guid"
  6. "sparrow/pkg/models"
  7. "sparrow/pkg/rpcs"
  8. "sparrow/pkg/server"
  9. "sparrow/services/knowoapi/model"
  10. )
  11. // OtaService Ota manager
  12. type OtaService interface {
  13. Create(*models.Ota) error
  14. Delete(*models.Ota) error
  15. Update(*models.Ota) error
  16. Query(int, int, string, string, string) ([]models.Ota, int, error)
  17. Get(string, string) (models.Ota, error)
  18. Upgrade(params models.OtaUpgradeParams) error
  19. }
  20. type otaService struct {
  21. models *model.All
  22. }
  23. // NewOtaService new Ota manager
  24. func NewOtaService(models *model.All) OtaService {
  25. return otaService{
  26. models: models,
  27. }
  28. }
  29. func (a otaService) Query(pi, ps int, name, vendorId, version string) ([]models.Ota, int, error) {
  30. return a.models.Ota.Query(pi, ps, name, vendorId, version)
  31. }
  32. func (a otaService) Get(vendorId, recordId string) (models.Ota, error) {
  33. return a.models.Ota.Get(vendorId, recordId)
  34. }
  35. func (a otaService) Create(Ota *models.Ota) error {
  36. Ota.RecordId = guid.S()
  37. return a.models.Ota.Create(Ota)
  38. }
  39. func (a otaService) Delete(Ota *models.Ota) error {
  40. return a.models.Ota.Delete(Ota)
  41. }
  42. func (a otaService) Update(Ota *models.Ota) error {
  43. _, err := a.models.Ota.Update(Ota)
  44. return err
  45. }
  46. func (a otaService) Upgrade(params models.OtaUpgradeParams) error {
  47. ota, err := a.Get(params.VendorId, params.FileId)
  48. if err != nil {
  49. return err
  50. }
  51. devices, err := a.models.Device.Query(params.VendorId, params.ProductId, params.DeviceIDs)
  52. if err != nil {
  53. return err
  54. }
  55. client := ghttp.NewClient()
  56. file := client.GetVar(fmt.Sprintf("%s%s", "https://app.yongxulvjian.com", ota.Url))
  57. var fileArgs rpcs.ArgsOtaFile
  58. fileArgs.FileData = file.Bytes()
  59. fileArgs.FileId = int(ota.ID)
  60. var reply rpcs.ReplyEmptyResult
  61. go func() {
  62. for _, device := range devices {
  63. err = server.RPCCallByName(nil, rpcs.DeviceManagerName, "DeviceManager.SavaFile", fileArgs, &reply)
  64. if err != nil {
  65. server.Log.Errorf("OTA升级文件保存失败:%v", err)
  66. }
  67. var commandArgs rpcs.ArgsSendCommand
  68. commandArgs.Cmd = string(models.OtaUpgrade)
  69. commandArgs.DeviceId = device.DeviceIdentifier
  70. commandArgs.Params = map[string]interface{}{
  71. "fileId": ota.ID,
  72. "fileSize": ota.Size,
  73. }
  74. var commandReply rpcs.ReplySendCommand
  75. err = server.RPCCallByName(nil, rpcs.ControllerName, "Controller.SendCommand", commandArgs, &commandReply)
  76. if err != nil {
  77. server.Log.Errorf("OTA升级指令下发失败:%v", err)
  78. }
  79. }
  80. }()
  81. return nil
  82. }