路由器一键桥接Android实现

原创 2015年07月07日 17:14:00
开始之前,首先说一下什么叫一键桥接,所谓一键桥接,就是点击一下,就可以对所连接的路由器进行网络中继设置,以实现路由器可以通过已有的无线路由器进行网络访问。

那么实现这个功能有几种方法呢?可以说有很多种,只要可以和路由网关进行通信就行。一般可以选择,Socket通信,Http通信。对于Http通信可以选择HttpClient, HttpURLConnection等。在本文中,为了实现的方便,我们选择android的特性之一,webkit,也即是使用WebView控件来实现一键桥接

一、WebView是什么
可参考:
http://blog.csdn.net/chenshijun0101/article/details/7045394
和:
http://blog.csdn.net/t12x3456/article/details/13769731/

二、看我实现


package com.leo.switchrouter;

import android.app.Service;
import android.content.Context;
import android.content.Intent;
import android.content.SharedPreferences;
import android.os.Handler;
import android.os.IBinder;
import android.os.Message;
import android.os.SystemClock;
import android.text.TextUtils;
import android.webkit.HttpAuthHandler;
import android.webkit.WebSettings;
import android.webkit.WebView;
import android.webkit.WebViewClient;
import android.widget.Toast;

/**
 * @see 对桥接中需要的数据进行初始化
 * @since 2015-06-17
 * @author Leo
 *
 */
public class SwitchRouterService extends Service {
    /*定义的一些变量,注本文使用的路由器是GoAgent*/
    
    private static final String TAG = "SwitchRouterService";
    private SwitchRouterService mService = this;
    private MWifiManager mWifiManager = null;
    private SharedPreferences sp = null;
    private Handler mHandler = null;
    private WebView mWebView = null;

    private String address = "10.10.10.254";
    private String username = "admin";
    private String bpassword = "admin";
    private String npassword = "0123456789";

    private String ssid = "Hui";
    private int mode = 3;
    private int type = 0;

    private String url1 = "http://10.10.10.254/opmode.asp";
    private String url2 = "http://10.10.10.254/wireless/apcli.asp";
    private String url3 = "http://10.10.10.254/wireless/apcli.asp";

    private String network = "";

    @Override
    public IBinder onBind(Intent arg0) {
        // TODO Auto-generated method stub
        return null;
    }

    @Override
    public void onCreate() {
        // TODO Auto-generated method stub
        super.onCreate();
        mHandler = new Handler() {

            @Override
            public void handleMessage(Message msg) {
                // TODO Auto-generated method stub
                // super.handleMessage(msg);
                int what = msg.what;
                switch (what) {
                case Constant.WHAT_START: {
                    isRunning = true;
                    toast("桥接刚开始,进入第一步,共三个步骤");
                    new Thread(new FirstRunnable()).start();
                }
                    break;
                case Constant.WHAT_FIRST: {
                    isRunning = true;
                    toast("第一步完成,进入第二步,共三个步骤");
                    new Thread(new SecondRunnable()).start();
                }
                    break;
                case Constant.WHAT_SECOND: {
                    isRunning = true;
                    toast("第二步完成,进入第三步,共三个步骤");
                    new Thread(new ThirdRunnable()).start();
                }
                    break;
                case Constant.WHAT_THIRD: {
                    toast("桥接已经完成,祝你生活愉快");
                    stopSelf();
                }
                    break;
                default:
                    toast("地球人 我来自火星");
                    break;
                }
            }

        };
        initData();
        mHandler.sendEmptyMessage(Constant.WHAT_START);
    }

    private void toast(String text) {
        Toast.makeText(mService, text, Toast.LENGTH_SHORT).show();
    }

    private void initData() {
        mWifiManager = new MWifiManager(this);
        initValues();
        initWebView();
    }

    private boolean isRunning = false;
    private static final long DELAY = 5000;

