2010-01-07 14 views
8

Para un proyecto personal mio, estoy tratando de recuperar la intensidad de la señal de WiFi del iPhone. Soy plenamente consciente de que esto es en la tierra de la bondad no documentada, por lo que te abstengo de responder "No Appstore". :)Acceso y uso de MobileWiFi.framework

Anywho, he estado leyendo sobre las anteriores aplicaciones de escáner de red WiFi (WiFi Stumbler), pero me temo que la mayoría (si no todas) reflejan la documentación desfasada del SDK. Afortunadamente, esta pregunta también proporcionará algún material centralizado/profundo con el iPhone SDK 3.1.2 más reciente.

Aquí está mi código incompleto/no-trabajo:

.h

void *libHandle; 
void *airportHandle; 
int (*open)(void *); 
int (*bind)(void *, NSString *); 
int (*close)(void *); 
int (*scan)(void *, NSArray **, void *); 

.m

libHandle = dlopen("/System/Library/PrivateFrameworks/MobileWiFi.framework/MobileWiFi",RTLD_LAZY); 

open = dlsym(libHandle, "Apple80211Open"); 
bind = dlsym(libHandle, "Apple80211BindToInterface"); 
close = dlsym(libHandle, "Apple80211Close"); 
scan = dlsym(libHandle, "Apple80211Scan"); 

open(&airportHandle); 
bind(airportHandle, @"en0"); 

NSLog(@"Result %@",libHandle); 

Cuando se ejecuta en el dispositivo, que va a producir mi cada vez más so- favorito ...

Tipo de excepción: EXC_BAD_ACCESS (SIGSEGV)

Estoy pensando en la llamada de carga dinámica, no está cargando nada. El directorio: /System/Library/PrivateFrameworks/ solo muestra un archivo Info.plist sin binarios o alias.

Probablemente haciendo algo terriblemente malo (¿directorio incorrecto?) ... ¡aprecien cualquier ayuda!

Además, como seguimiento. Para extraer la información Wi-Fi, que podría ser hecho por:

GetInfoCopy = dlsym(libHandle, "Apple80211GetInfoCopy"); 

Y mis preguntas son: 1) ¿Alguien ha tenido suerte con esto? 2) ¿Cómo se obtiene un volcado de encabezado como lo haría con el volcado de clases en las bibliotecas de Objective-C (porque MobileWifi está en C)?

Respuesta

8

Para cualquiera que tropieza esta pregunta, aquí está mi biblioteca para acceder a redes 802.11. Aunque Apple afirma que niega cualquier aplicación que use marcos privados, hay varias aplicaciones WiFi de fuente cerrada en la AppStore. Úselo bajo su propio riesgo.

Esta biblioteca funciona con iPhone SDK 3.1.2.

Uso:

SOLStumbler *networksManager = [[SOLStumbler alloc] init]; 
[networksManager scanNetworks]; 

Resultado:

Un redes NSDictionary de un NSDictionary información.

Utilice CFShow para explorar el puntero devuelto que contiene información. O llame al método de descripción para la salida de muestra.

+2

Tenga cuidado. Últimamente, Apple ha estado imponiendo la eliminación de los escáneres WiFi. – Rev316

+0

hola estoy recibiendo EXC_BAD_ACCESS en este código ... :( – Rajneesh071

+0

no existe WiFiManager.paquete/WiFiManager -> aplicación crack – vualoaithu

2

No estoy seguro de si esto sería un problema, pero abrir/cerrar/enlazar son nombres que ya están en uso (biblioteca C estándar).

El binario no existe, ya que está almacenado en el dyld shared_cache (dlopen tendrá éxito porque la biblioteca está 'cargada técnicamente'); sin embargo, observo que no está comprobando que cualquiera de libHandle, abrir, cerrar, vincular o escanear sean válidos cuando los recupera de las funciones dl *.

+0

Lo suficientemente cerca, pero es una buena idea. – Rev316

4

Estas funciones de Apple80211xxx no existen en MobileWiFi.framework (puede verificar usando la herramienta `nm 'contra los binarios de SDK).

(Además, es imposible volcar una cabecera C desde binarios porque toda la información de tipo se eliminan durante la compilación. Es necesario realizar ingeniería inversa a usted mismo o esperar a alguien para hacerlo.)

5

datos a fecha de julio de 2012 (iOS 5.0)

El código que está intentando utilizar es bastante viejo. Esto (por ejemplo, WiFiManager o MobileWiFi) se encuentra en un marco privado. Eso significa que Apple puede, y con frecuencia lo hará, cambiarlo o moverlo de la versión del sistema operativo a la versión.

Ejecuté nm en el marco de MobileWifi, y no vi ninguno de esos nombres de funciones. Entonces, creo que es por eso que tu código falla.

$ PWD /Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS5.0.sdk/System/Library/PrivateFrameworks/MobileWiFi.framework

$ nm MobileWiFi | grep 80211

$

supongo que podría ser necesario ejecutar nm en el marco del dispositivo real, pero no perder el tiempo, después de mirar esto:

Discussion of this framework, and follow-ons.

Parece que ahora puede encontrar funciones equivalentes (?) En el marco IPConfiguration. Prueba este código:

libHandle = dlopen("/System/Library/SystemConfiguration/IPConfiguration.bundle/IPConfiguration", RTLD_LAZY); 

lo corrió en un jailbreak iOS 5.0.1 telefónicas y funcionó (cargado el dylib y encontré algunas de las funciones Apple80211). Desde ese hilo al que me he vinculado, parece que es necesario tenerlo instalado en /Applications en un teléfono con jailbreak, para que funcione completamente. O, posiblemente, tenga que perder el tiempo agregando algunos derechos a su aplicación de espacio aislado.

+0

no se usa para iphone 5S os 7.1, tengo obtener Nulo – vualoaithu

+0

Sí. Con esta cadena, pasa 'if (libHandle == NULL && (error = dlerror())! = NULL)' en * iOS 7 *. Pero no puede hacer que funcione. 'scanNetworks' no encuentra ninguna red alrededor. – skywinder

+0

@skywinder, 'scanNetworks' falla porque ese código tiene ahora 4 años. Como lo describo en mi respuesta, debe usar un nuevo marco para obtener la funcionalidad equivalente (y ha tenido que hacerlo desde al menos iOS 5). Si está intentando hacer esto con iOS 7, le recomendaría que publique una [nueva pregunta] (http://stackoverflow.com/questions/ask). – Nate