HeWang 2 сар өмнө
parent
commit
9f696bdde5

+ 2 - 0
aarch64/jili/common/config/c_cloud.go

@@ -17,6 +17,8 @@ type platform struct {
 	UrlDeviceAuth string `yaml:"url-device-auth"`
 	UrlTaskPoll   string `yaml:"url-task-poll"`
 	UrlTask       string `yaml:"url-task"`
+	Ak            string `yaml:"ak"`
+	Sk            string `yaml:"sk"`
 }
 
 type rosbagStruct struct {

+ 2 - 1
aarch64/jili/common/config/c_global_var.go

@@ -1,7 +1,8 @@
 package config
 
 var (
-	LogDir            = "/mnt/media/sda1/cicv-data-closedloop/log/"
+	//LogDir            = "/mnt/media/sda1/cicv-data-closedloop/log/"
+	LogDir            = "D:\\Project\\cicv_data_closed_loop/log/"
 	ControlLogPrefix  = "control"
 	MasterLogPrefix   = "master"
 	SlaveLogPrefix    = "slave"

+ 3 - 2
aarch64/jili/common/config/c_local.go

@@ -7,8 +7,9 @@ import (
 )
 
 var (
-	LocalConfig     localConfig
-	localConfigPath = "/mnt/media/sda1/cicv-data-closedloop/config/local-config.yaml"
+	LocalConfig localConfig
+	//localConfigPath = "/mnt/media/sda1/cicv-data-closedloop/config/local-config.yaml"
+	localConfigPath = "D:\\Project\\cicv_data_closed_loop\\aarch64\\jili\\多功能车-test-local-config.yaml"
 	//localConfigPath = "/userdata/cicv-data-closedloop/config/local-config.yaml"
 	OssEquBasePrefix string
 )

+ 96 - 51
aarch64/jili/common/config/c_platform.go

@@ -3,42 +3,52 @@ package config
 import (
 	"cicv-data-closedloop/common/config/c_log"
 	"cicv-data-closedloop/common/util"
+	"crypto/md5"
+	"encoding/hex"
 	"encoding/json"
+	"fmt"
+	"sort"
 	"strings"
 	"time"
 )
 
 type taskTrigger struct {
-	TriggerId         int    `json:"triggerId"`
-	TriggerName       string `json:"triggerName"`
-	TriggerScriptPath string `json:"triggerScriptPath"`
-	TriggerType       string `json:"triggerType"`
+	TriggerId              int    `json:"triggerId"`              // 触发器id
+	TriggerName            string `json:"triggerName"`            // 触发器名称
+	TriggerScriptPath      string `json:"triggerScriptPath"`      // 脚本在oss上的path
+	ListenTopic            string `json:"listenTopic"`            // 触发器监听的topic
+	CollectionTopic        string `json:"collectionTopic"`        // 触发器采集的topic
+	CollectionPreSeconds   string `json:"collectionPreSeconds"`   // 采集前几秒的数据
+	CollectionAfterSeconds string `json:"collectionAfterSeconds"` // 采集后几秒的数据
+	Priority               string `json:"priority"`               // 优先级, 数值越小越优先
 }
 
 type PlatformConfigStruct struct {
-	TaskConfigId    string        `json:"taskConfigId"`   // 配置ID
-	TaskConfigName  string        `json:"taskConfigName"` // 配置名称
-	DropUploadData  bool          `json:"dropUploadData"` // 更新任务时 true 先上传旧任务 false 删除旧任务
-	TaskMaxTime     int           `json:"taskMaxTime"`
-	TaskBeforeTime  int           `json:"taskBeforeTime"`
-	TaskAfterTime   int           `json:"taskAfterTime"`
-	TaskCachePolicy string        `json:"taskCachePolicy"`
-	EquipmentTopic  string        `json:"equipmentTopic"` // topic序列
-	Lru             []string      `json:"LRU"`
-	TaskTriggers    []taskTrigger `json:"taskTriggers"`
+	TaskConfigId       string        `json:"taskConfigId"`       // 任务ID
+	TaskConfigName     string        `json:"taskConfigName"`     // 任务名称
+	TaskType           string        `json:"taskType"`           // 任务类型
+	StartTime          string        `json:"startTime"`          // 开始时间(taskType为“single”有效)
+	EndTime            string        `json:"endTime"`            // 结束时间(taskType为“single”有效)
+	DailyStartTime     string        `json:"dailyStartTime"`     // 开始时间(taskType为“daily/weekly/monthly”有效)
+	DailyEndTime       string        `json:"dailyEndTime"`       // 结束时间(taskType为“daily/weekly/monthly”有效)
+	CollectionStrategy int           `json:"collectionStrategy"` // 采集策略
+	UploadStrategy     int           `json:"uploadStrategy"`     // 上传策略
+	CompressionType    int           `json:"compressionType"`    // 压缩类型
+	TaskTriggers       []taskTrigger `json:"taskTriggers"`       // 触发器信息
 }
 
 type response struct {
-	Data    PlatformConfigStruct `json:"data"`
-	Success bool                 `json:"success"`
-	Message string               `json:"message"`
-	Code    int                  `json:"code"`
-	NowTime string               `json:"nowTime"`
+	Data    []PlatformConfigStruct `json:"data"`
+	Success bool                   `json:"success"`
+	Message string                 `json:"message"`
+	Code    int                    `json:"code"`
+	NowTime string                 `json:"nowTime"`
 }
 
 var (
-	PlatformConfig PlatformConfigStruct
-	RecordTopics   []string
+	PlatformConfig  PlatformConfigStruct
+	PlatformConfig1 []PlatformConfigStruct
+	RecordTopics    []string
 )
 
 // InitPlatformConfig 初始化数据闭环平台的配置
@@ -51,21 +61,21 @@ func InitPlatformConfig() {
 	// 1 如果车辆没有配置任务,则阻塞在这里,不启动任务
 	for {
 		time.Sleep(time.Duration(2) * time.Second)
-		PlatformConfig, err = getConfig()
+		PlatformConfig1, err = GetConfig()
 		if err != nil {
 			c_log.GlobalLogger.Error("获取配置status失败:", err)
 			continue
 		}
-		if checkPlatformConfig() {
-			RecordTopics = strings.Split(PlatformConfig.EquipmentTopic, ",")
-			// 去掉首尾空格
-			for i, topic := range RecordTopics {
-				RecordTopics[i] = strings.TrimSpace(topic)
-			}
-			break
-		}
-	}
-	c_log.GlobalLogger.Infof("获取数据闭环平台配置 - 成功。【触发前】=【%v 秒】,触发后=【%v 秒】,【最大窗口】=【%v 秒】。", PlatformConfig.TaskBeforeTime, PlatformConfig.TaskAfterTime, PlatformConfig.TaskMaxTime)
+		//if checkPlatformConfig() {
+		//	RecordTopics = strings.Split(PlatformConfig.EquipmentTopic, ",")
+		//	// 去掉首尾空格
+		//	for i, topic := range RecordTopics {
+		//		RecordTopics[i] = strings.TrimSpace(topic)
+		//	}
+		//	break
+		//}
+	}
+	//c_log.GlobalLogger.Infof("获取数据闭环平台配置 - 成功。【触发前】=【%v 秒】,触发后=【%v 秒】,【最大窗口】=【%v 秒】。", PlatformConfig.TaskBeforeTime, PlatformConfig.TaskAfterTime, PlatformConfig.TaskMaxTime)
 }
 
 /*
@@ -155,32 +165,39 @@ func GetStatus(taskConfigId string) (string, error) {
 	return dataMap["status"].(string), nil
 }
 
-func getConfig() (PlatformConfigStruct, error) {
-	token, err := GetAccessToken()
-	if err != nil {
-		return PlatformConfigStruct{}, err
-	}
-	// 下载插件和获取配置
-	// 2 访问配置获取接口
+func GetConfig() ([]PlatformConfigStruct, error) {
+	queryParams := map[string]string{
+		"equipmentNo": LocalConfig.SecretKey,
+	}
+	// 1. 生成签名
+	sign := GenerateSign(CloudConfig.Platform.Ak, CloudConfig.Platform.Sk, queryParams)
+	fmt.Println("sign:", sign)
+	if sign == "" {
+		return []PlatformConfigStruct{}, fmt.Errorf("生成签名失败。")
+	}
+	headers := map[string]string{
+		"ak":        CloudConfig.Platform.Ak,
+		"timestamp": fmt.Sprintf("%d", time.Now().Unix()),
+		"sign":      sign,
+	}
+	// 2 访问任务配置获取接口
 	resp, err := util.HttpGetStringAddHeadersResponseString(
 		CloudConfig.Platform.UrlTask,
-		map[string]string{
-			"authorization": token,
-		},
-		map[string]string{
-			"equipmentNo": LocalConfig.EquipmentNo,
-		},
+		headers,
+		queryParams,
 	)
 	if err != nil {
 		c_log.GlobalLogger.Error("访问接口", CloudConfig.Platform.UrlTask, "失败:", err)
-		return PlatformConfigStruct{}, err
+		return []PlatformConfigStruct{}, err
 	}
 	var result response
 	err = json.Unmarshal([]byte(resp), &result)
+	fmt.Println("result", result)
 	if err != nil {
 		c_log.GlobalLogger.Error("解析【返回结果】", resp, "失败:", err)
-		return PlatformConfigStruct{}, err
+		return []PlatformConfigStruct{}, err
 	}
+
 	return result.Data, nil
 }
 
@@ -189,9 +206,37 @@ func checkPlatformConfig() bool {
 		c_log.GlobalLogger.Error("数据闭环平台没有配置任务。")
 		return false
 	}
-	if PlatformConfig.EquipmentTopic == "" {
-		c_log.GlobalLogger.Error("数据闭环平台没有配置topic序列。")
-		return false
-	}
+	//if PlatformConfig.EquipmentTopic == "" {
+	//	c_log.GlobalLogger.Error("数据闭环平台没有配置topic序列。")
+	//	return false
+	//}
 	return true
 }
+
+// GenerateSign 生成签名
+func GenerateSign(ak, sk string, params map[string]string) string {
+	// 1. 添加时间戳
+	params["timestamp"] = fmt.Sprintf("%d", time.Now().Unix())
+
+	// 2. 参数排序
+	keys := make([]string, 0, len(params))
+	for k := range params {
+		keys = append(keys, k)
+	}
+	sort.Strings(keys)
+
+	// 3. 拼接参数
+	var buffer strings.Builder
+	for _, k := range keys {
+		buffer.WriteString(k)
+		buffer.WriteByte('=')
+		buffer.WriteString(params[k])
+		buffer.WriteByte('&')
+	}
+	paramStr := buffer.String()[:len(buffer.String())-1]
+
+	// 4. 计算MD5
+	signStr := paramStr + sk
+	hash := md5.Sum([]byte(signStr))
+	return hex.EncodeToString(hash[:])
+}

+ 8 - 9
aarch64/jili/control/main.go

@@ -15,7 +15,6 @@ func init() {
 	runtime.GOMAXPROCS(1)
 	// 初始化日志配置
 	c_log.InitLog(commonConfig.LogDir, commonConfig.ControlLogPrefix)
-	//c_log.InitLog("/userdata/cicv-data-closedloop/log/", "pjisuv-control")
 	// 初始化本地配置文件(第1处配置,在本地文件)
 	commonConfig.InitLocalConfig()
 	// 初始化Oss连接信息
@@ -72,14 +71,14 @@ func RunWithInternet() {
 				continue
 			}
 			var killArgs commonService.KillSignal
-			if lastStatus == "UN_CHANGE" && status == "CHANGE" {
-				killArgs = commonService.KillSignal{DropUploadData: commonConfig.PlatformConfig.DropUploadData, Restart: true}
-				c_log.GlobalLogger.Info("更新任务,发送rpc重启信号到本地:", killArgs)
-			}
-			if lastStatus == "UN_CHANGE" && status == "NONE" {
-				killArgs = commonService.KillSignal{DropUploadData: commonConfig.PlatformConfig.DropUploadData, Restart: false}
-				c_log.GlobalLogger.Info("杀死任务,发送rpc结束信号到本地:", killArgs)
-			}
+			//if lastStatus == "UN_CHANGE" && status == "CHANGE" {
+			//	killArgs = commonService.KillSignal{DropUploadData: commonConfig.PlatformConfig.DropUploadData, Restart: true}
+			//	c_log.GlobalLogger.Info("更新任务,发送rpc重启信号到本地:", killArgs)
+			//}
+			//if lastStatus == "UN_CHANGE" && status == "NONE" {
+			//	killArgs = commonService.KillSignal{DropUploadData: commonConfig.PlatformConfig.DropUploadData, Restart: false}
+			//	c_log.GlobalLogger.Info("杀死任务,发送rpc结束信号到本地:", killArgs)
+			//}
 
 			KillRpcClient, err := rpc.Dial("tcp", commonConfig.LocalConfig.Node.Ip+":"+commonConfig.CloudConfig.RpcPort)
 			if err != nil {

+ 0 - 207
aarch64/jili/master/service/for_competition.go

@@ -1,207 +0,0 @@
-package service
-
-//
-//import (
-//	"cicv-data-closedloop/aarch64/pjisuv/common/config"
-//	commonConfig "cicv-data-closedloop/aarch64/pjisuv/common/config"
-//	"cicv-data-closedloop/common/config/c_log"
-//	"cicv-data-closedloop/common/util"
-//	"cicv-data-closedloop/pjisuv_msgs"
-//	"github.com/bluenviron/goroslib/v2"
-//	"github.com/bluenviron/goroslib/v2/pkg/msgs/std_msgs"
-//	"os"
-//	"strings"
-//	"sync"
-//	"time"
-//)
-//
-//var (
-//	dir       = "/userdata/competition/"
-//	dirBak    = "/userdata/competition-bak/"
-//	ossPrefix = "competition/"
-//	// v20240604 添加 /pj_vehicle_fdb_pub 判断人工接管场景
-//	commandArgs            = []string{"record", "--split", "--duration=1", "/pji_gps", "/data_read", "/pj_vehicle_fdb_pub"}
-//	topic                  = "/team_name"
-//	urlExamTick            = "http://36.110.106.142:12341/web_server/exam/tick"
-//	urlExamBegin           = "http://36.110.106.142:12341/web_server/exam/begin"
-//	urlExamEnd             = "http://36.110.106.142:12341/web_server/exam/end"
-//	cacheMutex             sync.Mutex
-//	cacheTeamName          = make(map[string]time.Time)
-//	heartBeatTimeThreshold = 5 * time.Second // 心跳时间
-//	bakSecondNumber        = 3600
-//	cachePositionX         = -999.00
-//	cachePositionY         = -999.00
-//	cacheAutoMode          = -1                // 自动驾驶状态 0 人工 1 自动
-//	InitialPositionX       = 565266.0482367771 // todo 需要比赛确认起点
-//	InitialPositionY       = 4329773.48728322  // todo 需要比赛确认起点
-//)
-//
-//// todo 实车比赛临时使用
-//// history record命令无法录制()
-//func ForCompetition() {
-//	go dataCollection()
-//	go dataCollectionBak(bakSecondNumber) // 需要再车上备份的数据,防止网络差传不回来
-//	go location()                         // 记录经纬度和速度
-//	go mode()                             // 记录自动驾驶状态
-//	go tick()
-//}
-//
-//// 全量数据采集
-//func dataCollection() {
-//	c_log.GlobalLogger.Info("开始采集实车算法比赛全量数据。")
-//	util.CreateDir(dir)
-//	// 1 打包
-//	c_log.GlobalLogger.Info("采集实车算法比赛全量数据的环境变量为:", commonConfig.RosbagEnvs)
-//	command, err := util.ExecuteWithEnvAndDirAsync(commonConfig.RosbagEnvs, dir, commonConfig.RosbagPath, commandArgs...)
-//	if err != nil {
-//		c_log.GlobalLogger.Error("程序崩溃。执行record命令", command, "出错:", err)
-//		os.Exit(-1)
-//	}
-//	// 2 扫描目录文件
-//	for {
-//		time.Sleep(time.Duration(2) * time.Second)
-//		files, _ := util.ListAbsolutePathAndSort(dir)
-//		if len(files) >= 2 {
-//			//c_log.GlobalLogger.Info("扫描实车比赛数据采集目录,", files)
-//			for i := range files {
-//				if i == len(files)-1 { // 最后一个包在录制中,不上传
-//					break
-//				}
-//				c_log.GlobalLogger.Debug("上传实车算法比赛全量数据包", files[i])
-//				bagSlice := strings.Split(files[i], "/")
-//				commonConfig.OssMutex.Lock()
-//				_ = commonConfig.OssBucket.PutObjectFromFile(ossPrefix+config.LocalConfig.EquipmentNo+"/"+bagSlice[len(bagSlice)-1], files[i])
-//				commonConfig.OssMutex.Unlock()
-//				_ = util.DeleteFile(files[i])
-//			}
-//		}
-//	}
-//}
-//
-//// 全量数据采集
-//func dataCollectionBak(bakSecondNumber int) {
-//	c_log.GlobalLogger.Info("开始备份实车算法比赛全量数据。")
-//	util.CreateDir(dirBak)
-//	// 1 打包
-//	command, err := util.ExecuteWithEnvAndDirAsync(commonConfig.RosbagEnvs, dirBak, commonConfig.RosbagPath, commandArgs...)
-//	if err != nil {
-//		c_log.GlobalLogger.Error("程序崩溃。备份目录执行record命令", command, "出错:", err)
-//		os.Exit(-1)
-//	}
-//	// 2 扫描目录文件
-//	for {
-//		time.Sleep(time.Duration(2) * time.Second)
-//		files, _ := util.ListAbsolutePathAndSort(dirBak)
-//		if len(files) >= bakSecondNumber {
-//			// 超出阈值就删除心跳+1个文件
-//			_ = util.DeleteFile(files[0])
-//			_ = util.DeleteFile(files[1])
-//			_ = util.DeleteFile(files[2])
-//		}
-//	}
-//}
-//
-//// data格式为队伍编号
-//// 保存单次考试时间区间
-//func location() {
-//	_, _ = goroslib.NewSubscriber(goroslib.SubscriberConf{
-//		Node:  commonConfig.RosNode,
-//		Topic: "/cicv_location",
-//		Callback: func(data *pjisuv_msgs.PerceptionLocalization) {
-//			cachePositionX = data.PositionX
-//			cachePositionY = data.PositionY
-//		},
-//	})
-//}
-//
-//func mode() {
-//	_, _ = goroslib.NewSubscriber(goroslib.SubscriberConf{
-//		Node:  commonConfig.RosNode,
-//		Topic: "/pj_vehicle_fdb_pub",
-//		Callback: func(data *pjisuv_msgs.VehicleFdb) {
-//			cacheAutoMode = int(data.Automode)
-//		},
-//	})
-//}
-//
-//// data格式为队伍编号
-//// 保存单次考试时间区间
-//func tick() {
-//	_, _ = goroslib.NewSubscriber(goroslib.SubscriberConf{
-//		Node:  commonConfig.RosNode,
-//		Topic: topic,
-//		Callback: func(data *std_msgs.String) {
-//			if cacheAutoMode == 1 { // 只有在自动驾驶状态才发送心跳
-//				//if math.Abs(positionX-InitialPositionX) > 5.00 || math.Abs(positionY-InitialPositionY) > 5.00 { // todo 测试临时使用起点判断
-//				teamName := data.Data
-//				response, err := util.HttpPostJsonWithHeaders(
-//					urlExamTick,
-//					map[string]string{"Authorization": "U9yKpD6kZZDDe4LFKK6myAxBUT1XRrDM"},
-//					map[string]string{
-//						"teamName":    teamName,
-//						"positionX":   util.ToString(cachePositionX),
-//						"positionY":   util.ToString(cachePositionY),
-//						"equipmentNo": config.LocalConfig.EquipmentNo, // 设备编号
-//					},
-//				)
-//				if err != nil {
-//					c_log.GlobalLogger.Infof("队伍 %v 的心跳发送到云端报错,错误信息为:%v。", teamName, err)
-//				}
-//				c_log.GlobalLogger.Infof("队伍 %v 的心跳发送到云端,响应结果为:%v。", teamName, response)
-//			}
-//		},
-//	})
-//}
-//
-////// data格式为队伍编号
-////// 保存单次考试时间区间
-////func examBeginBak() {
-////	_, _ = goroslib.NewSubscriber(goroslib.SubscriberConf{
-////		Node:  commonConfig.RosNode,
-////		Topic: topic,
-////		Callback: func(data *std_msgs.String) {
-////			teamName := data.Data
-////			cacheMutex.Lock()
-////			{
-////				if !util.ContainsKey(cacheTeamName, teamName) { // 1 如果缓存数组中没有此队名,代表考试开始,缓存此队名,和当前时间戳
-////					examBeginTime := time.Now()
-////					cacheTeamName[teamName] = examBeginTime
-////					_, _ = util.HttpPostJsonWithHeaders(
-////						urlExamBegin,
-////						map[string]string{"Authorization": "U9yKpD6kZZDDe4LFKK6myAxBUT1XRrDM"},
-////						map[string]string{"teamName": teamName},
-////					)
-////					c_log.GlobalLogger.Infof("队伍 %v 的考试开始。", teamName)
-////				} else { // 2 如果缓存数组中有此队名,代表考试进行中,刷新时间戳
-////					cacheTeamName[teamName] = time.Now()
-////				}
-////			}
-////			cacheMutex.Unlock()
-////		},
-////	})
-////}
-////
-////func examEndBak() {
-////	for {
-////		time.Sleep(time.Duration(1) * time.Second)
-////		cacheMutex.Lock()
-////		{
-////			var keysToDelete []string
-////			for teamName, heartBeatTime := range cacheTeamName {
-////				if time.Since(heartBeatTime) > heartBeatTimeThreshold { // 检查缓存中的队名,如果超过心跳时间,则代表考试结束,删除缓存中的队名
-////					keysToDelete = append(keysToDelete, teamName)
-////				}
-////			}
-////			for _, teamName := range keysToDelete { // 检查缓存中的队名,如果超过心跳时间,则代表考试结束,删除缓存中的队名
-////				delete(cacheTeamName, teamName)
-////				_, _ = util.HttpPostJsonWithHeaders(
-////					urlExamEnd,
-////					map[string]string{"Authorization": "U9yKpD6kZZDDe4LFKK6myAxBUT1XRrDM"},
-////					map[string]string{"teamName": teamName},
-////				)
-////				c_log.GlobalLogger.Infof("队伍 %v 的考试结束。", teamName)
-////			}
-////		}
-////		cacheMutex.Unlock()
-////	}
-////}

+ 4 - 1
aarch64/jili/多功能车-cloud-config.yaml

@@ -8,7 +8,10 @@ monitor:
 platform:
   url-device-auth: http://1.202.169.139:8081/device/auth
   url-task-poll: http://1.202.169.139:8081/device/task/poll
-  url-task: http://1.202.169.139:8081/device/task
+#  url-task: http://1.202.169.139:8081/device/task
+  url-task:  http://82.156.39.136:8085/bservice/device/task
+  ak: guoqi
+  sk: 64fd3e1ffe3476e9e81f06cadd9da6dea1b428716da71545ad037a2fb3aefcb1
 full-collect: true
 bag-number: 120 # 无人驾驶比赛期间,这里不需要缓存
 config-refresh-interval: 60

+ 1 - 1
aarch64/jili/多功能车-soc2-local-config.yaml

@@ -5,7 +5,7 @@ node:
   name: node2
   ip: 192.168.1.103
 # 数据闭环平台参数
-equipment-no: pjisuv-012
+equipment-no: pjisuv-001
 secret-key: wdf47xgggqxmnko2
 # 获取oss连接信息的接口url
 url-get-oss-config: http://36.110.106.156:18379/oss/config?token=nXonLUcMtGcrQqqKiyygIwyVbvizE0wD

+ 23 - 0
aarch64/jili/多功能车-test-local-config.yaml

@@ -0,0 +1,23 @@
+# 是否联通互联网
+internet: false
+# 节点名称和IP
+node:
+  name: node1
+  ip: 192.168.1.102
+# 数据闭环平台参数
+equipment-no: 1
+secret-key: stringstringstrin
+# 获取oss连接信息的接口url
+url-get-oss-config: http://36.110.106.156:18379/oss/config?token=nXonLUcMtGcrQqqKiyygIwyVbvizE0wD
+# 金龙车数据前缀
+oss-base-prefix: pjisuv/
+# oss上的配置文件的名称
+cloud-config-filename: cloud-config.yaml
+# 将oss上的配置文件下载到本地的路径
+#cloud-config-local-path: /mnt/media/sda1/cicv-data-closedloop/config/cloud-config.yaml
+cloud-config-local-path: D:\Project\cicv_data_closed_loop\aarch64\jili\多功能车-cloud-config.yaml
+restart-cmd:
+  dir: "/mnt/media/sda1/cicv-data-closedloop/"
+  name: "sh"
+  args:
+    - "start-soc1.sh"

+ 2 - 33
common/util/u_http.go

@@ -2,46 +2,13 @@ package util
 
 import (
 	"bytes"
-	"crypto/md5"
-	"encoding/hex"
 	"encoding/json"
 	"fmt"
 	"io"
 	"net/http"
 	"net/url"
-	"sort"
-	"strings"
-	"time"
 )
 
-// GenerateSign 生成签名
-func GenerateSign(ak, sk string, params map[string]string) string {
-	// 1. 添加时间戳
-	params["timestamp"] = fmt.Sprintf("%d", time.Now().Unix())
-
-	// 2. 参数排序
-	keys := make([]string, 0, len(params))
-	for k := range params {
-		keys = append(keys, k)
-	}
-	sort.Strings(keys)
-
-	// 3. 拼接参数
-	var buffer strings.Builder
-	for _, k := range keys {
-		buffer.WriteString(k)
-		buffer.WriteByte('=')
-		buffer.WriteString(params[k])
-		buffer.WriteByte('&')
-	}
-	paramStr := buffer.String()[:len(buffer.String())-1]
-
-	// 4. 计算MD5
-	signStr := paramStr + sk
-	hash := md5.Sum([]byte(signStr))
-	return hex.EncodeToString(hash[:])
-}
-
 func HttpGet(url string) (string, error) {
 	// 创建一个HTTP客户端
 	client := &http.Client{}
@@ -137,6 +104,8 @@ func HttpGetStringAddHeadersResponseString(baseUrl string, headers map[string]st
 	}
 	u.RawQuery = q.Encode()
 
+	fmt.Println("url", u.String())
+
 	// 创建请求
 	req, err := http.NewRequest("GET", u.String(), nil)
 	if err != nil {

+ 25 - 0
test/platform_api_test.go

@@ -0,0 +1,25 @@
+package test
+
+import (
+	commonConfig "cicv-data-closedloop/aarch64/jili/common/config"
+	"cicv-data-closedloop/common/config/c_log"
+	"fmt"
+	"testing"
+)
+
+func init() {
+	// 初始化日志配置
+	c_log.InitLog(commonConfig.LogDir, commonConfig.ControlLogPrefix)
+	// 初始化本地配置文件(第1处配置,在本地文件)
+	commonConfig.InitLocalConfig()
+	commonConfig.InitCloudConfig()
+}
+
+func TestGetConfig(t *testing.T) {
+	fmt.Println(commonConfig.LocalConfig.EquipmentNo)
+	PlatformConfig, err := commonConfig.GetConfig()
+	fmt.Println("PlatformConfig", PlatformConfig)
+	if err != nil {
+		c_log.GlobalLogger.Error("获取配置status失败:", err)
+	}
+}