본문 바로가기

카테고리 없음

[안드로이드 api] WiFi 네트워크 감시 및 처리루틴

1.
목적: 디바이스 장치 서칭시
       WiFi가 설정되었는지 실시간으로 감시하고
       불가능시 WiFi App 설정 메류로 Intent 호출
       WiFi 선택 후 가능시 원하는 작업 수행

설명: - Receiver를 등록하여 WiFi를 감시하고 처리한다.
        - Flag를 설정하여 onCreate() 에서 환경을 셋팅하고 onResume() 에서 Flag를 체크하여 작업 수행여부를 결정한다.
        - Receiver 이벤트 중 WIFI_STATE_ENABLED 상태이면 WiFi를 선택했음을 Flag로 설정하면
          WIFI_STATE_DISABLED 일때 호출되는 Settings.ACTION_WIFI_SETTINGS 인텐트를 호출하여 불려진 WiFi App  설정 후 불려지는
          onResume() 에서 Flag를 체크하여 원하는 루틴을 처리 할 수 있다.
       
정리: - WIFI_STATE_DISABLED :  Receiver 에서 Settings.ACTION_WIFI_SETTINGS 인텐트를 호출
          WIFI_STATE_ENABLED  : Receiver 에서 Flag 설정
          onCreate() : 환경을 셋팅
          onResume() : Flag에 따른 처리
               1. WiFi App 설정 액티비티에서 돌아왔을 때
               2. 살아있는 상태로 홈키를 눌렀다가 다시 돌아올 때 

추가 기능 : 
  1. wifi 상태인지 확인
  2. wifi 주소 int 값 리턴
  3. wifi 주소 string 리턴

2.
목적: 하나의 쓰레드만 사용하기 위한 방법

- deviceSearchThread.isAlive() 를 사용하여 쓰레드가 살아있는지 검사 후 쓰레드 실행 여부 결정
- deviceSearchThread.interrupt() 를 사용하여 쓰레드 정지






package com.glusys.devicesearch.sample;

import java.util.ArrayList;
import java.util.Iterator;

import android.app.Activity;
import android.content.Context;
import android.content.Intent;
import android.content.IntentFilter;
import android.net.wifi.WifiManager;
import android.os.Bundle;
import android.provider.Settings;
import android.util.Log;
import android.widget.ArrayAdapter;
import android.widget.ListView;

import com.devicesearch.core.R;
import com.glusys.devicesearch.core.DeviceSearchThread;
import com.glusys.devicesearch.core.NASDeviceInfo;
import com.glusys.devicesearch.core.NASSearchData2;
import com.glusys.devicesearch.core.NASSearchListener;



/**
 * DeviceSearchSampleActivity
 * 
 * 나스 장치 검색 셈플 코드
 * + WIFI 실시간 감시 코드 적용
 * 
 * @author hjsuccess17@gmail.com
 *
 */
