투케이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 [클래스 종료]

 

반응형
Comments