package Ġcn . gy g xz c . uh f . ble Ċ Ċ import Ġandroid . bluetooth . Bluetooth Device Ċ import Ġandroid . bluetooth . Bluetooth Socket Ċ import Ġandroid . content . Context Ċ import Ġcn . gy g xz c . uh f . Log Utils Ċ import Ġcn . gy g xz c . uh f . event . ErrorCode Ċ import Ġcn . gy g xz c . uh f . exception . RF ID Exception Ċ import Ġcn . gy g xz c . uh f . receiver . Blue State Receiver Ċ import Ġcn . gy g xz c . uh f . uh f . enums . U HF Ex Enums Ċ import Ġcn . gy g xz c . uh f . uh f . reader . Socket Reader Ċ import Ġcn . gy g xz c . uh f . uh f . reader . U HF Reader Ċ import Ġcn . gy g xz c . uh f . uh f . util . Tools Ċ import Ġio . reactivex . Observable Ċ import Ġio . reactivex . Single Ċ import Ġio . reactivex . schedul ers . Schedulers Ċ import Ġjava . io . IOException Ċ import Ġjava . util .* Ċ import Ġjava . util . concurrent . TimeUnit ĊĊ Ċ /** Ċ Ġ* Ġ@ author Ġn iant uo Ċ Ġ* Ġ@ created Time Ġ 2 0 1 8 / 5 / 1 2 Ġ 1 8 : 0 4 Ċ Ġ* Ċ Ġ* Ġ Ġ è¿Ļä¸ª éľĢè¦ģ ä½ľä¸º ä¸Ģä¸ª åħ¨å±Ģ åıĺéĩı æĿ¥ ç»´æĬ¤ ï¼Į æīĢä»¥ ä¸Ģä¸ª APP åıªèĥ½ è¿ŀæİ¥ ä¸Ģä¸ª Ċ Ġ* Ġ Ġ åŁºäºİ è¿Ļä¸ª çļĦ æĵįä½ľ ï¼Į è¿Ļä¸ª æĺ¯ èİ·åıĸ èĵĿ çī Ļ çļĦ è¾ĵåħ¥ è¾ĵåĩº æµģ Ċ Ġ* Ġ Ġ å¹¶ ç»´æĬ¤ ä¸Ģä¸ª åħ¨å±Ģ çļĦ ï¼Į å®ŀéĻħ ä¸Ĭ æĺ¯ æĸ¹ä¾¿ ç³»ç»Ł çļĦ è°ĥçĶ¨ ï¼Į ä»¥åıĬ åľ¨ Activity ä¹ĭéĹ´çļĦ ä¼łéĢĴ ï¼Į åĩı å°ĳ éļ¾ åº¦ Ċ Ġ* Ġ ĠéĢļè¿ĩ å®ĥ èĩªå·±çļĦ ä¸Ģä¸ª çĶŁåĳ½ åĳ¨æľŁ çļĦ æİ§åĪ¶ ï¼Į åı¯ä»¥ éģ¿åħį ä»£çłģ æ³ Ħ æ¼ı è¿Ļä¸ª éĹ®é¢ĺ Ċ Ġ*/ Ċ class ĠB le Instance Ġ{ ĊĠĠĠ Ġcompanion Ġobject Ġ{ ĊĠĠĠĠĠĠĠ Ġprivate Ġconst Ġval ĠMY _ UUID Ġ= Ġ" 0 0 0 0 1 1 0 1 - 0 0 0 0 - 1 0 0 0 - 8 0 0 0 - 0 0 8 0 5 F 9 B 3 4 FB " Ġ// ĠS PP æľįåĬ¡ UUID åı· ĊĠĠĠĠĠĠĠ Ġprivate Ġconst Ġval ĠTAG Ġ= Ġ" B le Instance " ĊĠĠĠĠĠĠĠ Ġval ĠBLE Ġ= ĠB le Instance () ĊĠĠĠ Ġ} ĊĊĊĠĠĠ Ġvar Ġconnected Device : ĠBluetooth Device ? Ġ= Ġnull ĊĠĠĠ Ġvar Ġbluetooth Socket : ĠBluetooth Socket ? Ġ= Ġnull ĊĊĊĠĠĠ Ġfun Ġis Connected (): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġconnected Device Ġ!= Ġnull ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ&& Ġbluetooth Socket Ġ!= Ġnull ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ&& ĠBlue State Receiver . isConnected ( connected Device !! ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġconnect ( device : ĠBluetooth Device ): ĠObservable < Bluetooth Socket > Ġ{ ĊĠĠĠĠĠĠĠ Ġthis . connected Device Ġ= Ġdevice ĊĠĠĠĠĠĠĠ Ġreturn ĠObservable . create < Bluetooth Socket > Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġensure Device () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġsocket Ġ= Ġdevice . create Rf comm Socket To Service Record ( UUID . fromString ( MY _ UUID )) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsocket . connect () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbluetooth Socket Ġ= Ġsocket ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit . onNext ( socket ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit . onComplete () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( e : ĠIOException ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit . onError ( e ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsocket . close () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. timeout ( 1 0 , ĠTimeUnit . SECONDS ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. retry ( 2 ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. subscribe On ( Schedulers . io ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. unsubscribe On ( Schedulers . io ()) ĊĠĠĠ Ġ} ĊĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* Ġ ä¿Ŀè¯ģ åĨĻ æķ°æį®çļĦ åįķ çº¿ç¨ĭ ĊĠĠĠĠ Ġ* Ġ è¿Ļä¸ª åľ°æĸ¹ è¿ĺ è¦ģ èĢĥèĻĳ ä¸Ģä¸ĭ ï¼Į å®ŀéĻħ ä¸Ĭ åºĶè¯¥ æĺ¯ è¾ĵåħ¥ è¾ĵåĩº æµģ ä¿Ŀè¯ģ åĲĮæĹ¶ åıªæľī ä¸Ģä¸ª çº¿ç¨ĭ è®¿éĹ® ĊĠĠĠĠ Ġ* Ġå¦Ĥæŀľ æĺ¯ èĩªå®ļä¹ī çļĦ éĶĻè¯¯ ï¼Į åį³ è¡¨ç¤º æĺ¯ ä»£çłģ ä¸» åĬ¨ æĬĽ åĩºçļĦ éĶĻè¯¯ ĊĠĠĠĠ Ġ* Ġä¸į éľĢè¦ģ éĩį è¯ķ ï¼Į è¿Ļä¸ª æĺ¯ è¾ĵåħ¥ æĮĩä»¤ ï¼Į è¿ĶåĽŀ ç»ĵæŀľ ĊĠĠĠĠ Ġ* Ġ ä¸Ģä¸ª æĮĩä»¤ å¯¹åºĶ çļĦæĺ¯ ä¸Ģä¸ª ç»ĵæŀľ ï¼Į èĵĿ çī Ļ çļĦ è¾ĵåħ¥ è¾ĵåĩº æµģ æĺ¯ åĲĮæŃ¥ çļĦ ĊĠĠĠĠ Ġ* Ġ ä¹Łå°±æĺ¯ è¯´ ï¼Į ä¸į åı¯èĥ½ åĲĮæĹ¶ å¯¹ ä¸Ģä¸ª èĵĿ çī Ļ socket è¿Ľè¡Į å¤ļä¸ª åĨĻ çļĦ æĵįä½ľ ï¼Į æĢ» æĺ¯ åĨĻ - è¯» ï¼Į ï¼Į åĨĻ - è¯» ĊĠĠĠĠ Ġ* Ġ å®ŀéĻħ ä¸Ĭ è¿Ļ åĦ¿ çļĦ åĨĻ æ³ķ æĺ¯ çī¹ åľ° éĴĪå¯¹ RF ID è®¾å¤ĩ çļĦ ï¼Į åĽłä¸º RF ID è®¾å¤ĩ å¹¶ ä¸įä¼ļ ä¸» åĬ¨ ç»Ļ APP ç«¯ åıĳéĢģ æ¶Īæģ¯ ĊĠĠĠĠ Ġ* Ġæµ ģ ç¨ĭ æĺ¯ æİ¥æĶ¶ åĳ½ä»¤ ï¼Į è¿ĶåĽŀ ç»ĵæŀľ ï¼Į æīĢä»¥ åı¯ä»¥ è¿Ļæł· æĵįä½ľ ĊĠĠĠĠ Ġ* Ġå¦Ĥæŀľ ä½¿çĶ¨ èĵĿ çī Ļ éĢļä¿¡ ï¼Į è¿Ļç§į æĵįä½ľ åºĶè¯¥ æĺ¯ ä¸įåı¯ åıĸ çļĦ ï¼Į åĽłä¸º åıĮ æĸ¹ éĥ½ åı¯èĥ½ æĺ¯ æ¶Īæģ¯ çļĦ åıĳ èµ· èĢħ ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġfun Ġwrite ( bytes : ĠByteArray ): ĠObservable < ByteArray > Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn ĠObservable . create < ByteArray > Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġensure Socket () ĊĠĠĠĠĠĠĠĠĠĠĠ ĠLog Utils . info ( TAG , Ġ" åĨĻ -> ${ Tools . bytes 2 HexString ( bytes )} ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġsynchronized ( bluetooth Socket !! ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbluetooth Socket !!. output Stream . write ( bytes ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbluetooth Socket !!. output Stream . flush () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġit . onNext ( bytes ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġit . onComplete () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. flatMap < ByteArray > Ġ{ ĠU HF Reader . read ( bluetooth Socket !!. inputStream ) Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. do On Dispose Ġ{ ĠLog Utils . debug ( TAG , Ġ" write Ġ-> Ġ åıĸæ¶Ī è®¢ éĺħ ") Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. subscribe On ( Schedulers . io ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. unsubscribe On ( Schedulers . io ()) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠæĬ Ĭ è¯» åĨĻ å½ĵ æĪĲ ä¸Ģä¸ª æķ´ ä½ĵ ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġfun Ġwrite Single ( bytes : ĠByteArray ): ĠSingle < ByteArray > Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn ĠSingle . create < ByteArray > Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġensure Socket () ĊĠĠĠĠĠĠĠĠĠĠĠ ĠLog Utils . debug ( TAG , Ġ" åĨĻ single -> ${ Tools . bytes 2 HexString ( bytes )} ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġsynchronized ( bluetooth Socket !! ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbluetooth Socket !!. output Stream . write ( bytes ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbluetooth Socket !!. output Stream . flush () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġit . on Success ( bytes ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. flatMap Ġ{ ĠU HF Reader . read Single ( bluetooth Socket !!. inputStream ) Ġ} ĊĠĠĠ Ġ} ĊĊĊĠĠĠ Ġfun Ġwrite Direct ( bytes : ĠByteArray ): ĠSingle < ByteArray > Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn ĠSingle . create < ByteArray > Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġensure Socket () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġsynchronized ( bluetooth Socket !! ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbluetooth Socket !!. output Stream . write ( bytes ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbluetooth Socket !!. output Stream . flush () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ ĠThread . sleep ( 5 0 ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġresponse Ġ= ĠSocket Reader . read ( bluetooth Socket !!. inputStream ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( response Ġ== Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit . onError ( RF ID Exception ( U HF Ex Enums . ERR _ NO _ RESPONSE )) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit . on Success ( response ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. subscribe On ( Schedulers . io ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. unsubscribe On ( Schedulers . io ()) ĊĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* Ġ åħ³éĹŃ è¿ŀæİ¥ , æĬĬ è¿Ļ åıĤæķ° ç½® ç©º ï¼Į éĺ² æŃ¢ åıĳçĶŁ åĨħåŃĺ æ³ Ħ æ¼ı ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġfun Ġdisconnect () Ġ{ ĊĠĠĠĠĠĠĠ Ġbluetooth Socket ?. close () ĊĠĠĠĠĠĠĠ Ġbluetooth Socket Ġ= Ġnull ĊĠĠĠĠĠĠĠ Ġconnected Device Ġ= Ġnull ĊĠĠĠ Ġ} ĊĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* Ġ éĢĢåĩº çļĦæĹ¶åĢĻ ä¸Ģå®ļ æĽ´ è¦ģ è°ĥçĶ¨ è¯¥ æĸ¹æ³ķ ï¼Į éĺ² æŃ¢ åĩºçİ° åĨħåŃĺ æ³ Ħ æ¼ı ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġfun Ġdestroy () Ġ{ ĊĠĠĠĠĠĠĠ Ġdisconnect () ĊĠĠĠ Ġ} ĊĊĊĠĠĠ Ġ@ Throws ( Exception :: class ) ĊĠĠĠ Ġprivate Ġfun Ġensure Device () Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( connected Device Ġ== Ġnull ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthrow ĠRF ID Exception ( ErrorCode . ERROR _ BLE _ NO _ DEVICE ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Throws ( RF ID Exception :: class ) ĊĠĠĠ Ġprivate Ġfun Ġensure Socket () Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( bluetooth Socket Ġ== Ġnull ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthrow ĠRF ID Exception ( ErrorCode . ERROR _ BLE _ NO _ CONNECTED ) ĊĠĠĠ Ġ} Ċ Ċ }