مهدی عادلی فر
بنیانگذار توسینسو و برنامه نویس

کارکردن با شبکه های wifi در اندروید

با سلام به همه دوستان و همراهان Itpro.ir در این مطلب قصد دارم که کارکردن با شبکه بیسیم در دستگاه های اندرویدی را شرح بدهم. اندروید به کاربران این امکان را می دهد که به وضعیت ارتباطات Wifi به صورت سطح پایین دسترسی داشته باشند. برنامه ها تقریبا می توانند به همه اطلاعات ارتباطات بیسیم Wifi دسترسی داشته باشند. این اطلاعات شامل سرعت شبکه ایجاد شده، آدرس IP، وضعیت negotiation و بسیاری اطلاعات دیگر می باشد. اعمالی که برنامه ها می توانند روی ارتباطات wifi انجام دهند عبارت است از: اسکن، حذف، اضافه، اتصال و یا ارتباط Wifi. اندروید برای مدیریت ارتباطات wifi از یک API به نام WifiManager استفاده می کند. برای این که از این API یک نمونه بسازیم باید از متد getSystemService استفاده کنیم که کد آن به شکل زیر خواهد بود.

دوره های شبکه، برنامه نویسی، مجازی سازی، امنیت، نفوذ و ... با برترین های ایران
WifiManager mainWifiObj;
mainWifiObj = (WifiManager) getSystemService(Context.WIFI_SERVICE);

برای این که لیستی از شبکه های بیسیم را پیدا کنید باید BroadcastReceiver خود را ثبت کنید. که این عمل ثبت کردن با استفاده از متد registerReceiver انجام می شود که به عنوان پارامتر ورودی شی receiver شما را دریافت می کند. سینتکس این کد به شکل زیر خواهد بود.

class WifiScanReceiver extends BroadcastReceiver {
   public void onReceive(Context c, Intent intent) {
   }
}
WifiScanReceiver wifiReciever = new WifiScanReceiver();
registerReceiver(wifiReciever, new IntentFilter(WifiManager.SCAN_RESULTS_AVAILABLE_ACTION));  

عمل اسکن کردن شبکه های بیسیم با استفاده از متد startScan شروع می شود. که در کلاس WifiManager وجود دارد. این متد لیستی از اشیا از کلاس ScanResult برای ما برمی گرداند. نحوه نوشتن کد اسکن به شکل زیر است.

List<ScanResult> wifiScanList = mainWifiObj.getScanResults();
String data = wifiScanList.get(0).toString();

علاوه بر عمل اسکن کردن شما می توانید کنترل بیشتری روی wifi داشته باشید. این کار را می توانید با استفاده از متدهای موجود در کلاس WifiManager انجام دهید. که چند تا از آن متدها را در زیر مشاهده می کنید.

  1. addNetwork(WifiConfiguration config) این متد یک شبکه جدید مجموعه شبکه های پیکربندی شده اضافه می کند.
  2. createWifiLock(String tag) این متد اجازه می دهد که یک قفل wifi بسازید. Wifi در اندروید به این شکل است که پس از مدتی بیکار بودن از کار می افتد. ولی اندروید این امکان را به برنامه ها می دهد که در صورت نیاز اتصال wifi را به صورت طولانی مدت روشن نگه دارند که این کار توسط wifiLock انجام می شود.
  3. disconnect() با استفاده از این متد اتصال به اکسس پوینت موجود قطع خواهد شد.
  4. enableNetwork(int netId,boolean disableOthers) این متد یک id شبکه را دریافت کرده و به آن متصل می شود.
  5. getWifiState() این متد حالت شبکه فعال کنونی را بر می گرداند.
  6. isWifiEnabled() مشخص می کند که آیا Wifi دستگاه روشن است یا خاموش.
  7. setWifiEnabled(boolean enabled) این متد Wifi دستگاه را خاموش یا روشن می کند.

  8. ساخت یک برنامه که بتواند با wifi کار کند


در ادامه برنامه ای می نویسیم که با استفاده از توابع گفته شده بتواند لیست شبکه های wifi را به دست بیاورد و بتوان از داخل برنامه شبکه wifi را خاموش و یا روشن نمود. برای این کار یک پروژه جدید ایجاد می کنیم. دقت داشته باشید که کلیه کارها و اعمال گفته شده در این مطلب در محیط Android Studio انجام شده است. بعد از این که پروژه را ایجاد کردیم یک پروژه به نام MainActivity باید داشته باشیم. که به همان تناظر باید یک layout به نام activity_main.xml باید در برنامه داشته باشیم که به عنوان layout اصلی برنامه است. ما در layout برنامه یک textView برای نمایش داریم که در آن فقط کلمه Wifi را نوشته ایم. و یک checkBox داریم که برای خاموش و یا روشن کردن wifi استفاده می شود و همچنین یک لیست داریم که لیست شبکه های موجود را با جزئیات نمایش می دهد. که کد layout به شک زیر است:

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
                xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent"
                android:layout_height="match_parent" android:paddingLeft="@dimen/activity_horizontal_margin"
                android:paddingRight="@dimen/activity_horizontal_margin"
                android:paddingTop="@dimen/activity_vertical_margin"
                android:paddingBottom="@dimen/activity_vertical_margin" tools:context=".MainActivity">

    <TextView android:text="Wifi" android:layout_width="wrap_content"
              android:layout_height="wrap_content"
              android:id="@+id/textview"
              android:textSize="35sp"
              android:layout_alignParentTop="true"
              android:layout_centerHorizontal="true" />

    <CheckBox
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:id="@+id/wifiChecker"
        android:text="EnableWifi"
        />

    <ListView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:id="@+id/listView"



        android:background="#fff5d376"
        android:layout_below="@+id/textview"
        android:layout_centerHorizontal="true"
        android:layout_marginTop="87dp"/>