public class DeviceSearchSampleActivity extends Activity {
/** Called when the activity is first created. */

public static final int PORT = 8989; 

private ListView listView;
private ArrayAdapter<String> adapter;
private ArrayList<String> deviceList;
private DeviceSearchThread deviceSearchThread; //장치검색 쓰레드
private SnowWiFiMonitor wifiMonitor; //wifi 모니터
private WifiManager wifiManager; //wifi 메니저
private boolean enableRequeste; //장치검색 쓰레드를 start 할수 있는지

//와이파이 모니터 리스너
SnowWiFiMonitor.OnChangeNetworkStatusListener SnowChangedListener 
= new SnowWiFiMonitor.OnChangeNetworkStatusListener()
{
public void OnChanged(int status) 
{
switch(status)
{
case SnowWiFiMonitor.WIFI_STATE_DISABLED:
Log.e("test", "[WifiMonitor] WIFI_STATE_DISABLED");

wifiManager.setWifiEnabled(true); //wifi 자동 켜짐
//wifi app 설정 메뉴로 
Intent intent = new Intent(Settings.ACTION_WIFI_SETTINGS);
startActivity(intent);

break;

case SnowWiFiMonitor.WIFI_STATE_DISABLING:
Log.e("LYK", "[WifiMonitor] WIFI_STATE_DISABLING");
break;

case SnowWiFiMonitor.WIFI_STATE_ENABLED:
Log.e("LYK", "[WifiMonitor] WIFI_STATE_ENABLED");
//onResume 에서 사용됨
if(!enableRequeste){
enableRequeste = true;
onResume();
}
break;

case SnowWiFiMonitor.WIFI_STATE_ENABLING:
Log.e("LYK", "[WifiMonitor] WIFI_STATE_ENABLING");
break;

case SnowWiFiMonitor.WIFI_STATE_UNKNOWN:
Log.e("LYK", "[WifiMonitor] WIFI_STATE_UNKNOWN");
break;

case SnowWiFiMonitor.NETWORK_STATE_CONNECTED:
Log.e("LYK", "[WifiMonitor] NETWORK_STATE_CONNECTED");
break;

case SnowWiFiMonitor.NETWORK_STATE_CONNECTING:
Log.e("LYK", "[WifiMonitor] NETWORK_STATE_CONNECTING");
break;

case SnowWiFiMonitor.NETWORK_STATE_DISCONNECTED:
Log.e("LYK", "[WifiMonitor] NETWORK_STATE_DISCONNECTED");
break;

case SnowWiFiMonitor.NETWORK_STATE_DISCONNECTING:
Log.e("LYK", "[WifiMonitor] NETWORK_STATE_DISCONNECTING");
break;

case SnowWiFiMonitor.NETWORK_STATE_SUSPENDED:
Log.e("LYK", "[WifiMonitor] NETWORK_STATE_SUSPENDED");
break;

case SnowWiFiMonitor.NETWORK_STATE_UNKNOWN:
Log.e("LYK", "[WifiMonitor] WIFI_STATE_DISABLED");
break;

}
}
};

@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
Log.e("LYK", "onCreate");
deviceList = new ArrayList<String>();

listView = (ListView)findViewById(R.id.listView1);
adapter = new ArrayAdapter<String>(this, android.R.layout.simple_list_item_1, deviceList);
listView.setAdapter(adapter);

//wifi 메니져
wifiManager = (WifiManager)getSystemService(Context.WIFI_SERVICE);
enableRequeste = wifiManager.isWifiEnabled();


//장치검색 루틴
deviceSearchThread = new DeviceSearchThread();
deviceSearchThread.setOnListener(new NASSearchListener() {

//장치가 검색되어 추가되었을대 불리는 리스너
public void onAdd(NASDeviceInfo device) {
StringBuffer buffer = new StringBuffer();
//디바이스 이름
buffer.append("DeviceName: "+device.getData1().getSzDeviceName()+"\n");
ArrayList<NASSearchData2> data2List = device.getData2List();
Iterator<NASSearchData2> it = data2List.iterator();
while(it.hasNext()){
NASSearchData2 data2 = it.next();
//디바이스 어떤 렌카드의 IP
buffer.append("ip: "+data2.getStringIPAddress());
}
//디버그
Log.e("LYK", "onAdd: \n"+ buffer.toString());

//리스트에 추가
deviceList.add(buffer.toString());

//아답터에 데이터 변경 알림
runOnUiThread(new  Runnable() {
public void run() {
adapter.notifyDataSetChanged();
}
});
}
});

//wifi 실시간 상태 감시  //퍼미션 설정 필요(manifest 참조)
wifiMonitor = new SnowWiFiMonitor(this);
wifiMonitor.setOnChangeNetworkStatusListener(SnowChangedListener);
registerReceiver(wifiMonitor, new IntentFilter(WifiManager.WIFI_STATE_CHANGED_ACTION));
//
}



/**
* 장치 검색 쓰레드를 실행한다
*/
private void requestDeviceSearch(){
//설정된 wifi 주소 
String ip = getWifiIpAsString(DeviceSearchSampleActivity.this);
Log.e("LYK", "[WifiMonitor] ip= "+ip);
if(ip != null){
//자신의 주소와 포트 설정
//포트는 나스포트로 잡는 것이 좋다
deviceSearchThread.setAdressAndPort(ip, DeviceSearchThread.SSNAS_SENDTO_PORT);
deviceSearchThread.start(); //쓰레드 시작
}
}


@Override
protected void onResume() {
// TODO Auto-generated method stub
super.onResume();
Log.e("LYK", "onResume/enableRequeste= "+enableRequeste);
if(enableRequeste){
//준비된 상태이고 쓰레드가 살아있는 상태가 아닐때 쓰레드를 실행한다
//중복된 쓰레드 생성을 방지하기 위한 방법
if(!deviceSearchThread.isAlive()){
Log.e("LYK", "Thread_Alive=  "+deviceSearchThread.isAlive());
requestDeviceSearch();
}
}
}


@Override
protected void onDestroy() {
// TODO Auto-generated method stub
super.onDestroy();
Log.e("LYK", "onDestroy");
//쓰레드를 종료해주는 것이 바람직
deviceSearchThread.interrupt();
//리시버도 종료해 줘야한다
unregisterReceiver(wifiMonitor);
finish();
}



/**
* wifi 상태인지 확인
* @param context
* @return
*/
public static boolean isWifiEnabled(Context context) {

WifiManager wifiMgr = (WifiManager)context
.getSystemService(Context.WIFI_SERVICE);
if(wifiMgr.getWifiState() == WifiManager.WIFI_STATE_ENABLED) {
return true;
} else {
return false;
}
}

/**
* wifi 주소 int 값 리턴
* @param context
* @return
*/
public static int getWifiIpAsInt(Context context) {
WifiManager wifiMgr = (WifiManager)context
.getSystemService(Context.WIFI_SERVICE);
if(wifiMgr.isWifiEnabled()) {
return wifiMgr.getConnectionInfo().getIpAddress();
} else {
return 0;
}
}

/**
* wifi 주소 string 리턴
* @param context
* @return
*/
public static String getWifiIpAsString(Context context) {
int addr = getWifiIpAsInt(context);
if(addr != 0) {
StringBuffer buf = new StringBuffer();
buf.append(addr & 0xff).append('.').
append((addr >>>= 8) & 0xff).append('.').
append((addr >>>= 8) & 0xff).append('.').
append((addr >>>= 8) & 0xff);
return buf.toString();
} else {
return null;
}
}

}