From 9314ec141b15996dc0e6a71785efbf491eec8493 Mon Sep 17 00:00:00 2001
From: zhangzengfei <zhangzengfei@smartai.com>
Date: 星期二, 12 九月 2023 15:07:54 +0800
Subject: [PATCH] 修改wifi配置
---
system-service/sys/system.go | 156 +++++++++++++-------------
system-service/controllers/syssetconf.go | 29 ++++
system-service/iwlist/iwlist.go | 169 ++++++++++++++++++++++++++++
system-service/main.go | 1
4 files changed, 275 insertions(+), 80 deletions(-)
diff --git a/system-service/controllers/syssetconf.go b/system-service/controllers/syssetconf.go
index c5b2efa..a884e95 100644
--- a/system-service/controllers/syssetconf.go
+++ b/system-service/controllers/syssetconf.go
@@ -1020,10 +1020,12 @@
// @Router /data/api-v/sysset/getWifiList [POST]
func (sset SysSetController) GetWifiList(h *bhomeclient.WrapperHandler, c *bhomeclient.Request) *bhomeclient.Reply {
fname := c.PostForm("ifname")
- wifiList, err := sys.GetWifi(fname)
+ wifiList, err := sys.ScanWifiList(fname)
if nil == err {
return &bhomeclient.Reply{Success: true, Data: wifiList}
} else {
+ logger.Debug("iwlist err,", fname, err.Error())
+
return &bhomeclient.Reply{Success: false, Msg: err.Error()}
}
}
@@ -1040,7 +1042,30 @@
passwd := c.PostForm("passwd")
ssid := c.PostForm("ssid")
- err := sys.ConnectWifi(fname, passwd, ssid)
+ err := sys.ConnectWifi(fname, ssid, passwd)
+ if nil == err {
+ return &bhomeclient.Reply{Success: true, Data: "杩炴帴鎴愬姛!"}
+ } else {
+ msg := err.Error()
+ if strings.Contains(msg, "exit status") {
+ msg = "鍔犲叆澶辫触,璇锋鏌ラ厤缃�!"
+ }
+ return &bhomeclient.Reply{Success: false, Msg: msg}
+ }
+}
+
+// @Summary 杩炴帴wifi
+// @Description 杩炴帴wifi
+// @Produce json
+// @Tags 杩炴帴wifi
+// @Success 200 {string} json "{"code":200, msg:"",data:[],success:true}"
+// @Failure 500 {string} json "{"code":500, msg:"",data:"[]",success:false}"
+// @Router /data/api-v/sysset/connectWifi [POST]
+func (sset SysSetController) DisonnectWifi(h *bhomeclient.WrapperHandler, c *bhomeclient.Request) *bhomeclient.Reply {
+ fname := c.PostForm("ifname")
+
+ // 鍏抽棴wifi杩炴帴鏃秙sid 浼燿el
+ err := sys.ConnectWifi(fname, "del", "")
if nil == err {
return &bhomeclient.Reply{Success: true, Data: "杩炴帴鎴愬姛!"}
} else {
diff --git a/system-service/iwlist/iwlist.go b/system-service/iwlist/iwlist.go
new file mode 100644
index 0000000..a175a21
--- /dev/null
+++ b/system-service/iwlist/iwlist.go
@@ -0,0 +1,169 @@
+package iwlist
+
+import (
+ "os/exec"
+ "regexp"
+ "strconv"
+ "strings"
+ "sync"
+)
+
+var (
+ newCellRegexp = regexp.MustCompile(`^Cell\s+(?P<cell_number>.+)\s+-\s+Address:\s(?P<mac>.+)$`)
+ regxp [7]*regexp.Regexp
+)
+
+type Cell struct {
+ CellNumber string `json:"cell_number"`
+ MAC string `json:"mac"`
+ ESSID string `json:"essid"`
+ Mode string `json:"mode"`
+ Frequency float32 `json:"frequency"`
+ FrequencyUnits string `json:"frequency_units"`
+ Channel int `json:"channel"`
+ EncryptionKey bool `json:"encryption_key"`
+ Encryption string `json:"encryption"`
+ SignalQuality int `json:"signal_quality"`
+ SignalTotal int `json:"signal_total"`
+ SignalLevel int `json:"signal_level"`
+ Connected bool `json:"connected"`
+}
+
+func init() {
+ // precompile regexp
+ regxp = [7]*regexp.Regexp{
+ regexp.MustCompile(`^ESSID:\"(?P<essid>.*)\"$`),
+ regexp.MustCompile(`^Mode:(?P<mode>.+)$`),
+ regexp.MustCompile(`^Frequency:(?P<frequency>[\d.]+) (?P<frequency_units>.+) \(Channel (?P<channel>\d+)\)$`),
+ regexp.MustCompile(`^Encryption key:(?P<encryption_key>.+)$`),
+ regexp.MustCompile(`^IE:\ WPA\ Version\ (?P<wpa>.+)$`),
+ regexp.MustCompile(`^IE:\ IEEE\ 802\.11i/WPA2\ Version\ (?P<wpa2>)$`),
+ regexp.MustCompile(`^Quality=(?P<signal_quality>\d+)/(?P<signal_total>\d+)\s+Signal level=(?P<signal_level>.+) d.+$`),
+ }
+}
+
+func Scan(interfaceName string) ([]Cell, error) {
+ // execute iwlist for scanning wireless networks
+ cmd := exec.Command("iwlist", interfaceName, "scan")
+ out, err := cmd.CombinedOutput()
+ if err != nil {
+ return nil, err
+ }
+
+ wifiList, err := parse(string(out))
+ if err != nil {
+ return wifiList, err
+ }
+
+ // 鑾峰彇褰撳墠杩炴帴鐨剋ifi
+ // 浣跨敤iwconfig 鑾峰彇褰撳墠鎺ュ彛鐨勮繛鎺ョ姸鎬�, 杩囨护鍑鸿繛鎺ョ殑wifi鍚嶇О
+ // 蹇界暐浜哅ode鐨勫垽鏂紝杩炴帴鍚庡簲璇ユ槸Managed
+ //wlan0 IEEE 802.11AC ESSID:"Basic" Nickname:"<WIFI@REALTEK>"
+ // Mode:Managed Frequency:5.22 GHz Access Point: 82:45:58:18:17:E6
+ // Bit Rate:200 Mb/s Sensitivity:0/0
+ // Retry:off RTS thr:off Fragment thr:off
+ // Power Management:off
+ // Link Quality=75/100 Signal level=-53 dBm Noise level=0 dBm
+ // Rx invalid nwid:0 Rx invalid crypt:0 Rx invalid frag:0
+ // Tx excessive retries:0 Invalid misc:0 Missed beacon:0
+
+ reg, _ := regexp.Compile(`ESSID:\"(\w+)\".*\n\s+Mode:(\w+).*Point:\s?(\S+)`)
+ cmd = exec.Command("iwconfig", interfaceName)
+ out, _ = cmd.CombinedOutput()
+
+ res := reg.FindStringSubmatch(string(out))
+ if len(res) == 4 {
+ for i, v := range wifiList {
+ if v.MAC == res[3] {
+ wifiList[i].Connected = true
+ wifiList[0], wifiList[i] = wifiList[i], wifiList[0]
+ }
+ }
+ }
+
+ return wifiList, nil
+}
+
+func parse(input string) (cells []Cell, err error) {
+ lines := strings.Split(input, "\n")
+
+ var cell *Cell
+ var wg sync.WaitGroup
+ var m sync.Mutex
+ for _, line := range lines {
+ line = strings.TrimSpace(line)
+
+ // check new cell value
+ if cellValues := newCellRegexp.FindStringSubmatch(line); len(cellValues) > 0 {
+ cells = append(cells, Cell{
+ CellNumber: cellValues[1],
+ MAC: cellValues[2],
+ })
+ cell = &cells[len(cells)-1]
+
+ continue
+ }
+
+ // compare lines to regexps
+ wg.Add(len(regxp))
+ for _, reg := range regxp {
+ go compare(line, &wg, &m, cell, reg)
+ }
+ wg.Wait()
+ }
+
+ return
+}
+
+func compare(line string, wg *sync.WaitGroup, m *sync.Mutex, cell *Cell, reg *regexp.Regexp) {
+ defer wg.Done()
+
+ if values := reg.FindStringSubmatch(line); len(values) > 0 {
+ keys := reg.SubexpNames()
+
+ m.Lock()
+
+ for i := 1; i < len(keys); i++ {
+ switch keys[i] {
+ case "essid":
+ cell.ESSID = values[i]
+ case "mode":
+ cell.Mode = values[i]
+ case "frequency":
+ if frequency, err := strconv.ParseFloat(values[i], 32); err == nil {
+ cell.Frequency = float32(frequency)
+ }
+ case "frequency_units":
+ cell.FrequencyUnits = values[i]
+ case "channel":
+ if channel, err := strconv.ParseInt(values[i], 10, 32); err == nil {
+ cell.Channel = int(channel)
+ }
+ case "encryption_key":
+ if cell.EncryptionKey = values[i] == "on"; cell.EncryptionKey {
+ cell.Encryption = "wep"
+ } else {
+ cell.Encryption = "off"
+ }
+ case "wpa":
+ cell.Encryption = "wpa"
+ case "wpa2":
+ cell.Encryption = "wpa2"
+ case "signal_quality":
+ if quality, err := strconv.ParseInt(values[i], 10, 32); err == nil {
+ cell.SignalQuality = int(quality)
+ }
+ case "signal_total":
+ if total, err := strconv.ParseInt(values[i], 10, 32); err == nil {
+ cell.SignalTotal = int(total)
+ }
+ case "signal_level":
+ if level, err := strconv.ParseInt(values[i], 10, 32); err == nil {
+ cell.SignalLevel = int(level)
+ }
+ }
+ }
+
+ m.Unlock()
+ }
+}
diff --git a/system-service/main.go b/system-service/main.go
index f95fe17..168e931 100644
--- a/system-service/main.go
+++ b/system-service/main.go
@@ -155,6 +155,7 @@
funcMap[urlPrefix+"/sysset/getWifiList"] = ssController.GetWifiList
funcMap[urlPrefix+"/sysset/getDefKeyboardLayout"] = ssController.GetDefKeyboardLayout
funcMap[urlPrefix+"/sysset/connectWifi"] = ssController.ConnectWifi
+ funcMap[urlPrefix+"/sysset/disconnectWifi"] = ssController.DisonnectWifi
funcMap[urlPrefix+"/sysset/getSysSetting"] = ssController.GetSysSetting
funcMap[urlPrefix+"/sysset/updateSysSetting"] = ssController.UpdateSysSetting
funcMap[urlPrefix+"/sysset/freedisk"] = ssController.DiskInfo
diff --git a/system-service/sys/system.go b/system-service/sys/system.go
index 41d6e46..c79d6f0 100644
--- a/system-service/sys/system.go
+++ b/system-service/sys/system.go
@@ -11,6 +11,7 @@
"strconv"
"vamicro/config"
"vamicro/extend/util"
+ "vamicro/system-service/iwlist"
"vamicro/system-service/models"
sysVo "vamicro/system-service/vo"
@@ -141,7 +142,7 @@
return info, err
}
-//鑾峰彇缃戝崱淇℃伅
+// 鑾峰彇缃戝崱淇℃伅
func GetNetWorkCards() ([]sysVo.NetWorkCard, error) {
interfaces, err := net.Interfaces()
if nil != err {
@@ -184,7 +185,7 @@
return data, nil
}
-//淇敼IP鍙戝竷娑堟伅
+// 淇敼IP鍙戝竷娑堟伅
func IpChangePublish(newIp string) bool {
//淇敼鍥芥爣ip
tmpResourceConf := models.ResourceConfig{}
@@ -213,7 +214,8 @@
return false
}
-/**
+/*
+*
鏇存柊閰嶇疆
@param serverName 鏈嶅姟鍚嶇О
@param newIp 鏈嶅姟Ip
@@ -491,7 +493,7 @@
return err == nil
}
-//璁剧疆璇█
+// 璁剧疆璇█
func SetLang(lang string, language string) error {
// set env
envCMD := exec.Command("/bin/sh", "-c", "LANG=%s", lang)
@@ -525,7 +527,7 @@
return err
}
-//鑾峰彇褰撳墠璇█
+// 鑾峰彇褰撳墠璇█
func GetLang() (string, error) {
content, err := execRootCommand("cat /etc/default/locale|grep LANG")
if nil == err {
@@ -541,7 +543,7 @@
return "", err
}
-//鑾峰彇榛樿閿洏甯冨眬
+// 鑾峰彇榛樿閿洏甯冨眬
func GetDefKeyboard() (string, error) {
content, err := execRootCommand("cat /etc/default/keyboard|grep XKBLAYOUT")
if nil == err {
@@ -557,7 +559,7 @@
return "", err
}
-//鑾峰彇閿洏甯冨眬
+// 鑾峰彇閿洏甯冨眬
func GetKeyboardLayouts() (map[string]string, []sysVo.KeyBoardLayout, error) {
output, err := execRootCommand("man -P cat xkeyboard-config")
if nil != err {
@@ -615,7 +617,7 @@
return keyBoardLayoutMap, keyBoardLayouts, nil
}
-//璁剧疆閿洏甯冨眬
+// 璁剧疆閿洏甯冨眬
func SetKeyboardLayout(layout string) error {
cmdStr := fmt.Sprintf("sed -i 's/XKBLAYOUT=.*/XKBLAYOUT=\"%s\"/' /etc/default/keyboard", layout)
_, err := execRootCommand(cmdStr)
@@ -623,7 +625,7 @@
return err
}
-//鍏抽棴缃戠粶
+// 鍏抽棴缃戠粶
func DownNetCard(networkAdapter string) error {
cmdStr := fmt.Sprintf("ip link set %s down", networkAdapter)
_, err := execRootCommand(cmdStr)
@@ -631,7 +633,7 @@
return err
}
-//寮�鍚綉缁�
+// 寮�鍚綉缁�
func UpNetCard(networkAdapter string) error {
_, _, err := GetLocalIP(networkAdapter)
if err != nil {
@@ -643,7 +645,7 @@
return err
}
-//鑾峰彇鏃犵嚎缃戝崱
+// 鑾峰彇鏃犵嚎缃戝崱
func GetIwDev() ([]string, error) {
content, err := execRootCommand("iw dev")
if nil == err {
@@ -664,76 +666,74 @@
return nil, errors.New("iw dev not found")
}
-//鑾峰彇wifi缃戠粶
-func GetWifi(netcard string) ([]sysVo.WiFi, error) {
- reg, err := regexp.Compile(`Quality=(\d+)/70[^\n]+\n\s+Encryption key:([^\n]+)\n\s+ESSID:\"([^\"]+)\"`)
- if nil == err {
- var wifiList = make([]sysVo.WiFi, 0)
- info, err := execRootCommand(fmt.Sprintf("iwlist %s scan", netcard))
- if nil == err {
- res := reg.FindAllStringSubmatch(string(info), -1)
- for _, item := range res {
- if len(item) >= 4 {
- wifi := sysVo.WiFi{item[3], item[1], item[2]}
- wifiList = append(wifiList, wifi)
- }
- }
- return wifiList, nil
- }
- }
- return nil, err
+// 鑾峰彇wifi缃戠粶
+func ScanWifiList(netcard string) ([]iwlist.Cell, error) {
+ return iwlist.Scan(netcard)
}
-//杩炴帴WIFI
-func ConnectWifi(fname, passwd, ssid string) error {
- content, err := execRootCommand(fmt.Sprintf("wpa_cli -i %s add_network", fname))
- if nil != err {
+// 杩炴帴WIFI
+func ConnectWifi(fname, ssid, passwd string) error {
+ networkConfigScript := "/opt/vasystem/script/wlanconfig"
+
+ // 妫�鏌ユ枃浠舵槸鍚﹀瓨鍦�
+ if _, err := os.Stat(networkConfigScript); err != nil {
return err
}
- newid := strings.TrimSpace(string(content))
- reg, err := regexp.Compile(`^(\d+)$`)
- if nil == err {
- b := reg.MatchString(newid)
- if !b {
- return errors.New("WIFI鍔犲叆澶辫触")
- }
- ret, err := execRootCommand(fmt.Sprintf("wpa_cli -i %s set_network %s ssid '\"%s\"'", fname, newid, ssid))
- if nil != err {
- return err
- }
- if strings.TrimSpace(string(ret)) != "OK" {
- return errors.New(string(ret))
- }
- ret, err = execRootCommand(fmt.Sprintf("wpa_cli -i %s set_network %s psk '\"%s\"'", fname, newid, passwd))
- if nil != err {
- return err
- }
- if strings.TrimSpace(string(ret)) != "OK" {
- return errors.New(string(ret))
- }
- ret, err = execRootCommand(fmt.Sprintf("wpa_cli -i %s disconnect", fname))
- if nil != err {
- return err
- }
- if strings.TrimSpace(string(ret)) != "OK" {
- return errors.New(string(ret))
- }
- ret, err = execRootCommand(fmt.Sprintf("wpa_cli -i %s select_network %s", fname, newid))
- if nil != err {
- return err
- }
- if strings.TrimSpace(string(ret)) != "OK" {
- return errors.New(string(ret))
- }
- _, err = execRootCommand(fmt.Sprintf("udhcpc -i %s -q -n", fname))
- if nil != err {
- return errors.New("瀵嗙爜濂藉儚涓嶅鍝�")
- }
- _, err = execRootCommand(fmt.Sprintf("wpa_cli -i %s save_config", fname))
- return nil
- } else {
- return err
- }
+
+ // # wlanconfig wlan0 Basic Basic2019
+ cmdStr := fmt.Sprintf("%s %s %s %s", networkConfigScript, fname, ssid, passwd)
+ _, err := execRootCommand(cmdStr)
+
+ return err
+
+ //content, err := execRootCommand(fmt.Sprintf("wpa_cli -i %s add_network", fname))
+ //if nil != err {
+ // return err
+ //}
+ //newid := strings.TrimSpace(string(content))
+ //reg, err := regexp.Compile(`^(\d+)$`)
+ //if nil == err {
+ // b := reg.MatchString(newid)
+ // if !b {
+ // return errors.New("WIFI鍔犲叆澶辫触")
+ // }
+ // ret, err := execRootCommand(fmt.Sprintf("wpa_cli -i %s set_network %s ssid '\"%s\"'", fname, newid, ssid))
+ // if nil != err {
+ // return err
+ // }
+ // if strings.TrimSpace(string(ret)) != "OK" {
+ // return errors.New(string(ret))
+ // }
+ // ret, err = execRootCommand(fmt.Sprintf("wpa_cli -i %s set_network %s psk '\"%s\"'", fname, newid, passwd))
+ // if nil != err {
+ // return err
+ // }
+ // if strings.TrimSpace(string(ret)) != "OK" {
+ // return errors.New(string(ret))
+ // }
+ // ret, err = execRootCommand(fmt.Sprintf("wpa_cli -i %s disconnect", fname))
+ // if nil != err {
+ // return err
+ // }
+ // if strings.TrimSpace(string(ret)) != "OK" {
+ // return errors.New(string(ret))
+ // }
+ // ret, err = execRootCommand(fmt.Sprintf("wpa_cli -i %s select_network %s", fname, newid))
+ // if nil != err {
+ // return err
+ // }
+ // if strings.TrimSpace(string(ret)) != "OK" {
+ // return errors.New(string(ret))
+ // }
+ // _, err = execRootCommand(fmt.Sprintf("udhcpc -i %s -q -n", fname))
+ // if nil != err {
+ // return errors.New("瀵嗙爜濂藉儚涓嶅鍝�")
+ // }
+ // _, err = execRootCommand(fmt.Sprintf("wpa_cli -i %s save_config", fname))
+ // return nil
+ //} else {
+ // return err
+ //}
}
func ExistService(name string) string {
@@ -744,7 +744,7 @@
return string(b)
}
-//閰嶇疆mqtt
+// 閰嶇疆mqtt
func SetMqttConf(conf *sysVo.MqttConf) error {
etcPath := "/etc/mosquitto/mosquitto.conf"
pwfile := "/etc/mosquitto/pwfile"
--
Gitblit v1.8.0