Today's

길을 나서지 않으면 그 길에서 만날 수 있는 사람을 만날 수 없다

모바일 앱(안드로이드)

Android Jetpack Compose에서 WiFi 검색 및 UPnP를 이용한 주변기기 IP 찾기 ( AI 와 코딩해 보기 1번째)

Billcorea 2025. 2. 23. 15:30
반응형

Android Jetpack Compose에서 WiFi 검색 및 UPnP를 이용한 주변기기 IP 찾기

wifi

 

이번 포스트에서는 안드로이드 Jetpack Compose를 사용하여 WiFi 네트워크를 검색하고 UPnP를 이용해 주변 기기의 IP를 찾는 방법을 설명드리겠습니다. 이를 통해 WiFi 네트워크 스캔 및 UPnP 기기 검색을 위한 기본적인 구현 방법을 학습할 수 있습니다.

1. WiFi 검색

안드로이드에서 WiFi 스캔을 하기 위해서는 WifiManager를 사용할 수 있습니다. 이 예제에서는 Compose와 함께 사용하기 위해 ViewModel을 사용하여 데이터를 관리합니다.

1.1 권한 추가

먼저 AndroidManifest.xml 파일에 필요한 권한을 추가합니다:

<uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />
<uses-permission android:name="android.permission.CHANGE_WIFI_STATE" />
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />

1.2 ViewModel 생성

WiFi 스캔 기능을 구현하기 위해 ViewModel을 생성합니다:

import android.app.Application
import android.content.BroadcastReceiver
import android.content.Context
import android.content.Intent
import android.content.IntentFilter
import android.net.wifi.ScanResult
import android.net.wifi.WifiManager
import androidx.lifecycle.AndroidViewModel
import androidx.lifecycle.LiveData
import androidx.lifecycle.MutableLiveData

class WifiViewModel(application: Application) : AndroidViewModel(application) {
    private val wifiManager = application.getSystemService(Context.WIFI_SERVICE) as WifiManager
    private val _scanResults = MutableLiveData<List<ScanResult>>()
    val scanResults: LiveData<List<ScanResult>> = _scanResults

    private val wifiScanReceiver = object : BroadcastReceiver() {
        override fun onReceive(context: Context?, intent: Intent?) {
            _scanResults.value = wifiManager.scanResults
        }
    }

    init {
        val intentFilter = IntentFilter(WifiManager.SCAN_RESULTS_AVAILABLE_ACTION)
        application.registerReceiver(wifiScanReceiver, intentFilter)
        startScan()
    }

    fun startScan() {
        wifiManager.startScan()
    }

    override fun onCleared() {
        super.onCleared()
        getApplication<Application>().unregisterReceiver(wifiScanReceiver)
    }
}

1.3 Jetpack Compose UI에서 ViewModel 사용

Compose UI에서 ViewModel을 사용하여 WiFi 네트워크 목록을 표시합니다:

import androidx.compose.foundation.lazy.LazyColumn
import androidx.compose.foundation.lazy.items
import androidx.compose.material3.Text
import androidx.compose.runtime.Composable
import androidx.compose.runtime.collectAsState
import androidx.compose.runtime.getValue
import androidx.hilt.navigation.compose.hiltViewModel
import androidx.lifecycle.viewmodel.compose.viewModel

@Composable
fun WifiScreen() {
    val wifiViewModel: WifiViewModel = hiltViewModel()
    val scanResults by wifiViewModel.scanResults.collectAsState(initial = emptyList())

    LazyColumn {
        items(scanResults) { result ->
            Text(text = result.SSID)
        }
    }
}

2. UPnP를 이용한 주변 기기 IP 검색

UPnP (Universal Plug and Play)를 사용하여 네트워크 상의 장치를 발견하려면 UPnP 라이브러리를 사용할 수 있습니다. 대표적인 UPnP 라이브러리로 CyberLink for Java가 있습니다.

2.1 CyberLink for Java 설정

build.gradle 파일에 의존성을 추가합니다:

dependencies {
    implementation 'net.cybergarage:cyberlink-for-java:2.1.0'
}

2.2 UPnP 장치 검색을 위한 클래스 생성

UPnP 장치 검색을 위한 클래스를 생성합니다:

import net.cybergarage.upnp.ControlPoint
import net.cybergarage.upnp.Device
import net.cybergarage.upnp.device.DeviceChangeListener

class UpnpService {
    private val controlPoint = ControlPoint()

    fun searchDevices(callback: (Device) -> Unit) {
        controlPoint.addDeviceChangeListener(object : DeviceChangeListener {
            override fun deviceAdded(device: Device?) {
                device?.let { callback(it) }
            }

            override fun deviceRemoved(device: Device?) {
                // Handle device removal if necessary
            }
        })
        controlPoint.start()
        controlPoint.search()
    }

    fun stop() {
        controlPoint.stop()
    }
}

2.3 ViewModel 생성

UPnP 장치 검색 기능을 구현하기 위해 ViewModel을 생성합니다:

import androidx.lifecycle.ViewModel
import androidx.lifecycle.viewModelScope
import kotlinx.coroutines.flow.MutableStateFlow
import kotlinx.coroutines.flow.StateFlow
import kotlinx.coroutines.launch
import net.cybergarage.upnp.Device

class UpnpViewModel : ViewModel() {
    private val upnpService = UpnpService()
    private val _devices = MutableStateFlow<List<Device>>(emptyList())
    val devices: StateFlow<List<Device>> = _devices

    init {
        searchDevices()
    }

    private fun searchDevices() {
        viewModelScope.launch {
            upnpService.searchDevices { device ->
                _devices.value = _devices.value + device
            }
        }
    }

    override fun onCleared() {
        super.onCleared()
        upnpService.stop()
    }
}

2.4 Jetpack Compose UI에서 ViewModel 사용

Compose UI에서 ViewModel을 사용하여 발견된 장치 목록을 표시합니다:

import androidx.compose.foundation.lazy.LazyColumn
import androidx.compose.foundation.lazy.items
import androidx.compose.material3.Text
import androidx.compose.runtime.Composable
import androidx.compose.runtime.collectAsState
import androidx.compose.runtime.getValue
import androidx.hilt.navigation.compose.hiltViewModel

@Composable
fun UpnpScreen() {
    val upnpViewModel: UpnpViewModel = hiltViewModel()
    val devices by upnpViewModel.devices.collectAsState()

    LazyColumn {
        items(devices) { device ->
            Text(text = device.friendlyName)
        }
    }
}

이제 Jetpack Compose를 사용하여 WiFi 네트워크를 검색하고 UPnP를 이용해 주변 기기의 IP를 찾는 기능을 구현할 수 있습니다. 위의 예제는 기본적인 구현 방법을 설명하며, 실제 프로젝트에서는 추가적인 예외 처리와 UI 개선이 필요할 수 있습니다.

 

*** 이 예시는 실제 구현시 제약 사항이 많이 생기는 예제 입니다.  그냥 참고 하는 정도만 생각 해서 사용 하세요.  github 에서 지원되는 AI 도구를 활용한 예제 입니다.

반응형