본문 바로가기

소프트웨어/Android/Java/Ndk

Wifi 검색 샘플 소스

주변의 Wifi AP를 검색하고 그에대한

BSSID( MAC ADDR)

SSID

Capabilitiies(암호화)

Frequency

Signal Level

을 보여주는 간단한 APP이다.


소스는 '커니의 안드로이드 2판'을 참고하였다.



간단하게 원리를 정리하자면,

Wifi 검색은 WifiManager Class를 이용하여 Wifi service의 context를 얻고 

wifiManager = (WifiManager)getSystemService(Context.WIFI_SERVICE); //인스턴스 get

그 값을 이용해서 주변 wifi를 getScanResults 매서드를 이용해서 스캔한다.

scanResult = wifiManager.getScanResults();

그리고 스캔값들을 HashMap에 저장하여(이부분은 개발자가 편한대로..) 리스트에 출력한다.

HashMap<String,String> item = new HashMap<String,String>();

item.put("bssid","BSSID : " + result.BSSID);

item.put("ssid","SSID : " + result.SSID);

item.put("capabilities","Capablities : " + result.capabilities);

item.put("freq","Freq : " + result.frequency);

item.put("level","Signal Level : " + result.level);

list.add(item);


부가적으로 Device가 Wifi가 사용 가능한지 체크를 하기 위해서 

ConnectivityManager Class를 이용하여 Connectivity sevice의 context를 얻고

connManager = (ConnectivityManager)getSystemService(Context.CONNECTIVITY_SERVICE); //인스턴스 get

NetworkInfo clas를 이용하여 Wifi모듈의 NextworkInfo를 얻어와서 모듈이 작동중인지 체크를 할 수 있다.

NetworkInfo wifiInfo =

connManager.getNetworkInfo( ConnectivityManager.TYPE_WIFI); //wifi 타입의 정보를 얻오온다.



참고. ConnectivityManager에서는 아래와 같은 여러가지 모듈의 상태값을 받아올 수 있다.( 블루투스,wifi,wimax(==wibro) 등 )







menifest permission은 아래의 두가지가 필요하다.

 <uses-permission android:name="android.permission.ACCESS_WIFI_STATE"/>

  <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/>

xml과 manifest는 아래의 압축파일을 참고

SearchWIFI.zip


package com.example.searchwifi;


import java.util.ArrayList;

import java.util.HashMap;

import java.util.List;


import android.app.ListActivity;

import android.content.Context;

import android.net.ConnectivityManager;

import android.net.NetworkInfo;

import android.net.wifi.ScanResult;

import android.net.wifi.WifiManager;

import android.os.Bundle;

import android.view.Menu;

import android.view.View;

import android.view.View.OnClickListener;

import android.widget.Button;

import android.widget.SimpleAdapter;

import android.widget.Toast;


public class MainActivity extends ListActivity {


//private

private WifiManager wifiManager;

private ConnectivityManager connManager;

private List<ScanResult> scanResult;

private SimpleAdapter adapter;

private ArrayList< HashMap<String,String> > list;

private Button btnRefresh;

@Override

protected void onCreate(Bundle savedInstanceState) {

super.onCreate(savedInstanceState);

setContentView(R.layout.activity_main);

list = new ArrayList< HashMap<String,String> >();

wifiManager = (WifiManager)getSystemService(Context.WIFI_SERVICE); //인스턴스 get

connManager = (ConnectivityManager)getSystemService(Context.CONNECTIVITY_SERVICE); //인스턴스 get

NetworkInfo wifiInfo =

connManager.getNetworkInfo( ConnectivityManager.TYPE_WIFI); //wifi 타입의 정보를 얻오온다.

if(wifiInfo.isAvailable())

refresh();

else

Toast.makeText(getApplicationContext() , "wifi 사용불가", Toast.LENGTH_LONG).show();

btnRefresh = (Button)findViewById(R.id.btnRefresh);

btnRefresh.setOnClickListener(new OnClickListener() {

@Override

public void onClick(View v) {

// TODO Auto-generated method stub

refresh();

}

});

}


@Override

public boolean onCreateOptionsMenu(Menu menu) {

// Inflate the menu; this adds items to the action bar if it is present.

getMenuInflater().inflate(R.menu.main, menu);

return true;

}


private void refresh() {

scanResult = wifiManager.getScanResults();

list.clear();

for(ScanResult result: scanResult) {

HashMap<String,String> item = new HashMap<String,String>();

item.put("bssid","BSSID : " + result.BSSID);

item.put("ssid","SSID : " + result.SSID);

item.put("capabilities","Capablities : " + result.capabilities);

item.put("freq","Freq : " + result.frequency);

item.put("level","Signal Level : " + result.level);

list.add(item);

}

String[] from = new String[] { 

"bssid", 

"ssid", 

"capabilities", 

"freq", 

"level"

};

int[] to      = new int[] {  

R.id.bssid, 

R.id.ssid, 

R.id.capabilities,

R.id.Freq, 

R.id.level

};

adapter = new SimpleAdapter( this, list, R.layout.row, from, to);

setListAdapter(adapter);

}


}