¿Cómo acceder a WifiService en el marco de Android a través del código C?
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): p>
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())) p>
{
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 ); p>
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 p>
}
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