add macos
This commit is contained in:
@@ -2,45 +2,52 @@
|
||||
|
||||
package winapi
|
||||
|
||||
/*
|
||||
#cgo LDFLAGS: -framework CoreWLAN -framework CoreLocation -framework Foundation
|
||||
#include <stdlib.h>
|
||||
|
||||
typedef struct {
|
||||
char* ssid;
|
||||
char* bssid;
|
||||
} CWifiInfo;
|
||||
|
||||
void RequestLocationPermission();
|
||||
CWifiInfo GetCurrentWifiInfo();
|
||||
*/
|
||||
import "C"
|
||||
import (
|
||||
"bytes"
|
||||
"os/exec"
|
||||
"strings"
|
||||
"unsafe"
|
||||
)
|
||||
|
||||
// GetWifiConnection đọc SSID và BSSID từ ipconfig (macOS)
|
||||
func GetWifiConnection() WifiConnection {
|
||||
// Find Wi-Fi interface dynamically
|
||||
wifiInterface := "en0"
|
||||
cmdPort := exec.Command("networksetup", "-listallhardwareports")
|
||||
if outPort, err := cmdPort.Output(); err == nil {
|
||||
lines := strings.Split(string(outPort), "\n")
|
||||
for i := 0; i < len(lines)-1; i++ {
|
||||
if strings.Contains(lines[i], "Hardware Port: Wi-Fi") {
|
||||
next := strings.TrimSpace(lines[i+1])
|
||||
if strings.HasPrefix(next, "Device:") {
|
||||
wifiInterface = strings.TrimSpace(strings.TrimPrefix(next, "Device:"))
|
||||
break
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
cmd := exec.Command("ipconfig", "getsummary", wifiInterface)
|
||||
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)
|
||||
if strings.HasPrefix(trimmed, "SSID :") {
|
||||
conn.SSID = strings.TrimSpace(strings.TrimPrefix(trimmed, "SSID :"))
|
||||
} else if strings.HasPrefix(trimmed, "BSSID :") {
|
||||
conn.BSSID = normalizeMAC(strings.TrimSpace(strings.TrimPrefix(trimmed, "BSSID :")))
|
||||
}
|
||||
}
|
||||
return conn
|
||||
// RequestLocationAccess requests Location permission on macOS
|
||||
func RequestLocationAccess() {
|
||||
C.RequestLocationPermission()
|
||||
}
|
||||
|
||||
// GetWifiConnection đọc SSID và BSSID từ CoreWLAN (macOS)
|
||||
func GetWifiConnection() WifiConnection {
|
||||
info := C.GetCurrentWifiInfo()
|
||||
defer func() {
|
||||
if info.ssid != nil {
|
||||
C.free(unsafe.Pointer(info.ssid))
|
||||
}
|
||||
if info.bssid != nil {
|
||||
C.free(unsafe.Pointer(info.bssid))
|
||||
}
|
||||
}()
|
||||
|
||||
ssid := ""
|
||||
if info.ssid != nil {
|
||||
ssid = C.GoString(info.ssid)
|
||||
}
|
||||
|
||||
bssid := ""
|
||||
if info.bssid != nil {
|
||||
bssid = C.GoString(info.bssid)
|
||||
}
|
||||
|
||||
return WifiConnection{
|
||||
SSID: ssid,
|
||||
BSSID: normalizeMAC(bssid),
|
||||
}
|
||||
}
|
||||
|
||||
45
client/internal/winapi/wifi_darwin.m
Normal file
45
client/internal/winapi/wifi_darwin.m
Normal file
@@ -0,0 +1,45 @@
|
||||
#import <CoreWLAN/CoreWLAN.h>
|
||||
#import <CoreLocation/CoreLocation.h>
|
||||
#import <Foundation/Foundation.h>
|
||||
|
||||
static CLLocationManager *locationManager = nil;
|
||||
|
||||
void RequestLocationPermission() {
|
||||
dispatch_async(dispatch_get_main_queue(), ^{
|
||||
if (locationManager == nil) {
|
||||
locationManager = [[CLLocationManager alloc] init];
|
||||
}
|
||||
if (@available(macOS 10.15, *)) {
|
||||
[locationManager requestWhenInUseAuthorization];
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
typedef struct {
|
||||
char* ssid;
|
||||
char* bssid;
|
||||
} CWifiInfo;
|
||||
|
||||
CWifiInfo GetCurrentWifiInfo() {
|
||||
CWifiInfo info;
|
||||
info.ssid = NULL;
|
||||
info.bssid = NULL;
|
||||
|
||||
@autoreleasepool {
|
||||
CWWiFiClient *client = [CWWiFiClient sharedWiFiClient];
|
||||
if (client != nil) {
|
||||
CWInterface *interface = [client interface];
|
||||
if (interface != nil) {
|
||||
NSString *ssidStr = [interface ssid];
|
||||
NSString *bssidStr = [interface bssid];
|
||||
if (ssidStr != nil) {
|
||||
info.ssid = strdup([ssidStr UTF8String]);
|
||||
}
|
||||
if (bssidStr != nil) {
|
||||
info.bssid = strdup([bssidStr UTF8String]);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
return info;
|
||||
}
|
||||
@@ -6,3 +6,6 @@ package winapi
|
||||
func GetWifiConnection() WifiConnection {
|
||||
return WifiConnection{}
|
||||
}
|
||||
|
||||
// RequestLocationAccess requests Location permission (stub for other systems)
|
||||
func RequestLocationAccess() {}
|
||||
|
||||
@@ -38,3 +38,6 @@ func GetWifiConnection() WifiConnection {
|
||||
}
|
||||
return conn
|
||||
}
|
||||
|
||||
// RequestLocationAccess requests Location permission (stub for Windows)
|
||||
func RequestLocationAccess() {}
|
||||
|
||||
Reference in New Issue
Block a user