最近在学习Android WiFi framework的相关知识,这里总结以下。WiFi framework的内容大致可以分为以下几个模块:
1. WiFi相关内容
2.WiFi P2P相关内容
3.Hotspot相关内容
4.WiFi Display相关内容
后面就将从这四个方面一一介绍。
try{ Slog.i(TAG,"Wi-Fi P2pService"); wifiP2p=newWifiP2pService(context); ServiceManager.addService(Context.WIFI_P2P_SERVICE, wifiP2p); }catch(Throwable e){ reportWtf("starting Wi-Fi P2pService", e); } try{ Slog.i(TAG,"Wi-Fi Service"); wifi=newWifiService(context); ServiceManager.addService(Context.WIFI_SERVICE, wifi); }catch(Throwable e){ reportWtf("starting Wi-Fi Service", e); } try{ Slog.i(TAG,"Connectivity Service"); connectivity=newConnectivityService( context, networkManagement, networkStats, networkPolicy); ServiceManager.addService(Context.CONNECTIVITY_SERVICE, connectivity); networkStats.bindConnectivityManager(connectivity); networkPolicy.bindConnectivityManager(connectivity); wifi.checkAndStartWifi(); wifiP2p.connectivityServiceReady(); }catch(Throwable e){ reportWtf("starting Connectivity Service", e); }
WifiService(Context context){ mContext= context; mInterfaceName= SystemProperties.get("wifi.interface","wlan0"); mWifiStateMachine=newWifiStateMachine(mContext, mInterfaceName); ....... HandlerThread wifiThread=newHandlerThread("WifiService"); wifiThread.start(); mAsyncServiceHandler=newAsyncServiceHandler(wifiThread.getLooper()); mWifiStateMachineHandler=newWifiStateMachineHandler(wifiThread.getLooper()); mWifiController=newWifiController(mContext, this,wifiThread.getLooper()); ....... }
publicConnectivityService(Context context,INetworkManagementService netManager, INetworkStatsService statsService,INetworkPolicyManager policyManager, NetworkFactory netFactory){ if(DBG) log("ConnectivityService starting up"); HandlerThread handlerThread=newHandlerThread("ConnectivityServiceThread"); handlerThread.start(); mHandler=newInternalHandler(handlerThread.getLooper()); mTrackerHandler=newNetworkStateTrackerHandler(handlerThread.getLooper()); ....... // Create and start trackers for hard-coded networks for(int targetNetworkType: mPriorityList){ finalNetworkConfig config= mNetConfigs[targetNetworkType]; finalNetworkStateTracker tracker; try{ tracker= netFactory.createTracker(targetNetworkType, config); mNetTrackers[targetNetworkType]= tracker; }catch(IllegalArgumentException e){ Slog.e(TAG,"Problem creating "+ getNetworkTypeName(targetNetworkType) +" tracker: "+ e); continue; } tracker.startMonitoring(context, mTrackerHandler); if(config.isDefault()){ tracker.reconnect(); } }
NetworkStateTracker.EVENT_STATE_CHANGED NetworkStateTracker.EVENT_CONFIGURATION_CHANGED NetworkStateTracker.EVENT_NETWORK_SUBTYPE_CHANGED
publicNetworkStateTracker createTracker(int targetNetworkType,NetworkConfig config){ switch(config.radio){ case TYPE_WIFI: returnnewWifiStateTracker(targetNetworkType, config.name); case TYPE_MOBILE: returnnewMobileDataStateTracker(targetNetworkType, config.name); case TYPE_DUMMY: returnnewDummyDataStateTracker(targetNetworkType, config.name); case TYPE_BLUETOOTH: returnBluetoothTetheringDataTracker.getInstance(); case TYPE_WIMAX: return makeWimaxStateTracker(mContext, mTrackerHandler); case TYPE_ETHERNET: returnEthernetDataTracker.getInstance(); default: thrownewIllegalArgumentException( "Trying to create a NetworkStateTracker for an unknown radio type: " + config.radio); } } }
publicWifiStateTracker(int netType,String networkName){ mNetworkInfo=newNetworkInfo(netType,0, networkName,""); mLinkProperties=newLinkProperties(); mLinkCapabilities=newLinkCapabilities(); mNetworkInfo.setIsAvailable(false); setTeardownRequested(false); } publicvoid startMonitoring(Context context,Handler target){ mCsHandler= target; mContext= context; mWifiManager=(WifiManager) mContext.getSystemService(Context.WIFI_SERVICE); IntentFilter filter=newIntentFilter(); filter.addAction(WifiManager.NETWORK_STATE_CHANGED_ACTION); filter.addAction(WifiManager.LINK_CONFIGURATION_CHANGED_ACTION); mWifiStateReceiver=newWifiStateReceiver(); mContext.registerReceiver(mWifiStateReceiver, filter); }
publicvoid checkAndStartWifi(){ boolean wifiEnabled= mSettingStore.isWifiToggleEnabled(); Slog.i(TAG,"WifiService starting up with Wi-Fi "+ (wifiEnabled?"enabled":"disabled")); // If we are already disabled (could be due to airplane mode), avoid changing persist // state here if(wifiEnabled) setWifiEnabled(wifiEnabled); mWifiWatchdogStateMachine=WifiWatchdogStateMachine. makeWifiWatchdogStateMachine(mContext); }