Android開發之APN網路切換

來源:互聯網
上載者:User

本文介紹Android平台中關於APN網路切換的相關知識。
 
APN(Access Point Name),即“存取點名稱”,用來標識GPRS的業務種類,目前分為兩大類:CMWAP(通過GPRS訪問WAP業務)、CMNET(除了WAP以外的服務目前都用CMNET,比如串連網際網路等)。
 
APN的英文全稱是Access Point Name,中文全稱叫存取點,是您在通過手機上網時必須配置的一個參數,它決定了您的手機通過哪種接入方式來訪問網路。
 
移動手機的預設上網配置有兩種:CMWAP和CMNET。一些使用隨處工作的大客戶,通常會使用專用APN,其存取點隨意定義,只要和該省電訊廠商其他APN不衝突即可。
   
CMWAP也叫移動夢網,通過該存取點可接入一個比較大的移動私網,網內有大量的手機應用下載及資源訪問。因為CMWAP不接入互連網,只接入行動電信業者的私網,所以流量費用比較低廉。
   
CMNET也叫GPRS串連互連網,通常每個省的電訊廠商會提供若干個Internet出口以供CMNET撥號使用者使用。其流量費用較CMWAP要高一些。
   
目前國內銷售的手機,如果是非智能機,通常已配置好CMWAP串連,智能機通常會配置CMWAP和CMNET串連。如需手動添加這些配置,請參考手機說明書。
   
專有APN在功能上可以和Internet的VPN做類比,實際上他就是基於GPRS的VPN網路。
 
專有APN常見組網方式
1,電訊廠商部署一條專線接入到企業的網路中,局端和企業端路由器之間採用私人IP進行串連。
 
    2,局端互連路由器與GGSN採用GRE隧道串連。
 
專有APN的幾個重要特點:
1,除非電訊廠商分配一個Internet IP地址,否則電腦沒有任何辦法通過Internet訪問該APN中的主機。
 
2,只有手機卡號在APN中的白名單之列,該手機才可以接入該APN。
 
3,企業客戶可以建立一套RADIUS和DHCP伺服器,GGSN向RADIUS伺服器提供使用者主叫號碼,採用主叫號碼和使用者帳號相結合的認證方式;使用者通過認證後由DHCP伺服器分配企業內部的靜態IP地址。補充:該認證方式不一定適合於每個省的電訊廠商,這取決於該省電訊廠商的APN管理平台。
 
GPRS專網系統終端上網登入伺服器平台的流程為:
  
1)使用者發出GPRS登入請求,請求中包括由電訊廠商為GPRS專網系統專門分配的專網APN;
 
  
2)根據請求中的APN,SGSN向DNS伺服器發出查詢請求,找到與企業伺服器平台串連的GGSN,並將使用者請求通過GTP隧道封裝送給GGSN;
 
  
3)GGSN將使用者認證資訊(包括手機號碼、使用者帳號、密碼等)通過專線送至Radius進行認證;
 
  
4)Radius證明伺服器看到手機號等認證資訊,確認是合法使用者發來的請求,向DHCP伺服器請求分配使用者地址;
 
  
5)Radius認證通過後,由Radius向GGSN發送攜帶使用者地址的確認資訊;
 
  
6)使用者得到了IP地址,就可以攜帶資料包,對GPRS專網系統資訊查詢和業務處理平台進行訪問。
 
