Notice
Recent Posts
Recent Comments
Link
투케이2K
136. (TWOK/UTIL) [Android/Java] C_SmartConfig_Module : 스마트 콘피그 통신 수행 유틸 파일 본문
투케이2K 유틸파일
136. (TWOK/UTIL) [Android/Java] C_SmartConfig_Module : 스마트 콘피그 통신 수행 유틸 파일
투케이2K 2024. 10. 3. 08:22[설 명]
프로그램 : Android / Java
설 명 : C_SmartConfig_Module : 스마트 콘피그 통신 수행 유틸 파일
[소스 코드]
package com.example.javaproject.C_Module;
import android.content.Context;
import android.os.Build;
import android.os.Handler;
import android.os.Looper;
import com.espressif.iot.esptouch.EsptouchTask;
import com.espressif.iot.esptouch.IEsptouchListener;
import com.espressif.iot.esptouch.IEsptouchResult;
import com.example.javaproject.C_App;
import com.example.javaproject.C_StateCheck;
import com.example.javaproject.C_Util;
import com.example.javaproject.S_Log;
import java.util.List;
import java.util.concurrent.TimeUnit;
import io.reactivex.rxjava3.core.Observable;
import okhttp3.OkHttpClient;
import okhttp3.Request;
public class C_SmartConfig_Module {
/**
* // --------------------------------------------------------------------------------------
* TODO [클래스 설명]
* // --------------------------------------------------------------------------------------
* 1. [설명] : Espress : esptouch : 스마트 컨피그 통신 수행 모듈 (하드웨어 칩과 SDK 호환성이 맞아야 사용 가능 모듈)
* // --------------------------------------------------------------------------------------
* 2. 필요 퍼미션 :
*
* TODO [안드로이드 13 이상] : [근처 기기 스캔 + 와이파이 접근 + 위치 접근]
*
* <uses-permission android:name="android.permission.BLUETOOTH_SCAN"/>
*
* <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION"/>
* <uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION"/>
*
* <uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />
* <uses-permission android:name="android.permission.CHANGE_WIFI_STATE"/>
* <uses-permission android:name="android.permission.CHANGE_NETWORK_STATE" />
* <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
* <uses-feature android:name="android.hardware.location.network"/>
*
*
* TODO [안드로이드 13 미만] : [와이파이 접근 + 위치 접근]
*
* <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION"/>
* <uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION"/>
*
* <uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />
* <uses-permission android:name="android.permission.CHANGE_WIFI_STATE"/>
* <uses-permission android:name="android.permission.CHANGE_NETWORK_STATE" />
* <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
* <uses-feature android:name="android.hardware.location.network"/>
* // --------------------------------------------------------------------------------------
* 3. Build.gradle 의존성 부여 :
*
* implementation 'com.github.EspressifApp:lib-esptouch-android:1.1.1'
* // --------------------------------------------------------------------------------------
* 4. 와이파이 및 기능 사용간 참고 사항 :
*
* - 와이파이 스캔 기능은 1분에 4회 이상 스캔 시 OS 에서 제한 발생 (개발자 모드에서 제한 해제 가능)
* // --------------------------------------------------------------------------------------
* */
/**
* // --------------------------------------------------------------------------------------
* TODO [빠른 로직 찾기 : 주석 로직 찾기]
* // --------------------------------------------------------------------------------------
*
* // --------------------------------------------------------------------------------------
*
* // --------------------------------------------------------------------------------------
*
* // --------------------------------------------------------------------------------------
*
* // --------------------------------------------------------------------------------------
*/
// ------------------------------------------------------------------------------------------
// TODO [사용 방법]
// ------------------------------------------------------------------------------------------
/*
try {
// -------------------------------------------------
// TODO [1]. 스마트 콘피그 수행 필요 변수 선언
// -------------------------------------------------
String ssid = "TWOK";
String bssid = "58:86:94:c1:47:5c";
String pw = "t0123456789";
// --------------------------------------
// TODO [2]. [EsptouchTask 클래스 인스턴스 초기화]
// --------------------------------------
C_SmartConfig_Module c_esptouch_module = C_SmartConfig_Module.getInstance();
c_esptouch_module.setContext(A_Test.this);
// --------------------------------------
// TODO [3]. [EsptouchTask 와이파이 정보 초기화 수행]
// --------------------------------------
if(c_esptouch_module.createEsptouchTask(ssid, bssid, pw) == true) { // [소켓 연결 상태 확인]
// --------------------------------------
// TODO [4]. [EsptouchTask 브로드 캐스팅 결과 확인]
// --------------------------------------
C_SmartConfig_Module.observableEsptouchTaskBroadcast()
.subscribeOn(AndroidSchedulers.mainThread()) // [Observable (생성자) 로직을 IO 스레드에서 실행 : 백그라운드]
.observeOn(Schedulers.io()) // [Observer (관찰자) 로직을 메인 스레드에서 실행]
.subscribe(new Observer<String>() { // [Observable.create 타입 지정]
@Override
public void onSubscribe(@NonNull Disposable d) {
}
@Override
public void onNext(@NonNull String value) {
// TODO [IP 주소 확인 결과 처리]
S_Log._W_("EsptouchTaskBroadcast :: onNext :: " + String.valueOf(value), null);
}
@Override
public void onError(@NonNull Throwable e) {
}
@Override
public void onComplete() {
}
});
}
else {
S_Log._E_("EsptouchTask 초기화 실패", null);
}
}
catch (Exception e) {
S_Log._printStackTrace_(null, S_FinalData.LOG_BUG_STATE, null, e);
}
*/
// ------------------------------------------------------------------------------------------
// ------------------------------------------------------------------------------------------
// TODO [전역 변수 선언]
// ------------------------------------------------------------------------------------------
private static String ACTIVITY_NAME = "C_SmartConfig_Module";
private Context mMainCtx; // [컨텍스트]
private static EsptouchTask esptouchTask = null; // [EsptouchTask 객체]
private static final int broadCastSeconds = 60; // [60 초 설정] : [Esptouch 라이브러리 기본 타임 아웃도 60초]
// ------------------------------------------------------------------------------------------
// TODO [콘텍스트 지정]
// ------------------------------------------------------------------------------------------
public void setContext(Context ctx) {
mMainCtx = ctx;
}
// ------------------------------------------------------------------------------------------
// TODO [인스턴스 생성]
// ------------------------------------------------------------------------------------------
public static C_SmartConfig_Module getInstance() { return C_SmartConfig_Module.LazyHolder.INSTANCE; }
private static class LazyHolder {
private static final C_SmartConfig_Module INSTANCE = new C_SmartConfig_Module();
}
// ------------------------------------------------------------------------------------------
// TODO [EsptouchTask 객체 생성 수행]
// ------------------------------------------------------------------------------------------
public synchronized boolean createEsptouchTask(String ssid, String bssid, String pw) {
// [리턴 번수 선언]
boolean resultData = false;
// [로직 처리 수행]
try{
// -----------------------------------------
// [인풋 값 널 값 체크 수행]
// -----------------------------------------
// ssid : twokWifi
// -----------------------------------------
// bssid : 3a:db:07:97:e9:b7
// -----------------------------------------
// pw : t0123456789
// -----------------------------------------
// [초기화 수행]
esptouchTask = null;
if (C_Util.stringNotNull(ssid) == true && C_Util.stringNotNull(bssid) == true && C_Util.stringNotNull(pw) == true){
S_Log._W_(ACTIVITY_NAME + " : EsptouchTask 생성 수행", new String[]{ "SSID :: " + String.valueOf(ssid), "BSSID :: " + String.valueOf(bssid), "PW :: " + String.valueOf(pw) });
// [mMainCtx 널 체크 수행]
if (mMainCtx != null) {
// [와이파이 활성 상태 체크]
if (C_StateCheck.getWifiEnable(mMainCtx) == true
&& C_StateCheck.get_Wifi_Enable_Device(mMainCtx) == true){
// [EsptouchTask 객체 생성 수행]
esptouchTask = new EsptouchTask(ssid, bssid, pw, mMainCtx);
// [리턴 값 변경]
resultData = true;
}
else {
S_Log._E_(ACTIVITY_NAME + " : EsptouchTask 생성 에러", new String[]{ "Wifi Enabled False" });
}
}
else {
S_Log._E_(ACTIVITY_NAME + " : EsptouchTask 생성 에러", new String[]{ "mMainCtx is null" });
}
}
else {
S_Log._E_(ACTIVITY_NAME + " : EsptouchTask 생성 에러", new String[]{ "Input Data Is Null" });
}
} catch (Exception e) {
S_Log._E_(ACTIVITY_NAME + " : EsptouchTask 생성 에러", new String[]{ String.valueOf(e.getMessage()) });
}
return resultData;
}
// ------------------------------------------------------------------------------------------
// TODO [EsptouchTask 브로드 캐스팅 알림 전파 수행]
// ------------------------------------------------------------------------------------------
// TODO [호출 방법 소스 코드]
// -----------------------------------------------------------------------------------------
/*
try {
C_SmartConfig_Module.observableEsptouchTaskBroadcast()
.subscribeOn(AndroidSchedulers.mainThread()) // [Observable (생성자) 로직을 IO 스레드에서 실행 : 백그라운드]
.observeOn(Schedulers.io()) // [Observer (관찰자) 로직을 메인 스레드에서 실행]
.subscribe(new Observer<String>() { // [Observable.create 타입 지정]
@Override
public void onSubscribe(@NonNull Disposable d) {
}
@Override
public void onNext(@NonNull String value) {
}
@Override
public void onError(@NonNull Throwable e) {
}
@Override
public void onComplete() {
}
});
}
catch (Exception e){
e.printStackTrace();
}
*/
// -----------------------------------------------------------------------------------------
public static Observable<String> observableEsptouchTaskBroadcast(){
// [로직 처리 실시]
return Observable.create(subscriber -> {
try {
// ===============================================================
S_Log._D_(ACTIVITY_NAME + " : EsptouchTask 브로드 캐스팅 알림 전파 수행", null);
// ===============================================================
new Thread(){
@Override
public void run(){
if (esptouchTask != null){
// --------------------------------------------------------
// TODO [브로드 캐스팅 과정 로그 참고]
/*
Welcome Esptouch 1.1.1 // TODO [초기화 성공]
agSocket(113) with statsTag=0xffffffff, statsUid=-1
tagSocket(117) with statsTag=0xffffffff, statsUid=-1
mServerSocket is created, socket read timeout: 60000, port: 18266 // TODO [타임 아웃 시간]
receiveSpecLenBytes() entrance: len = 11
received len : 11 // TODO [실제 브로드 캐스팅 전파 후 >> 콜백 연결 메시지 수신 받음]
recDatas[0]:24
recDatas[1]:36
recDatas[2]:-95
recDatas[3]:96
recDatas[4]:-88
recDatas[5]:77
recDatas[6]:-24
recDatas[7]:-64
recDatas[8]:-88
recDatas[9]:0
recDatas[10]:17
receiveSpecLenBytes: $�`�M���??
// */
// --------------------------------------------------------
// TODO [브로드 캐스팅 알림 전파]
esptouchTask.setPackageBroadcast(true);
// --------------------------------------------------------
// TODO [최대 대기 브로드 캐스팅 및 연결 대기 시간]
Handler handler = new Handler(Looper.getMainLooper());
handler.postDelayed(new Runnable() {
@Override
public void run() {
S_Log._E_(ACTIVITY_NAME + " : EsptouchTask 브로드 캐스트 타임 아웃", null);
// [리턴 반환]
try { if (subscriber != null && subscriber.isDisposed() == false){ subscriber.onNext(""); subscriber.onComplete(); } esptouchTask = null; } catch (Exception ex){ ex.printStackTrace(); }
}
}, (broadCastSeconds * 1000) );
// --------------------------------------------------------
// TODO [브로드 캐스팅 알림 전파 이벤트 결과 확인]
esptouchTask.setEsptouchListener(new IEsptouchListener() {
@Override
public void onEsptouchResultAdded(IEsptouchResult result) {
S_Log._W_(ACTIVITY_NAME + " : EsptouchTask 브로드 캐스트 연결 상태 콜백 결과 확인", new String[]{ result.toString() });
}
});
// --------------------------------------------------------
// TODO [브로드 캐스팅 알림 결과 확인 대기]
int expectResultCount = 1;
List<IEsptouchResult> results = esptouchTask.executeForResults(expectResultCount);
IEsptouchResult first = results.get(0);
if (first.isCancelled()){
S_Log._E_(ACTIVITY_NAME + " : EsptouchTask 결과 확인 에러", new String[]{ "esptouchTask isCancelled" });
// [예약된 작업 취소]
try { handler.removeMessages(0); handler.removeCallbacks(null); } catch (Exception es){ es.printStackTrace(); }
// [리턴 반환]
try { if (subscriber != null && subscriber.isDisposed() == false){ subscriber.onNext(""); subscriber.onComplete(); esptouchTask = null; } } catch (Exception es){ es.printStackTrace(); }
// [로직 종료]
return;
}
if (first.isSuc()) {
// TODO [ip 주소 확인] : [LOG :: DESCRIPTION :: EsptouchTaskBroadcast :: onNext :: 192.168.0.17]
String resultData = first.getInetAddress().getHostAddress();
// [로그 출력 수행]
S_Log._W_(ACTIVITY_NAME + " : EsptouchTask 결과 확인 성공", new String[]{ String.valueOf(resultData) });
// [예약된 작업 취소]
try { handler.removeMessages(0); handler.removeCallbacks(null); } catch (Exception es){ es.printStackTrace(); }
// TODO [리턴 반환]
try { if (subscriber != null && subscriber.isDisposed() == false){ subscriber.onNext(resultData); subscriber.onComplete(); esptouchTask = null; } } catch (Exception es){ es.printStackTrace(); }
}
else {
S_Log._E_(ACTIVITY_NAME + " : EsptouchTask 결과 확인 에러", new String[]{ "esptouchTask isSuc false" });
// [예약된 작업 취소]
try { handler.removeMessages(0); handler.removeCallbacks(null); } catch (Exception es){ es.printStackTrace(); }
// [리턴 반환]
try { if (subscriber != null && subscriber.isDisposed() == false){ subscriber.onNext(""); subscriber.onComplete(); esptouchTask = null; } } catch (Exception es){ es.printStackTrace(); }
}
// --------------------------------------------------------
}
else {
S_Log._E_(ACTIVITY_NAME + " : EsptouchTask 브로드 캐스트 에러", new String[]{ "esptouchTask Is Null" });
// [리턴 반환]
try { if (subscriber != null && subscriber.isDisposed() == false){ subscriber.onNext(""); subscriber.onComplete(); } esptouchTask = null; } catch (Exception ex){ ex.printStackTrace(); }
}
}
}.start();
} catch (final Exception e){
e.printStackTrace();
// [리턴 데이터 반환]
try { if (subscriber != null && subscriber.isDisposed() == false){ subscriber.onNext(""); subscriber.onComplete(); } esptouchTask = null; } catch (Exception ex){ ex.printStackTrace(); }
}
});
}
} // TODO [클래스 종료]
반응형
'투케이2K 유틸파일' 카테고리의 다른 글
Comments