Możesz chcieć użyć prywatnego szkieletu Apple80211 przy użyciu biblioteki dlfcn.h. Przykładem iPhone można znaleźć tutaj:
http://www.csse.uwa.edu.au/~chris/iphone/APlogger/
Pobierz plik źródłowy i zbadać moduł skanera.
Podsumowując, można wymyślić coś takiego:
#define IF_NAME "en0"
#include <dlfcn.h>
- (void)performScan
{
int (*open)(void *);
int (*bind)(void *, NSString *);
int (*close)(void *);
int (*scan)(void *, NSArray **, void *);
void *libHandle;
void *airportHandle;
libHandle = dlopen("/System/Library/Frameworks/Preferences.framework/Preferences", RTLD_LAZY);
open = dlsym(libHandle, "Apple80211Open");
bind = dlsym(libHandle, "Apple80211BindToInterface");
scan = dlsym(libHandle, "Apple80211Scan");
close = dlsym(libHandle, "Apple80211Close");
open(&airportHandle);
bind(airportHandle, @IF_NAME);
NSArray *found;
NSDictionary *params = [[NSDictionary alloc] init];
scan(airportHandle, &found, params);
int nnw = [found count];
for(int i=0 ; i < nnw ; i++) {
NSDictionary *nw = [found objectAtIndex:i];
NSString *ssid = [self fixSSID:nw];
// RSSI indicates signal strength
int rssi = [[nw objectForKey:@"RSSI"] intValue];
}
// Cleanup
close(airportHandle);
dlclose(libHandle);
}
-(NSString *)fixSSID:(NSDictionary *)nw
{
if ([[nw objectForKey:@"HIDDEN_NETWORK"] boolValue])
return @"<hidden>";
else
return [nw objectForKey:@"SSID_STR"];
}
Zauważ, że jeśli używasz ramy prywatnych w iOS aplikacji, nie będzie mógł opublikować je w App Store (Apple odrzuci Twoja aplikacja, ponieważ nie ma publicznej dokumentacji dla frameworka Apple80211). ale ponieważ twoje pytanie dotyczy rozwoju OSX, nie dotyczy to twojego przypadku.
Mam nadzieję, że to pomaga.
Farzan Doroodgar
Czy masz szczęście? –
Niestety, nie zrobiłem tego. Czy masz jakies pomysły? –
Możesz spróbować użyć właściwości rssi na obiekcie CWInterface. Pokazuje "bieżący zmierzony wskaźnik mocy odebranego sygnału (RSSI) (dBm) dla interfejsu.". Działa w środowisku sandbox. –