95 lines
2.8 KiB
Go
95 lines
2.8 KiB
Go
package cli
|
||
|
||
import (
|
||
"encoding/json"
|
||
"flag"
|
||
"hands/define"
|
||
"log"
|
||
"net/http"
|
||
"os"
|
||
"strings"
|
||
)
|
||
|
||
// 解析配置
|
||
func ParseConfig() *define.Config {
|
||
cfg := &define.Config{}
|
||
|
||
// 命令行参数
|
||
var canInterfacesFlag string
|
||
flag.StringVar(&cfg.CanServiceURL, "can-url", "http://127.0.0.1:5260", "CAN 服务的 URL")
|
||
flag.StringVar(&cfg.WebPort, "port", "9099", "Web 服务的端口")
|
||
flag.StringVar(&cfg.DefaultInterface, "interface", "", "默认 CAN 接口")
|
||
flag.StringVar(&canInterfacesFlag, "can-interfaces", "", "支持的 CAN 接口列表,用逗号分隔 (例如:can0,can1,vcan0)")
|
||
flag.Parse()
|
||
|
||
// 环境变量覆盖命令行参数
|
||
if envURL := os.Getenv("CAN_SERVICE_URL"); envURL != "" {
|
||
cfg.CanServiceURL = envURL
|
||
}
|
||
if envPort := os.Getenv("WEB_PORT"); envPort != "" {
|
||
cfg.WebPort = envPort
|
||
}
|
||
if envInterface := os.Getenv("DEFAULT_INTERFACE"); envInterface != "" {
|
||
cfg.DefaultInterface = envInterface
|
||
}
|
||
if envInterfaces := os.Getenv("CAN_INTERFACES"); envInterfaces != "" {
|
||
canInterfacesFlag = envInterfaces
|
||
}
|
||
|
||
// 解析可用接口
|
||
if canInterfacesFlag != "" {
|
||
cfg.AvailableInterfaces = strings.Split(canInterfacesFlag, ",")
|
||
// 清理空白字符
|
||
for i, iface := range cfg.AvailableInterfaces {
|
||
cfg.AvailableInterfaces[i] = strings.TrimSpace(iface)
|
||
}
|
||
}
|
||
|
||
// 如果没有指定可用接口,从 CAN 服务获取
|
||
if len(cfg.AvailableInterfaces) == 0 {
|
||
log.Println("🔍 未指定可用接口,将从 CAN 服务获取...")
|
||
cfg.AvailableInterfaces = getAvailableInterfacesFromCanService(cfg.CanServiceURL)
|
||
}
|
||
|
||
// 设置默认接口
|
||
if cfg.DefaultInterface == "" && len(cfg.AvailableInterfaces) > 0 {
|
||
cfg.DefaultInterface = cfg.AvailableInterfaces[0]
|
||
}
|
||
|
||
return cfg
|
||
}
|
||
|
||
// 从 CAN 服务获取可用接口
|
||
func getAvailableInterfacesFromCanService(canServiceURL string) []string {
|
||
resp, err := http.Get(canServiceURL + "/api/interfaces")
|
||
if err != nil {
|
||
log.Printf("⚠️ 无法从 CAN 服务获取接口列表: %v,使用默认配置", err)
|
||
return []string{"can0", "can1"} // 默认接口
|
||
}
|
||
defer resp.Body.Close()
|
||
|
||
var apiResp define.ApiResponse
|
||
if err := json.NewDecoder(resp.Body).Decode(&apiResp); err != nil {
|
||
log.Printf("⚠️ 解析 CAN 服务接口响应失败: %v,使用默认配置", err)
|
||
return []string{"can0", "can1"}
|
||
}
|
||
|
||
if data, ok := apiResp.Data.(map[string]interface{}); ok {
|
||
if configuredPorts, ok := data["configuredPorts"].([]interface{}); ok {
|
||
interfaces := make([]string, 0, len(configuredPorts))
|
||
for _, port := range configuredPorts {
|
||
if portStr, ok := port.(string); ok {
|
||
interfaces = append(interfaces, portStr)
|
||
}
|
||
}
|
||
if len(interfaces) > 0 {
|
||
log.Printf("✅ 从 CAN 服务获取到接口: %v", interfaces)
|
||
return interfaces
|
||
}
|
||
}
|
||
}
|
||
|
||
log.Println("⚠️ 无法从 CAN 服务获取有效接口,使用默认配置")
|
||
return []string{"can0", "can1"}
|
||
}
|