android WIFI开发

android wifi开发:
wifi技术是一种无线联网技术,通常使用无线路由器制造一个wifi热点,我们的终端设备就可以打开wifi进行互联,那么在android手机上是如何实现与无线路由器的热点互联的呢?

android wifi开发的api都在android.net.wifi包下面,它下面主要包括以下几个类:

1. ScanResult   打开wifi扫描到的无线网络接入点,包括接入点名称、身份验证、频率、信号强度

2. WifiConfiguration  wifi网络的配置参数,主要包括ssid networkid presharedkey等信息

3. WifiInfo  这个代表无线连接描述,一般用于我们已经连好的wifi,通过它可以获取接入点名称、IP地址、mac地址、网络id等

4. 重要的是这个类  WifiManager管理wifi的类,在他里面有一些重要的方法
    打开网卡:
        先判断isWifiEnabled()    在打开setWifiEnabled(boolean enabled) 

    连接wifi:
        (如果没有保存,就先addNetwork(WifiConfiguration config) )   
        再enableNetwork(int netId, boolean disableOthers)    第二个参数看名字就知道了

    关闭wifi:
        disableNetwork(int netId) 
        disconnect() 

    获取wifi状态:
        getWifiState() 
        返回值  One of WIFI_STATE_DISABLED,
                WIFI_STATE_DISABLING, WIFI_STATE_ENABLED,
                 WIFI_STATE_ENABLING, WIFI_STATE_UNKNOWN

下面以一个用手机创建wifi热点和连接wifi热点为例:
创建wifi热点:
利用java反射机制,获取WifiManager掩藏的setWifiApEnabled进行创建热点

    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        wConfiguration = new WifiConfiguration();
        wManager = (WifiManager)getSystemService(Context.WIFI_SERVICE);
        wConfiguration.SSID = "my_wifi_1";
        wConfiguration.preSharedKey = "123456789";

        btn = (Button)this.findViewById(R.id.wifi);
        btn.setOnClickListener(new View.OnClickListener() {

            @Override
            public void onClick(View arg0) {
                // TODO Auto-generated method stub
                flag = !flag;

                //热点不能和wifi同时开启  如果wifi开启就关闭掉
                if(wManager.isWifiEnabled()){
                    wManager.setWifiEnabled(false);
                }

                try {
                    Method method = wManager.getClass().getMethod("setWifiApEnabled", WifiConfiguration.class, Boolean.TYPE);
                    method.invoke(wManager, wConfiguration, flag);
                } catch (NoSuchMethodException e) {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                } catch (IllegalAccessException e) {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                } catch (IllegalArgumentException e) {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                } catch (InvocationTargetException e) {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                }
            }
        });
    }

    连接wifi热点:
        连接wifi也很简单,只需要设置WifiConfiguration的参数,在把它加入到network里面去,enablewifi功能即可
        //连接wifi  参数比较多  麻烦
    public WifiConfiguration setWifiParams(){
        WifiConfiguration mWifiConfiguration = new WifiConfiguration();

        mWifiConfiguration.SSID = "\"" + ssid + "\"";
        mWifiConfiguration.preSharedKey = "\"" + password + "\"";
        mWifiConfiguration.hiddenSSID = true;           //不再广播此ssid
        mWifiConfiguration.allowedGroupCiphers.set(WifiConfiguration.GroupCipher.TKIP);  
        mWifiConfiguration.allowedGroupCiphers.set(WifiConfiguration.GroupCipher.CCMP);  
        mWifiConfiguration.allowedKeyManagement.set(WifiConfiguration.KeyMgmt.WPA_PSK);  
        mWifiConfiguration.allowedPairwiseCiphers.set(WifiConfiguration.PairwiseCipher.TKIP);  
        mWifiConfiguration.allowedPairwiseCiphers.set(WifiConfiguration.PairwiseCipher.CCMP);  
        mWifiConfiguration.allowedProtocols.set(WifiConfiguration.Protocol.RSN);    

        return mWifiConfiguration;
    }
    返回的wificonfiguration使用addnetwork,enableNetwork(int netId, boolean disableOthers)即可打开
还有一种比较省力的方法,直接跳跳转到用户设置wifi界面,用户手动设置:
startActivity(new Intent(android.provider.Settings.ACTION_WIFI_SETTINGS));

名词解释:
SSID:无线网络的名称,入常见的TP-link后面一串数字等,不同的无线网络接入点可以名字相同
BSSID:无线接入点的名称,通常默认为路由器的mac地址,当有时出现虚拟接入点是则时在该mac地址上添加而成
ESSID:是所有SSID的集合
举个栗子:
一个大型公司的wifi接入点一般不只有一个,会有多个wifi接入点,但是又不可能取不同的名字,通常将他们接入点取相同的SSID名称,使用不同的信道(1~13传送wifi数据的通道,相同信道会出现干扰,导致信号不稳定,信道根据wifi的频段绝点2.4MHz附件),这就可以在移动的过程中去自动连接

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

帅气好男人_Jack

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值