pInfo = (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 + 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), 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::IBinder::FIRST_CALL_TRANSACTION + 32), TRANSACTION_addToBlacklist = (android::IBinder::FIRST_CALL_TRANSACTION + 33), TRANSACTION_clearBlacklist = (android::IBinder::FIRST_CALL_TRANSACTION + 34), TRANSACTION_getWifiServiceMessenger = (android::IBinder::FIRST_CALL_TRANSACTION + 35), TRANSACTION_getWifiStateMachineMessenger = (android::IBinder::FIRST_CALL_TRANSACTION + 36), TRANSACTION_getConfigFile = (android::IBinder::FIRST_CALL_TRANSACTION + 37), TRANSACTION_captivePortalCheckComplete = (android::IBinder::FIRST_CALL_TRANSACTION + 38), }; public: BpWifiService(const android::sp
& impl): android::BpInterface
(impl) { } void startScan(int forceActive) { android::Parcel 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
&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
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
sm = android::defaultServiceManager(); android::sp
binder; android::sp
wifi; binder = sm->getService(android::String16(WIFI_SERVICE)); if (binder == 0) { return 1; } wifi = android::interface_cast
(binder); wifi->setWifiEnabled(true); printf("+++++scan start"); wifi->startScan(1); for(int i=0;i<10;i++) { usleep(1*1000*1000); List
list; wifi->getScanResults(list); if(list.size() > 0) { for(List
::iterator it = list.begin();it != list.end();++it) { (*it).dump(); } break; } } return(0); }
基本的思路很简单:
先通过:
android::defaultServiceManager()->getService(android::String16(WIFI_SERVICE));
获取binder接口,再通过Parcel读与binder,具体的实现可以参考IWifiManager.java的代码。
编译后运行以上的代码可以得到类似以下的输出:
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 |