platform_cfg.go 4.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179
  1. package cfg
  2. import (
  3. "cicv-data-closedloop/pji/common/cutil"
  4. "cicv-data-closedloop/pji/common/log"
  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. log.GlobalLogger.Info("获取数据闭环平台配置 - 开始")
  36. // 1 如果车辆没有配置任务,则阻塞在这里,不启动任务
  37. for {
  38. time.Sleep(time.Duration(1))
  39. log.GlobalLogger.Info("获取数据闭环平台配置 - 进行中")
  40. status, err := GetStatus("")
  41. if err != nil {
  42. log.GlobalLogger.Error("获取配置status失败:", err)
  43. continue
  44. }
  45. // 判断是否有配置,第一次访问状态应该为:CHANGE(一共三种状态 CHANGE|UNCHANGE|NONE)
  46. if status == "CHANGE" {
  47. PlatformConfig, err = getConfig()
  48. if err != nil {
  49. log.GlobalLogger.Error("获取配置status失败:", err)
  50. continue
  51. } else {
  52. break
  53. }
  54. } else {
  55. log.GlobalLogger.Error("车辆没有配置采集任务,等待平台配置。status=", status)
  56. }
  57. }
  58. log.GlobalLogger.Info("获取数据闭环平台配置 - 结束:", PlatformConfig)
  59. }
  60. /*
  61. {
  62. "data": {
  63. "accessToken": "YWRmYWRzZmFzZGZhZHNmYWRmYWRm=",
  64. "expireTime": "28800",
  65. "equipmentNo": "robot-001"
  66. },
  67. "success": true,
  68. "message": "ok",
  69. "code": 1,
  70. "nowTime": "2023-12-09 22:41:00"
  71. }
  72. */
  73. // GetAccessToken 认证接口,获取access_token
  74. func GetAccessToken() (string, error) {
  75. respJson, err := cutil.HttpPostJsonResponseString(
  76. CloudConfig.Platform.UrlDeviceAuth,
  77. map[string]string{
  78. "equipmentNo": LocalConfig.EquipmentNo,
  79. "secretKey": LocalConfig.SecretKey,
  80. },
  81. )
  82. if err != nil {
  83. return "", nil
  84. }
  85. respMap, err := cutil.JsonStringToMap(respJson)
  86. if err != nil {
  87. log.GlobalLogger.Error("解析返回结果", respJson, "失败:", err)
  88. return "", nil
  89. }
  90. dataMap := respMap["data"].(map[string]interface{})
  91. if err != nil {
  92. log.GlobalLogger.Error("解析返回结果.data", dataMap, "失败:", err)
  93. return "", nil
  94. }
  95. return dataMap["accessToken"].(string), nil
  96. }
  97. /*
  98. {
  99. "data": {
  100. "status": "UNCHANGE"
  101. "taskConfigld": "xxx"
  102. },
  103. "success": true,
  104. "message": "ok",
  105. "code": 1,
  106. "nowTime": "2023-12-09 21:08:49"
  107. }
  108. */
  109. //GetStatus 根据taskConfigId获取任务status,如果传入空代表车端没有配置,直接获取新的配置
  110. func GetStatus(taskConfigId string) (string, error) {
  111. token, err := GetAccessToken()
  112. if err != nil {
  113. return "", err
  114. }
  115. resp, err := cutil.HttpGetStringAddHeadersResponseString(
  116. CloudConfig.Platform.UrlTaskPoll,
  117. map[string]string{
  118. "authorization": token,
  119. },
  120. map[string]string{
  121. "equipmentNo": LocalConfig.EquipmentNo,
  122. "taskConfigId": taskConfigId,
  123. },
  124. )
  125. if err != nil {
  126. log.GlobalLogger.Error("访问接口", CloudConfig.Platform.UrlTask, "失败:", err)
  127. return "", err
  128. }
  129. respMap, err := cutil.JsonStringToMap(resp)
  130. if err != nil {
  131. log.GlobalLogger.Error("解析【返回结果1】", resp, "失败:", err)
  132. return "", err
  133. }
  134. dataMap := respMap["data"].(map[string]interface{})
  135. if err != nil {
  136. log.GlobalLogger.Error("解析【返回结果.data】", dataMap, "失败:", err)
  137. return "", err
  138. }
  139. return dataMap["status"].(string), nil
  140. }
  141. func getConfig() (platformConfig, error) {
  142. token, err := GetAccessToken()
  143. if err != nil {
  144. return platformConfig{}, err
  145. }
  146. // 下载插件和获取配置
  147. // 2 访问配置获取接口
  148. resp, err := cutil.HttpGetStringAddHeadersResponseString(
  149. CloudConfig.Platform.UrlTask,
  150. map[string]string{
  151. "authorization": token,
  152. },
  153. map[string]string{
  154. "equipmentNo": LocalConfig.EquipmentNo,
  155. },
  156. )
  157. if err != nil {
  158. log.GlobalLogger.Error("访问接口", CloudConfig.Platform.UrlTask, "失败:", err)
  159. return platformConfig{}, err
  160. }
  161. var result response
  162. err = json.Unmarshal([]byte(resp), &result)
  163. if err != nil {
  164. log.GlobalLogger.Error("解析【返回结果】", resp, "失败:", err)
  165. return platformConfig{}, err
  166. }
  167. return result.Data, nil
  168. }