درخواست های ارتباط
جستجو
    لیست دوستان من
    صندوق پیام
    همه را دیدم
    • در حال دریافت لیست پیام ها
    صندوق پیام
    رویدادها
    همه را دیدم
    • در حال دریافت لیست رویدادها
    همه رویدادهای من
    اطلاعات مطلب
      مدرس/نویسنده
      مهدی عادلی فر
      امتیاز: 242796
      رتبه:6
      111
      196
      285
      1456
      مهدی عادلی، بنیان گذار TOSINSO. کارشناس ارشد نرم افزار کامپیوتر از دانشگاه صنعتی امیرکبیر و #C و جاوا و اندروید کار می کنم. در زمینه های موبایل و وب و ویندوز فعالیت دارم و به طراحی نرم افزار و اصول مهندسی نرم افزار علاقه مندم. پروفایل کاربر

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

      تاریخ 38 ماه قبل
      نظرات 0
      بازدیدها 719
      با سلام به همه دوستان و همراهان 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 باشید



      نویسنده : مهدی عادلی فر
      منبع :انجمن تخصصی فناوری اطلاعات ایران 
      هر گونه نشر و کپی برداری بدون ذکر منبع و نام نویسنده دارای اشکال اخلاقی می باشد. 

      برچسب ها
      مطالب مرتبط

      در حال دریافت اطلاعات

      نظرات
      هیچ نظری ارسال نشده است

        برای ارسال نظر ابتدا به سایت وارد شوید

        arrow
        دوره های وب سایت توسینسو

        با دوره های وب سایت توسینسو به همراه برترین اساتید ایران دانش خود را به روز کنید و در کنار آموزش آنلاین پشتیبانی اساتید را هم داشته باشید

        شبکه و زیر ساخت، مجازی سازی، امنیت اطلاعات، برنامه نویسی، گرافیک، اینترنت اشیاء، طراحی وب و صدا ها دوره آموزشی دیگر

        تا 150،000 تومان شارژ هدیه

        همین امروز شروع کنید