1. 程式人生 > >android 設定wifi SSID和MAC地址的繫結

android 設定wifi SSID和MAC地址的繫結

1)新增SSID名稱後,WIFI列表僅能連線該設定的SSID AP

2)    SSID並啟用後,PDA只連線同名SSID的AP,其他連線不上;
3)    MAC地址的應用場景和SSID類同,為避免非法AP設定成我們相同的SSID騙取連線,設定MAC
地址或範圍並啟用後,只有和預置MAC地址匹配的AP才能連線上;

以下就是實現新增SSID和MAC後限制wifi的連線:

package com.android.settings.wifi;

public class WifiSettings extends RestrictedSettingsFragment
        implements DialogInterface.OnClickListener, Indexable, WifiTracker.WifiListener,
        AccessPointListener {
    //定義訪問資料庫的一些變數

    private static final String AUTHORITY="com.android.setting.wifi.provider.wifissidprovider";
    private static final String AUTHORITY_MAC="com.android.setting.wifi.provider.wifimacprovider";
    private static final Uri SSID_CONTENT_URI=Uri.parse("content://"+AUTHORITY);
    private static final Uri MAC_CONTENT_URI=Uri.parse("content://"+AUTHORITY_MAC);
    private List<WifiSsidMac> listSsidMacs;

    @Override
    public void onCreate(Bundle icicle) {
        //初始化list
        listSsidMacs=new ArrayList<WifiSettings.WifiSsidMac>();
    }

    //查詢wifi ssid資料
    private void getWifiSsidData(){
    listSsidMacs.clear();
   Cursor cursor = getContentResolver().query(SSID_CONTENT_URI, new String[]{"rowid as _id","name","status"}, null, null, null);
    if(cursor!=null){
    if(cursor.moveToFirst()){
    WifiSsidMac bean=null;
    do{
          bean=new WifiSsidMac();
          bean.setSsidid(cursor.getInt(0));
          bean.setName(cursor.getString(1));
          bean.setStatus(cursor.getInt(2));
          listSsidMacs.add(bean);
    } while(cursor.moveToNext());
  }
  cursor.close();
 }
}
    
   //查詢wifi mac資料

    private void getWifiMacData(){
Cursor cursor = getContentResolver().query(MAC_CONTENT_URI, new String[]{"rowid as _id","name","status"}, null, null, null);
if(cursor!=null){
if(cursor.moveToFirst()){
WifiSsidMac bean=null;
do{
bean=new WifiSsidMac();
bean.setMacid(cursor.getInt(0));
bean.setName(cursor.getString(1));
bean.setStatus(cursor.getInt(2));
listSsidMacs.add(bean);
} while(cursor.moveToNext());
}
cursor.close();
}
}
    //宣告ssid mac物件
    private class WifiSsidMac{
    private int ssidid;
    private int macid;
    private String name;
    private int status;
public int getSsidid() {
return ssidid;
}
public void setSsidid(int ssidid) {
this.ssidid = ssidid;
}
public int getMacid() {
return macid;
}
public void setMacid(int macid) {
this.macid = macid;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getStatus() {
return status;
}
public void setStatus(int status) {
this.status = status;
}
@Override
public String toString() {
return "WifiSsidMac [ssidid=" + ssidid + ", macid=" + macid + ", name=" + name + ", status=" + status + "]";
}
    }
    
    @Override
    public void onActivityCreated(Bundle savedInstanceState) {
        super.onActivityCreated(savedInstanceState);
        //獲取wifi管理器
        mWifiTracker =
                new WifiTracker(getActivity(), this, mBgThread.getLooper(), true, true, false);
        mWifiManager = mWifiTracker.getManager();
        。。。
        //獲取重新整理wifi列表
        if (intent.hasExtra(EXTRA_START_CONNECT_SSID)) {
            onAccessPointsChanged();
        }
    }

    //開始搜尋wifi
    @Override
    public void onResume() {
        mWifiTracker.startTracking();
    }

    //連線wifi
    private void accessPointConnect(){
    if (mSelectedAccessPoint.isSaved()) {
            connect(mSelectedAccessPoint.getConfig());
        } else if (mSelectedAccessPoint.getSecurity() == AccessPoint.SECURITY_NONE) {
            /** Bypass dialog for unsecured networks */
            mSelectedAccessPoint.generateOpenNetworkConfig();
            connect(mSelectedAccessPoint.getConfig());
        } else {
            mDlgModify = false;
            showDialog(mSelectedAccessPoint, true);
        }

    }

    //處理點選選單項做wifi連線操作
    @Override
    public boolean onContextItemSelected(MenuItem item) {
        if (mSelectedAccessPoint == null) {
            return super.onContextItemSelected(item);
        }
        switch (item.getItemId()) {
            case MENU_ID_CONNECT: {
            if(true){
            if(mSelectedAccessPoint.isSsidBinding() ||mSelectedAccessPoint.isMacBinding()){
            accessPointConnect();
                } else{
                Toast.makeText(getActivity(), getString(R.string.wifi_disconnected), Toast.LENGTH_SHORT).show();
                }
            } else{
            accessPointConnect();
            }
                return true;
            }
            case MENU_ID_FORGET: {
                forget();
                return true;
            }
        }
        return super.onContextItemSelected(item);
    }


    //點選項彈出框做連線操作
    @Override
    public boolean onPreferenceTreeClick(PreferenceScreen screen, Preference preference) {
        if (preference instanceof AccessPointPreference) {
            mSelectedAccessPoint = ((AccessPointPreference) preference).getAccessPoint();
            if(true){
          //如果ssid和mac繫結才可以點選
           if(mSelectedAccessPoint.isSsidBinding() || mSelectedAccessPoint.isMacBinding()){
            onPreferenceTreeClick();
          } else{
          Toast.makeText(getActivity(), getString(R.string.wifi_disconnected), Toast.LENGTH_SHORT).show();
          }
            } else{
            onPreferenceTreeClick();
            }
        } else {
            return super.onPreferenceTreeClick(screen, preference);
        }
        return true;
    }
    
    private void onPreferenceTreeClick(){
    /** Bypass dialog for unsecured, unsaved, and inactive networks */
        if (mSelectedAccessPoint.getSecurity() == AccessPoint.SECURITY_NONE &&
                !mSelectedAccessPoint.isSaved() && !mSelectedAccessPoint.isActive()) {
            /// M: support open ap wps test @{
            if (FeatureOption.MTK_OPEN_AP_WPS_SUPPORT
                && mSelectedAccessPoint.getWpsAvailable()) {
                showDialog(mSelectedAccessPoint, false);
            } else {
            /// @}
                mSelectedAccessPoint.generateOpenNetworkConfig();
                if (!savedNetworksExist) {
                    savedNetworksExist = true;
                    getActivity().invalidateOptionsMenu();
                }
                connect(mSelectedAccessPoint.getConfig());
            }
        } else if (mSelectedAccessPoint.isSaved()){
            mDlgModify = false;
            showDialog(mSelectedAccessPoint, false);
        } else {
            mDlgModify = false;
            showDialog(mSelectedAccessPoint, true);
        }
    }


    private void showDialog(AccessPoint accessPoint, boolean edit) {
        if (accessPoint != null) {
            WifiConfiguration config = accessPoint.getConfig();
            if (isEditabilityLockedDown(getActivity(), config) && accessPoint.isActive()) {
                final int userId = UserHandle.getUserId(config.creatorUid);
                final PackageManager pm = getActivity().getPackageManager();
                final IPackageManager ipm = AppGlobals.getPackageManager();
                String appName = pm.getNameForUid(config.creatorUid);
                try {
                    final ApplicationInfo appInfo = ipm.getApplicationInfo(appName, /* flags */ 0,
                            userId);
                    final CharSequence label = pm.getApplicationLabel(appInfo);
                    if (label != null) {
                        appName = label.toString();
                    }
                } catch (RemoteException e) {
                    // leave appName as packageName
                }
                final AlertDialog.Builder builder = new AlertDialog.Builder(getActivity());
                builder.setTitle(accessPoint.getSsid())
                        .setMessage(getString(R.string.wifi_alert_lockdown_by_device_owner,
                                appName))
                        .setPositiveButton(android.R.string.ok, null)
                        .show();
                return;
            }
        }


        if (mDialog != null) {
            removeDialog(WIFI_DIALOG_ID);
            mDialog = null;
        }

        // Save the access point and edit mode
        mDlgAccessPoint = accessPoint;
        mDlgEdit = edit;

        showDialog(WIFI_DIALOG_ID);
    }

    @Override
    public Dialog onCreateDialog(int dialogId) {
        switch (dialogId) {
            case WIFI_DIALOG_ID:
                AccessPoint ap = mDlgAccessPoint; // For manual launch
                if (ap == null) { // For re-launch from saved state
                    if (mAccessPointSavedState != null) {
                        ap = new AccessPoint(getActivity(), mAccessPointSavedState);
                        // For repeated orientation changes
                        mDlgAccessPoint = ap;
                        // Reset the saved access point data
                        mAccessPointSavedState = null;
                    }
                }
                // If it's null, fine, it's for Add Network
                mSelectedAccessPoint = ap;
                ///M: add mtk feature
                if (mSelectedAccessPoint != null) {
                    mWifiSettingsExt.recordPriority(mSelectedAccessPoint.getConfig());
                }
                final boolean hideForget = (ap == null || isEditabilityLockedDown(getActivity(),
                        ap.getConfig()));
                mDialog = new WifiDialog(getActivity(), this, ap, mDlgEdit,
                        mDlgModify, /* no hide submit/connect */ false,
                        /* hide forget if config locked down */ hideForget);
                return mDialog;
            case WPS_PBC_DIALOG_ID:
                return new WpsDialog(getActivity(), WpsInfo.PBC);
            case WPS_PIN_DIALOG_ID:
                return new WpsDialog(getActivity(), WpsInfo.DISPLAY);
            case WRITE_NFC_DIALOG_ID:
                if (mSelectedAccessPoint != null) {
                    mWifiToNfcDialog = new WriteWifiConfigToNfcDialog(
                            getActivity(), mSelectedAccessPoint.getConfig().networkId,
                            mSelectedAccessPoint.getSecurity(),
                            mWifiManager);
                } else if (mWifiNfcDialogSavedState != null) {
                    mWifiToNfcDialog = new WriteWifiConfigToNfcDialog(
                            getActivity(), mWifiNfcDialogSavedState, mWifiManager);
                }

                return mWifiToNfcDialog;
        }
        return super.onCreateDialog(dialogId);
    }

    /**
     * Shows the latest access points available with supplemental information like
     * the strength of network and the security for it.
     */
    @Override
    public void onAccessPointsChanged() {
        // Safeguard from some delayed event handling
        if (getActivity() == null) return;
        if (isUiRestricted()) {
            addMessagePreference(R.string.wifi_empty_list_user_restricted);
            return;
        }
        final int wifiState = mWifiManager.getWifiState();

        switch (wifiState) {
            case WifiManager.WIFI_STATE_ENABLED:
            //獲取wifi列表
            List<ScanResult> listScanResult=null;
            if(true){
            getWifiSsidData();
                     getWifiMacData();
                     listScanResult= mWifiManager.getScanResults();
                     Log.i("chensenquan", "wifi listSsidMacs count:"+listSsidMacs.size());
                     Log.i("chensenquan", "wifi listScanResult count:"+listScanResult.size());
            }

                // AccessPoints are automatically sorted with TreeSet.
                final Collection<AccessPoint> accessPoints =
                        mWifiTracker.getAccessPoints();
                //getPreferenceScreen().removeAll();
                mWifiSettingsExt.emptyCategory(getPreferenceScreen());

                boolean hasAvailableAccessPoints = false;
                /// M: add ap to screen @{
                Log.d(TAG, "accessPoints.size() = "  + accessPoints.size());
                int index = 0;
                for (AccessPoint accessPoint : accessPoints) {
                    // Ignore access points that are out of range.
                    if (accessPoint.getLevel() != -1) {
                        hasAvailableAccessPoints = true;
                        if (accessPoint.getTag() != null) {
                            final Preference pref = (Preference) accessPoint.getTag();
                            pref.setOrder(index++);
                            //getPreferenceScreen().addPreference(pref);
                            mWifiSettingsExt.addPreference(getPreferenceScreen(),
                                pref, accessPoint.getConfig() != null);
                            continue;
                        }
                        
                        //設定上報的BSSID(mac地址)
                        //注意:當沒有連線wifi時getBSSID()是有值的,連線之後上報的BSSID為空,
                        所有要通過mWifiManager.getScanResults()獲取BSSID來設定accessPoint.setBSSID()

                       if(true){

                                for(ScanResult scanResult:listScanResult){

                                      if(scanResult.SSID.equals(accessPoint.getSsid().toString())){

                                               Log.i("chensenquan", "wifi scanResult ssid name:"+scanResult.SSID);

                                               accessPoint.setBSSID(scanResult.BSSID);

                                         } 

                                  } 

                                 setBindingSSIDMAC(accessPoint);

                        }  

                       //這個類繫結wifi每項詳細資訊,利用它來做的連線
                        AccessPointPreference preference = new AccessPointPreference(accessPoint,
                                getActivity(), mUserBadgeCache, false);
                        preference.setOrder(index++);
...
                    }
                }
        }
    }
    
   //繫結SSID和MAC
    private void setBindingSSIDMAC(AccessPoint accessPoint){
    String mac=accessPoint.getBSSID();
    accessPoint.setWifiMacAddress(mac);
    Log.i("chensenquan", "wifi mac:"+mac);
    for(WifiSsidMac bean:listSsidMacs){//listSsidMacs是通過新增ssid和mac從資料庫中獲取到的
        //比較相同的ssid來繫結
        if(bean.getName().equals(accessPoint.getSsid().toString())){
        Log.i("chensenquan", "same wifi ssid:"+bean.getSsidid());
        if(bean.getStatus()==1){
         Log.i("chensenquan", "binding wifi ssid status:"+bean.getStatus());
          accessPoint.setSsidBinding(true);
    }
         accessPoint.setWifiSsidid(bean.getSsidid());
 } else {
if(bean.getName().equals(mac)){
  //比較相同的mac來繫結
  Log.i("chensenquan", "same wifi macid:"+bean.getMacid());
  if(bean.getStatus()==1){
  Log.i("chensenquan", "binding wifi mac status:"+bean.getStatus());
      accessPoint.setMacBinding(true);
  }
  accessPoint.setWifiMacid(bean.getMacid());
}
}
}
        
        //如果ssid和mac沒有繫結,就端開連線
        if(accessPoint.getNetworkInfo()!=null){
        boolean isConnected=accessPoint.getNetworkInfo().isConnected();
        Log.i("chensenquan", "is connected:"+isConnected);
        if(isConnected && !accessPoint.isSsidBinding() && !accessPoint.isMacBinding()){
        Log.i("chensenquan", "disConnected");
        disconnectWifi(accessPoint);
        }
        }
    }
    
    /**
     * 斷開當前連線的網路
     */

    public void disconnectWifi(AccessPoint accessPoint) {
        int netId = accessPoint.getConfig().networkId;
        mWifiManager.disableNetwork(netId);
        mWifiManager.disconnect();
    }


    //輸入密碼後做連線
    @Override
    public void onClick(DialogInterface dialogInterface, int button) {
        if (button == WifiDialog.BUTTON_FORGET && mSelectedAccessPoint != null) {
            forget();
        } else if (button == WifiDialog.BUTTON_SUBMIT) {
            if (mDialog != null) {
                submit(mDialog.getController());
            }
        }
    }

    /* package */ void submit(WifiConfigController configController) {
        final WifiConfiguration config = configController.getConfig();
        Log.d(TAG, "submit, config = " + config);
        ///M: add mtk feature
        if (mSelectedAccessPoint != null) {
            mWifiSettingsExt.submit(config, mSelectedAccessPoint,
                mSelectedAccessPoint.getNetworkInfo() != null ?
                mSelectedAccessPoint.getNetworkInfo().getDetailedState() : null);
        }

        if (config == null) {
            if (mSelectedAccessPoint != null
                    && mSelectedAccessPoint.isSaved()) {
                connect(mSelectedAccessPoint.getConfig());
            }
        } else if (configController.isModify()) {
            mWifiManager.save(config, mSaveListener);
        } else {
            mWifiManager.save(config, mSaveListener);
            if (mSelectedAccessPoint != null) { // Not an "Add network"
                connect(config);
            }
        }

        mWifiTracker.resumeScanning();

    }

    //斷開連線,取消儲存
    /* package */ void forget() {
        MetricsLogger.action(getActivity(), MetricsLogger.ACTION_WIFI_FORGET);
        if (!mSelectedAccessPoint.isSaved()) {
            if (mSelectedAccessPoint.getNetworkInfo() != null &&
                    mSelectedAccessPoint.getNetworkInfo().getState() != State.DISCONNECTED) {
                // Network is active but has no network ID - must be ephemeral.
                mWifiManager.disableEphemeralNetwork(
                        AccessPoint.convertToQuotedString(mSelectedAccessPoint.getSsidStr()));
            } else {
                // Should not happen, but a monkey seems to trigger it
                Log.e(TAG, "Failed to forget invalid network " + mSelectedAccessPoint.getConfig());
                return;
            }
        } else {
            mWifiManager.forget(mSelectedAccessPoint.getConfig().networkId, mForgetListener);
        }

        mWifiTracker.resumeScanning();

        // We need to rename/replace "Next" button in wifi setup context.
        changeNextButtonState(false);

        /// M: since we lost a configured AP, left ones priority need to be refreshed
        mWifiSettingsExt.updatePriority();
    }

    //連線
    protected void connect(final WifiConfiguration config) {
        MetricsLogger.action(getActivity(), MetricsLogger.ACTION_WIFI_CONNECT);
        mWifiManager.connect(config, mConnectListener);
    }

    protected void connect(final int networkId) {
        MetricsLogger.action(getActivity(), MetricsLogger.ACTION_WIFI_CONNECT);
        mWifiManager.connect(networkId, mConnectListener);
    }

    /**
     * Refreshes acccess points and ask Wifi module to scan networks again.
     */
    /* package */ void refreshAccessPoints() {
        mWifiTracker.resumeScanning();

        //getPreferenceScreen().removeAll();
        mWifiSettingsExt.emptyCategory(getPreferenceScreen());
    }

    /**
     * Called when "add network" button is pressed.
     */
    /* package */ void onAddNetworkPressed() {
        MetricsLogger.action(getActivity(), MetricsLogger.ACTION_WIFI_ADD_NETWORK);
        // No exact access point is selected.
        mSelectedAccessPoint = null;
        showDialog(null, true);
    }

    /* package */ int getAccessPointsCount() {
        final boolean wifiIsEnabled = mWifiTracker.isWifiEnabled();
        if (wifiIsEnabled) {
            return getPreferenceScreen().getPreferenceCount();
        } else {
            return 0;
        }
    }

    /**
     * Requests wifi module to pause wifi scan. May be ignored when the module is disabled.
     */
    /* package */ void pauseWifiScan() {
        mWifiTracker.pauseScanning();
    }
    /**
     * Requests wifi module to resume wifi scan. May be ignored when the module is disabled.
     */
    /* package */ void resumeWifiScan() {
        mWifiTracker.resumeScanning();
    }

    /**
     * Called when "add network" button in wifi gprs selected is pressed.
     */
    public void addNetworkForSelector() {
        MetricsLogger.action(getActivity(), MetricsLogger.ACTION_WIFI_ADD_NETWORK);
        // No exact access point is selected.
        mSelectedAccessPoint = null;
        showDialog(null, true);
    }

}

這個類是顯示wifi每項的佈局
package com.android.settings.wifi;

import com.android.settings.R;
import com.android.settingslib.wifi.AccessPoint;

public class AccessPointPreference extends Preference {
    public AccessPointPreference(AccessPoint accessPoint, Context context, UserBadgeCache cache,
                                 boolean forSavedNetworks) {
        super(context);
      //如果ssid和mac繫結顯示其繫結後的圖示,加布局顯示
        setWidgetLayoutResource(R.layout.wifi_binding_image);
    }

    public AccessPoint getAccessPoint() {
        return mAccessPoint;
    }


    @Override
    protected void onBindView(View view) {
        super.onBindView(view);
。。。。。。
        view.setContentDescription(mContentDescription);
        //控制其ssid和mac繫結的圖示顯示
        ImageView iv_mac=(ImageView)view.findViewById(R.id.iv_mac);
        ImageView iv_ssid=(ImageView)view.findViewById(R.id.iv_ssid);
        if(mAccessPoint.isSsidBinding() && mAccessPoint.isMacBinding()){
        iv_ssid.setVisibility(View.VISIBLE);
        iv_mac.setVisibility(View.VISIBLE);
        } else  if(mAccessPoint.isSsidBinding()){
        iv_mac.setVisibility(View.GONE);
        } else if(mAccessPoint.isMacBinding()){
        iv_ssid.setVisibility(View.GONE);
        }  else{
        iv_ssid.setVisibility(View.GONE);
        iv_mac.setVisibility(View.GONE);
        }

    }
    。。。。。。

}

這個類是wifi每項的詳細資訊
位置:MT6750M/frameworks/base/packages/SettingsLib/src/com/android/settingslib/wifi
/*
 * Copyright (C) 2015 The Android Open Source Project
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *      http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */


package com.android.settingslib.wifi;
。。。。。。
import com.android.settingslib.R;
public class AccessPoint implements Comparable<AccessPoint>, Cloneable {
    static final String TAG = "SettingsLib.AccessPoint";
    。。。。。。
    //定義變數
    private String ssid;
    private String bssid;
    private boolean isSsidBinding=false;
    private int wifiSsidid;
    private boolean isMacBinding=false;
    private int wifiMacid;
    private String wifiMacAddress;

    。。。。。。


    public NetworkInfo getNetworkInfo() {
        return mNetworkInfo;
    }


    public int getSecurity() {
        return security;
    }


    public String getSsidStr() {
        return ssid;
    }


    public CharSequence getSsid() {
        SpannableString str = new SpannableString(ssid);
        str.setSpan(new TtsSpan.VerbatimBuilder(ssid).build(), 0, ssid.length(),
                Spannable.SPAN_INCLUSIVE_INCLUSIVE);
        return str;
    }


    //定義繫結時用到的方法
    public String getBSSID() {
        return bssid;
    }


    public void setBSSID(String bssid) {
        this.bssid=bssid;
    }


    public boolean isSsidBinding() {
return isSsidBinding;
    }


    public void setSsidBinding(boolean isSsidBinding) {
this.isSsidBinding = isSsidBinding;
    }


    public int getWifiSsidid() {
return wifiSsidid;
    }


    public void setWifiSsidid(int wifiSsidid) {
this.wifiSsidid = wifiSsidid;
    }


    public boolean isMacBinding() {
return isMacBinding;
    }


    public void setMacBinding(boolean isMacBinding) {
this.isMacBinding = isMacBinding;
    }


    public int getWifiMacid() {
return wifiMacid;
    }


    public void setWifiMacid(int wifiMacid) {
this.wifiMacid = wifiMacid;
    }


    public String getWifiMacAddress() {
return wifiMacAddress;
    }


    public void setWifiMacAddress(String wifiMacAddress) {
this.wifiMacAddress = wifiMacAddress;
    }



    /**
     * Generate and save a default wifiConfiguration with common values.
     * Can only be called for unsecured networks.
     */
    public void generateOpenNetworkConfig() {
        if (security != SECURITY_NONE)
            throw new IllegalStateException();
        if (mConfig != null)
            return;
        mConfig = new WifiConfiguration();
        mConfig.SSID = AccessPoint.convertToQuotedString(ssid);
        mConfig.allowedKeyManagement.set(KeyMgmt.NONE);

    }

    //這個就是開啟wifi開關,掃描到wifi後上報的所有資訊,包括SSID和MAC,wifi連線後BSSID會返回null,至於為什麼為null,還沒有研究出來
    private void initWithScanResult(ScanResult result) {
        ssid = result.SSID;
bssid = result.BSSID;

        security = getSecurity(result);
        /* OPEN AP test support */
        mWpsAvailable = security != SECURITY_EAP && result.capabilities.contains("WPS");
        if (security == SECURITY_PSK)
            pskType = getPskType(result);
        mRssi = result.level;
        mSeen = result.timestamp;
    }


    public static String convertToQuotedString(String string) {
        return "\"" + string + "\"";

    }

    //獲取連線的安全類別
    private static int getSecurity(ScanResult result) {
        ///M: add mtk [email protected]{
        int security = AccessPointExt.getSecurity(result);
        if (security != -1) {
            return security;
        }
        ///@}
        if (result.capabilities.contains("WEP")) {
            return SECURITY_WEP;
        } else if (result.capabilities.contains("PSK")) {
            return SECURITY_PSK;
        } else if (result.capabilities.contains("EAP")) {
            return SECURITY_EAP;
        }
        return SECURITY_NONE;
    }


    static int getSecurity(WifiConfiguration config) {
        if (config.allowedKeyManagement.get(KeyMgmt.WPA_PSK)) {
            return SECURITY_PSK;
        }
        if (config.allowedKeyManagement.get(KeyMgmt.WPA_EAP) ||
                config.allowedKeyManagement.get(KeyMgmt.IEEE8021X)) {
            return SECURITY_EAP;
        }
        ///M: add mtk [email protected]{
        int security = AccessPointExt.getSecurity(config);
        if (security != -1) {
            return security;
        }
        ///@}
        return (config.wepKeys[0] != null) ? SECURITY_WEP : SECURITY_NONE;
    }


    public static String securityToString(int security, int pskType) {
        if (security == SECURITY_WEP) {
            return "WEP";
        } else if (security == SECURITY_PSK) {
            if (pskType == PSK_WPA) {
                return "WPA";
            } else if (pskType == PSK_WPA2) {
                return "WPA2";
            } else if (pskType == PSK_WPA_WPA2) {
                return "WPA_WPA2";
            }
            return "PSK";
        } else if (security == SECURITY_EAP) {
            return "EAP";
        }
        return "NONE";
    }
}


AccessPoint的整個類我沒有貼完整,這個就是wifi的每項的詳細資訊都在這個類裡面,大家有興趣可以去看看

相關推薦

android 設定wifi SSIDMAC地址

1)新增SSID名稱後,WIFI列表僅能連線該設定的SSID AP 2)    SSID並啟用後,PDA只連線同名SSID的AP,其他連線不上; 3)    MAC地址的應用場景和SSID類同,為避免非法AP設定成我們相同的SSID騙取連線,設定MAC 地址或範圍並啟用後

