메뉴 건너뛰기

조회 수 11305 추천 수 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

  }

}

} 

 


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

© k2s0o1d4e0s2i1g5n. All Rights Reserved