È possibile utilizzare il framework privato Apple80211 utilizzando la libreria dlfcn.h. Un esempio iPhone può essere trovato qui:
http://www.csse.uwa.edu.au/~chris/iphone/APlogger/
Scarica il file di origine e indagare modulo scanner.
In sintesi, si arriva con qualcosa di simile a questo:
#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"];
}
Nota che se si utilizza quadri privati nelle vostre applicazioni iOS, non sarà in grado di pubblicarle su App Store (Apple rifiuterà la tua app perché non esiste documentazione pubblica per il framework Apple80211). ma dal momento che la tua domanda riguarda lo sviluppo di OSX, questo non vale per il tuo caso.
Spero che aiuti.
Farzan Doroodgar
Hai avuto fortuna? –
Sfortunatamente, non l'ho fatto. Hai qualche idea? –
Puoi provare a utilizzare la proprietà rssi sull'oggetto CWInterface. Mostra "l'attuale misura di indicazione dell'intensità del segnale ricevuta (RSSI) (dBm) per l'interfaccia.". Funziona nell'ambiente sandbox. –