Red de conocimiento informático - Material del sitio web - ¿Cómo acceder a WifiService en el marco de Android a través del código C?

¿Cómo acceder a WifiService en el marco de Android a través del código C?

Después de todo, los servicios de la capa Java son paquetes vinculantes de la capa C, por lo que, en principio, es completamente posible acceder directamente a los servicios de la capa de marco de Android a través del código C. Este artículo toma el acceso a WifiService como ejemplo para explicar cómo. para implementar esta función.

Sin más preámbulos, aquí está el código:

WifiTest.cpp

[cpp] Consulte la copia simple en CODE para ver qué se deriva de mi código piece La pieza de código que sale

#include lt;sys/types.hgt

#include lt;unistd.hgt

#include lt; grp.hgt ;

#include lt;binder/IPCThreadState.hgt;

#include lt;binder/ProcessState.hgt; /IServiceManager.hgt;

#include lt;utils/Log.hgt;

#include lt;utils/String16.hgt; lt;utils /Vector.hgt;

#include lt;utils/List.hgt;

#include lt;utils/PropertyMap.hgt; espacio de nombres android

#define WIFI_SERVICE "wifi"

const String16 WIFI_DESCRIPTOR("android.net.wifi.IWifiManager"

class ScanResult

{

privado:

ScanResultamp; const ScanResultamp o):

mSsid(o.mSsid), mBssid(o.mBssid), mCaps(o.mCaps), mLevel(o.mLevel), mFrequency(o.mFrequency), mTimestamp( o.mTimestamp )

{

}

ScanResult(String8 ssid, String16 bssid, String16 caps, int nivel, int freq, int64_t timeStamp):

mSsid(ssid), mBssid(bssid), mCaps(mayúsculas), mLevel(nivel), mFrequency(freq), mTimestamp(timeStamp)

{

}

void dump()

{

char temp[130]

int size; (temp, 0, tamaño de (temp));

printf("ssid s\n", mSid.string();

tamaño = mBssid.size(); /p>

if(tamaño gt; tamañode(temp)/2 - 1)

{

p>

tamaño = tamaño de(temp)/2 - 1

}

utf16_to_utf8(mBssid.string(), tamaño, temperatura

printf("Bssid s \n", temp);

tamaño = mCaps.size()

if(tamaño gt; tamaño de(temp)/2 - 1)

{

tamaño = tamaño de (temp)/2 - 1

}

utf16_too_utf8(mCaps.string(), tamaño, temp);

printf("ssid s \n", temp);

printf("nivel d \n",

printf( "freq d \n", mFrequency);

printf("freq ld \n", mTimestamp

}

privado:

String8 mSsid;

String16 mBssid;

String16 mCaps

int mLevel

int mFrequency;

int64_t mTimestamp;

};

clase IWifiService: público android::IInterface {

público:

DECLARE_META_INTERFACE(WifiService )

virtual void startScan(int forceActive) = 0

virtual int getScanResults(Listlt;ScanResultgt; amp; list) =

virtual bool setWifiEnabled; (bool habilitar) = 0;

};

clase BpWifiService: público android::BpInterfacelt;IWifiServicegt

{

Enum

{

FIRST_CALL_TRANSACTION = 1,

TRANSACTION_getConfiguredNetworks = (android::IBinder::FIRST_CALL_TRANSACTION 0),

TRANSACTION_addOrUpdateNetwork = (android::IBinder::FIRST_CALL_TRANSACTION 1),

TRANSACTION_removeNetwork = (android::IBinder::FIRST_CALL_TRANSACTION 1),

TRANSACTION_removeNetwork = (android::IBinder

::FIRST_CALL_TRANSACTION 2),

TRANSACTION_enableNetwork = (android::IBinder::FIRST_CALL_TRANSACTION 3),

TRANSACTION_disableNetwork = (android::IBinder::FIRST_CALL_TRANSACTION 4),

TRANSACTION_pingSupplicant = (android::IBinder::FIRST_CALL_TRANSACTION 9),

TRANSACTION_reassociate = (android::IBinder::FIRST_CALL_TRANSACTION 10),

TRANSACTION _getConnectionInfo = (android:: FIRST_CALL_TRANSACTION 10) IBinder::FIRST_CALL_TRANSACTION 11),

TRANSACTION_setWifiEnabled = (android::IBinder::FIRST_CALL_TRANSACTION 11),

TRANSACTION_setWifiEnabled = (android::IBinder::FIRST_CALL_TRANSACTION TRANSACTION 12) ,

p>

TRANSACTION_getWifiEnabledState = (android::IBinder::FIRST_CALL_TRANSACTION 13),

TRANSACTION_setCountryCode = (android::FIRST_CALL_TRANSACTION TRANSACTION 15),

TRANSACTION_getFrequencyBand = (android::IBinder ::FIRST_CALL_TRANSACTION 16),

TRANSACTION_ isDualBandSupported = (android::IBinder::FIRST_CALL_TRANSACTION 17),

TRANSACTION_saveConfiguration = (android::IBinder::FIRST_CALL_TRANSACTION 17 ),

TRANSACTION_saveConfiguration = (android::IBinder::FIRST_CALL_TRANSACTION CALL_TRANSACTION 18),

TRANSACTION_getDhcpInfo = (android::IBinder::FIRST_CALL_TRANSACTION 19),

TRANSACTION_acquireWifiLock = (android ::IBinder::FIRST_CALL_TRANSACTION 20),

TRANSACTION_updateWifiLockWorkSource

= (android::IBinder::FIRST_CALL_TRANSACTION 21),

TRANSACTION_releaseWifiLock = (android::IBinder::FIRST_CALL_TRANSACTION 22),

TRANSACTION_initializeMulticastFiltering = (android::IBinder::FIRST_CALL_TRANSACTION 22 ),

FIRST_CALL_TRANSACTION 23),

TRANSACTION_isMulticastEnabled = (android::IBinder::FIRST_CALL_TRANSACTION 24),

TRANSACTION_acquireMulticastLock = (android::IBinder::FIRST_CALL_TRANSACTION 25),

TRANSACTION_releaseMulticastLock = (android::IBinder::FIRST_CALL_TRANSACTION 26),

TRANSACTION_setWifiApEnabled = (android::IBinder::FIRST_CALL_TRANSACTION 27).

IBinder::FIRST_CALL_TRANSACTION 27),

TRANSACTION_getWifiApEnabledState = (android::IBinder::FIRST_CALL_TRANSACTION 28),

TRANSACTION_getWifiApConfiguration = (android::IBinder::FIRST_CALL_TRANSACTION 29),

TRANSACTION_setWifiApConfiguration = (android::IBinder::FIRST_CALL_TRANSACTION 30),

TRANSACTION_startWifi = (android::IBinder::FIRST_CALL_TRANSACTION 31),

TRANSACTION_stopWifi = (android:: FIRST_CALL_TRANSACTION 31) IBinder::FIRST_CALL_TRANSACTION 32),

TRANSACTION_addToBlacklist = (android::IBinder::FIRST_CALL_TRANSACTION 33),

TRANSACTION_clearBlacklist = (android::IBinder::FIRST_CALL_TRANSACTION 34),

p>

TRANSACTION_getWifiServiceMessenger = (android::IBinder::FIRST_CALL_TRANSACTION 35),

TRANSACTION_getWifiStateMachineMessenger = (android:.

TRANSACTION_getWifiStateMachineMessenger = (android::IBinder: :FIRST_CALL_TRANSACTION 36 ),

TRANSACTION_getConfigFile = (android::IBinder::FIRST_CALL_TRANSACTION 37),

TRANSACTION_captivePortalCheckComplete = (android::IBinder::FIRST_CALL_TRANSACTION 38),

} ;

público:

BpWifiService( const android::splt; android::IBindergt; amp; impl): android::BpInterfacelt; p>

{

}

void startScan(int forceActive)

{

android:: Datos del paquete, respuesta;

data.writeInterfaceToken(WIFI_DESCRIPTOR);

i;

f (forceActive)

{

data.writeInt32(1

}

más

no; .

De lo contrario

{

data.writeInt32(0

}

remoto() - gt.Transact(TRANSACTION_startScan, datos, respuesta, 0);

}

Virtual int.

virtual int getScanResults(Listlt; ScanResultgt; amp; list)

{

Datos de parcela, respuesta

data.writeInterfaceToken( WIFI_DESCRIPTOR);

remoto()-gt; transact(TRANSACTION_getScanResults, datos, respuesta, 0);

if (0! = respuesta.readExceptionCode()))

{

devuelve 0;

}

int recuento (WIFI_DESCRIPTOR).

int recuento = respuesta.readInt32 ();

for (int i=0; ilt; count; i )

{

String8 ssid

int res = respuesta.readInt32 ();

if (res != 0)

{

respuesta.readInt32()

respuesta.readInt32();

int longitud = respuesta.readInt32();

ssid = String8((const char*)) respuesta.readInplace(longitud), longitud

}

///

if (res !

// utf16_to_utf8(const char16_t* src, size_t src_len, char* dst);

String16 BSSID = respuesta.readString16();

String16 caps = respuesta.readString16()

int nivel = respuesta.readInt32(); p> int frecuencia = respuesta.readInt32();

int64_t marca de tiempo = respuesta.readInt64();

Resultado del escaneo (ssid, BSSID, mayúsculas, nivel, frecuencia, marca de tiempo);

list.push_back(resultado);

}

Devuelve el recuento.

Recuento de devoluciones

}

bool setWifiEnabled(bool enable)

{

Datos de parcela, respuesta

data.writeInterfaceToken(WIFI_DESCRIPTOR);

if(enable)

data.writeInt32(1

else

else

p>

data.writeInt32(0);

remoto()-gt; transact(TRANSACTION_setWifiEnabled, datos, amp; respuesta, 0)

respuesta.readExceptionCode()

devuelve 0!=respuesta.

}

IMPLEMENT_META_INTERFACE(WifiService, WIFI_DESCRIPTOR)

int main(int argc, char *argv[])

{

android::splt; android::IServiceManagergt sm = android::defaultServiceManager( );

android::splt ;android::IBindergt.binder;

android::splt;IWifiServicegt;wifi

binder = sm-gt; getService(android::String16(WIFI_SERVICE));

p>

if ( carpeta == 0)

{

return

}

wifi = android:: interface_castlt; (carpeta);

wifi-gt.setWifiEnabled(true); (" inicio de escaneo");

wifi-gt; startScan(1

for(int i=0;ilt;10;i)

{

usleep(1*1000*1000);

Listlt; lista ScanResults

getScanResults(lista);

if(list.size() gt; 0)

{

for(Listlt;ScanResultgt;::iterator it = list.begin();it! = lista.end(); it)

{

(*it).dump();

}

break;

}

}

return(0);

}

La idea básica es muy simple:

p>

Primera pasada:

android::defau

ltServiceManager()-gt;getService(android::String16(WIFI_SERVICE));

Obtenga la interfaz adhesiva y luego lea el adhesivo a través de Parcel. Para conocer el método de implementación, consulte el código de IWifiManager.java.

Después de compilar y ejecutar el código anterior, puede obtener un resultado similar a:

ssid wifitest

Bssid b8:55:10:84:13: 57

ssid [WPA-PSK-CCMP][WPA2-PSK-CCMP][WPS][ESS]

nivel -55

frecuencia 2447

frecuencia 2447

p>

marca de tiempo 1073922473

prueba ssid

Bssid 08:bd:43:c3:a9:96

ssid [WPA2-PSK-CCMP ][WPS][ ESS]

nivel -66

frecuencia 2462

marca de tiempo 1073922473