    private class FirstRunnable implements Runnable {
        public void run() {
            while (isRunning) {
                System.out.println("I am the first step");
                String now = mWifiManager.getNowWifiInfo().getSSID();
                System.out.println(network + " " + now);
                if (TextUtils.equals(now, network)) {
                    processFirst();
                    delay(DELAY);
                    isRunning = false;
                    mHandler.sendEmptyMessage(Constant.WHAT_FIRST);
                }
            }
        }
    }

    private class SecondRunnable implements Runnable {
        public void run() {
            while (isRunning) {
                System.out.println("I am the second step");
                String now = mWifiManager.getNowWifiInfo().getSSID();
                if (TextUtils.equals(now, network)) {
                    processSecond();
                    isRunning = false;
                    delay(DELAY);
                    mHandler.sendEmptyMessage(Constant.WHAT_SECOND);
                }
            }
        }
    }

    private class ThirdRunnable implements Runnable {
        public void run() {
            while (isRunning) {
                System.out.println("I am the third step");
                String now = mWifiManager.getNowWifiInfo().getSSID();
                if (TextUtils.equals(now, network)) {
                    processThird();
                    isRunning = false;
                    delay(DELAY);
                    mHandler.sendEmptyMessage(Constant.WHAT_THIRD);
                }
            }
        }
    }

    private void delay(long time) {
        try {
            Thread.sleep(time);
        } catch (InterruptedException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
    }

/*执行第一步,更改模式*/
    private void processFirst() {
        url1 = "http://" + address + "/opmode.asp";
        mWebView.loadUrl(url1);
        System.out.println("first:" + url1);
        delay(DELAY);
        mWebView.loadUrl("javascript:document.opmode.opMode[3].checked = true;changeMode();opmode_submit();");
    }

/*第二步,填写中继源网络信息*/
    private void processSecond() {
        url2 = "http://" + address + "/wireless/apcli.asp";
        mWebView.loadUrl(url2);
        System.out.println("second:" + url2);
        delay(DELAY);
        mWebView.loadUrl("javascript:document.wireless_apcli.apcli_ssid.value = '"
                + ssid + "';");
        mWebView.loadUrl("javascript:document.wireless_apcli.apcli_mode.options["
                + mode
                + "].selected = true;SecurityModeSwitch();EncryptModeSwitch();");
        mWebView.loadUrl("javascript:document.wireless_apcli.apcli_enc.options["
                + type + "].selected = true;EncryptModeSwitch();");
        mWebView.loadUrl("javascript:document.wireless_apcli.apcli_wpapsk.value = '"
                + npassword + "';document.wireless_apcli.submit();");
    }
/*更改信道,本文中使用Auto选项,可在实际需求中进行信道筛选*/
    private void processThird() {
        url3 = "http://" + address + "/wireless/basic.asp";
        mWebView.loadUrl(url3);
        delay(DELAY);
        mWebView.loadUrl("document.wireless_basic.sz11gChannel.options[0].selected = true;ChOnChange();document.wireless_basic.submit();");
    }

    private void initValues() {
        sp = getSharedPreferences(Constant.SP_NAME, Context.MODE_PRIVATE);
        address = sp.getString(Constant.KEY_ADDRESS, "10.10.10.254");
        username = sp.getString(Constant.KEY_USERNAME, "admin");
        bpassword = sp.getString(Constant.KEY_B_PASSWORD, "admin");
        npassword = sp.getString(Constant.KEY_N_PASSWORD, "1234567890");
        ssid = sp.getString(Constant.KEY_SSID, "Huicai");

        mode = sp.getInt(Constant.KEY_MODE, 3);
        type = sp.getInt(Constant.KEY_TYPE, 0);

        network = sp.getString(Constant.KEY_NETWORK, "huicai");
    }

/*对WebView进行初始化,使WebView可以操作JS,并自动登录*/
    private void initWebView() {
        mWebView = new WebView(this);
        WebSettings settings = mWebView.getSettings();
        settings.setJavaScriptEnabled(true);
        mWebView.setWebViewClient(new WebViewClient() {

            @Override
            public boolean shouldOverrideUrlLoading(WebView view, String url) {
                // TODO Auto-generated method stub
                view.loadUrl(url);
                return super.shouldOverrideUrlLoading(view, url);
            }

            @Override
            public void onReceivedHttpAuthRequest(WebView view,
                    HttpAuthHandler handler, String host, String realm) {
                // TODO Auto-generated method stub
                handler.proceed(username, bpassword);
                // super.onReceivedHttpAuthRequest(view, handler, host, realm);
            }

        });
    }
}


三、总结
本文中所使用的方法,是投机取巧了,通过JS代码很容易的操作配置页面,然后通过WebView操作JS代码,很容易实现想要实现的功能。

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/zhaicaixiansheng/article/details/46791869

linux、android下网桥实现

linux下网桥实现: 1、安装编译安装bridge-utils; apt-get install bridge-utils 2、配置网桥  brctl addbr bridge ifcon...
  • zjli321
  • zjli321
  • 2016-07-05 19:08:51
  • 806

Android桥接模式demo

