zhangzengfei
2023-09-05 63645d248c765244488cd34dbc1bb6528ca6b7c7
system-service/controllers/wifi.go
@@ -1,97 +1,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
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
}