package Ġcom . ch imer apps . mqtt Ċ Ċ import Ġcom . ch imer apps . mqtt . connection . Mqtt Connection Ċ import Ġcom . ch imer apps . mqtt . connection . Mqtt Message Listener Ċ import Ġcom . ch imer apps . mqtt . connection . TCP Mqtt Connection Ċ import Ġcom . ch imer apps . mqtt . connection . Websocket Mqtt Connection Ċ import Ġcom . ch imer apps . mqtt . format . Mqtt Protocol Version Ċ import Ġcom . ch imer apps . mqtt . format . Mqtt Qo S Ċ import Ġcom . ch imer apps . mqtt . format . Mqtt Topic Ċ import Ġcom . ch imer apps . mqtt . format . packets . Mqtt Conn ack Packet Ċ import Ġcom . ch imer apps . mqtt . format . packets . Mqtt Connect Packet Ċ import Ġcom . ch imer apps . mqtt . format . packets . Mqtt Connection Result Ċ import Ġcom . ch imer apps . mqtt . format . packets . Mqtt Disconnect Packet Ċ import Ġcom . ch imer apps . mqtt . format . packets . Mqtt Ping Packet Ċ import Ġcom . ch imer apps . mqtt . format . packets . Mqtt Ping Resp Packet Ċ import Ġcom . ch imer apps . mqtt . format . packets . Mqtt Pub Ack Out Packet Ċ import Ġcom . ch imer apps . mqtt . format . packets . Mqtt Pub Comp Out Packet Ċ import Ġcom . ch imer apps . mqtt . format . packets . Mqtt Pub Comp Packet Ċ import Ġcom . ch imer apps . mqtt . format . packets . Mqtt Pub Rec Out Packet Ċ import Ġcom . ch imer apps . mqtt . format . packets . Mqtt Pub Rec Packet Ċ import Ġcom . ch imer apps . mqtt . format . packets . Mqtt Pub Rel Out Packet Ċ import Ġcom . ch imer apps . mqtt . format . packets . Mqtt Pub Rel Packet Ċ import Ġcom . ch imer apps . mqtt . format . packets . Mqtt Publish In Packet Ċ import Ġcom . ch imer apps . mqtt . format . packets . Mqtt Publish Out Packet Ċ import Ġcom . ch imer apps . mqtt . format . packets . Mqtt Sub Ack Packet Ċ import Ġcom . ch imer apps . mqtt . format . packets . Mqtt Subscribe Packet Ċ import Ġcom . ch imer apps . mqtt . format . packets . Mqtt Un sub Ack Packet Ċ import Ġcom . ch imer apps . mqtt . format . packets . Mqtt Un subscribe Packet Ċ import Ġcom . ch imer apps . mqtt . format . protocol . Mqtt 3 _ 1 Protocol Ċ import Ġokhttp 3 . Http Url Ċ import Ġokhttp 3 . Ok HttpClient Ċ import Ġok io . Buffered Source Ċ import Ġjava . util . concurrent . Executor Ċ import Ġjava . util . concurrent . Executors Ċ import Ġjavax . net . Socket Factory Ċ import Ġjavax . net . ssl . SS LS ocket Factory Ċ Ċ class ĠM qtt Client Ġprivate Ġconstructor ( private Ġval Ġurl : ĠHttp Url , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġprivate Ġval ĠclientId : ĠString , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġprivate Ġval Ġusername : ĠString ?, ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġprivate Ġval Ġpassword : ĠString ?, ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġprivate Ġval Ġwill Topic : ĠString ?, ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġprivate Ġval Ġwill Message : ĠByteArray ?, ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġprivate Ġval Ġwill Qo S : ĠM qtt Qo S ?, ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġprivate Ġval Ġretain Will : ĠBoolean , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġprivate Ġval Ġclean Session : ĠBoolean , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġprotocol Version : ĠM qtt Protocol Version , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġprivate Ġval Ġconnection : ĠM qtt Connection , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġprivate Ġval Ġcallback Executor : ĠExecutor ) Ġ{ ĊĊĠĠĠ Ġenum Ġclass ĠConnection Type Ġ{ ĊĠĠĠĠĠĠĠ ĠTCP , ĠWEB SOCKET ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġval Ġprotocol Handler Ġ= ĠM qtt 3 _ 1 Protocol () Ġ// No Ġspecial Ġhandling Ġrequired Ġfor Ġ 3 . 1 . 1 ĊĊĠĠĠ Ġvar Ġconnection Status : ĠConnection Status Ġ= ĠConnection Status . DIS CONNECTED ĊĠĠĠĠĠĠĠ Ġget () Ġ= Ġsynchronized ( this ) Ġ{ Ġfield Ġ} ĊĠĠĠĠĠĠĠ Ġprivate Ġset ( value ) Ġ= Ġsynchronized ( this ) Ġ{ Ġfield Ġ= Ġvalue Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠConnect Ġto Ġthe Ġserver Ġand Ġuse Ġthe Ġgiven Ġlistener Ġto Ġreport Ġmessages Ġon ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ@ param Ġlistener Ġ ĠThe Ġlistener Ġto Ġuse Ġfor Ġcallbacks ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġfun Ġconnect ( listener : ĠM qtt Client Listener ) Ġ{ ĊĠĠĠĠĠĠĠ Ġconnection Status Ġ= ĠConnection Status . CONNECT ING ĊĠĠĠĠĠĠĠ Ġconnection . connect ( url , Ġobject Ġ: ĠM qtt Message Listener Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġon Message ( source : ĠBuffered Source ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġwhen Ġ( val Ġparsed Ġ= Ġprotocol Handler . on Message ( source )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠM qtt Conn ack Packet Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġwhen Ġ( val Ġconnection Status Ġ= Ġparsed . connection Status ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠM qtt Connection Result . ACCEPT ED Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthis @ Mqtt Client . connection Status Ġ= ĠConnection Status . CONNECTED ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcallback Executor . execute Ġ{ Ġlistener . on Connected ( this @ Mqtt Client ) Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġcallback Executor . execute Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthis @ Mqtt Client . connection Status Ġ= ĠConnection Status . DIS CONNECTED ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlistener . on Connection Failed ( this @ Mqtt Client , Ġconnection Status Ġ?: ĠM qtt Connection Result . UNKNOWN ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠM qtt Publish In Packet Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcallback Executor . execute Ġ{ Ġlistener . on Message ( Mqtt Message . create ( parsed )) Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġwhen Ġ( parsed . qo S ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠM qtt Qo S . AT _ MO ST _ ON CE Ġ-> ĠUnit Ġ// Do Ġnothing ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠM qtt Qo S . AT _ LE AST _ ON CE Ġ-> Ġconnection . send Mqtt Message ( protocol Handler . build Message ( Mqtt Pub Ack Out Packet ( parsed . packet Identifier ))) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠM qtt Qo S . EX ACT LY _ ON CE Ġ-> Ġconnection . send Mqtt Message ( protocol Handler . build Message ( Mqtt Pub Rec Out Packet ( parsed . packet Identifier ))) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠM qtt Ping Resp Packet Ġ-> Ġcallback Executor . execute Ġ{ Ġlistener . on P ong () Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠM qtt Pub Rel Packet Ġ-> Ġconnection . send Mqtt Message ( protocol Handler . build Message ( Mqtt Pub Comp Out Packet ( parsed . packet Identifier ))) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠM qtt Pub Rec Packet Ġ-> Ġconnection . send Mqtt Message ( protocol Handler . build Message ( Mqtt Pub Rel Out Packet ( parsed . packet Identifier ))) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠM qtt Sub Ack Packet Ġ-> Ġcallback Executor . execute Ġ{ Ġlistener . on Action Success ( Mqtt Token ( parsed . packet Identifier )) Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠM qtt Un sub Ack Packet Ġ-> Ġcallback Executor . execute Ġ{ Ġlistener . on Action Success ( Mqtt Token ( parsed . packet Identifier )) Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠM qtt Pub Comp Packet Ġ-> Ġcallback Executor . execute Ġ{ Ġlistener . on Action Success ( Mqtt Token ( parsed . packet Identifier )) Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġon Connected () Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġbuffer Ġ= Ġprotocol Handler . build Message ( Mqtt Connect Packet ( protocol Version , ĠclientId , Ġusername , Ġpassword , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġwill Topic , Ġwill Message , Ġwill Qo S , Ġretain Will , Ġclean Session )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġconnection . send Mqtt Message ( buffer ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġon Closed ( code : ĠInt , Ġreason : ĠString ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġconnection Status Ġ= ĠConnection Status . DIS CONNECTED ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcallback Executor . execute Ġ{ Ġlistener . on Disconnected ( null ) Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġprotocol Handler . clear () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġon Closed WithError ( error : ĠThrowable ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġconnection Status Ġ= ĠConnection Status . DIS CONNECTED ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcallback Executor . execute Ġ{ Ġlistener . on Disconnected ( error ) Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġprotocol Handler . clear () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ}) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠDis connect s Ġclean ly Ġfrom Ġthe Ġserver ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġfun Ġdisconnect () Ġ{ ĊĠĠĠĠĠĠĠ Ġconnection . send Mqtt Message ( protocol Handler . build Message ( Mqtt Disconnect Packet ())) ĊĠĠĠĠĠĠĠ Ġconnection . disconnect () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠSub scri bes Ġto Ġthe Ġgiven Ġtopic Ġand Ġrequest Ġthe Ġgiven ĠQ oS ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ@ param Ġtopic ĠThe Ġtopic Ġto Ġsubscribe Ġto ĊĠĠĠĠ Ġ* Ġ@ param Ġrequest Qo S ĠĠĠ ĠThe Ġrequested ĠQ oS Ġfor Ġthis Ġsubscription ĊĠĠĠĠ Ġ* Ġ@ return ĠA Ġsubscription Ġhelper Ġthat Ġcan Ġbe Ġused Ġto Ġeasily Ġunsubscribe Ġfrom Ġthis Ġtopic . ĠAlso Ġcontains Ġthe Ġtoken Ġwhich Ġcan Ġbe Ġused Ġto Ġreport Ġthe Ġstatus Ġof Ġthe Ġsubscription ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġfun Ġsubscribe ( topic : ĠString , Ġrequest Qo S : ĠM qtt Qo S ): ĠM qtt Topic Subscription Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġpacket Ġ= ĠM qtt Subscribe Packet ( listOf ( Mqtt Topic ( topic , Ġrequest Qo S ))) ĊĠĠĠĠĠĠĠ Ġval Ġblob Ġ= Ġprotocol Handler . build Message ( packet ) ĊĊĠĠĠĠĠĠĠ Ġconnection . send Mqtt Message ( blob ) ĊĠĠĠĠĠĠĠ Ġreturn ĠM qtt Topic Subscription ( topic , Ġthis , ĠM qtt Token ( packet . packet Identifier )) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠUn sub scri bes Ġfrom Ġthe Ġgiven Ġtopic ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ@ param Ġtopic ĠThe Ġtopic Ġto Ġunsubscribe Ġfrom ĊĠĠĠĠ Ġ* Ġ@ return ĠA Ġtoken Ġwhich Ġcan Ġbe Ġused Ġto Ġreport Ġthe Ġstatus Ġof Ġthe Ġunsubscribe ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġfun Ġunsubscribe ( topic : ĠString ): ĠM qtt Token Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġunsubscribe Ġ= ĠM qtt Un subscribe Packet ( listOf ( topic )) ĊĠĠĠĠĠĠĠ Ġconnection . send Mqtt Message ( protocol Handler . build Message ( unsubscribe )) ĊĠĠĠĠĠĠĠ Ġreturn ĠM qtt Token ( unsubscribe . packet Identifier ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠPub lishes Ġthe Ġgiven Ġmessage Ġto Ġthe Ġgiven Ġtopic Ġwith Ġthe Ġprovided ĠQ oS . ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* ĠSee Ġthe ĠMQTT Ġspecifications , Ġchapter Ġ 3 . 3 Ġfor Ġdetails Ġabout Ġthe Ġparameters ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ@ param Ġtopic ĠThe Ġtopic Ġto Ġpublish Ġto ĊĠĠĠĠ Ġ* Ġ@ param Ġmessage ĠĠ ĠThe Ġmessage Ġto Ġpublish ĊĠĠĠĠ Ġ* Ġ@ param Ġq os ĠĠ ĠThe ĠQ oS Ġto Ġuse Ġfor Ġthis Ġpublish ĊĠĠĠĠ Ġ* Ġ@ param Ġis Dup ĠFlag Ġindicating Ġthat Ġthis Ġmessage Ġis Ġa Ġ( prob able ) Ġduplicate ĊĠĠĠĠ Ġ* Ġ@ param Ġretain ĠĠĠ ĠFlag Ġindicating Ġif Ġthis Ġmessage Ġshould Ġbe Ġretained ĊĠĠĠĠ Ġ* Ġ@ return ĠA Ġtoken Ġwhich Ġcan Ġbe Ġused Ġto Ġreport Ġthe Ġstatus Ġof Ġthe Ġpublication ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġfun Ġpublish ( topic : ĠString , Ġmessage : ĠByteArray , Ġq os : ĠM qtt Qo S , Ġis Dup : ĠBoolean , Ġretain : ĠBoolean ): ĠM qtt Token Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġmsg Ġ= ĠM qtt Publish Out Packet ( topic , Ġmessage , Ġq os , Ġis Dup , Ġretain ) ĊĠĠĠĠĠĠĠ Ġval Ġmqtt Message Ġ= Ġprotocol Handler . build Message ( msg ) ĊĊĠĠĠĠĠĠĠ Ġconnection . send Mqtt Message ( mqtt Message ) ĊĠĠĠĠĠĠĠ Ġreturn ĠM qtt Token ( msg . packet Identifier ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠSend Ġa Ġping Ġto Ġthe Ġserver ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġfun Ġping () Ġ{ ĊĠĠĠĠĠĠĠ Ġconnection . send Mqtt Message ( protocol Handler . build Message ( Mqtt Ping Packet ())) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠCreates Ġa Ġnew Ġbuilder Ġinitialized Ġto Ġthe Ġvalues Ġof Ġthis Ġclient ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġfun Ġbuild Up on (): ĠBuilder Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn ĠBuilder ( this ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġclass ĠBuilder ( val ĠclientId : ĠString ) Ġ{ ĊĊĠĠĠĠĠĠĠ Ġvar Ġconnection Type Ġ= ĠConnection Type . TCP ĊĠĠĠĠĠĠĠĠĠĠĠ Ġprivate Ġset ĊĠĠĠĠĠĠĠ Ġvar Ġhttp Url : ĠHttp Url ? Ġ= Ġnull ĊĠĠĠĠĠĠĠĠĠĠĠ Ġprivate Ġset ĊĠĠĠĠĠĠĠ Ġvar Ġok HttpClient : ĠOk HttpClient ? Ġ= Ġnull ĊĠĠĠĠĠĠĠĠĠĠĠ Ġprivate Ġset ĊĠĠĠĠĠĠĠ Ġvar Ġusername : ĠString ? Ġ= Ġnull ĊĠĠĠĠĠĠĠĠĠĠĠ Ġprivate Ġset ĊĠĠĠĠĠĠĠ Ġvar Ġpassword : ĠString ? Ġ= Ġnull ĊĠĠĠĠĠĠĠĠĠĠĠ Ġprivate Ġset ĊĠĠĠĠĠĠĠ Ġvar Ġwill Topic : ĠString ? Ġ= Ġnull ĊĠĠĠĠĠĠĠĠĠĠĠ Ġprivate Ġset ĊĠĠĠĠĠĠĠ Ġvar Ġwill Message : ĠByteArray ? Ġ= Ġnull ĊĠĠĠĠĠĠĠĠĠĠĠ Ġprivate Ġset ĊĠĠĠĠĠĠĠ Ġvar Ġwill Qo S : ĠM qtt Qo S ? Ġ= Ġnull ĊĠĠĠĠĠĠĠĠĠĠĠ Ġprivate Ġset ĊĠĠĠĠĠĠĠ Ġvar Ġretain Will : ĠBoolean Ġ= Ġfalse ĊĠĠĠĠĠĠĠĠĠĠĠ Ġprivate Ġset ĊĠĠĠĠĠĠĠ Ġvar Ġprotocol Version : ĠM qtt Protocol Version Ġ= ĠM qtt Protocol Version . VERSION _ 3 _ 1 ĊĠĠĠĠĠĠĠĠĠĠĠ Ġprivate Ġset ĊĠĠĠĠĠĠĠ Ġvar Ġclean Session : ĠBoolean Ġ= Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠ Ġprivate Ġset ĊĠĠĠĠĠĠĠ Ġvar Ġsocket Factory : ĠSocket Factory ? Ġ= Ġnull ĊĠĠĠĠĠĠĠĠĠĠĠ Ġprivate Ġset ĊĠĠĠĠĠĠĠ Ġvar Ġssl Socket Factory : ĠSSL Socket Factory ? Ġ= Ġnull ĊĠĠĠĠĠĠĠĠĠĠĠ Ġprivate Ġset ĊĠĠĠĠĠĠĠ Ġvar Ġcallback Executor : ĠExecutor ? Ġ= Ġnull ĊĠĠĠĠĠĠĠĠĠĠĠ Ġprivate Ġset ĊĊĠĠĠĠĠĠĠ Ġconstructor ( client : ĠM qtt Client ) Ġ: Ġthis ( client . clientId ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġconnection Type Ġ= Ġclient . connection . connection Type ĊĠĠĠĠĠĠĠĠĠĠĠ Ġhttp Url Ġ= Ġclient . url ĊĠĠĠĠĠĠĠĠĠĠĠ Ġok HttpClient Ġ= Ġ( client . connection Ġas ? ĠWeb socket Mqtt Connection )?. httpClient ĊĠĠĠĠĠĠĠĠĠĠĠ Ġusername Ġ= Ġclient . username ĊĠĠĠĠĠĠĠĠĠĠĠ Ġpassword Ġ= Ġclient . password ĊĠĠĠĠĠĠĠĠĠĠĠ Ġwill Topic Ġ= Ġclient . will Topic ĊĠĠĠĠĠĠĠĠĠĠĠ Ġwill Message Ġ= Ġclient . will Message ĊĠĠĠĠĠĠĠĠĠĠĠ Ġwill Qo S Ġ= Ġclient . will Qo S ĊĠĠĠĠĠĠĠĠĠĠĠ Ġretain Will Ġ= Ġclient . retain Will ĊĠĠĠĠĠĠĠĠĠĠĠ Ġprotocol Version Ġ= Ġclient . protocol Version ĊĠĠĠĠĠĠĠĠĠĠĠ Ġclean Session Ġ= Ġclient . clean Session ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ( client . connection Ġas ? ĠTCP Mqtt Connection )?. let Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsocket Factory Ġ= Ġit . normal Socket Factory ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġssl Socket Factory Ġ= Ġit . ssl Socket Factory ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcallback Executor Ġ= Ġclient . callback Executor ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġfun Ġurl ( http Url : ĠHttp Url ): ĠBuilder Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthis . http Url Ġ= Ġhttp Url ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġthis ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġfun Ġconnection Type ( type : ĠConnection Type ): ĠBuilder Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġconnection Type Ġ= Ġtype ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġthis ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġfun Ġlast Will ( topic : ĠString , Ġmessage : ĠByteArray , Ġq os : ĠM qtt Qo S , Ġretain : ĠBoolean ): ĠBuilder Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġwill Topic Ġ= Ġtopic ĊĠĠĠĠĠĠĠĠĠĠĠ Ġwill Message Ġ= Ġmessage ĊĠĠĠĠĠĠĠĠĠĠĠ Ġwill Qo S Ġ= Ġq os ĊĠĠĠĠĠĠĠĠĠĠĠ Ġretain Will Ġ= Ġretain ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġthis ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġfun Ġwebsocket Client ( ok HttpClient : ĠOk HttpClient ): ĠBuilder Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthis . ok HttpClient Ġ= Ġok HttpClient ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġthis ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġfun Ġtcp Socket Factory ( socket Factory : ĠSocket Factory , Ġssl Socket Factory : ĠSSL Socket Factory ): ĠBuilder Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthis . socket Factory Ġ= Ġsocket Factory ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthis . ssl Socket Factory Ġ= Ġssl Socket Factory ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġthis ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġfun Ġprotocol Version ( version : ĠM qtt Protocol Version ): ĠBuilder Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthis . protocol Version Ġ= Ġversion ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġthis ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġfun Ġcredentials ( username : ĠString ?, Ġpassword : ĠString ?): ĠBuilder Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthis . username Ġ= Ġusername ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthis . password Ġ= Ġpassword ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġthis ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġfun Ġclean Session ( clean Session : ĠBoolean ): ĠBuilder Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthis . clean Session Ġ= Ġclean Session ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġthis ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġfun Ġcallback Executor ( executor : ĠExecutor ): ĠBuilder Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthis . callback Executor Ġ= Ġexecutor ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġthis ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġfun Ġbuild (): ĠM qtt Client Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġurl Ġ= Ġhttp Url Ġ?: Ġthrow ĠIllegalStateException (" Connection Ġurl Ġnot Ġset ") ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĠM qtt Client ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġurl , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠclientId Ġ= ĠclientId , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġusername Ġ= Ġusername , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġpassword Ġ= Ġpassword , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġwill Topic Ġ= Ġwill Topic , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġwill Message Ġ= Ġwill Message , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġwill Qo S Ġ= Ġwill Qo S , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġretain Will Ġ= Ġretain Will , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġclean Session Ġ= Ġclean Session , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġprotocol Version Ġ= Ġprotocol Version , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġconnection Ġ= Ġcreate Connection (), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcallback Executor Ġ= Ġcallback Executor Ġ?: ĠExec utors . new Single Thread Executor () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġprivate Ġfun Ġcreate Connection (): ĠM qtt Connection Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġwhen Ġ( connection Type ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠConnection Type . TCP Ġ-> ĠTCP Mqtt Connection ( normal Socket Factory Ġ= Ġsocket Factory Ġ?: ĠSocket Factory . getDefault (), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġssl Socket Factory Ġ= Ġssl Socket Factory Ġ?: ĠSSL Socket Factory . getDefault () Ġas ĠSSL Socket Factory ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠConnection Type . WEB SOCKET Ġ-> ĠWeb socket Mqtt Connection ( ok HttpClient Ġ?: ĠOk HttpClient . Builder (). build ()) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġenum Ġclass ĠConnection Status Ġ{ ĊĠĠĠĠĠĠĠ ĠDIS CONNECTED , ĊĠĠĠĠĠĠĠ ĠCONNECT ING , ĊĠĠĠĠĠĠĠ ĠCONNECT ED ĊĠĠĠ Ġ} Ċ Ċ } Ċ Ċ /** Ċ Ġ* ĠListener Ġinterface Ġfor Ġmqtt Ġmessages . ĠAll Ġcallbacks Ġare Ġexecuted Ġon Ġthe Ġprovided Ġexecutor Ġ( see Ġ{@ link ĠM qtt Client # Builder # callback Executor }) Ċ Ġ*/ Ċ interface ĠM qtt Client Listener Ġ{ ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠCalled Ġwhen Ġthe Ġconnection Ġhas Ġbeen Ġestablished Ġand Ġthe Ġserver Ġacknowled ged Ġthe Ġconnection Ġrequest ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġfun Ġon Connected ( client : ĠM qtt Client ) ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠCalled Ġcreating Ġthe Ġconnection Ġhas Ġfailed ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ@ param Ġresult ĠĠĠ ĠThe Ġreason Ġfor Ġthe Ġconnection Ġfailure ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġfun Ġon Connection Failed ( client : ĠM qtt Client , Ġresult : ĠM qtt Connection Result ) ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠCalled Ġwhen Ġthe Ġclient Ġhas Ġdisconnected , Ġoptionally Ġwith Ġerror ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ@ param Ġerror ĠSet Ġwhen Ġthe Ġclient Ġdisconnected Ġwith Ġan Ġerror , Ġnull Ġif Ġit Ġdisconnected Ġnormally ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġfun Ġon Disconnected ( error : ĠThrowable ?) ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠCalled Ġwhen Ġa Ġtopic Ġmessage Ġis Ġreceived ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ@ param Ġmessage ĠĠ ĠThe Ġmessage Ġsent Ġto Ġthe Ġtopic ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġfun Ġon Message ( message : ĠM qtt Message ) ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠCalled Ġwhen Ġan Ġaction Ġwas Ġconfirmed Ġby Ġthe Ġserver , Ġuse Ġthe Ġtoken Ġto Ġassociate Ġthis Ġwith Ġthe Ġaction ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ@ param Ġtoken ĠThe Ġtoken Ġassociated Ġwith Ġthe Ġaction ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġfun Ġon Action Success ( token : ĠM qtt Token ) ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠCalled Ġwhen Ġa Ġserver Ġp ong Ġis Ġreceived ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġfun Ġon P ong () Ċ Ċ } Ċ Ċ /** Ċ Ġ* ĠRepresents Ġa Ġtopic Ġmessage Ġsent Ġby Ġa Ġclient Ċ Ġ*/ Ċ data Ġclass ĠM qtt Message ( val Ġtopic : ĠString , Ġval Ġpayload : ĠByteArray , Ġval Ġq os : ĠM qtt Qo S , Ġval Ġretain : ĠBoolean , Ġval Ġis Dup : ĠBoolean ) Ġ{ ĊĊĠĠĠ Ġinternal Ġcompanion Ġobject Ġ{ ĊĠĠĠĠĠĠĠ Ġinternal Ġfun Ġcreate ( packet : ĠM qtt Publish In Packet ): ĠM qtt Message Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĠM qtt Message ( packet . topic , Ġpacket . message , Ġpacket . qo S , Ġpacket . retain , Ġpacket . is Dup ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġequals ( other : ĠAny ?): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( this Ġ=== Ġother ) Ġreturn Ġtrue ĊĠĠĠĠĠĠĠ Ġif Ġ( java Class Ġ!= Ġother ?. java Class ) Ġreturn Ġfalse ĊĊĠĠĠĠĠĠĠ Ġother Ġas ĠM qtt Message ĊĊĠĠĠĠĠĠĠ Ġif Ġ( topic Ġ!= Ġother . topic ) Ġreturn Ġfalse ĊĠĠĠĠĠĠĠ Ġif Ġ(! payload . content Equals ( other . payload )) Ġreturn Ġfalse ĊĠĠĠĠĠĠĠ Ġif Ġ( qos Ġ!= Ġother . qos ) Ġreturn Ġfalse ĊĠĠĠĠĠĠĠ Ġif Ġ( retain Ġ!= Ġother . retain ) Ġreturn Ġfalse ĊĠĠĠĠĠĠĠ Ġif Ġ( is Dup Ġ!= Ġother . is Dup ) Ġreturn Ġfalse ĊĊĠĠĠĠĠĠĠ Ġreturn Ġtrue ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun ĠhashCode (): ĠInt Ġ{ ĊĠĠĠĠĠĠĠ Ġvar Ġresult Ġ= Ġtopic . hashCode () ĊĠĠĠĠĠĠĠ Ġresult Ġ= Ġ 3 1 Ġ* Ġresult Ġ+ Ġpayload . content HashCode () ĊĠĠĠĠĠĠĠ Ġresult Ġ= Ġ 3 1 Ġ* Ġresult Ġ+ Ġq os . hashCode () ĊĠĠĠĠĠĠĠ Ġresult Ġ= Ġ 3 1 Ġ* Ġresult Ġ+ Ġretain . hashCode () ĊĠĠĠĠĠĠĠ Ġresult Ġ= Ġ 3 1 Ġ* Ġresult Ġ+ Ġis Dup . hashCode () ĊĠĠĠĠĠĠĠ Ġreturn Ġresult ĊĠĠĠ Ġ} Ċ Ċ } Ċ Ċ /** Ċ Ġ* ĠH older Ġfor Ġa Ġtopic Ġsubscription Ċ Ġ*/ Ċ class ĠM qtt Topic Subscription ( private Ġval Ġtopic : ĠString , Ġprivate Ġval Ġclient : ĠM qtt Client , Ġval Ġtoken : ĠM qtt Token ) Ġ{ ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠCancel Ġthe Ġsubscription . ĠNote Ġthat Ġdue Ġto Ġthreading Ġparallel ism , Ġmessages Ġfor Ġthis Ġtopic Ġcan Ġstill Ġar rive Ġfor Ġa Ġmoment Ġafter Ġthis Ġmethod Ġis Ġcalled ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġfun Ġcancel () Ġ{ ĊĠĠĠĠĠĠĠ Ġclient . unsubscribe ( topic ) ĊĠĠĠ Ġ} Ċ Ċ } Ċ Ċ /** Ċ Ġ* ĠRepresents Ġan Ġaction Ġon Ġthe Ġmqtt Ġlayer . ĠSome Ġactions Ġreturn Ġa Ġtoken Ġwhich Ġwill Ġalso Ġbe Ġpassed Ġin Ġ{@ link ĠM qtt Client Listener # on Action Success }. Ċ Ġ* Ċ Ġ* ĠNOTE : ĠUse Ġ{ Object # equals } Ġand Ġnot Ġpointer Ġequality Ċ Ġ*/ Ċ data Ġclass ĠM qtt Token ( private Ġval Ġcode : ĠInt ) Ċ Ċ /** Ċ Ġ* ĠAdapter Ġfor Ġthe Ġ{@ link ĠM qtt Client Listener } Ġwhich Ġprovides Ġa Ġdefault Ġ( empty ) Ġimplementation Ġfor Ġall Ġmethods Ċ Ġ*/ Ċ abstract Ġclass ĠM qtt Client Listener Adapter Ġ: ĠM qtt Client Listener Ġ{ ĊĠĠĠ Ġoverride Ġfun Ġon Connected ( client : ĠM qtt Client ) Ġ{ ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġon Connection Failed ( client : ĠM qtt Client , Ġresult : ĠM qtt Connection Result ) Ġ{ ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġon Disconnected ( error : ĠThrowable ?) Ġ{ ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġon Message ( message : ĠM qtt Message ) Ġ{ ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġon Action Success ( token : ĠM qtt Token ) Ġ{ ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġon P ong () Ġ{ ĊĠĠĠ Ġ} Ċ }