메뉴 건너뛰기

조회 수 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
번호 제목 날짜 조회 수
197 MediaPlayer 클래스 사용법 file 2018.10.02 1803
196 prepend(),append(),before(),after() 메서드 2014.10.20 7361
195 ScrollView의 활용 2015.07.16 6530
194 setContentView()와 레이아웃 전개자(LayoutInflater) 2021.03.31 266
193 TextureView를 이용한 카메라 Preview 좌우 반전 2015.06.10 14235
192 This Handler class should be static or leaks might occur 시 해결법 2020.12.14 240
191 URL을 이용해서 이미지 다운로드 하기 2015.07.16 7407
190 URL을 이용해서 이미지 다운로드 하기 (멀티 쓰레드 이용) file 2015.07.16 8992
189 ViewFlipper 사용하기 file 2015.07.16 9631
188 Virtual Device , 디자인 화면 file 2021.03.31 260
187 Volley 로 웹요청하고 응답받기1 - Get방식 file 2020.12.14 348
186 Volley 로 웹요청하고 응답받기2 - Post방식 , 로그인-회원가입 (php,mysql 연동) file 2020.12.14 1435
185 Volley 로 웹요청하고 응답받기3 - Get방식 , json 읽기 (php,mysql) file 2020.12.14 378
184 Volley 이용시에 한글 깨질때 UTF-8로 변경 2020.12.14 348
183 WebView 작업할때 Net::ERR_UNKNOWN_URL_SCHEME 에러 발생할때 (전화걸기,문자보내기 안된다) 2020.12.14 1069
182 WebView 줌 컨트롤러 가리기 2014.08.28 6316
181 WebView를 사용할때 HttpClient를 이용한 Session 유지 2018.12.27 4381
180 WebView에서 카메라 및 이미지 업로드 (선택적용가능) file 2020.12.14 2702
» WIFI 신호세기 강도 측정하기 2014.08.28 11243
178 XmlPullParser 를이용하여 데이터 가져와보기!! 2014.08.28 7221
Board Pagination Prev 1 2 3 4 5 6 7 8 9 10 ... 13 Next
/ 13

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

© k2s0o1d4e0s2i1g5n. All Rights Reserved