  • 2016年04月13日 16:51
  • 15.44MB
  • 下载

桥接SoftAp模式下的ApClient网络

1. 修改内核以支持bridge CONFIG_STP=y CONFIG_BRIDGE=y CONFIG_BRIDGE_IGMP_SNOOPING=y 2. 修改驱动以支持AP_CLIENT(...
  • u014780165
  • u014780165
  • 2015-01-27 11:09:55
  • 3342

ceph 一键部署

首先先赞一个,ceph很强大。部署很方便。 写了一个半自动化部署脚本,第一次写高手飘过。过些时间来做成完全一键部署。   #!/usr/bin/env bash # *./ clear* cl...
  • cd520yy
  • cd520yy
  • 2013-01-01 22:56:34
  • 1285

多个路由器无线桥接,共享网络

原文路径:http://win7sky.com/luyouqishezhi/20130803-1053.html 初次接触WDS的同学可能不太了解如何设置WDS,但应该对路由器的一些基本设置有所了解...
  • u010662488
  • u010662488
  • 2015-09-25 18:44:20
  • 1159

家里用两个路由器进行WDS桥接扩大信号覆盖范围

路由器A用的是Tenda 的 N300 路由器B用的是WDR5600 因为主路由器放在房间里,光钎也是只接到了房间里,所以用了另外一个路由器作为桥接放在客厅,这样的话在外面也可以连接到wifi网络...
  • mazicwong
  • mazicwong
  • 2017-01-17 00:32:37
  • 845

一分钟实现内网穿透(ngrok服务器搭建)

简单来说内网穿透的目的是:让外网能访问你本地的应用,例如在外网打开你本地http://127.0.0.1指向的Web站点。 最近公司的花生壳到期了,要续费,发现价格一直在涨,都是5年以上的老用户,旗...
  • zhangguo5
  • zhangguo5
  • 2017-09-05 10:47:45
  • 66890

路由器桥接chinanet拨号共享

前言从去年下半年开始就在折腾路由器刷固件、内网穿透、ss代理、脚本编写,这认我对路由器有了新的了解,说实话没折腾之前就只觉得路由器只能拨号。最近K3已经刷好固件正式上岗,随之淘汰下K1s。本人工作环境...
  • vr7jj
  • vr7jj
  • 2017-05-27 00:49:13
  • 1593

成功设置两个路由器通过桥接信号放大

  • 2014年08月19日 21:15
  • 239KB
  • 下载

闪传“一键换机”帮你快速转移手机数据

闪传“一键换机”帮你快速转移手机数据       2015年11月6日 11:04  CCTIME飞象网  ...
  • autumn20080101
  • autumn20080101
  • 2016-06-24 10:05:28
  • 370
收藏助手
不良信息举报
您举报文章:路由器一键桥接Android实现
举报原因:
原因补充:

(最多只允许输入30个字)