투케이2K

892. (Android/Java) [유틸 파일] getSoftApDeviceIpAddress : 디바이스 와이파이 연결 및 소켓 통신 가능한 IP 주소 획득 본문

Android

892. (Android/Java) [유틸 파일] getSoftApDeviceIpAddress : 디바이스 와이파이 연결 및 소켓 통신 가능한 IP 주소 획득

투케이2K 2024. 11. 15. 18:26

[개발 환경 설정]

개발 툴 : AndroidStudio

개발 언어 : Java / Kotlin

 

[소스 코드]

 

// --------------------------------------------------------------------------------------
[개발 및 테스트 환경]
// --------------------------------------------------------------------------------------

- 언어 : Java

- 개발 툴 : Android Studio

- 구분 : 유틸 파일

// --------------------------------------------------------------------------------------






// --------------------------------------------------------------------------------------
[소스 코드]
// --------------------------------------------------------------------------------------

    // -----------------------------------------------------------------------------------------
    // TODO [SEARCH FAST] : getSoftApDeviceIpAddress : 디바이스 와이파이 연결 및 소켓 통신 가능한 IP 주소 획득
    // -----------------------------------------------------------------------------------------
    public static String getSoftApDeviceIpAddress(Context mContext) {

        /**
         * // -----------------------------------------
         * [getSoftApDeviceIpAddress 메소드 설명]
         * // -----------------------------------------
         * 1. 디바이스 와이파이 연결 및 소켓 통신 가능한 IP 주소 획득
         * // -----------------------------------------
         * 2. 호출 방식 :
         *
         * C_Wifi_Ap_Module.getSoftApDeviceIpAddress(A_Intro.this);
         * // -----------------------------------------
         * 3. 참고 :
         *
         * App To Device 간 AP 연결 후 소켓 통신 가능 IP 주소 예시 : 뒷자리 1 값
         *
         * 192.168.0.1
         * 192.168.1.1
         * 192.168.10.1
         * // -----------------------------------------
         * */


        // [리턴 변수 선언]
        String returnData = "";
        String M_LOG = "";


        // [로직 처리 수행]
        try {

            // TODO [휴대폰 와이파이 기능 활성 상태 확인]
            if (mContext != null && C_StateCheck.isWifiConnected(mContext) == true){
                
                
                // TODO [디바이스 IP 리스트를 담기 위한 배열 변수 선언]
                ArrayList<String> ipList = new ArrayList<>();

                
                // TODO [네트워크 리스트 목록 확인]
                for (Enumeration<NetworkInterface> en = NetworkInterface.getNetworkInterfaces(); en.hasMoreElements();) {

                    NetworkInterface intf = en.nextElement();

                    //S_Log.w("Network", "getName :: " + intf.getName() + " / " + "toString :: " + intf.toString());

                    for (Enumeration<InetAddress> enumIpAddr = intf.getInetAddresses(); enumIpAddr.hasMoreElements();) {

                        InetAddress inetAddress = enumIpAddr.nextElement();

                        // S_Log.w("Address", "isLoopbackAddress :: " + inetAddress.isLoopbackAddress() + " / " + "getHostAddress :: " + inetAddress.getHostAddress());

                        // TODO [IPv6 형식 제외]
                        if (inetAddress instanceof Inet6Address){
                            continue;
                        }

                        // TODO [IP 주소 확인]
                        String ip = String.valueOf(inetAddress.getHostAddress());
                        ip = ip.trim();
                        
                        // TODO [Null 인 경우 제외]
                        if (C_Util.stringNotNull(ip) == false){
                            continue;
                        }

                        // TODO [127.0.0.1 형식 인 경우 제외]
                        if (ip.equals("127.0.0.1") == true){
                            continue;
                        }

                        // TODO [1 차 검증 완료 IP 리스트 배열에 삽입]
                        ipList.add(ip);

                    }
                    
                }

                
                S_Log.w("IP_LIST", String.valueOf(ipList));
                
                
                // TODO [배열 값 Empty 여부 확인 및 App To Device 소켓 통신 가능한 IP 주소 확인]
                if (ipList != null && ipList.size()>0){

                    try {
                        for (int i=0; i<ipList.size(); i++){

                            String getIp = ipList.get(i);
                            
                            // [방어 로직] : . (닷) 포함이 안된 경우 제외
                            if (getIp.contains(".") == false){
                                continue;
                            }

                            // [방어 로직] : 192.168 형식이 포함 안된 경우 제외
                            if (getIp.contains("192.168") == false){
                                continue;
                            }

                            // [. (닷) 기준 파싱 수행]
                            String parseIp[] = getIp.split("\\.");

                            // [파싱 안된 경우 제외]
                            if (parseIp == null || parseIp.length != 4){
                                continue;
                            }
                            
                            // TODO [IP 주소에서 마지막 형식 값  1로 변경] : 예시 - 192.168.0.1
                            parseIp[3] = "1";
                            returnData =  String.format("%s.%s.%s.%s", parseIp[0], parseIp[1], parseIp[2], parseIp[3]);
                        }
                    }
                    catch (Exception es){
                        es.printStackTrace();
                    }


                    // TODO [소켓 통신 가능한 IP 주소 찾기 여부 확인]
                    if (C_Util.stringNotNull(returnData) == true){
                        M_LOG = "Success :: Found Ip Address";
                    }
                    else {
                        M_LOG = "Fail :: Not Found Ip Address";
                    }

                }
                else {
                    M_LOG = "Error :: ipList Size Is Null";
                }

            }
            else {
                M_LOG = "Error :: Context Is Null || Wifi Connected False";
            }

        }
        catch (Exception e){
            e.printStackTrace();
            M_LOG = "Exception :: " + String.valueOf(e.getMessage());
        }


        // [로그 출력 실시]
        //*
        // ===============================================================
        S_Log._D_("디바이스 와이파이 연결 및 소켓 통신 가능한 IP 주소 획득", new String[]{
                "M_LOG :: " + String.valueOf(M_LOG),
                "RETURN :: " + String.valueOf(returnData)
        });
        // ===============================================================
        // */


        // [리턴 반환]
        return returnData;
    }

// --------------------------------------------------------------------------------------






// --------------------------------------------------------------------------------------
[결과 출력]
// --------------------------------------------------------------------------------------

D///===========//: ================================================
I/: [LOG :: CLASS PLACE :: com.example.javaproject.C_Module.C_Wifi_Ap_Module.getSoftApDeviceIpAddress(C_Wifi_Ap_Module.java:1617)]
I/: ----------------------------------------------------
I/: [LOG :: NOW TIME :: 2024-11-15 10:55:02 금요일]
I/: ----------------------------------------------------
I/: [LOG :: DESCRIPTION :: 디바이스 와이파이 연결 및 소켓 통신 가능한 IP 주소 획득]
I/: ----------------------------------------------------
I/: [LOG :: M_LOG :: Success :: Found Ip Address]
I/: ----------------------------------------------------
I/: [LOG :: RETURN :: 192.168.0.1]
D///===========//: ================================================

// --------------------------------------------------------------------------------------

 

반응형
Comments