일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | ||
6 | 7 | 8 | 9 | 10 | 11 | 12 |
13 | 14 | 15 | 16 | 17 | 18 | 19 |
20 | 21 | 22 | 23 | 24 | 25 | 26 |
27 | 28 | 29 | 30 | 31 |
- 그라파나
- hyperledger fabric
- 플레이프레임워크
- play2 강좌
- 엔터프라이즈 블록체인
- 파이썬 강좌
- 스위프트
- 이더리움
- 파이썬 머신러닝
- 하이퍼레저 패브릭
- 파이썬
- 파이썬 동시성
- Adapter 패턴
- 스칼라 동시성
- 하이브리드앱
- 스칼라 강좌
- 주키퍼
- Hyperledger fabric gossip protocol
- 파이썬 데이터분석
- Akka
- 블록체인
- Actor
- Play2
- play 강좌
- CORDA
- 안드로이드 웹뷰
- 스칼라
- akka 강좌
- Golang
- Play2 로 웹 개발
- Today
- Total
HAMA 블로그
안드로이드 와이파이 다이렉트(WI-FI Direct) 프로그래밍(2-1) 본문
"기적을 부르는 안드로이드 통신 프로그래밍" 으로 공부한 내용 정리입니다.
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();
}
});
}
}
'안드로이드' 카테고리의 다른 글
안드로이드에서 서비스 와 쓰레드의 차이 (0) | 2015.06.30 |
---|---|
안드로이드 와이파이 다이렉트(WI-FI Direct) 프로그래밍(3-1) (0) | 2015.06.21 |
안드로이드 와이파이 다이렉트(WI-FI Direct) 프로그래밍(1) (0) | 2015.06.20 |
[안드로이드] QR Scanner 와 웹뷰 (0) | 2015.06.12 |
안드로이드 스마트폰 기반의 모바일 게이트웨이 구현 (0) | 2015.06.11 |