c_platform.go 4.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169
  1. package config
  2. import (
  3. "cicv-data-closedloop/common/config/c_log"
  4. "cicv-data-closedloop/common/util"
  5. "encoding/json"
  6. "time"
  7. )
  8. type taskTrigger struct {
  9. TriggerId int `json:"triggerId"`
  10. TriggerName string `json:"triggerName"`
  11. TriggerScriptPath string `json:"triggerScriptPath"`
  12. TriggerType string `json:"triggerType"`
  13. }
  14. type platformConfig struct {
  15. TaskConfigId string `json:"taskConfigId"` // 配置ID
  16. TaskConfigName string `json:"taskConfigName"` // 配置名称
  17. DropUploadData bool `json:"dropUploadData"` // 更新任务时 true 先上传旧任务 false 删除旧任务
  18. TaskMaxTime int `json:"taskMaxTime"`
  19. TaskBeforeTime int `json:"taskBeforeTime"`
  20. TaskAfterTime int `json:"taskAfterTime"`
  21. TaskCachePolicy string `json:"taskCachePolicy"`
  22. Lru []string `json:"LRU"`
  23. TaskTriggers []taskTrigger `json:"taskTriggers"`
  24. }
  25. type response struct {
  26. Data platformConfig `json:"data"`
  27. Success bool `json:"success"`
  28. Message string `json:"message"`
  29. Code int `json:"code"`
  30. NowTime string `json:"nowTime"`
  31. }
  32. var PlatformConfig platformConfig
  33. // InitPlatformConfig 初始化数据闭环平台的配置
  34. func InitPlatformConfig() {
  35. var err error
  36. c_log.GlobalLogger.Info("获取数据闭环平台配置 - 开始")
  37. // 1 如果车辆没有配置任务,则阻塞在这里,不启动任务
  38. for {
  39. time.Sleep(time.Duration(1))
  40. c_log.GlobalLogger.Info("获取数据闭环平台配置 - 进行中")
  41. PlatformConfig, err = getConfig()
  42. if err != nil {
  43. c_log.GlobalLogger.Error("获取配置status失败:", err)
  44. continue
  45. }
  46. break
  47. }
  48. c_log.GlobalLogger.Info("获取数据闭环平台配置 - 成功。")
  49. }
  50. /*
  51. {
  52. "data": {
  53. "accessToken": "YWRmYWRzZmFzZGZhZHNmYWRmYWRm=",
  54. "expireTime": "28800",
  55. "equipmentNo": "robot-001"
  56. },
  57. "success": true,
  58. "message": "ok",
  59. "code": 1,
  60. "nowTime": "2023-12-09 22:41:00"
  61. }
  62. */
  63. // GetAccessToken 认证接口,获取access_token
  64. func GetAccessToken() (string, error) {
  65. respJson, err := util.HttpPostJsonResponseString(
  66. CloudConfig.Platform.UrlDeviceAuth,
  67. map[string]string{
  68. "equipmentNo": LocalConfig.EquipmentNo,
  69. "secretKey": LocalConfig.SecretKey,
  70. },
  71. )
  72. if err != nil {
  73. return "", nil
  74. }
  75. respMap, err := util.JsonStringToMap(respJson)
  76. if err != nil {
  77. c_log.GlobalLogger.Error("解析返回结果", respJson, "失败:", err)
  78. return "", nil
  79. }
  80. dataMap, ok := respMap["data"].(map[string]interface{})
  81. if !ok {
  82. c_log.GlobalLogger.Error("解析返回结果.data", dataMap, "失败:", err)
  83. return "", nil
  84. }
  85. return dataMap["accessToken"].(string), nil
  86. }
  87. /*
  88. {
  89. "data": {
  90. "status": "UNCHANGE"
  91. "taskConfigld": "xxx"
  92. },
  93. "success": true,
  94. "message": "ok",
  95. "code": 1,
  96. "nowTime": "2023-12-09 21:08:49"
  97. }
  98. */
  99. //GetStatus 根据taskConfigId获取任务status,如果传入空代表车端没有配置,直接获取新的配置
  100. func GetStatus(taskConfigId string) (string, error) {
  101. token, err := GetAccessToken()
  102. if err != nil {
  103. return "", err
  104. }
  105. resp, err := util.HttpGetStringAddHeadersResponseString(
  106. CloudConfig.Platform.UrlTaskPoll,
  107. map[string]string{
  108. "authorization": token,
  109. },
  110. map[string]string{
  111. "equipmentNo": LocalConfig.EquipmentNo,
  112. "taskConfigId": taskConfigId,
  113. },
  114. )
  115. if err != nil {
  116. c_log.GlobalLogger.Error("访问接口", CloudConfig.Platform.UrlTask, "失败:", err)
  117. return "", err
  118. }
  119. respMap, err := util.JsonStringToMap(resp)
  120. if err != nil {
  121. c_log.GlobalLogger.Error("解析【返回结果1】", resp, "失败:", err)
  122. return "", err
  123. }
  124. dataMap, ok := respMap["data"].(map[string]interface{})
  125. if !ok {
  126. c_log.GlobalLogger.Errorf("解析【返回结果.data】的类型不是(map[string]interface{}),【dataMap】=%v", dataMap)
  127. return "", err
  128. }
  129. return dataMap["status"].(string), nil
  130. }
  131. func getConfig() (platformConfig, error) {
  132. token, err := GetAccessToken()
  133. if err != nil {
  134. return platformConfig{}, err
  135. }
  136. // 下载插件和获取配置
  137. // 2 访问配置获取接口
  138. resp, err := util.HttpGetStringAddHeadersResponseString(
  139. CloudConfig.Platform.UrlTask,
  140. map[string]string{
  141. "authorization": token,
  142. },
  143. map[string]string{
  144. "equipmentNo": LocalConfig.EquipmentNo,
  145. },
  146. )
  147. if err != nil {
  148. c_log.GlobalLogger.Error("访问接口", CloudConfig.Platform.UrlTask, "失败:", err)
  149. return platformConfig{}, err
  150. }
  151. var result response
  152. err = json.Unmarshal([]byte(resp), &result)
  153. if err != nil {
  154. c_log.GlobalLogger.Error("解析【返回结果】", resp, "失败:", err)
  155. return platformConfig{}, err
  156. }
  157. return result.Data, nil
  158. }