메뉴 건너뛰기

조회 수 11309 추천 수 0 댓글 0
?

단축키

Prev이전 문서

Next다음 문서

크게 작게 위로 아래로 댓글로 가기 인쇄
?

단축키

Prev이전 문서

Next다음 문서

크게 작게 위로 아래로 댓글로 가기 인쇄

미국에 오면서 코딩 공부를 많이 하지 못한거같다. ㅜ.ㅜ 그래도 이곳의 문화를 많이 봐서 기분이 좋다. 

 

이번에는 RSSI 를 코딩으로 나타내도록 해본다. 

 

RSSI 는 특정 AP의 신호 감도를 측정하는 것이다. 

 

RSSI는 Received Signal Strength Indication혹은 Received Signal Strength Indicator의 약자이다. 어느 쪽으로 상황에 맞게 사용할 수 있다. 이것은 말 그대로 수신된 신호의 세기로 이해하면 된다. 특정 주파수 대역의 에너지 크기라고 생각하면 간단하다. 값은 8bit로 표시되며 0x00~0xFF의 값으로 표시되며 오차는 6db이내로 결정할 수 있다. 

이것은 위치를 계산이 가능하고 라우팅 테이블을 생성하기 때문에 매우 중요한 요소라고 할 수 있다. 

 

RSSI 에서 음수료 표시되는데 0에 가까울수록 신호의 세기가 강한 것이라고 생각하면 된다. 

 

그러면 와이파이 리스트를 받아오는 것을 사용해보자. 

 

시작을 누르면 기본적으로 브로드캐스트 리시버를 이용하여, 신호를 받아오고 그것을 텍스트에 표시하는 원리이다. 

 

permission 의 경우에는 이두가지 퍼미션을 추가해 주어야 한다. 

 

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

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

 

그리고 dBm의 의미는 

전기 통신에서 사용되는 전력의 절대 측정단위.라고 써잇는데 

일단은 dBm이라고 알아 놓고 나중에, 거리로 환산하는 방법을 다음에 포스팅 해보도록 한다. ​

 

아래의 글을보고 신호와 Noise의 상관관계를 알아야 한다. 

 

Noise(잡음) 은 반대로 -숫자가 크면 좋다. 즉 -90 이 -80 보다 잡음이 더 적다는 의미이다. 

따라서 RSSI와 Noise 와의 차이(갭)가 크면 클수록 좋다. 

 

