<ruby id="bdb3f"></ruby>

    <p id="bdb3f"><cite id="bdb3f"></cite></p>

      <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
        <p id="bdb3f"><cite id="bdb3f"></cite></p>

          <pre id="bdb3f"></pre>
          <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

          <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
          <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

          <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                <ruby id="bdb3f"></ruby>

                ThinkChat2.0新版上線,更智能更精彩,支持會話、畫圖、視頻、閱讀、搜索等,送10W Token,即刻開啟你的AI之旅 廣告
                **1、WifiWatchdogStateMachine介紹** WifiWatchdogStateMachine用于監控無線網絡的信號質量,它在WifiService的checkAndStartWifi函數中被創建,其創建函數是makeWifiWatchdogStateMachine,代碼如下所示: **WifiWatchdogStateMachine.java::makeWifiWatchdogStateMachine** ~~~ public static WifiWatchdogStateMachine makeWifiWatchdogStateMachine(Context context) { ContentResolver contentResolver = context.getContentResolver(); ConnectivityManager cm = (ConnectivityManager) context.getSystemService( Context.CONNECTIVITY_SERVICE); //判斷手機是否只支持Wifi。很顯然,對于大部分手機來說,sWifiOnly為false sWifiOnly = (cm.isNetworkSupported(ConnectivityManager.TYPE_MOBILE) == false); //WIFI_WATCHDOG_ON功能默認是打開的 putSettingsGlobalBoolean(contentResolver, Settings.Global.WIFI_WATCHDOG_ON, true); //創建一個WifiWatchdogStateMachine對象,它也是一個HSM WifiWatchdogStateMachine wwsm = new WifiWatchdogStateMachine(context); wwsm.start();//啟動HSM return wwsm; } ~~~ 先來看WifiWatchdogStateMachine的初始化流程。 **①、WifiWatchdogStateMachine構造函數分析** **WifiWatchdogStateMachine.java::WifiWatchdogStateMachine** ~~~ private WifiWatchdogStateMachine(Context context) { super(TAG); mContext = context; mContentResolver = context.getContentResolver(); mWifiManager = (WifiManager) context.getSystemService(Context.WIFI_SERVICE); //mWsmChannel用于和WifiStateMachine交互 mWsmChannel.connectSync(mContext, getHandler(), mWifiManager.getWifiStateMachineMessenger()); //關鍵函數:setupNetworkReceiver將創建一個廣播接收對象,用于接收NETWORK_STATE_CHANGED_ACTION、 // WIFI_STATE_CHANGED_ACTION、RSSI_CHANGED_ACTION、SUPPLICANT_STATE_CHANGED_ACTION等廣播 setupNetworkReceiver(); //監控Wifi Watchdog設置的變化情況 registerForSettingsChanges(); registerForWatchdogToggle(); addState(mDefaultState); ......//添加狀態,一共有9個狀態。如圖5-7所示 //Wifi Watchdog默認是開啟的,故狀態機轉入NotConnectedState狀態 if (isWatchdogEnabled()) setInitialState(mNotConnectedState); else setInitialState(mWatchdogDisabledState); updateSettings(); } ~~~ 上面代碼中,WifiWatchdogStateMachine的初始狀態是NotConnectedState。不過這個狀態僅實現了enter函數,而且該函數中僅實現了一句打印輸出的代碼。所以NotConnectedState是一個象征意義遠大于實際作用的類。 圖5-7所示為WifiWatchdogStateMachine中的各個狀態及層級關系: :-: ![](http://img.blog.csdn.net/20140309210929406?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvSW5ub3N0/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast) 圖5-7 WifiWatchdogStateMachine狀態及層級關系 WifiWatchdogStateMachine完全靠廣播事件來驅動。相關代碼在setupNetworkReceiver函數中。 **WifiWatchdogStateMachine.java::setupNetworkReceiver** ~~~ private void setupNetworkReceiver() { mBroadcastReceiver = new BroadcastReceiver() { public void onReceive(Context context, Intent intent) { String action = intent.getAction(); if (action.equals(WifiManager.RSSI_CHANGED_ACTION)) { obtainMessage(EVENT_RSSI_CHANGE, intent.getIntExtra(WifiManager.EXTRA_NEW_RSSI, -200), 0).sendToTarget(); } else if (action.equals(WifiManager.SUPPLICANT_STATE_CHANGED_ACTION)) { sendMessage(EVENT_SUPPLICANT_STATE_CHANGE, intent); } else if (action.equals(WifiManager.NETWORK_STATE_CHANGED_ACTION)) { sendMessage(EVENT_NETWORK_STATE_CHANGE, intent); } ...... else if (action.equals(WifiManager.WIFI_STATE_CHANGED_ACTION)) sendMessage(EVENT_WIFI_RADIO_STATE_CHANGE,intent.getIntExtra( WifiManager.EXTRA_WIFI_STATE, WifiManager.WIFI_STATE_UNKNOWN)); } }; mIntentFilter = new IntentFilter(); mIntentFilter.addAction(WifiManager.NETWORK_STATE_CHANGED_ACTION); ......//添加感興趣的廣播事件類型 mContext.registerReceiver(mBroadcastReceiver, mIntentFilter); } ~~~ 在前面介紹的WifiService工作流程中,SUPPLICANT_STATE_CHANGED_ACTION和NETWORK_STATE_CHANGED_ACTION廣播發送的次數非常頻繁。所以,WifiWatchdogStateMachine也不會太清閑。 下面,我們直接從WifiStateMachine在VerifyingLinkState的enter函數中發送的NETWORK_STATE_CHANGED_ACTION廣播開始分析WifiWatchdogStateMachine的處理流程。 **②、EVENT_NETWORK_STATE_CHANGE處理流程分析** 該消息被NotConnectedState的父狀態WatchdogEnabledState處理,相關代碼如下所示: **WifiWatchdogStateMachine.java::WatchdogEnabledState:processMessage** ~~~ public boolean processMessage(Message msg) { Intent intent; switch (msg.what) { ...... case EVENT_NETWORK_STATE_CHANGE: intent = (Intent) msg.obj; NetworkInfo networkInfo = (NetworkInfo) intent.getParcelableExtra( WifiManager.EXTRA_NETWORK_INFO); mWifiInfo = (WifiInfo) intent.getParcelableExtra(WifiManager.EXTRA_WIFI_INFO); //更新bssid信息 updateCurrentBssid(mWifiInfo != null ? mWifiInfo.getBSSID() : null); switch (networkInfo.getDetailedState()) { case VERIFYING_POOR_LINK://WifiStateMachine在VerifyingLinkState中設置的狀態 mLinkProperties = (LinkProperties) intent.getParcelableExtra( WifiManager.EXTRA_LINK_PROPERTIES); //mPoorNetworkDetectionEnabled用于判斷是否需要監控AP的信號質量 if (mPoorNetworkDetectionEnabled) { if (mWifiInfo == null || mCurrentBssid == null) { //下面這個函數將通過mWsmChannel向WifiStateMachine發送 //GOOD_LINK_DETECTED消息 sendLinkStatusNotification(true); } else transitionTo(mVerifyingLinkState);//進入VerifyingLinkState } else sendLinkStatusNotification(true); break; case CONNECTED://WifiStateMachine在ConnectedState中設置的狀態,請讀者自行分析 //OnlineWatchState的處理流程 transitionTo(mOnlineWatchState); } ....... } return HANDLED; } ~~~ 如果WifiWatchdogStateMachine開啟了無線網絡信號質量監控的話,它將轉入VerifyingLinkState,其enter函數如下所示: **WifiWatchdogStateMachine.java::VerifyingLinkState:enter** ~~~ public void enter() { mSampleCount = 0; mCurrentBssid.newLinkDetected(); //向自己發送CMD_RSSI_FETCH消息 sendMessage(obtainMessage(CMD_RSSI_FETCH, ++mRssiFetchToken, 0)); } ~~~ 來看CMD_RSSI_FETCH消息的處理。 **③、CMD_RSSI_FETCH處理流程分析** **WifiWatchdogStateMachine.java::VerifyingLinkState:processMessage** ~~~ public boolean processMessage(Message msg) { switch (msg.what) { ...... case CMD_RSSI_FETCH: if (msg.arg1 == mRssiFetchToken) { /* 向WifiStateMachine發送RSSI_PKTCNT_FETCH消息,WifiStateMachine的處理過程 就是調用WifiNative的signalPoll和pktcntPoll以獲取RSSI、LinkSpeed、發送 Packet的總個數、發送失敗的Packet總個數。注意,4.2中的WPAS才支持pktcntPoll。 WifiStateMachine處理完RSSI_PKTCNT_FETCH后將回復RSSI_PKTCNT_FETCH_SUCCEEDED 消息給WifiWatchdogStateMachine */ mWsmChannel.sendMessage(WifiManager.RSSI_PKTCNT_FETCH); //LINK_SAMPLING_INTERVAL_MS值為1000ms sendMessageDelayed(obtainMessage(CMD_RSSI_FETCH, ++mRssiFetchToken, 0), LINK_SAMPLING_INTERVAL_MS); } break; case WifiManager.RSSI_PKTCNT_FETCH_SUCCEEDED: //WifiStateMachine回復的消息中攜帶一個RssiPacketCountInfo對象 RssiPacketCountInfo info = (RssiPacketCountInfo) msg.obj; int rssi = info.rssi; /* WifiWatchdog用了一個名為指數加權移動平均算法(Volume-weighted Exponential Moving Average)的方法來辨別網絡信號質量的好壞。本書不擬對它進行討論,感興趣的讀者不妨 自行研究 */ long time = mCurrentBssid.mBssidAvoidTimeMax - SystemClock.elapsedRealtime(); //假設網絡質量很好,則調用sendLinkStateNotification以發送GOOD_LINK_DETECT消息給 //WifiStateMachine if (time <= 0) sendLinkStatusNotification(true); else { //此時的rssi好于某個閾值。mGoodLinkTargetRssi由算法計算得來 if (rssi >= mCurrentBssid.mGoodLinkTargetRssi) { //當采樣次數大于一定值時,才認為網絡狀態變好。mGoodLinkTargetCount也是通過 //相關方法計算得來 if (++mSampleCount >= mCurrentBssid.mGoodLinkTargetCount) { mCurrentBssid.mBssidAvoidTimeMax = 0; sendLinkStatusNotification(true); } } else mSampleCount = 0; } break; ...... } return HANDLED; } ~~~ 當WifiWatchdogStateMachine檢測到Pool link時,它將發送POOL_LINK_DETECT消息給WifiStateMachine去處理。相關流程請感興趣的讀者自行研究。 WifiWatchdogStateMachine是一個比較有趣的模塊。其目的很簡單,就是監測無線網絡的信號質量,然后做相應動作。另外,WifiWatchdogStateMachine還使用了一些比較高級的算法來判斷網絡信號質量的好壞,感興趣的讀者不妨進行一番深入研究。
                  <ruby id="bdb3f"></ruby>

                  <p id="bdb3f"><cite id="bdb3f"></cite></p>

                    <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
                      <p id="bdb3f"><cite id="bdb3f"></cite></p>

                        <pre id="bdb3f"></pre>
                        <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

                        <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
                        <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

                        <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                              <ruby id="bdb3f"></ruby>

                              哎呀哎呀视频在线观看