Android4.4(MT8685)源碼WIFI - 新聞資訊 - 雲南小程序開發|雲南軟件開發|雲南網站建設-昆明融晨信息技術有限公司

159-8711-8523

雲南網建設/小程序開發/軟件開發

知識

不(bù)管是(shì)網站,軟件還是(shì)小程序,都要(yào / yāo)直接或間接能爲(wéi / wèi)您産生價值,我們在(zài)追求其視覺表現的(de)同時(shí),更側重于(yú)功能的(de)便捷,營銷的(de)便利,運營的(de)高效,讓網站成爲(wéi / wèi)營銷工具,讓軟件能切實提升企業内部管理水平和(hé / huò)效率。優秀的(de)程序爲(wéi / wèi)後期升級提供便捷的(de)支持!

您當前位置>首頁 » 新聞資訊 » 技術分享 >

Android4.4(MT8685)源碼WIFI

發表時(shí)間:2021-1-4

發布人(rén):融晨科技

浏覽次數:71


在(zài)Android系統啓動的(de)時(shí)候,會在(zài)./frameworks/base/services/java/com/android/server/SystemServer.java類中啓動許多服務,其中和(hé / huò)Wifi相關的(de)服務就(jiù)在(zài)這(zhè)裏初始化。在(zài)SystemServer的(de)main方法中,我們可以(yǐ)看到(dào)
thr.initAndLoop();

這(zhè)裏調用了(le/liǎo)它的(de)内部類對象的(de)initAndLoop方法,在(zài)這(zhè)個(gè)方法的(de)作用主要(yào / yāo)就(jiù)是(shì)初始化系統啓動需要(yào / yāo)加載的(de)服務的(de),我們在(zài)這(zhè)個(gè)方法中可以(yǐ)找到(dào)
try {
                    Slog.i(TAG, "Wi-Fi Service");
                    wifi = new WifiService(context);
                    ServiceManager.addService(Context.WIFI_SERVICE, wifi);
                } catch (Throwable e) {
                    reportWtf("starting Wi-Fi Service", e);
                }

                try {
                    Slog.i(TAG, "Connectivity Service");
                    connectivity = new ConnectivityService(
                            context, networkManagement, networkStats, networkPolicy);
                    ServiceManager.addService(Context.CONNECTIVITY_SERVICE, connectivity);
                    networkStats.bindConnectivityManager(connectivity);
                    networkPolicy.bindConnectivityManager(connectivity);

                    wifiP2p.connectivityServiceReady();
                    wifi.checkAndStartWifi();
                } catch (Throwable e) {
                    reportWtf("starting Connectivity Service", e);
                }

這(zhè)裏我們可以(yǐ)看到(dào)初始化了(le/liǎo)一個(gè)WifiService和(hé / huò)ConnectivityService對象,并把這(zhè)2個(gè)對象注冊到(dào)ServiceManager中,然後通過創建的(de)對象wifi 來(lái)調用checkAndStartWifi方法,具體的(de)WifiService的(de)分析我們下一章再做詳細介紹,現在(zài)我們簡單分析下ConnectivityService。
ConnectivityService是(shì)管理系統中所有的(de)數據連接服務,其中就(jiù)包括Wifi,我們來(lái)看看它的(de)構造函數,路徑:./frameworks/base/services/java/com/android/server/ConnectivityService.java
public ConnectivityService(Context context, INetworkManagementService netd,
            INetworkStatsService statsService, INetworkPolicyManager policyManager) {
        // Currently, omitting a NetworkFactory will create one internally
        // TODO: create here when we have cleaner WiMAX support
        this(context, netd, statsService, policyManager, null);
    }

這(zhè)裏就(jiù)是(shì)調用了(le/liǎo)同名的(de)構造方法
public ConnectivityService(Context context, INetworkManagementService netManager,
            INetworkStatsService statsService, INetworkPolicyManager policyManager,
            NetworkFactory netFactory) {
        if (DBG) log("ConnectivityService starting up");

        HandlerThread handlerThread = new HandlerThread("ConnectivityServiceThread");
        handlerThread.start();
        mHandler = new InternalHandler(handlerThread.getLooper());
        mTrackerHandler = new NetworkStateTrackerHandler(handlerThread.getLooper());

// Create and start trackers for hard-coded networks
        for (int targetNetworkType : mPriorityList) {
            final NetworkConfig config = mNetConfigs[targetNetworkType];
            final NetworkStateTracker tracker;
            try {
                /** M: Hotspot Manager @{*/
                if(config.radio == TYPE_USB){
                    log("new UsbDataStateTracker");
                    mNetTrackers[targetNetworkType] = new UsbDataStateTracker(targetNetworkType, config.name, mNetd);
                    mNetTrackers[targetNetworkType].startMonitoring(context, mTrackerHandler);
                    continue;
                } 
                if(true == FeatureOption.MTK_ALPS_BOX_SUPPORT && config.radio == TYPE_ETHERNET){	
                    if (DBG) log("Starting Ethernet Service.");
                    mNetTrackers[TYPE_ETHERNET] = makeEthStateTracker(context);
                    if(mNetTrackers[TYPE_ETHERNET] != null){
                        if (DBG) log("mNetTrackers[TYPE_ETHERNET] != null");
                        mNetTrackers[TYPE_ETHERNET].startMonitoring(context, mTrackerHandler);
                        if (config.isDefault()) {
                            mNetTrackers[TYPE_ETHERNET].reconnect();
                        }  
                    }              
                    continue;                
                }
                /*@} */
		/*@} */
                ///M:new a Teledongle Data Tracker @by mtk94127 @{
                if(FeatureOption.MTK_EXTERNAL_DONGLE_SUPPORT && (config.radio == TYPE_TEDONGLE)) {
                    log("new TedongleDataStateTracker");
                    mNetTrackers[targetNetworkType] = makeTedongleDataTracker();
                    log("new TedongleDataStateTracker medium!");
                    mNetTrackers[targetNetworkType].startMonitoring(context, mTrackerHandler);
                    log("new TedongleDataStateTracker end!");
                    continue;
                }
                ///M:@}
                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();
            }
        }
}

