마스터Q&A 안드로이드는 안드로이드 개발자들의 질문과 답변을 위한 지식 커뮤니티 사이트입니다. 안드로이드펍에서 운영하고 있습니다. [사용법, 운영진]

안드로이드 wifi를 이용한 어플 만들기

0 추천
package com.example.googlemaptest;

import java.util.List;

import android.app.Activity;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.content.IntentFilter;
import android.net.wifi.ScanResult;
import android.net.wifi.WifiManager;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.TextView;
import android.widget.Toast;

public class WIFIScanner extends Activity implements OnClickListener {

 private static final String TAG = "WIFIScanner";

  WifiManager wifimanager;

  TextView textStatus;

  Button btnScanStart;

  Button btnScanStop;
 
  private int scanCount = 0;

  String text = "";

  String result = "";

  private List<ScanResult> mScanResult; 

  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();

     wifimanager.startScan();

     } 
     
    else if (action.equals(WifiManager.NETWORK_STATE_CHANGED_ACTION)) {
     sendBroadcast(new Intent("wifi.ON_NETWORK_STATE_CHANGED"));

    }

   }

  };

  
  public void getWIFIScanResult() {

   mScanResult = wifimanager.getScanResults();

   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); 

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

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

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

  }

  public void initWIFIScan() {

   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()");

  }

  @Override

  public void onCreate(Bundle savedInstanceState) {

   super.onCreate(savedInstanceState);

   setContentView(R.layout.activity_wifiscanner);
   
   Button b = (Button) findViewById(R.id.button1);
   
   b.setOnClickListener(new OnClickListener(){
    public void onClick(View v){
     finish();
     }
   });

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

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

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

   btnScanStart.setOnClickListener(this);

   btnScanStop.setOnClickListener(this);

   wifimanager = (WifiManager) getSystemService(WIFI_SERVICE);

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

   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();

   }

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

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

    printToast("WIFI STOP !!!");

    unregisterReceiver(mReceiver);

   }
  
  }

 } 

와이파이 신호를 잡아와서 뿌려주는 코드입니다
현재 코드는 SSID와 RSSI값이 나오는데
제가 원하는게 같은이름의 AP들이 여러대 있을때
MAC주소를 표시하여 따로 구분하고싶습니다
------------------------------------------------------------------------------------------------------------------------
그리고 와이파이를 이용한 간단한 내부GPS를 만드는게 목적인대
예를들어 

2대의 AP가 있을떄
1번AP와 2번AP의 사이의 거리가 50M일떄
제가 1번AP의 10M 앞에서 신호의 세기를 측정했을때 -40dbM이
잡히고 2번AP의 신호세기는 -90dbM이 측정됬습니다

걸어서 10M 이동을 하여서

그리고 1번AP의 20M 앞에서 신호이 세기를 측정했을때 -55dbM이
잡히고 2번AP의 신호세기는 -75dbM이 측정됬습니다

이렇게 됬을떄 내부지도를 따로 만든뒤에 
제가 내부GPS를 켜고 걸어갈때 1번AP에서 -50dbM이 잡히고
2번AP에서 -80dbM이 잡혔을때 내부지도에 약 1번AP의 20M 떨어진 위치에 
현재 저의 위치를 찍어내고싶습니다

간단하게 말하면 RSSI의 값을 받아와서 만들어 놓은 내부지도에 
RSSI 값에 따른 위치를 지도에 찍어내는 어플을 만들고 싶습니다

생각은 이렇게 하고있지만 안드로이드를 배우는 학생이라 쉽지 않습니다
어떤식으로 만들어야 할지 무엇을 공부해야할지 감이 잡히질 않습니다
이런저런 자료를 찾아봤지만 wifi를 이용한 ips기술은 여러가지있는데
이해도 안가고 너무 어려워서 야매로 만들어볼려구합니다 
도와주세요 꾸벅ㅠ

 

카릴리 (470 포인트) 님이 2015년 5월 19일 질문

1개의 답변

0 추천
rssi값으로 거리를 대충은 구할수있겠지만 오차가 엄청나게 심합니다.

거리 이동했는데 오히려 더 멀어진것처럼 rssi가 나올수도 있구요. 중간에 장애물이 있다던가 기상상황에 따른다던가

변수들이 엄청나게 많아요.

전 블루투스로 비슷한거 하고 있는데요. 거리측정은 쉽지 않네요.

rssi로 거리구하는것도 한번 찾아보셔야할듯.

 

result 에 mac 주소 받아오는거 없나요? 블루투스의 경우엔 디바이스이름, rssi, mac 다 올라오는데

와이파이도 비슷할텐데요..
아시리 (8,400 포인트) 님이 2015년 5월 20일 답변
...