How to access the Android framework layer Wifiservice directly from C + + code

Source: Internet
Author: User
Tags bssid

In fact, the Java Layer service is the binder of the C + + layer encapsulation. So, in principle, it is entirely possible to access the service of the Android framework layer directly through C + + code, and this article takes a look at Wifiservice as an example of how to implement this function.


Crap say less. Directly on the code:


WifiTest.cpp


#include <sys/types.h> #include <unistd.h> #include <grp.h> #include <binder/ipcthreadstate.h > #include <binder/ProcessState.h> #include <binder/IServiceManager.h> #include <utils/log.h># Include <utils/string16.h>//#include <utils/Vector.h> #include <utils/List.h> #include <utils/ Propertymap.h>using namespace Android, #define WIFI_SERVICE "WIFI" Const STRING16 wifi_descriptor (" Android.net.wifi.IWifiManager "), Class scanresult{private:scanresult& operator= (const scanresult& o);p ublic : Scanresult (const scanresult& O): Mssid (O.mssid), Mbssid (O.mbssid), Mcaps (O.mcaps), Mlevel (o.mlevel), MFrequenc Y (o.mfrequency), Mtimestamp (O.mtimestamp) {} scanresult (String8 ssid,string16 bssid,string16 caps,int level,int F req,int64_t timeStamp): Mssid (SSID), Mbssid (BSSID), mcaps (Caps), mlevel (level), Mfrequency (Freq), Mtimestamp (        TimeStamp) {} void Dump () {char temp[130];        int size; MeMset (temp,0,sizeof (temp));        printf ("SSID%s \ n", mssid.string ());        Size = Mbssid.size ();        if (Size > sizeof (temp)/2-1) {size = sizeof (temp)/2-1;        } Utf16_to_utf8 (Mbssid.string (), size, temp);        printf ("Bssid%s \ n", temp);        Size = Mcaps.size ();        if (Size > sizeof (temp)/2-1) {size = sizeof (temp)/2-1;        } Utf16_to_utf8 (Mcaps.string (), size, temp);        printf ("SSID%s \ n", temp);        printf ("Level%d \ n", mlevel);        printf ("Freq%d \ n", mfrequency);    printf ("Freq%ld \ n", Mtimestamp);    }private:string8 Mssid;    String16 Mbssid;    String16 Mcaps;    int mlevel;    int mfrequency; int64_t Mtimestamp;}; Class Iwifiservice:public Android::iinterface {public:declare_meta_interface (wifiservice) virtual void STA        Rtscan (int forceactive) = 0;        virtual int getscanresults (list<scanresult> &list) = 0; virtual BOOL Setwifienabled (boolenable) = 0;};        Class Bpwifiservice:public android::bpinterface<iwifiservice>{enum {first_call_transaction = 1, Transaction_getconfigurednetworks = (android::ibinder::first_call_transaction + 0), Transaction_addorupdatenetwo RK = (android::ibinder::first_call_transaction + 1), Transaction_removenetwork = (Android::ibinder::first_call_tran Saction + 2), Transaction_enablenetwork = (android::ibinder::first_call_transaction + 3), transaction_disabl Enetwork = (android::ibinder::first_call_transaction + 4), transaction_pingsupplicant = (Android::ibinder::first_ca Ll_transaction + 5), Transaction_startscan = (android::ibinder::first_call_transaction + 6), TRANSACTION_get Scanresults = (android::ibinder::first_call_transaction + 7), Transaction_disconnect = (android::ibinder::first_cal L_transaction + 8), Transaction_reconnect = (android::ibinder::first_call_transaction + 9), Transaction_reas Sociate =(Android::ibinder::first_call_transaction +), Transaction_getconnectioninfo = (Android::ibinder::first_call_tran Saction + one), transaction_setwifienabled = (android::ibinder::first_call_transaction +), Transaction_get Wifienabledstate = (android::ibinder::first_call_transaction +), Transaction_setcountrycode = (android::IBinder:        : First_call_transaction + +), Transaction_setfrequencyband = (android::ibinder::first_call_transaction + 15), Transaction_getfrequencyband = (android::ibinder::first_call_transaction + +), transaction_isdualbandsupported = (android::ibinder::first_call_transaction + +), Transaction_saveconfiguration = (android::ibinder::first_call_tr Ansaction + +), Transaction_getdhcpinfo = (android::ibinder::first_call_transaction + +), Transaction_acqu Irewifilock = (android::ibinder::first_call_transaction +), Transaction_updatewifilockworksource = (android::IBi Nder::first_call_transaction +), Transaction_releasewifilock = (android::ibinder::first_call_transaction +), Transaction_initi Alizemulticastfiltering = (android::ibinder::first_call_transaction +), transaction_ismulticastenabled = (androi D::ibinder::first_call_transaction +), Transaction_acquiremulticastlock = (android::ibinder::first_call_transact ION +), Transaction_releasemulticastlock = (android::ibinder::first_call_transaction +), transaction_s etwifiapenabled = (android::ibinder::first_call_transaction +), Transaction_getwifiapenabledstate = (Android::IB  Inder::first_call_transaction +), transaction_getwifiapconfiguration = (android::ibinder::first_call_transaction +), Transaction_setwifiapconfiguration = (android::ibinder::first_call_transaction +), Transaction_st Artwifi = (android::ibinder::first_call_transaction +), Transaction_stopwifi = (Android::ibinder::first_call_tra Nsaction + +), TRansaction_addtoblacklist = (android::ibinder::first_call_transaction +), Transaction_clearblacklist = (android: : Ibinder::first_call_transaction +), Transaction_getwifiservicemessenger = (Android::ibinder::first_call_transac tion + +), Transaction_getwifistatemachinemessenger = (android::ibinder::first_call_transaction + +), TRAN Saction_getconfigfile = (android::ibinder::first_call_transaction + notoginseng), Transaction_captiveportalcheckcomplete = ( Android::ibinder::first_call_transaction + +),};p ublic:bpwifiservice (const ANDROID::SP&LT;ANDROID::IBINDER&GT        ;& impl): android::bpinterface<iwifiservice> (impl) {} void Startscan (int forceactive)            {android::P arcel data, reply;            Data.writeinterfacetoken (Wifi_descriptor);            if (forceactive) {data.writeint32 (1);            } else {data.writeint32 (0);    }        Remote ()->transact (Transaction_startscan, data, &reply, 0);            } virtual int getscanresults (list<scanresult> &list) {Parcel data, reply;            Data.writeinterfacetoken (Wifi_descriptor);            Remote ()->transact (transaction_getscanresults, data, &reply, 0);            if (0! = Reply.readexceptioncode ()) {return 0;            } int count = Reply.readint32 ();                for (int i=0;i<count;i++) {String8 SSID;                int res = Reply.readint32 ();                    if (res! = 0) {reply.readint32 ();                    Reply.readint32 ();                    int length = Reply.readint32 ();                SSID = String8 ((const char*) reply.readinplace (length), length);                }//Utf16_to_utf8 (const char16_t* SRC, size_t src_len, char* DST); String16 BSSID = Reply.readstring16 ();                String16 caps = Reply.readstring16 ();                int level = Reply.readint32 ();                int frequency = Reply.readint32 ();                int64_t timestamp = Reply.readint64 ();                Scanresult result (Ssid,bssid,caps,level,frequency,timestamp);            List.push_back (result);        } return count;            } bool Setwifienabled (bool enable) {Parcel data, reply;            Data.writeinterfacetoken (Wifi_descriptor);            if (enable) Data.writeint32 (1);            else Data.writeint32 (0);            Remote ()->transact (transaction_setwifienabled, data,&reply,0);            Reply.readexceptioncode ();        return 0!=reply.readint32 (); }};implement_meta_interface (Wifiservice, wifi_descriptor) int main (int argc, char *argv[]) {android::sp<android::i    servicemanager> sm = android::d Efaultservicemanager (); Android::sp<android::ibinder> Binder;   Android::sp<iwifiservice> WiFi;    Binder = Sm->getservice (Android::string16 (Wifi_service));    if (binder = = 0) {return 1;    WiFi = android::interface_cast<iwifiservice> (binder); Wifi->setwifienabled (True);p rintf ("+++++scan start"); Wifi->startscan (1); for (int i=0;i<10;i++) {usleep (1* 1000*1000); list<scanresult> list;wifi->getscanresults (list); if (list.size () > 0) {for (list<scanresult>::i        Terator it = List.begin (); It! = List.end (); ++it) {(*it). dump ();    } break; }} return (0);}



The main idea is very easy:

First Pass:

Android::d Efaultservicemanager ()->getservice (Android::string16 (Wifi_service));

Gets the binder interface. Then through the parcel read with binder, the detailed implementation can participate in the Iwifimanager.java code.


Executing the above code after compiling can get output similar to the following:


SSID Wifitest
Bssid b8:55:10:84:13:57
SSID [Wpa-psk-ccmp][wpa2-psk-ccmp][wps][ess]
Level-55
Freq 2447
Time Stamp 1073922473

SSID Test
Bssid 08:bd:43:c3:a9:96
SSID [Wpa2-psk-ccmp][wps][ess]
level-66
Freq 2462
Time Stamp 1073922473


Full code Download:

http://download.csdn.net/detail/i2cbus/7613361



How to access the Android framework layer Wifiservice directly from C + + code

Related Article

Contact Us

The content source of this page is from Internet, which doesn't represent Alibaba Cloud's opinion; products and services mentioned on that page don't have any relationship with Alibaba Cloud. If the content of the page makes you feel confusing, please write us an email, we will handle the problem within 5 days after receiving your email.

If you find any instances of plagiarism from the community, please send an email to: info-contact@alibabacloud.com and provide relevant evidence. A staff member will contact you within 5 working days.

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.