투케이2K

844. (Android/Java) 안드로이드 WifiNetworkSpecifier , NetworkRequest , ConnectivityManager 사용 WPA 와이파이 연결 본문

Android

844. (Android/Java) 안드로이드 WifiNetworkSpecifier , NetworkRequest , ConnectivityManager 사용 WPA 와이파이 연결

투케이2K 2024. 8. 20. 21:13

[개발 환경 설정]

개발 툴 : AndroidStudio

개발 언어 : Java / Kotlin

 

[소스 코드]

 

                try {

                    // ---------------------------------------------------------------
                    // TODO [사전] : 해당 연결하려는 와이파에 이미 연결 된 상태 인 지 확인 필요
                    // ---------------------------------------------------------------
                    // TODO [사전] : 와이파이 기능이 활성화 된 상태 필요
                    // ---------------------------------------------------------------
                    // TODO [사전] : 위치 권한 상태 부여 및 근처기기 권한 상태 부여 필요
                    // ---------------------------------------------------------------
                    // TODO [설명] : 앱 전용 해당 와이파이에 연결 >> IP 주소 획득 후 서버 소켓 활성 수행
                    // ---------------------------------------------------------------

                    if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.Q) {

                        // --------------------------------------------
                        // TODO [WifiNetworkSpecifier] : Wi-Fi 네트워크를 요청하는 데 사용되는 네트워크 지정자 객체
                        // --------------------------------------------
                        // TODO [와이파이] : 설정 화면에서 연결 된 적이 없어도 AP 연결 및 IP 획득 >> 서버 소켓 활성 수행
                        // --------------------------------------------
                        String ssid = "TWOK";
                        String password = "t0123456789";

                        WifiNetworkSpecifier wifiNetworkSpecifier = new WifiNetworkSpecifier.Builder()
                                .setSsid(String.valueOf(ssid))
                                .setWpa2Passphrase(String.valueOf(password)) // TODO [WPA/WPA2 형식]
                                .build();


                        // --------------------------------------------
                        // TODO [WifiNetworkSpecifier] : 와이파이 정보 입력
                        // --------------------------------------------
                        NetworkRequest networkRequest = new NetworkRequest.Builder()
                                .addTransportType(NetworkCapabilities.TRANSPORT_WIFI)
                                .setNetworkSpecifier(wifiNetworkSpecifier)
                                .build();

                        ConnectivityManager connectivityManager = (ConnectivityManager)getSystemService(Context.CONNECTIVITY_SERVICE);
                        connectivityManager.requestNetwork(networkRequest, new ConnectivityManager.NetworkCallback() {
                            @Override
                            public void onAvailable(Network network) {
                                super.onAvailable(network);
                                S_Log._W_("requestNetwork :: onAvailable :: Wifi Connection Success", null);

                                // [와이파이 정보 확인]
                                ConnectivityManager cm = (ConnectivityManager)getSystemService(Context.CONNECTIVITY_SERVICE);
                                NetworkCapabilities netCaps = cm.getNetworkCapabilities(network);
                                WifiInfo wifiInfo = (WifiInfo) netCaps.getTransportInfo();

                                int wIp = wifiInfo.getIpAddress();
                                String getIpAddress = String.format("%d.%d.%d.%d", (wIp & 0xff), (wIp >> 8 & 0xff), (wIp >> 16 & 0xff), (wIp >> 24 & 0xff));

                                // [로그 출력]
                                S_Log._W_("requestNetwork :: onAvailable IP 정보 출력 실시", new String[]{
                                        "getIpAddress :: " + String.valueOf(getIpAddress)
                                });

                                // [콜백 해제] : [AP 연결 종료]
                                //try { connectivityManager.unregisterNetworkCallback(this); } catch (Exception e){ e.printStackTrace(); }

                            }

                            @Override
                            public void onUnavailable() {
                                super.onUnavailable();
                                S_Log._E_("requestNetwork :: onUnavailable :: Wifi Connection Fail", null);

                                // [콜백 해제] : [AP 연결 종료]
                                try { connectivityManager.unregisterNetworkCallback(this); } catch (Exception e){ e.printStackTrace(); }
                            }

                            @Override
                            public void onLost(Network network) {
                                super.onLost(network);
                                S_Log._E_("requestNetwork :: onLost :: Wifi Connection Lost", null);

                                // [콜백 해제] : [AP 연결 종료]
                                try { connectivityManager.unregisterNetworkCallback(this); } catch (Exception e){ e.printStackTrace(); }
                            }

                        });

                    }

                }
                catch (Exception e){
                    e.printStackTrace();
                }

 

반응형
Comments