Notice
Recent Posts
Recent Comments
Link
투케이2K
463. (kotlin/코틀린) [유틸 파일] observablePingCheck : Runtime.getRuntime ping 핑 체크 수행 본문
Kotlin
463. (kotlin/코틀린) [유틸 파일] observablePingCheck : Runtime.getRuntime ping 핑 체크 수행
투케이2K 2024. 3. 14. 19:24[개발 환경 설정]
개발 툴 : AndroidStudio
개발 언어 : Kotlin
[소스 코드]
// -----------------------------------------------------------------------------------------
// TODO [SEARCH FAST] : [Observable] : observablePingCheck : ping 체크 결과 확인
// -----------------------------------------------------------------------------------------
// TODO [호출 방법 소스 코드]
// -----------------------------------------------------------------------------------------
/*
try {
C_App.observablePingCheck(A_Intro@this, "google.com", 1000)
.subscribeOn(AndroidSchedulers.mainThread()) // [Observable (생성자) 로직을 IO 스레드에서 실행 : 백그라운드]
.observeOn(Schedulers.io()) // [Observer (관찰자) 로직을 메인 스레드에서 실행]
.subscribe(
{ value ->
},
{ error ->
}
)
{
}
}
catch (Exception e){
e.printStackTrace()
}
*/
// -----------------------------------------------------------------------------------------
fun observablePingCheck(mContext: Context, ip: String, pingMiliSeconds: Int): Observable<Boolean> {
// [로직 처리 실시]
return Observable.create { subscriber: ObservableEmitter<Boolean> ->
try {
// ===============================================================
S_Log._D_("Ping 체크 수행 실시", arrayOf(
"ip :: $ip",
"pingMiliSeconds :: $pingMiliSeconds"
))
// ===============================================================
// [사전 조건 체크 수행]
if (C_Util.stringNotNull(ip) === true && ip.contains(".") == true && pingMiliSeconds > 0) {
Handler(Looper.getMainLooper()).postDelayed({
if (mContext != null) {
val thread =
Thread {
try {
// [IP 주소 만들기]
val runTime = Runtime.getRuntime()
// -----------------------------------------------------------
// TODO [디바이스 연결 상태는 빠르게 응답 받을 수 있으나, 모바일 응답은 대기 시간이 있어 타임 아웃 시간 늘려야 한다]
// [ip 는 test 하고 싶은 주소 삽입]
// [c = 패킷을 날릴 횟수]
// [W = 상대방이 응답을 주기까지 대기 시간 (Seconds)]
// [s = 전송 패킷 바이트 수]
// -----------------------------------------------------------
//String cmd = "ping -c 1 -W 1 "+ pingIp;
//String cmd = "ping -s 10 -c 1 -W 1 "+ pingIp;
val cmd = "ping -s 5 -c 1 $ip"
var proc: Process? = null
proc = runTime.exec(cmd)
//proc.waitFor()
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
if (!proc.waitFor(pingMiliSeconds.toLong(), TimeUnit.MILLISECONDS)) {
proc.destroy()
}
}
// --------------------------------------------------------
// [여기서 반환되는 ping 테스트의 결과 값은 0, 1, 2 중 하나]
// --------------------------------------------------------
// [0 : 성공, 1 : fail, 2 : error]
// --------------------------------------------------------
val result = proc.exitValue()
when (result) {
0 -> S_Log.w("Ping Test", "Ping Success : $ip")
1 -> S_Log.e("Ping Test", "Ping Fail : $ip")
else -> S_Log.e("Ping Test", "Ping Error : $ip")
}
if (result == 0) {
subscriber.onNext(true)
subscriber.onComplete()
} else {
subscriber.onNext(false)
subscriber.onComplete()
}
} catch (e: Exception) {
S_Log.e("[ERROR] Ping (핑) 테스트", "Exception :: " + e.message)
subscriber.onNext(false)
subscriber.onComplete()
}
}
thread.start() // [스레드 수행]
}
}, 0)
} else {
// [리턴 반환]
S_Log._E_("Ping 체크 수행 에러", arrayOf("ERROR :: Input Data Is Null"))
subscriber.onNext(false)
subscriber.onComplete()
}
} catch (e: Exception) {
e.printStackTrace()
// ------------------------------------------------------
// TODO [리턴 데이터 반환]
// ------------------------------------------------------
try {
subscriber.onNext(false)
subscriber.onComplete()
} catch (ex: Exception) {
ex.printStackTrace()
}
}
}
}
[결과 출력]
W/Ping Test: Ping Success : google.com
반응형
'Kotlin' 카테고리의 다른 글
Comments