在ROOT环境下 基于命令进行VPN pptp 拨号器开发

来源:互联网 发布:enrique iglesias 知乎 编辑:程序博客网 时间:2024/06/05 23:52

                                                                 VPN拨号器

项目需求 需要进行IP 地址 切换 需要用到VPN 还不能用原生的只能自己开发  差了大量的资料的都很坑  VPN API 被隐藏需要暴力反射获取 等等 超级麻烦 最后发现 在ROOT环境下用命令 可以进行 pptp拨号  核心命令就是四条

 
private Thread IP_3; //声明一个子线程    private Thread IP_2;    private Thread IP_1;    private Thread VPN_IP;    //private TextView it_ip; //   private EditText it_ip;    @Override    protected void onCreate(Bundle savedInstanceState) {        super.onCreate(savedInstanceState);        setContentView(R.layout.activity_main);      //  EditText it_ip= (EditText) findViewById(R.id.it_ip);     //   it_ip.setText(getLocalHostIp());        final String vpn_ip=getLocalHostIp();         //   String ip138=GetNetIp();        VPN_IP=new Thread(new Runnable() {            @Override            public void run() {                while (true){                    try {                        VPN_IP.sleep(15000);                    }                    catch (InterruptedException e) {                        e.printStackTrace();                    }                    if (vpn_ip.equals("0.0.0.0")){                        book();                        System.out.println("VPN---已断开重新连接中");                    }else {                        System.out.println("VPN---连接中"+vpn_ip);                    }                }            }        });        VPN_IP.start();    }    @Override    protected void onStart() {        super.onStart();           book();    }    public String execShell(String cmd){        try{            //权限设置            Process p = Runtime.getRuntime().exec("su");  //开始执行shell脚本            //获取输出流            OutputStream outputStream = p.getOutputStream();            DataOutputStream dataOutputStream=new DataOutputStream(outputStream);            //将命令写入            dataOutputStream.writeBytes(cmd);            //提交命令            dataOutputStream.flush();            //关闭流操作            dataOutputStream.close();            outputStream.close();        }        catch(Throwable t)        {            t.printStackTrace();        }        return cmd;    }    private  void book(){        IP_1 = new Thread(new Runnable() {            @Override            public void run() {                //这里写入子线程需要做的工作              try {                    IP_1.sleep(1000);                          // 自己服务器的地址  name 账号  password 密码                    execShell("mtpd wlan0 pptp 111.1.1.1 1723 name abc password 123456 linkname vpn nodefaultroute mtu 1396 mru 1396 +mppe unit 100");                                    Looper.prepare();                    Toast.makeText(MainActivity.this,"开启VPN",Toast.LENGTH_SHORT).show();                    //   System.out.println("激活命令");                    Looper.loop();              } catch (InterruptedException e) {                  // TODO Auto-generated catch block                  e.printStackTrace();              }            }        });        IP_1.start(); //启动线程        IP_2 = new Thread(new Runnable() {            public void run() {                try {                    IP_2.sleep(5000);                } catch (InterruptedException e) {                    // TODO Auto-generated catch block                    e.printStackTrace();                } //               设置IP出口  自定义网卡名称                execShell("ip -4 ro flush dev ppp100");                Looper.prepare();                Toast.makeText(MainActivity.this,"激活命令---1",Toast.LENGTH_SHORT).show();                //   System.out.println("激活命令");                Looper.loop();            };        });        IP_2.start();  IP_3 = new Thread(new Runnable() {        @Override        public void run() {            //这里写入子线程需要做的工作            try {                IP_3.sleep(10000);            } catch (InterruptedException e) {                // TODO Auto-generated catch block                e.printStackTrace();            }            execShell("ip ro add 0.0.0.0/1 dev ppp100");            Looper.prepare();            Toast.makeText(MainActivity.this,"激活最终命令",Toast.LENGTH_SHORT).show();            //   System.out.println("激活命令");            Looper.loop();        }    });    IP_3.start(); //启动线程}    // 得到本机ip地址    public String getLocalHostIp()    {        String ipaddress = "";        try        {            Enumeration<NetworkInterface> en = NetworkInterface                    .getNetworkInterfaces();            // 遍历所用的网络接口            while (en.hasMoreElements())            {                NetworkInterface nif = en.nextElement();// 得到每一个网络接口绑定的所有ip                Enumeration<InetAddress> inet = nif.getInetAddresses();                // 遍历每一个接口绑定的所有ip                while (inet.hasMoreElements())                {                    InetAddress ip = inet.nextElement();                    if (!ip.isLoopbackAddress()                            && InetAddressUtils.isIPv4Address(ip                            .getHostAddress()))                    {                        return ipaddress = "本机的ip是" + ":" + ip.getHostAddress();                    }                }            }        }        catch (SocketException e)        {            Log.e("feige", "获取本地ip地址失败");            e.printStackTrace();        }        return ipaddress;    }    @Override    protected void onStop() {        super.onStop();        execShell("settings put global airplane_mode_on 1");        execShell("am broadcast -a android.intent.action.AIRPLANE_MODE –ez state true");        System.out.println("结束---VPN");/*        execShell("settings put global airplane_mode_on 1");        execShell("am broadcast -a android.intent.action.AIRPLANE_MODE –ez state true");        execShell("settings put global airplane_mode_on 0");        execShell("am broadcast -a android.intent.action.AIRPLANE_MODE –ez state false");*/    }




整段代码复制就行 已经成功拨号 整段代码的逻辑就是 拨号成功后进行检测当前IP 地址 检测到VPN掉了 重新进行拨号

最后CSDN 还有一篇pptp 拨号文章可以看看他的 http://blog.csdn.net/oo_oo_/article/details/50152731







0 0