public class MainActivity extends Activity implements OnClickListener {

 

private static final String TAG = "WIFIScanner";

 

// WifiManager variable

WifiManager wifimanager;

 

// UI variable

TextView textStatus;

Button btnScanStart;

Button btnScanStart2;

Button btnScanStop;

Button btnScanStop2;

 

private int scanCount = 0;

String text = "";

String result = "";

 

 

 

 

private List<ScanResult> mScanResult; // ScanResult List

 

//첫번째 브로드 캐스트 리시버이다. 이것을 통해 사용하도록한다. 

//wifimanager라는 객체는 startScan()이라는 것을 갖고있어서 이것을 이용하면 ,

//스캔을 시작하고, 그 결과를 getWIFIScanResult를 이용하여 글씨로 뿌려준다. 

//테스트를 위해 2개의 리시버를 준비하였다. 

private BroadcastReceiver mReceiver = new BroadcastReceiver() {

  @Override

  public void onReceive(Context context, Intent intent) {

   final String action = intent.getAction();

   if (action.equals(WifiManager.SCAN_RESULTS_AVAILABLE_ACTION)) {

    getWIFIScanResult(); // get WIFISCanResult

    wifimanager.startScan(); // for refresh

   } else if (action.equals(WifiManager.NETWORK_STATE_CHANGED_ACTION)) {

    sendBroadcast(new Intent("wifi.ON_NETWORK_STATE_CHANGED"));

   }

  }

};

private BroadcastReceiver mReceiver2 = new BroadcastReceiver() {

  @Override

  public void onReceive(Context context, Intent intent) {

   final String action = intent.getAction();

   if (action.equals(WifiManager.SCAN_RESULTS_AVAILABLE_ACTION)) {

    getWIFIScanResult2(); // get WIFISCanResult

    wifimanager.startScan(); // for refresh

   } else if (action.equals(WifiManager.NETWORK_STATE_CHANGED_ACTION)) {

    sendBroadcast(new Intent("wifi.ON_NETWORK_STATE_CHANGED"));

   }

  }

};

 

//스캔한뒤에 그결과를 getScanResult()라는 함수로 받아온다. 

 

public void getWIFIScanResult() {

 

  mScanResult = wifimanager.getScanResults(); // ScanResult

  // Scan count

 

  textStatus.setText("Scan count is \t" + ++scanCount + " times \n");

 

 

 

  textStatus.append("=======================================\n");

  for (int i = 0; i < mScanResult.size(); i++) {

   ScanResult result = mScanResult.get(i);

  

  

   //이부분이 가장중요하다. SSID에서 AP이름을 확인하고 

//level은 신호세기를 나타낸다. 이것을 이용하여 사용할 것이다. 

 

   textStatus.append((i + 1) + ". SSID : " + result.SSID.toString()

     + "\t\t RSSI : " + result.level + " dBm\n");

   /**

   * TODO::RSSI calculation

   */

  

  }

  textStatus.append("=======================================\n");

}

 

//원리는 같다. 

public void getWIFIScanResult2() {

 

  mScanResult = wifimanager.getScanResults(); // ScanResult

  // Scan count

  textStatus.setText("Scan count is \t" + ++scanCount + " times \n");

 

  textStatus.append("=======================================\n");

  for (int i = 0; i < mScanResult.size(); i++) {

   ScanResult result = mScanResult.get(i);

   if (result.SSID.toString().equals("ollehWiFi")){

    textStatus.append((i + 1) + ". SSID : " + result.SSID.toString()

      + "\t\t RSSI : " + result.level + " dBm\n");}

  }

  textStatus.append("=======================================\n");

}

 

 

//스캔을 시작하며 리시버를 등록하여 준다. 

public void initWIFIScan() {

  // init WIFISCAN

  scanCount = 0;

  text = "";

  final IntentFilter filter = new IntentFilter(

    WifiManager.SCAN_RESULTS_AVAILABLE_ACTION);

  filter.addAction(WifiManager.NETWORK_STATE_CHANGED_ACTION);

  registerReceiver(mReceiver, filter);

  wifimanager.startScan();

  Log.d(TAG, "initWIFIScan()");

}

public void initWIFIScan2() {

  // init WIFISCAN

  scanCount = 0;

  text = "";

  final IntentFilter filter = new IntentFilter(

    WifiManager.SCAN_RESULTS_AVAILABLE_ACTION);

  filter.addAction(WifiManager.NETWORK_STATE_CHANGED_ACTION);

  registerReceiver(mReceiver2, filter);

  wifimanager.startScan();

  Log.d(TAG, "initWIFIScan2()");

}

 

 

/** Called when the activity is first created. */

@Override

public void onCreate(Bundle savedInstanceState) {

  super.onCreate(savedInstanceState);

  setContentView(R.layout.activity_main);

 

  // Setup UI

  textStatus = (TextView) findViewById(R.id.textStatus);

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

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

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

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

 

  // Setup OnClickListener

  btnScanStart.setOnClickListener(this);

  btnScanStart2.setOnClickListener(this);

  btnScanStop.setOnClickListener(this);

  btnScanStop2.setOnClickListener(this);

 

  // Setup WIFI

  wifimanager = (WifiManager) getSystemService(WIFI_SERVICE);

  Log.d(TAG, "Setup WIfiManager getSystemService");

 

  // if WIFIEnabled

  if (wifimanager.isWifiEnabled() == false)

   wifimanager.setWifiEnabled(true);

 

}

 

public void printToast(String messageToast) {

  Toast.makeText(this, messageToast, Toast.LENGTH_LONG).show();

}

 

@Override

public void onClick(View v) {

 

  if (v.getId() == R.id.btnScanStart) {

   Log.d(TAG, "OnClick() btnScanStart()");

   printToast("WIFI SCAN !!!");

   initWIFIScan(); // start WIFIScan

  }

  if (v.getId() == R.id.btnScanStart2) {

   Log.d(TAG, "OnClick() btnScanStart2()");

   printToast("WIFI SCAN !!!");

   initWIFIScan2(); // start WIFIScan

  }

  if (v.getId() == R.id.btnScanStop) {

   Log.d(TAG, "OnClick() btnScanStop()");

   printToast("WIFI STOP !!!");

   unregisterReceiver(mReceiver);

   return;

   // stop WIFISCan

  }

  if (v.getId() == R.id.btnScanStop2) {

   Log.d(TAG, "OnClick() btnScanStop2()");

   printToast("WIFI STOP !!!");

   unregisterReceiver(mReceiver2);

   return;

   // stop WIFISCan

  }

}

} 

 


List of Articles
번호 제목 날짜 조회 수
257 안드로이드 php 로 mysql json 파싱 하기 2014.08.28 9479
256 FTPClient 를이용하여 ftp상 서버에서 데이터 다운로드 편 2014.08.28 9917
255 XmlPullParser 를이용하여 데이터 가져와보기!! 2014.08.28 7282
254 FTPClient 를이용한 데이터 업로드 하기 2014.08.28 6428
253 클래스나눠서 xml 파싱과 FTP를이용하여 안드로이드에서 활용하기 2014.08.28 6242
252 전화 인텐트와 나의 전화 번호가져오기 2014.08.28 6372
251 사진찍기 및 앨범 에서 사진 가져오기!!! 2014.08.28 13950
250 안드로이드 웹에서 이미지 불러오기!! 2014.08.28 7376
249 맵에 오버레이 추가하여 아이템 넣어보기 2014.08.28 6541
248 실행중인 Service 확인하기 2014.08.28 6637
247 안드로이드 이미지 효율적으로 회전 해보기 2014.08.28 6071
» WIFI 신호세기 강도 측정하기 2014.08.28 11309
245 WebView 줌 컨트롤러 가리기 2014.08.28 6359
244 ImageVeiw의 현재 리소스 비교하기 2014.08.28 6812
243 HTML5 Speech Input (음성인식) API 2014.09.04 6493
242 HTML5 시작하기 file 2014.09.04 5704
241 CSS3 Rounded Corner, 그림자 효과 사용하기 file 2014.09.04 6830
240 JavaScript 맛보기 file 2014.09.04 6639
239 HTML5로 비디오 보여주기 Video Tag file 2014.09.04 7112
238 HTML5로 나만의 비디오 플레이어 스킨 만들기 -1- CSS file 2014.09.04 6524
Board Pagination Prev 1 2 3 4 5 6 7 8 9 10 ... 13 Next
/ 13

하단 정보를 입력할 수 있습니다

© k2s0o1d4e0s2i1g5n. All Rights Reserved