package Ġcom . ab iot s . network utils . core Ċ Ċ import Ġcom . ab iot s . network utils . Build Config Ċ import Ġcom . ab iot s . network utils . model . Ping Result Ċ import Ġcom . ab iot s . network utils . utils . Network Utils . millis To Sec Ċ import Ġkotlinx . coroutines .* Ċ import Ġkotlinx . coroutines . Dispatch ers . IO Ċ import Ġtim ber . log . Tim ber Ċ import Ġjava . net . Inet Address Ċ import Ġkotlin . system . measure Time Millis Ċ Ċ /** Ċ Ġ* Ġ@ author ĠJ ĠSu has ĠB hat Ċ Ġ*/ Ċ object ĠPing Devices Ġ{ ĊĊĠĠĠ Ġinit Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( Tim ber . tree Count () Ġ== Ġ 0 Ġ&& ĠBuild Config . DEBUG ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠTim ber . plant ( Tim ber . Debug Tree ()) ĊĠĠĠĠĠĠĠ Ġ} Ġelse ĠUnit ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġconst Ġval ĠP ING _ TIME _ OUT _ IN _ SEC Ġ= Ġ 1 ĊĠĠĠ Ġprivate Ġconst Ġval ĠP ING _ TTL Ġ= Ġ 1 2 8 ĊĠĠĠ Ġprivate Ġconst Ġval ĠP ING _ COMMAND Ġ= Ġ" ping " ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠThis Ġmethod Ġis Ġused Ġto Ġperform Ġthe ĠNative ĠPing , Ġwhich Ġruns Ġthe ĠPing Ġcommand Ġusing Ġthe Ġandroid Ġprocess . ĊĠĠĠĠ Ġ* Ġ@ param Ġhost Address ĠInet Address - ĠAddress Ġwe Ġneed Ġto Ġping ĊĠĠĠĠ Ġ* Ġ@ return ĠPing Result ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġsuspend Ġfun Ġdo Native Ping ( host Address : ĠInet Address ) Ġ= Ġwith Context ( IO ) Ġ{ ĊĠĠĠĠĠĠĠ ĠTim ber . d (" Ġ${ Thread . currentThread (). name } Ġ:- ĠNative Ġping ing Ġthe Ġaddress Ġ${ host Address . host Address }") ĊĠĠĠĠĠĠĠ ĠPing Result ( host Address ). apply Ġresult @{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġrun Catch ing Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġping Proc Ġ= ĠRuntime . get Runtime () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. exec ("$ PING _ COMMAND Ġ- c Ġ 1 Ġ- W Ġ$ PING _ TIME _ OUT _ IN _ SEC Ġ- t Ġ$ PING _ TTL Ġ${ host Address . host Address }") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġping Proc . waitFor () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġping Proc . let Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġwhen Ġ( it . exit Value ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ 0 Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġhandle Ping Response ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġping Result Ġ= Ġthis @ result , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġping Response Ġ= Ġit . inputStream . buffered Reader (). read Lines () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. toString () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ 1 Ġ-> Ġthis @ result . error Ġ= Ġ" failed , Ġexit Ġ= Ġ 1 " ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġthis @ result . error Ġ= Ġ" error , Ġexit Ġ= Ġ 2 " ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthis @ result ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ}. on Failure Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthis @ result . error Ġ= Ġit . localized Message ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ}. on Success Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠTim ber . d (" Ping Ġresult Ġ${ this . inet Address } Ġis Ġreachable :${ this . is Reach able }, Ġtime Ġtaken : Ġ${ this . time Taken } Ġseconds ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠThis Ġmethod Ġis Ġto Ġperform Ġthe ĠJava Ġping . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġsuspend Ġfun Ġdo Java Ping ( host : ĠInet Address , Ġping Result : ĠPing Result ) Ġ= Ġwith Context ( IO ) Ġ{ ĊĠĠĠĠĠĠĠ ĠTim ber . d (" Ġ Ġ${ Thread . currentThread (). name } Ġ:- ĠPerform ing Ġthe Ġjava Ġping Ġto Ġthe Ġaddress Ġ${ host . host Address }") ĊĠĠĠĠĠĠĠ Ġmeasure Time Millis Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġrun Catch ing Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġhost . is Reach able ( PING _ TIME _ OUT _ IN _ SEC ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ}. on Failure Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġping Result . error Ġ= Ġ" Timed ĠOut : Ġ${ it . localized Message }" ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ}. on Success Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġping Result . is Reach able Ġ= Ġit ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ(! ping Result . is Reach able ) Ġping Result . error Ġ= Ġ" Timed ĠOut " Ġelse ĠUnit ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ}. also Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠTim ber . d (" got Ġjava Ġping Ġresult Ġafter Ġ$ it Ġmilli Ġseconds ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġping Result . time Taken Ġ= Ġit . millis To Sec (). toFloat () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġhandle Ping Response ( ping Result : ĠPing Result , Ġping Response : ĠString ) Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( ping Response . contains (" 0 % Ġpacket Ġloss ")) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġstart : ĠInt Ġ= Ġping Response . indexOf ("/ m dev Ġ= Ġ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġend : ĠInt Ġ= Ġping Response . indexOf (" Ġms ]", Ġstart ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( start Ġ== Ġ- 1 Ġ|| Ġend Ġ== Ġ- 1 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġping Result . error Ġ= Ġ" Error : Ġ$ ping Response " ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġping Response . substring ( start Ġ+ Ġ 8 , Ġend ). let Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġstats : ĠArray < String > Ġ= Ġit . split ("/ ". to Regex ()). to Typed Array () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġping Result . is Reach able Ġ= Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġping Result . result Ġ= Ġping Response ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġping Result . time Taken Ġ= Ġstats [ 1 ]. toFloat () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġif Ġ( ping Response . contains (" 1 0 0 % Ġpacket Ġloss ")) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġping Result . error Ġ= Ġ" 1 0 0 % Ġpacket Ġloss " ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġif Ġ( ping Response . contains ("% Ġpacket Ġloss ")) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġping Result . error Ġ= Ġ" partial Ġpacket Ġloss " ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġif Ġ( ping Response . contains (" unknown Ġhost ")) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġping Result . error Ġ= Ġ" unknown Ġhost " ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġping Result . error Ġ= Ġ" unknown Ġerror Ġin Ġget Ping Stats " ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ }