Files
rikkei_simple_care/client/internal/winapi/winapi.go
2026-06-30 09:31:33 +07:00

83 lines
2.0 KiB
Go

package winapi
import (
"bytes"
"os/exec"
"strings"
"syscall"
)
// WifiConnection — SSID + BSSID (MAC) của điểm phát đang kết nối
type WifiConnection struct {
SSID string
BSSID string
}
// GetWifiSSID trả về SSID Wifi đang kết nối
func GetWifiSSID() string {
return GetWifiConnection().SSID
}
// GetWifiConnection đọc SSID và BSSID từ netsh (Windows)
func GetWifiConnection() WifiConnection {
cmd := exec.Command("netsh", "wlan", "show", "interfaces")
cmd.SysProcAttr = &syscall.SysProcAttr{HideWindow: true}
var out bytes.Buffer
cmd.Stdout = &out
if err := cmd.Run(); err != nil {
return WifiConnection{}
}
var conn WifiConnection
for _, line := range strings.Split(out.String(), "\n") {
trimmed := strings.TrimSpace(line)
lower := strings.ToLower(trimmed)
if strings.HasPrefix(lower, "ssid") && !strings.Contains(lower, "bssid") {
if v := valueAfterColon(trimmed); v != "" {
conn.SSID = v
}
}
// Windows: "AP BSSID" (EN) hoặc dòng có chứa "bssid" (locale khác)
if strings.Contains(lower, "bssid") {
if v := valueAfterColon(trimmed); v != "" {
conn.BSSID = normalizeMAC(v)
}
}
}
return conn
}
func valueAfterColon(line string) string {
idx := strings.Index(line, ":")
if idx < 0 {
return ""
}
return strings.TrimSpace(line[idx+1:])
}
func normalizeMAC(mac string) string {
var hex []rune
for _, c := range strings.ToLower(mac) {
if (c >= '0' && c <= '9') || (c >= 'a' && c <= 'f') {
hex = append(hex, c)
}
}
if len(hex) != 12 {
return strings.TrimSpace(mac)
}
return string(hex[0:2]) + ":" + string(hex[2:4]) + ":" + string(hex[4:6]) + ":" +
string(hex[6:8]) + ":" + string(hex[8:10]) + ":" + string(hex[10:12])
}
// BSSIDKey chuẩn hóa MAC để so khớp (12 ký tự hex)
func BSSIDKey(bssid string) string {
var hex []rune
for _, c := range strings.ToLower(bssid) {
if (c >= '0' && c <= '9') || (c >= 'a' && c <= 'f') {
hex = append(hex, c)
}
}
return string(hex)
}