</RelativeLayout>

کد activity ما به شکل زیر خواهد بود که همه اعمال register و unregister را در آن نشان می دهد.

package tosinso.com.myapplication;

import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.content.IntentFilter;
import android.net.wifi.ScanResult;
import android.net.wifi.WifiManager;
import android.os.Bundle;
import android.support.v7.app.ActionBarActivity;
import android.view.Menu;
import android.view.MenuItem;
import android.widget.ArrayAdapter;
import android.widget.CheckBox;
import android.widget.CompoundButton;
import android.widget.ListView;

import java.util.List;


public class MainActivity extends ActionBarActivity {
    ListView lv;
    WifiManager wifi;
    String wifis[];
    WifiScanReceiver wifiReciever;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        lv = (ListView) findViewById(R.id.listView);

        wifi = (WifiManager) getSystemService(Context.WIFI_SERVICE);
        wifiReciever = new WifiScanReceiver();
        wifi.startScan();
        CheckBox wifiCheck = (CheckBox) findViewById(R.id.wifiChecker);
        wifiCheck.setChecked(wifi.isWifiEnabled());
        wifiCheck.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {
            @Override
            public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
                wifi.setWifiEnabled(isChecked);
            }
        });
    }

    @Override
    protected void onPause() {
        unregisterReceiver(wifiReciever);
        super.onPause();
    }

    @Override
    protected void onPostResume() {
        registerReceiver(wifiReciever, new IntentFilter(WifiManager.SCAN_RESULTS_AVAILABLE_ACTION));
        super.onPostResume();
    }

    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        // Inflate the menu; this adds items to the action bar if it is present.
        getMenuInflater().inflate(R.menu.menu_main, menu);
        return true;
    }

    @Override
    public boolean onOptionsItemSelected(MenuItem item) {
        // Handle action bar item clicks here. The action bar will
        // automatically handle clicks on the Home/Up button, so long
        // as you specify a parent activity in AndroidManifest.xml.
        int id = item.getItemId();

        //noinspection SimplifiableIfStatement
        if (id == R.id.action_settings) {
            return true;
        }

        return super.onOptionsItemSelected(item);
    }

    private class WifiScanReceiver extends BroadcastReceiver {
        public void onReceive(Context c, Intent intent) {
            List<ScanResult> wifiScanList = wifi.getScanResults();
            wifis = new String[wifiScanList.size()];

            for (int i = 0; i < wifiScanList.size(); i++) {
                wifis[i] = ((wifiScanList.get(i)).toString());
            }
            lv.setAdapter(new ArrayAdapter<String>(getApplicationContext(), android.R.layout.simple_list_item_1, wifis));
        }
    }
}

برای این که بتوانیم به wifi در برنامه دسترسی داشته باشیم باید مجوز های آن را گرفته باشیم. که برای این کار ما از دو مجوز CHANGEWIFISTATE و ACCESSWIFISTATE استفاده می کنیم. به شکل کلی کد manifest به شکل زیر خواهد بود:

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="tosinso.com.myapplication" >
<uses-permission android:name="android.permission.CHANGE_WIFI_STATE"/>
    <uses-permission android:name="android.permission.ACCESS_WIFI_STATE"/>
    <application
        android:allowBackup="true"
        android:icon="@mipmap/ic_launcher"
        android:label="@string/app_name"
        android:theme="@style/AppTheme" >
        <activity
            android:name=".MainActivity"
            android:label="@string/app_name" >
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />

                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
    </application>

</manifest>

دقت کنید که با اجرا کردن برنامه روشن یا خاموش بودن wifi بررسی شده و checkBox موجود طبق آن علامت دار یا بی علامت است. همچنین در لیست موجود نام و جزئیات شبکه های wifi موجود نشان داده می شود. Itpro باشید

نویسنده : مهدی عادلی فر

منبع :انجمن تخصصی فناوری اطلاعات ایران 

هر گونه نشر و کپی برداری بدون ذکر منبع و نام نویسنده دارای اشکال اخلاقی می باشد. 


مهدی عادلی فر
مهدی عادلی فر

بنیانگذار توسینسو و برنامه نویس

مهدی عادلی، بنیان گذار TOSINSO. کارشناس ارشد نرم افزار کامپیوتر از دانشگاه صنعتی امیرکبیر و #C و جاوا و اندروید کار می کنم. در زمینه های موبایل و وب و ویندوز فعالیت دارم و به طراحی نرم افزار و اصول مهندسی نرم افزار علاقه مندم.

نظرات