2026/04/21

오늘의 이야기


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 도구를 활용한 예제 입니다.





댓글 없음:

댓글 쓰기

오늘의 이야기

Excel VBA를 활용한 자동화 꿀팁! 엑셀예시 엑셀을 사용할 때 반복되는 작업을 자동화하면 업무 효율성이 높아집니다. 오늘은 VBA(Visual Basic for Applications)를 활용하여 ...