android softap增加WPS功能代码解析

最近阅读了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。

缘是浪漫的相遇,瞬间让你我的心化为永恒!

android softap增加WPS功能代码解析

相关文章:

你感兴趣的文章:

标签云: