메뉴 건너뛰기

조회 수 11243 추천 수 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
번호 제목 날짜 조회 수
97 [안드로이드] 페이스북 같은 슬라이드 메뉴 만들기 file 2015.07.21 8182
96 [안드로이드] 팝업메뉴 사용법 file 2015.09.03 9391
95 [안드로이드] 콘텍스트 메뉴 사용예제 file 2015.09.03 7345
94 [안드로이드] 빠르게 사용할수 있는 컨텍스트 메뉴 만들기 file 2015.09.03 6789
93 [안드로이드] 뷰(View)의 너비와 높이 지정하기 file 2015.07.17 7140
92 [안드로이드] 뷰(View)에 여백넣기 file 2015.07.17 7225
91 [안드로이드] 버튼 이벤트 처리하기 file 2015.07.17 7029
90 [안드로이드] 리스트 뷰의 한 항목에 대한 컨텍스트 메뉴 만들기 file 2015.09.04 9080
89 [안드로이드] 레이아웃의 기본2 file 2015.07.16 7071
88 [안드로이드] 레이아웃의 기본1 file 2015.07.16 6962
87 [안드로이드] Activity에 대해서 file 2015.07.16 6767
86 [안드로이드 강좌] 초보자들이 많이 하는 실수 file 2015.08.11 6833
85 [DB]Android - DB 연동 기술 정리 2015.07.13 13798
84 [DB] 서버/클라이언트 소켓 통신하기 2015.07.13 20567
83 [Android] 퍼미션 권한체크(테드퍼미션) 2021.09.14 616
82 [Android 2.3] spinner file 2015.07.01 7647
81 [Android 2.3] SharePreference 2015.07.01 7051
80 XmlPullParser 를이용하여 데이터 가져와보기!! 2014.08.28 7221
» WIFI 신호세기 강도 측정하기 2014.08.28 11243
78 WebView에서 카메라 및 이미지 업로드 (선택적용가능) file 2020.12.14 2692
Board Pagination Prev 1 ... 4 5 6 7 8 9 10 11 12 13 Next
/ 13

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

© k2s0o1d4e0s2i1g5n. All Rights Reserved