下面是相關代碼:
 
  public void openAPN(){   
List list = getAPNList();  
        for (APN apn : list) {  
            ContentValues cv = new ContentValues();  
            cv.put("apn", APNMatchTools.matchAPN(apn.apn));  
            cv.put("type", APNMatchTools.matchAPN(apn.type));  
            getContentResolver().update(uri, cv, "_id=?", new String[]{apn.id});  
        }  
   }
 

  public void closeAPN(){   
List list = getAPNList(); 
       
        for (APN apn : list) {      
            ContentValues cv = new ContentValues();  
            cv.put("apn", APNMatchTools.matchAPN(apn.apn)+"mdev");  
            cv.put("type", APNMatchTools.matchAPN(apn.type)+"mdev");  
            getContentResolver().update(uri, cv, "_id=?", new String[]{apn.id});  
        }   
    }   
 

   private List getAPNList(){  
String tag = "Main.getAPNList()";  
        //current不為空白表示可以使用的APN  
        String projection[] = {"_id,apn,type,current"};  
        Cursor cr = this.getContentResolver().query(uri, projection, null, null, null);  
        List list = new ArrayList();  
         
        while(cr!=null && cr.moveToNext()){  
            Log.d(tag, cr.getString(cr.getColumnIndex("_id")) + " " + cr.getString(cr.getColumnIndex("apn")) + " " + cr.getString(cr.getColumnIndex("type"))+ " " + cr.getString(cr.getColumnIndex("current")));  
            APN a = new APN();  
            a.id = cr.getString(cr.getColumnIndex("_id"));   
            a.apn = cr.getString(cr.getColumnIndex("apn"));  
            a.type = cr.getString(cr.getColumnIndex("type"));  
            list.add(a);  
        }  
         
        if(cr!=null)  
        cr.close();  
        return list;  
    }  
         
    public static class APN{  
        String id;  
        String apn;  
        String type;  
    } 

 
    /**
     * @Name: setDefaultApn
     * @Description: 設定預設APN
     * @param apnId
     * @return boolean 傳回型別
     * @throws
     */
    public boolean setDefaultApn(int apnId) {
        boolean res = false;
        ContentResolver resolver = context.getContentResolver();
        ContentValues values = new ContentValues();
        values.put("apn_id", apnId);

        try {
            resolver.update(PREFERRED_APN_URI, values, null, null);
            Cursor c = resolver.query(PREFERRED_APN_URI, new String[] { "name",
                    "apn" }, "_id=" + apnId, null, null);
            if (c != null) {
                res = true;
                c.close();
            }
        } catch (SQLException e) {

        }
        return res;
}

 
    /**
     * 得到當前使用的APN
     * @return
     */
    public ApnNode getDefaultAPN() {
        String id = "";
        String apn = "";
        String name = "";
        String type = "";
        ApnNode apnNode = new ApnNode();
        Cursor mCursor = context.getContentResolver().query(PREFERRED_APN_URI,
                null, null, null, null);
        if (mCursor == null) {
            return null;
        }
        while (mCursor != null && mCursor.moveToNext()) {
            id = mCursor.getString(mCursor.getColumnIndex("_id"));
            name = mCursor.getString(mCursor.getColumnIndex("name"));
            apn = mCursor.getString(mCursor.getColumnIndex("apn"))
                    .toLowerCase();
            type = mCursor.getString(mCursor.getColumnIndex("type"))
                    .toLowerCase();
        }
        OLD_APN_ID = Integer.valueOf(id);
        apnNode.setName(name);
        apnNode.setApn(apn);
        apnNode.setType(type);
       
        System.out.println("old_name:" + name + "--old_apn:" + apn + "--old_type:" + type);
       
        return apnNode;
}

   
    /**
     * @Name: SwitchApn
     * @Description: 轉換APN狀態
     * @param 設定檔案
     * @return void 傳回型別
     * @throws
     */
    public void SwitchApn() {
        switch (GetCurrentNetType()) {
        case NET_3G:
            if (!IsCurrentEmergencyApn()) {
                EM_APN_ID = IsEmergencyApnExisted(EMERGENCY_APN);
                System.out.println(EM_APN_ID);
               
                if (EM_APN_ID == -1) {
                    setDefaultApn(AddEmergencyApn());
                } else {
                    setDefaultApn(EM_APN_ID);
                }
            }
           
            break;
        case NET_WIFI:
            break;
        case NET_OTHER:
            break;
        default:
            break;
        }
}

   
public final class APNMatchTools {  
    public static class APNNet{  
        /* 
        * 中國移動cmwap 
        */ 
        public static String CMWAP = "cmwap";  
        /*
        * 中國移動cmnet 
        */ 
        public static String CMNET = "cmnet";  
        //中國聯通3GWAP設定 中國聯通3G網際網路設定 中國聯通WAP設定 中國聯通網際網路設定  
        //3gwap 3gnet uniwap uninet  
        /*
        * 3G wap 中國聯通3gwap APN 
        */ 
        public static String GWAP_3 = "3gwap";  
        /* 
        * 3G net 中國聯通3gnet APN 
        */ 
        public static String GNET_3="3gnet";  
        /** 
        * uni wap 中國聯通uni wap APN 
        */ 
        public static String UNIWAP="uniwap";  
        /** 
        * uni net 中國聯通uni net APN 
        */ 
        public static String UNINET="uninet";  
         
        }  
         
        public static String matchAPN(String currentName) {  
            if("".equals(currentName) || null==currentName){  
            return "";  
        }  
         
        currentName = currentName.toLowerCase();  
         
        if(currentName.startsWith(APNNet.CMNET))  
            return APNNet.CMNET;  
        else if(currentName.startsWith(APNNet.CMWAP))  
            return APNNet.CMWAP;  
        else if(currentName.startsWith(APNNet.GNET_3))  
            return APNNet.GNET_3;  
        else if(currentName.startsWith(APNNet.GWAP_3))  
            return APNNet.GWAP_3;  
        else if(currentName.startsWith(APNNet.UNINET))  
            return APNNet.UNINET;  
        else if(currentName.startsWith(APNNet.UNIWAP))  
            return APNNet.UNIWAP;  
        else if(currentName.startsWith("default"))  
            return "default";  
        else return "";  
        // return currentName.substring(0, currentName.length() - SUFFIX.length());   
    }  
}  

 
<!-- 開關APN的許可權 -->
<uses-permission android:name="android.permission.WRITE_APN_SETTINGS" />

   
  對於Android APN存取點相關的開發,有一個不錯的開源項目APNDroid的原始碼本地下載,裡麵包含了一個不錯的Widget架構,大家可以通過APNDroid源碼學習到有關存取點的相關問題,可以解決GPRS,尤其是國內的CMNET、CMWAP的切換和管理。工程API Level為3,可以運行在Android 1.5或更高的版本上。
 
:點擊下載http://www.bkjia.com/uploadfile/2012/0330/20120330114042736.zip

 
完畢。^_^
 

 

摘自  HarHar
 

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.