c_platform.go 5.3 KB

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