無線網路設定隱藏網路以及mac地址

一共分為三個步驟 1.設定無線網路隱藏 https://jingyan.baidu.com/album/27fa7326e0f49246f8271f33.html?picindex=5 找到無線基本設定->ssid下面有一個隱藏的勾選項->勾選即可 2.查詢手機

DHCP實現macip地址

DHCP實現mac和ip地址繫結 作用:讓網路中某個mac地址的網絡卡永久使用一個固定的ip地址 DHCP服務的埠號:伺服器用的是udp:67埠,客戶機用的是udp:68埠 重要檔案: dhcp伺服器主配置檔案:/etc/dhcp/dhcpd.conf 裡面可以修改mac和ip地址,

Android獲取裝置IMEIMac地址

public static boolean checkPermission(Context context, String permission) { boolean result = false; if (Build.VERSION

CISCO交換機上實現MAC埠、IP埠、IPMAC

一、針對於目前ARP病毒肆虐,利用ARP協議進行欺騙的網路問題也日漸嚴重。在防範過程中除了VLAN的劃分來抑制問題的擴散,如果將MAC地址與埠繫結配合起來會達到最佳的防範效果。 下面在Cisco交換機上實現簡單的埠繫結,舉Cisco 3550為例: 3550#con

Windows 7下用arp命令IPMAC地址,提示“ARP 項新增失敗: 拒絕訪問”的解決方法

在Win 7版本以管理員身份執行時提示:“ARP 項新增失敗:請求的操作需要提升。”    解決辦法: CMD中輸入:netsh i  i show in  //注意兩個i之間是有空格的 然後找到“本地連線”對應的 “Idx” (我的是

AndroidWiFi下獲取IP地址MAC地址

本部落格將通過一個例項向大家介如何開發一個簡易的小應用實現獲取IP地址和MAC地址。(需要注意的一點是,虛擬機器可能不支援WIFI操作,所以需要用真機進行測試),由於許多解釋我已經在原始碼中解釋的挺清楚了,所以不做過多的解釋,如果不懂的小夥伴,可以留言交流。 APP的介面如下: &

iOS 獲取WifiSSIDMAC地址

匯入系統標頭檔案 #import <SystemConfiguration/CaptiveNetwork.h> 實現程式碼NSString*ssid =@"Not Found"; NSString*macIp =@"Not Found"; CFArrayRef

Linux Arp命令IPMAC地址防止ARP欺騙

Linux Arp命令危害:Linux Arp命令危害極大,有的病毒就使用ARP欺騙,不僅影響自身機器,同時也會影響同網段的其它機器,將其它機器的HTTP資料包里加入病毒程式碼。 1、程式碼例子如:<html><iframe src=http://病毒連結.htm width=0 h

華為三層交換機綁定IPMAC地址基礎命令

流程 bsp tab mac地址 基本 tegra 端口 root權限 如果 //本文檔主要介紹交換機地址綁定基本流程和用到的命令; //不記得命令可以輸入?查看,或在一段命令中用‘TAB’鍵進行命令補全:如”user-b s mac-a ‘TAB‘ //此處,將自動補全命

理解IP地址MAC地址

因此 出廠 表示 器) linu PC 多個 CP unknown 概述: IP 是地址,有定位功能(網與網的通訊)(網絡層) MAC 是身份證,無定位功能(在子網幹活)(鏈路層) 首先是如何查看ip地址的問題: Window:ipconfig Linux:ifconf

原來自己統計的裝置數,用IMEIMAC地址全不準

MAC(Media Access Control或者Medium Access Control)地址,意譯為媒體訪問控制,或稱為實體地址、硬體地址,用來定義網路裝置的位置。在OSI模型中,第三層網路層負責 IP地址,第二層資料鏈路層則負責 MAC地址。因此一個主機會有一個MAC地址,而每個網路位置會有一個

獲取裝置唯一識別碼Mac地址

下面這個工具類提供了一些方法,可以獲取裝置AndroidID、IMEI、序列號、以及由他們組成的唯一識別碼、網絡卡的MAC地址、藍芽MAC地址。程式碼如下: DeviceInfoUtil: package com.home; import java.util.UUID;

Linux下通過shell獲取網絡卡的ip地址mac地址

ip=`ifconfig eth0 | grep "inet addr" | awk -F: '{print $2}' | awk '{print $1}'` mac=`ifconfig | grep HWaddr | awk -F" " '{print $5}'` 轉自:http://blog.csdn.

如何檢視小米手機的IP地址MAC地址

以小米note為例 1 檢視小米手機的IP地址及MAC地址的方法有很多,在主介面找到設定選項,或者下拉螢幕,找到設定。 2 找到設定裡面的WLAN 3 進入wLAN設定後,首要條件是:開啟WLAN,尋找並加入WIFI,因為你不加入WIFI的話,是不存在IP地址的(只能

Android 設定wifi連線應用開發

言簡意賅的說吧。設定androidwifi連線, 1.new 一個wificonfiguration物件。 2.設定這個物件的一些屬性。 WifiConfiguration wc = new WifiConfiguration();   wc.SSID = "

(轉)獲取裝置唯一識別碼Mac地址

下面這個工具類提供了一些方法,可以獲取裝置AndroidID、IMEI、序列號、以及由他們組成的唯一識別碼、網絡卡的MAC地址、藍芽MAC地址。程式碼如下: DeviceInfoUtil: 001.packagecom.home; 002. 003.importja

為什麼同時需要IP地址MAC地址

每個乙太網裝置在出廠時都有一個唯一的MAC地址,為什麼還需要為每臺主機再分配一個IP地址?或者說每臺主機都分配唯一的IP地址,為什麼還要在網路裝置(如網絡卡,集線器,路由器等)生產時內嵌一個唯一的MAC地址呢? 主要原因有以下幾點: (1)IP地址的分配是根據網路的拓樸結構

網路基礎之ARP地址解析協議(為什麼IP地址MAC地址都要有,又是如何通過IP地址解析到MAC地址的)

ARP協議      Address Resolution Protocol      地址解析協議  在區域網中,網路中實際傳輸的是“幀”,幀裡面是有目標主機的MAC地址的。在乙太網中,一個主機要和另一個主機進行直接通訊,必須要知道目標主機的MAC地址。但這個目標MAC地址

delphi 獲取多網絡卡IP地址列表Mac地址

1、宣告windows系統的sendarp函式 function sendarp(ipaddr: ulong; temp: dword; ulmacaddr: pointer; ulmacaddrleng: pointer): Dword; StdCall;External