這(zhè)裏根據com.android.internal.R.array.networkAttributes配置的(de)屬性去創建一個(gè)個(gè)tracker,并監聽其狀态,tracker.startMonitoring(context, mTrackerHandler);可以(yǐ)看出(chū)tracker可以(yǐ)通過mTrackerHandler向ConnectivityService發送消息,這(zhè)些消息有
 /**
     * The network state has changed and the NetworkInfo object
     * contains the new state.
     *
     * msg.what = EVENT_STATE_CHANGED
     * msg.obj = NetworkInfo object
     */
    public static final int EVENT_STATE_CHANGED = BASE_NETWORK_STATE_TRACKER;

    /**
     * msg.what = EVENT_CONFIGURATION_CHANGED
     * msg.obj = NetworkInfo object
     */
    public static final int EVENT_CONFIGURATION_CHANGED = BASE_NETWORK_STATE_TRACKER + 1;

    /**
     * msg.what = EVENT_RESTORE_DEFAULT_NETWORK
     * msg.obj = FeatureUser object
     */
    public static final int EVENT_RESTORE_DEFAULT_NETWORK = BASE_NETWORK_STATE_TRACKER + 2;

    /**
     * msg.what = EVENT_NETWORK_SUBTYPE_CHANGED
     * msg.obj = NetworkInfo object
     */
    public static final int EVENT_NETWORK_SUBTYPE_CHANGED = BASE_NETWORK_STATE_TRACKER + 3;

    /**
     * msg.what = EVENT_NETWORK_CONNECTED
     * msg.obj = LinkProperties object
     */
    public static final int EVENT_NETWORK_CONNECTED = BASE_NETWORK_STATE_TRACKER + 4;

    /**
     * msg.what = EVENT_NETWORK_CONNECTION_DISCONNECTED
     * msg.obj = LinkProperties object, same iface name
     */
    public static final int EVENT_NETWORK_DISCONNECTED = BASE_NETWORK_STATE_TRACKER + 5;

當WiFi的(de)連接AP成功後,就(jiù)會想 ConnectivityService發送一個(gè)EVENT_STATE_CHANGED消息。
接着我們來(lái)看創建了(le/liǎo)哪些tracker,找到(dào)createTracker方法
 @Override
        public NetworkStateTracker createTracker(int targetNetworkType, NetworkConfig config) {
            switch (config.radio) {
                case TYPE_WIFI:
                    return new WifiStateTracker(targetNetworkType, config.name);
                case TYPE_MOBILE:
                    return new MobileDataStateTracker(targetNetworkType, config.name);
                case TYPE_DUMMY:
                    return new DummyDataStateTracker(targetNetworkType, config.name);
                case TYPE_BLUETOOTH:
                    return BluetoothTetheringDataTracker.getInstance();
                case TYPE_WIMAX:
                    return makeWimaxStateTracker(mContext, mTrackerHandler);
                case TYPE_CSD:
                    return new CsdStateTracker(targetNetworkType, config.name);
                default:
                    throw new IllegalArgumentException(
                            "Trying to create a NetworkStateTracker for an unknown radio type: "
                            + config.radio);
            }
        }

這(zhè)裏我們主要(yào / yāo)關注TYPE_WIFI,創建了(le/liǎo)一個(gè)WifiStateTracker對象,進入到(dào)WifiStateTracker的(de)構造方法
 public WifiStateTracker(int netType, String networkName) {
        ///M:@{
        mNetType = netType;
        ///@}
        mNetworkInfo = new NetworkInfo(netType, 0, networkName, "");
        mLinkProperties = new LinkProperties();
        mLinkCapabilities = new LinkCapabilities();

        mNetworkInfo.setIsAvailable(false);
        setTeardownRequested(false);
    }

接着調用startMonitoring
 /**
     * Begin monitoring wifi connectivity
     */
    public void startMonitoring(Context context, Handler target) {
        mCsHandler = target;
        mContext = context;

        mWifiManager = (WifiManager) mContext.getSystemService(Context.WIFI_SERVICE);
        IntentFilter filter = new IntentFilter();
        ///M:seperate p2p and wifi @{
        if (mNetType == ConnectivityManager.TYPE_WIFI) {
           filter.addAction(WifiManager.NETWORK_STATE_CHANGED_ACTION);
           filter.addAction(WifiManager.LINK_CONFIGURATION_CHANGED_ACTION);
        }
        ///@}
        
        mWifiStateReceiver = new WifiStateReceiver();
        mContext.registerReceiver(mWifiStateReceiver, filter);
    }

 這(zhè)裏就(jiù)是(shì)注冊了(le/liǎo)一個(gè)廣播用于(yú)接收NETWORK_STATE_CHANGED_ACTION和(hé / huò)LINK_CONFIGURATION_CHANGED_ACTION廣播,ConnectivityService我們就(jiù)分析到(dào)這(zhè)裏,下一章我們将詳細分析WifiService。

相關案例查看更多