最近阅读了softap增加WPS功能的源代码,,写下自己的心得体会。
1 UI
softap增加WPS功能在Settings中涉及的代码为TetherSettings.java和ApWpsDialog.java。
TetherSettings.java @Override public boolean onPreferenceTreeClick(PreferenceScreen screen, Preference preference) {if (preference == mWpsPushB) {showDialog(DIALOG_WPS_PBC);}} ApWpsDialog.java @Override protected void onStart() {mWifiManager.startWps(wpsConfig, mWpsListener); } 2 framework
WifiManager.startWps–>WifiManager.START_WPS–>WifiService–>WifiStateMachine
WifiStateMachine.java class SoftApStartedState extends State {@Overridepublic boolean processMessage(Message message) {switch(message.what) {case WifiManager.START_WPS:mSoftapMonitor.startMonitoring();WpsResult result = new WpsResult();result.status = WpsResult.Status.SUCCESS;replyToMessage(message, WifiManager.START_WPS_SUCCEEDED, result);transitionTo(mApWpsRunningState);break;}} } class ApWpsRunningState extends State {@Overridepublic boolean processMessage(Message message) {switch (message.what) {case TctSoftapMonitor.WPS_SUCCESS_EVENT:replyToMessage(mSourceMessage, WifiManager.WPS_COMPLETED);mSourceMessage.recycle();mSourceMessage = null;transitionTo(mSoftApStartedState);break;case TctSoftapMonitor.WPS_TIMEOUT_EVENT:replyToMessage(mSourceMessage, WifiManager.WPS_FAILED, WifiManager.WPS_TIMED_OUT);mSourceMessage.recycle();mSourceMessage = null;transitionTo(mSoftApStartedState);break;case CMD_TETHER_STATE_CHANGE:TetherStateChange stateChange = (TetherStateChange) message.obj;if (startTethering(stateChange.available)) {transitionTo(mTetheringState);}break;}} } 在开启softap的情况下WifiStateMachine接受到WifiManager.START_WPS进入ApWpsRunningState
接受到TctSoftapMonitor.java发送的WPS_SUCCESS_EVENT消息时表示WPS成功,会发送WPS_COMPLETED消息。
private static class ServiceHandler extends Handler {@Overridepublic void handleMessage(Message message) {switch (message.what) {case WifiManager.START_WPS_SUCCEEDED:if (listener != null) {WpsResult result = (WpsResult) message.obj;((WpsCallback) listener).onStarted(result.pin);//Listener needs to stay until completion or failuresynchronized(sListenerMapLock) {sListenerMap.put(message.arg2, listener);}}break;case WifiManager.WPS_COMPLETED:if (listener != null) {((WpsCallback) listener).onSucceeded();}break;}} } ApWpsDialog.java中的WpsListenner调用onSucceeded,updateDialog显示WPS succeeded。
3 TctSoftapMonitor.java
public void startMonitoring() {new MonitorThread().start(); } <pre class="prettyprint"><span class="kwd"> class</span><span class="pln"> </span><span class="typ">MonitorThread</span><span class="pln"> </span><span class="kwd">extends</span><span class="pln"> </span><span class="typ">Thread</span><span class="pln"> </span><span class="pun">{</span><span class="pln"> </span><span class="pln"> </span><span class="kwd"> public</span><span class="pln"> </span><span class="kwd">void</span><span class="pln"> run</span><span class="pun">()</span><span class="pln"> </span><span class="pun">{</span><span class="pln"> </span><span class="kwd">if</span><span class="pln"> </span><span class="pun">(</span><span class="pln">connectToSupplicant</span><span class="pun">())</span><span class="pln"> </span><span class="pun">{</span><span class="pln"> mWifiNative</span><span class="pun">.</span><span class="pln">startWpsPbcCommand</span><span class="pun">();</span><span class="pln"> </span><span class="pun">}</span><span class="pln"> </span><span class="pln"> </span><span class="com">//noinspection InfiniteLoopStatement</span><span class="pln"> </span><span class="kwd">for</span><span class="pln"> </span><span class="pun">(;;)</span><span class="pln"> </span><span class="pun">{</span><span class="pln"> </span><span class="typ"> String</span><span class="pln"> eventStr </span><span class="pun">=</span><span class="pln"> mWifiNative</span><span class="pun">.</span><span class="pln">waitForEvent</span><span class="pun">();</span><span class="pln"> </span><span class="pln"> </span><span class="kwd">if</span><span class="pln"> </span><span class="pun">(!</span><span class="pln">eventStr</span><span class="pun">.</span><span class="pln">startsWith</span><span class="pun">(</span><span class="pln">EVENT_PREFIX_STR</span><span class="pun">))</span><span class="pln"> </span><span class="pun">{</span><span class="pln"> </span><span class="kwd"> if</span><span class="pln"> </span><span class="pun">(</span><span class="pln">eventStr</span><span class="pun">.</span><span class="pln">startsWith</span><span class="pun">(</span><span class="pln">WPS_SUCCESS_STR</span><span class="pun">))</span><span class="pln"> </span><span class="pun">{</span><span class="pln"> </span><span class="com"> //add here</span><span class="pln"> mStateMachine</span><span class="pun">.</span><span class="pln">sendMessage</span><span class="pun">(</span><span class="pln">WPS_SUCCESS_EVENT</span><span class="pun">);</span><span class="pln"> mWifiNative</span><span class="pun">.</span><span class="pln">closeSupplicantConnection</span><span class="pun">();</span><span class="pln"> </span><span class="kwd">break</span><span class="pun">;</span><span class="pln"> </span><span class="pun">}</span><span class="pln"> </span><span class="pln"> </span><span class="kwd">continue</span><span class="pun">;</span><span class="pln"> </span><span class="pun">}</span><span class="pln"> </span><span class="pln"> </span><span class="pun">}</span><span class="pln"> </span><span class="pun">}</span><span class="pln"> </span><span class="kwd">private</span><span class="pln"> </span><span class="kwd">boolean</span><span class="pln"> connectToSupplicant</span><span class="pun">()</span><span class="pln"> </span><span class="pun">{</span><span class="pln"> </span><span class="pun"></span><span class="pln"> </span><span class="kwd">while</span><span class="pln"> </span><span class="pun">(</span><span class="kwd">true</span><span class="pun">)</span><span class="pln"> </span><span class="pun">{</span><span class="pln"> </span><span class="kwd">if</span><span class="pln"> </span><span class="pun">(</span><span class="pln">mWifiNative</span><span class="pun">.</span><span class="pln">connectTosoftap</span><span class="pun">())</span><span class="pln"> </span><span class="pun">{</span><span class="pln"> </span><span class="kwd">return</span><span class="pln"> </span><span class="kwd">true</span><span class="pun">;</span><span class="pln"> </span><span class="pun">}</span><span class="pln"> </span><span class="pln"> </span><span class="pun">}</span><span class="pln"> </span><span class="pln"> </span><span class="pun">}</span><span class="pln"> </span><span class="pun">}</span><span class="pln"></span>
4 wifi.c
WifiNative.java中的connectTosoftap调用wifi_connect_to_softap。
缘是浪漫的相遇,瞬间让你我的心化为永恒!