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가 설정되었는지 실시간으로 감시하고
불가능시 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() 를 사용하여 쓰레드 정지
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;
}
}
}