이번 포스트에서는 안드로이드 Jetpack Compose를 사용하여 WiFi 네트워크를 검색하고 UPnP를 이용해 주변 기기의 IP를 찾는 방법을 설명드리겠습니다. 이를 통해 WiFi 네트워크 스캔 및 UPnP 기기 검색을 위한 기본적인 구현 방법을 학습할 수 있습니다.
안드로이드에서 WiFi 스캔을 하기 위해서는 WifiManager를 사용할 수 있습니다. 이 예제에서는 Compose와 함께 사용하기 위해 ViewModel을 사용하여 데이터를 관리합니다.
먼저 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" />
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)
}
}
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)
}
}
}
UPnP (Universal Plug and Play)를 사용하여 네트워크 상의 장치를 발견하려면 UPnP 라이브러리를 사용할 수 있습니다. 대표적인 UPnP 라이브러리로 CyberLink for Java가 있습니다.
build.gradle 파일에 의존성을 추가합니다:
dependencies {
implementation 'net.cybergarage:cyberlink-for-java:2.1.0'
}
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()
}
}
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()
}
}
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 도구를 활용한 예제 입니다.
'모바일 앱(안드로이드)' 카테고리의 다른 글
Android Jetpack Compose로 Wi-Fi 목록 표시 및 연결, 비디오 정보 수신 앱 만들기 (AI 와 코딩해 보기 2번째) (1) | 2025.02.25 |
---|---|
What's New in Ladybug Feature Drop (레이디버그 기능 드롭의 새로운 기능) ... 퍼옴. (1) | 2025.02.17 |
카메라X·젯팩 구성으로 스포트라이트 효과 창출 ... 퍼옴 (1) | 2025.02.15 |
Google Cloud Translate V2 을 활용해서 strings.xml 을 번역해 보겠습니다. (3) | 2025.02.07 |
Jetpack Compose에서 알림 권한 요청과 알림 표시하기 (2) | 2025.02.03 |