zhangzengfei
2023-09-04 e8e536d1cb52d2126c8c7ce2ba1c7a76f7208678
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
package controllers
 
import (
    "basic.com/valib/bhomeclient.git"
    "basic.com/valib/logger.git"
    "encoding/json"
    "errors"
    "fmt"
    "io/ioutil"
    "os"
    "os/exec"
    "reflect"
    "strings"
    "vamicro/extend/util"
    "vamicro/system-service/vo"
)
 
type WifiController struct {
 
}
 
 
func (wc *WifiController) GetConfig(h *bhomeclient.WrapperHandler, c *bhomeclient.Request) *bhomeclient.Reply  {
    r := &bhomeclient.Reply{ Success:true }
    wifif := util.GetVamicroPath()+"/wifi.config"
    if util.FileExists(wifif) {
        b, err := ioutil.ReadFile(wifif)
        if err == nil {
            var set vo.WifiConf
            if err = json.Unmarshal(b, &set);err == nil {
                r.Data = set
            }
        }
    }
 
    return r
}
 
func (wc *WifiController) SaveConf (h *bhomeclient.WrapperHandler, c *bhomeclient.Request) *bhomeclient.Reply  {
    var reqBody vo.WifiConf
    err := c.BindJSON(&reqBody)
    if err != nil {
        return &bhomeclient.Reply{Msg: err.Error()}
    }
 
    b, err := json.Marshal(reqBody)
    if err != nil {
        return &bhomeclient.Reply{Msg:err.Error()}
    }
 
    wifif := util.GetVamicroPath()+"/wifi.config"
    err = ioutil.WriteFile(wifif, b, os.ModePerm)
    if err != nil {
        return &bhomeclient.Reply{Msg:err.Error()}
    }
 
    var cmdArr []string
    cmdArr = append(cmdArr, "/opt/hostapd/bin/wifi_config.sh")
    err = reflectObjCmd(&cmdArr, reqBody)
    if err !=nil {
        return &bhomeclient.Reply{Msg:err.Error()}
    }
 
    cmd := strings.Join(cmdArr, " ")
    logger.Debug("WifiConf cmd: ", cmd)
 
    b, e := exec.Command(cmd).Output()
    if e == nil {
        return &bhomeclient.Reply{Success:true, Msg: "配置成功"}
    }
 
    return  &bhomeclient.Reply{ Msg:string(b) }
}
 
//严格按照结构体的属性顺序生成sh参数,结构体的参数定义顺序不能变
func reflectObjCmd(cmdArr *[]string, d interface{}) error {
    v := reflect.ValueOf(d)
    for i:=0;i<v.NumField();i++ {
        field := v.Field(i)
        switch field.Type().Kind().String() {
        case "string":
            *cmdArr = append(*cmdArr, fmt.Sprintf("'%s'",field.String()))
        case "int":
            *cmdArr = append(*cmdArr, fmt.Sprintf("%d",field.Int()))
        case "bool":
            bv := 0
            if field.Bool() {
                bv = 1
            }
            *cmdArr = append(*cmdArr, fmt.Sprintf("%d", bv))
        default:
            logger.Error("unknown field type:", field.Type().Kind().String())
            return errors.New("unknown field")
        }
    }
    return nil
}