관리 메뉴

HAMA 블로그

안드로이드 와이파이 다이렉트(WI-FI Direct) 프로그래밍(2-1) 본문

안드로이드

안드로이드 와이파이 다이렉트(WI-FI Direct) 프로그래밍(2-1)

[하마] 이승현 (wowlsh93@gmail.com) 2015. 6. 21. 10:07


"기적을 부르는 안드로이드 통신 프로그래밍" 으로 공부한 내용 정리입니다.


1. 와이파이 다이렉트란 ? 

2. 와이파이 개발 일반 

  2-1) 와이파이 스캔 

  2-2) 와이파이 환경 설정

  2-3) 와이파이 네트워크 연결

 

3. 와이파이 다이렉트 개발 

  3-1) 일반

  3-2) 서비스 검색 

  3-3) 와이파이 락 과 멀티캐스트 설정 

  




와이파이 스캔 


- 무선 접속 장치

   무선접속 장치에 접속하고자 하는 단말기들을 위해 ,무선 접속 장치는 비콘 메세지를 주기적으로 주변에 뿌린다.

   비콘 메세지는 무선접속장치의 BSSID,SSID,무선접속장치의 속도 그리고 암호화 정보로 구성된다.

- 클라이언트

   수동적으로 비콘 메세지를 수신하여 주변의 무선접속 장치의 존재를 확인하는 방법

    능동적으로  단말기에서 직접 주변에 프로브 메세지를 브로드캐스트하고, 수신한 무선접속장치로부터 프로브 응답메세지 받는 방법.



다음은 코드로 확인해보자.

간략하게 설명하면 첫번째 액티비티에서 버튼을 클릭하여 1.스캔을 시작하고 2. 리시버를 등록한다

리시버에서 와이파이정보들을 받은후에 두번째 액티비티로 넘긴후 리스트로 보여준다.


<?xml version="1.0" encoding="utf-8"?>

<manifest xmlns:android="http://schemas.android.com/apk/res/android"

  package="com.example.wifi" 

  android:versionCode="1" 

  android:versionName="1.0">

  <application android:icon="@drawable/icon" 

    android:label="@string/app_name"

      android:theme="@android:style/Theme.Light">

     <activity android:name=".WiFiDemo" 

         android:label="@string/app_name">

      <intent-filter>

        <action android:name="android.intent.action.MAIN" />

        <category android:name="android.intent.category.LAUNCHER" />

      </intent-filter>

    </activity>

    <activity android:name=".ArrayAdapterActivity"/>

   </application>

  <uses-sdk android:minSdkVersion="6" />

  // 와이파이 디바이스에 대한 정보를 엑세스 할수있는 / 상태를 변경할수있는 권한을 취득합니다.

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

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

</manifest>



package com.example.wifi;


import android.app.Activity;

import android.content.ActivityNotFoundException;

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.WifiConfiguration;

import android.net.wifi.WifiInfo;

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;


import java.util.ArrayList;

import java.util.List;


public class WiFiDemo extends Activity {

WifiManager wifi;

BroadcastReceiver receiver;


TextView textStatus;

Button buttonScan;


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

@Override

public void onCreate(Bundle savedInstanceState) {

super.onCreate(savedInstanceState);

setContentView(R.layout.main);


// Setup UI

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

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

buttonScan.setOnClickListener(new OnClickListener() {

@Override

public void onClick(View view) {

wifi.startScan();  // 와이파이 스캔을 시작합니다.

}

});


// Setup WiFi

wifi = (WifiManager) getSystemService(Context.WIFI_SERVICE);


if (!wifi.isWifiEnabled())

    wifi.setWifiEnabled(true); 


// Get WiFi status

WifiInfo info = wifi.getConnectionInfo();

textStatus.append("\n\nWiFi Status: " + info.toString());


// List available networks

List<WifiConfiguration> configs = wifi.getConfiguredNetworks();

for (WifiConfiguration config : configs) {

textStatus.append("\n\n" + config.toString());


// 브로드 캐스트 리시버를 등록합니다.

               // 블루투스와 동일하게 와이파이를 스캔하여 취득한 무선 접속 장치의 정보는 안드로이드 시스템에서 

               // SCAN_RESULTS_AVAILABLE_ACTION 액션과 함께 브로드캐스트 인텐트로 모든 애플리케이션에 뿌리집니다.

receiver = new WiFiScanReceiver();

registerReceiver(receiver, new IntentFilter(WifiManager.SCAN_RESULTS_AVAILABLE_ACTION));

}


@Override

public void onDestroy() {

unregisterReceiver(receiver);

}

public class WiFiScanReceiver extends BroadcastReceiver {

@Override

public void onReceive(Context c, Intent intent) {

List<ScanResult> results = wifi.getScanResults();

ArrayList<String> data = new ArrayList<String>(); 

       

// 가장 강력한 신호를 가진것을 기록해서 밑에서 토스트로 사용자에게 보여줍니다.

ScanResult bestSignal = null;

for (ScanResult result : results) {

data.add(result.toString());

if (bestSignal == null || WifiManager.compareSignalLevel(bestSignal.level, result.level) < 0)

bestSignal = result;

}


// 검색된 와이파이 정보를 컬렉션에 넣고, startActivity 액티비티 호출

Intent i = new Intent();

                        i.setClass(WiFiDemo.this, ArrayAdapterActivity.class);

                        i.putStringArrayListExtra("data", data);  

            

                    try {

                    startActivity(i);

   } catch (ActivityNotFoundException e) {

         Log.w("ExplicitIntent", "ForwardTarget.class 를 발견할수없습니다.");

   }


                   String message = String.format("%s networks found. %s is the strongest.",

results.size(), bestSignal.SSID);

  Toast.makeText(WiFiDemo.this, message, Toast.LENGTH_LONG).show(); 

}

}

}



package com.example.wifi;


import android.app.Activity;

import android.content.Intent;

import android.os.Bundle;

import android.view.View;

import android.widget.AdapterView;

import android.widget.AdapterView.OnItemClickListener;

import android.widget.ArrayAdapter;

import android.widget.ListView;

import android.widget.TextView;

import android.widget.Toast;


import java.util.List;


public class ArrayAdapterActivity extends Activity {

ArrayAdapter<String> btArrayAdapter;

ListView listDevicesFound;

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

    @Override

    public void onCreate(Bundle savedInstanceState) {

        super.onCreate(savedInstanceState);

        setContentView(R.layout.list);

        listDevicesFound = (ListView)findViewById(R.id.devicesfound);

        

        Intent i = getIntent();

        List<String> data = i.getStringArrayListExtra("data");        

 

        btArrayAdapter = new ArrayAdapter<String>(this, android.R.layout.simple_list_item_1, data);

        listDevicesFound.setAdapter(btArrayAdapter);

        

        listDevicesFound.setOnItemClickListener(new OnItemClickListener() {

            @Override

public void onItemClick(AdapterView<?> l, View v, int position, long id) {    

                                Toast.makeText(getApplicationContext(), ((TextView) v).getText(),

                                Toast.LENGTH_SHORT).show();

            }

        });

    }

}





Comments