From 2df518f0b4374c0caa1bd0755f142ca2c2c35043 Mon Sep 17 00:00:00 2001 From: Elisa <20030784@studenti.uniupo.it> Date: Sun, 24 Jul 2022 19:55:17 +0200 Subject: [PATCH] aggiunto messaggi da inviare alla web app --- antifurto/bin/bin/install.bash | 2 + antifurto/bin/bin/start.bash | 6 + antifurto/bin/bin/stop.bash | 5 + antifurto/bin/bridge.conf | 15 ++ antifurto/bin/code/Antifurto.class | Bin 0 -> 5382 bytes antifurto/bin/code/Automa.class | Bin 0 -> 4016 bytes antifurto/bin/code/Esecutore.class | Bin 0 -> 4046 bytes antifurto/bin/code/Helper.class | Bin 0 -> 1106 bytes antifurto/bin/code/MyQueue.class | Bin 0 -> 1160 bytes antifurto/bin/code/Pair.class | Bin 0 -> 1043 bytes antifurto/bin/code/Publisher.class | Bin 0 -> 1051 bytes antifurto/bin/code/SubscribeCallback.class | Bin 0 -> 7464 bytes antifurto/bin/code/Timer.class | Bin 0 -> 856 bytes antifurto/bin/conf.xml | 12 ++ antifurto/bin/logger.xml | 10 + antifurto/bin/templates/interruttore.xml | 6 + antifurto/bin/templates/sensoremovimento1.xml | 6 + antifurto/bin/threads/MqttClientThread.xml | 11 ++ antifurto/res/CONF/deltaSensoriMovimento.json | 6 +- antifurto/res/CONF/zona.json | 10 +- antifurto/res/stato.json | 2 +- antifurto/src/code/Antifurto.java | 72 +++++--- antifurto/src/code/Automa.java | 32 ++-- antifurto/src/code/Esecutore.java | 54 +++++- antifurto/src/code/Helper.java | 174 +++++++++--------- antifurto/src/code/Pair.java | 12 +- antifurto/src/code/Publisher.java | 4 +- antifurto/src/code/SubscribeCallback.java | 158 ++++++++++++---- 28 files changed, 414 insertions(+), 183 deletions(-) create mode 100755 antifurto/bin/bin/install.bash create mode 100755 antifurto/bin/bin/start.bash create mode 100755 antifurto/bin/bin/stop.bash create mode 100644 antifurto/bin/bridge.conf create mode 100644 antifurto/bin/code/Antifurto.class create mode 100644 antifurto/bin/code/Automa.class create mode 100644 antifurto/bin/code/Esecutore.class create mode 100644 antifurto/bin/code/Helper.class create mode 100644 antifurto/bin/code/MyQueue.class create mode 100644 antifurto/bin/code/Pair.class create mode 100644 antifurto/bin/code/Publisher.class create mode 100644 antifurto/bin/code/SubscribeCallback.class create mode 100644 antifurto/bin/code/Timer.class create mode 100644 antifurto/bin/conf.xml create mode 100644 antifurto/bin/logger.xml create mode 100644 antifurto/bin/templates/interruttore.xml create mode 100644 antifurto/bin/templates/sensoremovimento1.xml create mode 100644 antifurto/bin/threads/MqttClientThread.xml diff --git a/antifurto/bin/bin/install.bash b/antifurto/bin/bin/install.bash new file mode 100755 index 0000000..5b474c2 --- /dev/null +++ b/antifurto/bin/bin/install.bash @@ -0,0 +1,2 @@ +#!/bin/bash +if [ ! -d "/home/debian/hat_home" ]; then mkdir /home/debian/hat_home; fi diff --git a/antifurto/bin/bin/start.bash b/antifurto/bin/bin/start.bash new file mode 100755 index 0000000..1396363 --- /dev/null +++ b/antifurto/bin/bin/start.bash @@ -0,0 +1,6 @@ +#!/bin/bash +status="OFF" +running=$(/usr/bin/pgrep antifurto) +if [ -f "/home/debian/CONFIG/antifurto/STATUS" ]; then status=$(cat /home/debian/CONFIG/antifurto/STATUS); fi +if [ ! -z "$running" ]; then status="OFF"; fi +if [ $status == "ON" ]; then (/home/debian/CONFIG/antifurto/bin/antifurto /home/debian/CONFIG/antifurto &>/dev/null&); fi diff --git a/antifurto/bin/bin/stop.bash b/antifurto/bin/bin/stop.bash new file mode 100755 index 0000000..c7fc461 --- /dev/null +++ b/antifurto/bin/bin/stop.bash @@ -0,0 +1,5 @@ +#!/bin/bash +status="NONE" +if [ -f "/home/debian/CONFIG/antifurto/STATUS" ]; then status=$(cat /home/debian/CONFIG/antifurto/STATUS); fi +if [ $status == "OFF" ]; then /home/debian/bin/stopag antifurto; fi + diff --git a/antifurto/bin/bridge.conf b/antifurto/bin/bridge.conf new file mode 100644 index 0000000..cf74ca9 --- /dev/null +++ b/antifurto/bin/bridge.conf @@ -0,0 +1,15 @@ +connection bridge-pissir-20030784 +address luci.local:1883 +bridge_cafile /etc/mosquitto/ca_certificates/ca_certificate.pem + +tls_version tlsv1.2 +try_private false +remote_username gruppo2 +remote_password funziona + +topic to/all in 2 +topic rpc/gruppo2/luci/antifurto in 2 +topic from/gruppo2/luci/gpio/+ both 2 + +topic from/gruppo2/luci/antifurto/description out 1 +topic from/gruppo2/luci/antifurto out 1 diff --git a/antifurto/bin/code/Antifurto.class b/antifurto/bin/code/Antifurto.class new file mode 100644 index 0000000000000000000000000000000000000000..8ceee73a134bc01304f619ec008df9f73513046f GIT binary patch literal 5382 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 literal 0 HcmV?d00001 diff --git a/antifurto/bin/code/Automa.class b/antifurto/bin/code/Automa.class new file mode 100644 index 0000000000000000000000000000000000000000..e7c5c2575f330bc66376541054a0212bd2ae441d GIT binary patch literal 4016 zcmZ`+Yj+!072RV=9$6kcv0^)QVz<OeTw9K<q=mM55O5QlD79o-xoKls!dM>5<H#CE z8o4RZQu?M3`Utc*<q-<S6jDebmZ9llb*+{!`~v<9fw0e=ku5pO(pocj?mc(kefD|G z=wJW)<R1XOjB*4Akkv7#!wzFUg0sj)(13*|1dxyL;>cw&jB{ZWWU?sBt{9eNv?R+< z=r|ui8?s{XWEkI-mG3p<`*=z&PwV(W1l@Q>Y<?)0XLUR$GtZ0R3p!qm;0|QNcuDRr z%jHL5ydsOQ3gl~Hye{`2hw(-jZ$@w%-U{RGFfN4g6Cv<ZxxAy}T@8`>qLZJPp0_ft zhK_Nkkd4bs{A79}<xL;fV9Z!K*GyaaqEoQNY~EZl<0aS5#ZQ>UIoF)dSu|@(+u6M7 zmI{`JBlT?j$()(b#?x-W&SwvMW@;vpcde{dIDAx2EV`!ajJR&e%n?mXXlPSYVpJ%U zT-T9PqE*{{K)R$1(<LYGXlNcwjE|lfd3bUnIijKEn3Lyf-aTdJO57h&tLe#+$q9m~ zhvTE;lOt!+qp9@7Lp-(dh@H3HqZ$JJ1E(|uk2y2kw`JVUTdC5*v{jfC=ZQ3WK4UGq zHt}`*Ovkc@aM5zpbc2co`=?}g3m-FQljfq@#55vO!L}9_ZIRKRyvRv&X6AT}<emLD zdzui)aMp5_DZ^67W`Hj2$(Xr}lQUB#XUP#lPO_LCD>w_aTGrjp6Ly%{tnC!?X0`dK zFK^GSu+=&fS;O|s9OG@NgR3DZcm-Ll`G~D_NIj2~TxY>l!qbWN%5*J6d;h@A!cgdn zwGY}^^E_E7Sz~6d$gnZ0QyRJ}%N1}YSC!EgCX78>DyW3CmzY($nai1l1p+i>ocxki zU{Xo|5_Q=`(oU(6vBqpklxEMbVJRU4Be-9~wmMZu!wgd`UQr=BJRC1r#ki?d8I~H= z@t%R7;}?RGHgFg2HgEz71LFeP=5HuUz?Hp*ka{q19}XJ$C4Ob#5`JyqeLQGjQZcDh z*arLFS2Xnbc*iDEWAW;KkaU*p1uO3#V&FIUt&WQZKEN3Rzr%`#tqQfO>J9uJ9}0s% z82BSDlkA3tgn(VZz(<%e@F)D48MLwL75V)oJ2xYW2QmvY2Cm>^1AoC|tTU(N?l<sP z5#<orM`YrFfg>`8h6X2Z;3`%%bXrT~%r=nplF&*!*__REYhPcm^Gt)vbikRNHSmxK z{V>usK2^GBXH6K_`vK#t_}flAF;O)eRkNyzCYU~q5*_k_e!|KvihE5ti?!$FO<%q0 zu9y3P#S&Y2td2Revxee&e~%P11$)Uqh&$_9-F%d^pGH;=BSxXmT2B@!Yo#7*{G#~! zoLNj+=fyIwZnc%WPDNjm&O9+IP&L)$=LMnet9H%bSjEntsjkFz^Z@BHmFoc1H4oeC zZwl!s8}CF71JxM*tLIkoHkylzR(?jqP~A<p$ZmQXcG<7xHOW*^Ey^1=TIcv$q}nwt zyW;m0cJb|gfZr=&eh{!LaMU0*%>2Jcjql|%TYws~O4OYd!ut+<m3IwC)m#u=_*&I- zgwJ2EdTvLQwrpX<JH{Pj2=W=YJ+=ldb`1@uqrtx+w1&o2=&`^W!dz(jm=+q2^V*3J zukGB`!D}bcx1)z2E2ErkB<2{tfnI58KK=sz3UKW%1s(CAlRKBuu`k*jy9%R>mMEuN zSI`pUR2f@VVerhYa%O`%a|e;ZPpKB3)W#2|-TVz<FZJrfNv<@Z;W~Efc%Z3<MuRj} zpT-4}5aJ2C*mimi(N%0yjM_a$<AY^%B=`Ltof?+0mxJvZKErLP!67obCrGB-hB~NB zR~b7VS-J7=4R(DzABdqDgVbS&9EZs(j{W@IOOB(A=Ltqsm>OvKFM7ySM>1AJRznIC z)L3E?^EGRgQwO{KLpNd|AB|vMv=CpzH}Rmq?@rFk$`-Y+jGdpMyNsU8obrO#$UBf^ zfY=m$W!`5fMVUvrNv{?mu_1yiQHR?P1-pVOM4T`#VNa|pcnx<@&M!rGmC;KLd&}7E zhcL+8S-Ej_vryAa@eIQ_gPpJ##92y{rR#Hio6X}9esp_61+F7ZmHvYV8ft{<mA9VH z{VfU=B=>~ReSFXl;2{pY048N=AGxQ7s+ez&4Mq2qv3C`H9Nno#{VO*<-%Qpa*+r5) zN3sR%L6PxvSxqHUdV*0sugLPt+#`F$qbe0OMv?i_@riy)qLRapM+cIF(O4OS%V>)3 zORk_XI;1F4`P7il{vZb)`$Lj=dRI`i4|RpAJc!1+LUc<Ni>LG#8{{Q5z<(tHJjIlI znkD}X%k^2N=5tKV=jp@?e7(L%@-I=%mvI`e;4!?aoM}VoI-)vGv8Hqe;Bc+{yBMO1 z{3q$1Bvdy^_W52JvFPv`;wxy1MOnr14N_4Rsy9gJO_F(=ie69$2GP(FstNHfJi4x2 zFVB#iZj24CVZWexsqEFjJ51eoH|;%*DcVRK_3$qILgZ&`u7da2a=%5dZ#M0_vVMwJ zFqdfhcwN)}&88pF^xHV&qY8N;5FvqnCD3LTAJYCib?rStH`{+idvo3XppU<`DgdG2 z<$&z+T4yVB0Q|O+FQ`_mD!~KLS_v~<7sjKxjCwGi5at?TKHY%PSj#iMw|Da{p^EIh e$h0255{-#E)jU3D3VZ<_|EvJ$++r!C+5ZD}S$Svx literal 0 HcmV?d00001 diff --git a/antifurto/bin/code/Esecutore.class b/antifurto/bin/code/Esecutore.class new file mode 100644 index 0000000000000000000000000000000000000000..e5c632a21e44d6bef8a89c8062d1b7beae587149 GIT binary patch literal 4046 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 literal 0 HcmV?d00001 diff --git a/antifurto/bin/code/Helper.class b/antifurto/bin/code/Helper.class new file mode 100644 index 0000000000000000000000000000000000000000..cbfca13d4240a1884a93c6cbb7ccbb591b612e09 GIT binary patch literal 1106 zcmZuwT~pIQ6g}HEYze_a3oZ2n@eAA1Hhv%~1r!iRofc-SqtnNbE}dXaI%$gj8y|hu zmv+X^_~?Uw!~Y@PO<F-{lD*m7yZ79)=Wc%e`ThgIGImtVVv*xEM@B^$SrsAVR4gGc zX9a1BQRp0ZRH(>u+*P6Bo;3G4mQ}>CD9r<DC`Ut)V};`(!`PZ-TiymkIFo(L5ZQL> zf+1G6Y_Z$<urJ&<#(tALYTI<JBkQ>(KXRF}<2LlewqxtBs(ZV8`-j5xO65c2$k3aH z-O#I^YuSyGgj9DvnWE)cj@{;X#4z3zjm7|IF*73Pyo+J7>KW$yiqZ1va6G2H(l!ab z>U3OF1iU6*h-OQ;Mae@$5-EnH&&hK1t<J%La7F!{Yk9(Dhz|oYHE_z5RcT5bYZ}(E zq2Y=2Je5c|lk-{_bqRE?LJ*KRn;N!2+NRD5v(>Shl&oPJ&lo055?v3tGfbT<4s>Nm z47tAC`zPjq3j?_sW=H8sJxC1vq(iV(zcYyuO=O6A&Jb=UlO5Fz<)hS)K{1<7o8G6; zgT4FcQI`ag=ZFrO(P|01&QKV|?_7z2Iwf4g44r&=g-LztC)qjrx<YSi2$Wn8>>EuO z(qzYcr-m#p;u8H6a_J@%N~V-PLbX1^wWS^+Jt&oYu8XlQc)pA12}B$bS{%a^-E)}6 zWyEQKyo{=5F^{VQ;LilBP-HzmUg<-v5tWJEKD1h)hso7QI?~03TKOl^eZ*=#Oi`Wb zB^q7CD_@R(%XlLHl>kCM_jz!dCkZq~zvmpy(paE<tWfz9m0qA|9-(6jD4c|$!Ev4A V25?NAq;L2H-cz(0Zu)g@{RJL2@pb?J literal 0 HcmV?d00001 diff --git a/antifurto/bin/code/MyQueue.class b/antifurto/bin/code/MyQueue.class new file mode 100644 index 0000000000000000000000000000000000000000..50ac71d1e9f4ea9afa31bd320196bcda41a7245b GIT binary patch literal 1160 zcmZ`&*-{fx5IvJ^vP=@fs;CHpItfZpaU(H`2vt-Cmr6=Y--hH$T}&o%GK1z*`~qHl zP)kFVR`~(`i67vrdTx>eS$w(O)A#i0?$dXE{QmkKzyemINWs*Rj=~2sf&pZdH>-|I z>h5xsF@B~nrz0D|Jg$UsHHvFkP?+oLxS`{wj$0anuRY-j4I{-ZYun0tuB>I39LH)G zWy{TJh?L}}ZMmL9%=mGbe7T$}5E#l!Te<}eelz`4Ltwd4WlFLrZSl~nZwRMsZPXai zWoxD0blY9v3j$lhuCl(_Bd=NZX7<s>mZ-Qn#S=2guN>VG6(P6DFl?reVl~7|u2p%p zZZ*4wI5~$i)6C`&j;J@b#Zs-N!OWKzkER!nhBQP=4bQ2FRjK+m*4s~%RC7uv1EUzz zFm#M&1_m)?U>v6m+{U7T9L5af6?~!#?@qX8yTWn2rYou|Z!4nd%7(4uj)4O1QjCAD zC&m8#Jp)U)Z(tb@46G<hqe7Xp{nj)L>{sY%NR_SX|Kz3m5xe2am+h`Hfj5?P4{(&) zEmzdZ(eQZDe<HGxee6ivExC@c>QuL<!oe{2)l{IGeQ34JlJ;hAwY{w<z}m4J4OVKx zaxlf`oZ{2h_-?5!?J&Q57(tLe7s2xcBlGan0|qj?&@$iPd%g?*7X&_bb5HV25CMb{ zKm<udiRPO6*^{&?JDmB9KnKD1ds(4wJkCB&;|%MnT645M+Jr*Sb`W}&=|DeRDaAU2 zh_mNj#}ni@i^)ER>~l;rHT({vG?AS@zlxs_8#FqI@BI0x*!>+OKClHHF%F=9UNy=D zzro>kwiDwJ2}Y9~XN>+h+nnNUnB%VNI2Y@epJsGsPp+AR11I;JS2aK^Q|a|uKaUHH H`Ec<seKzU} literal 0 HcmV?d00001 diff --git a/antifurto/bin/code/Pair.class b/antifurto/bin/code/Pair.class new file mode 100644 index 0000000000000000000000000000000000000000..2470277b8b66da852c3f09e4877b4624b7c51b5b GIT binary patch literal 1043 zcmaJ<e^1j;6g_X<=vLksbbwAp9f*t;sRI6l_>Vyi89$N{jenNfEJfBXT`~Ht(8x$M z@dNmwjOVooB50c4`+9rcJ?EbHe*FCU9l#P+3=CtcgbHq{Fs<XZfjp*)7*Tnqh-wK9 z%o?y@8$`^h@*N%X2Fh@B+|_YUppZn}z!NZ=yY73}*>l6T(@NqXY%dFFonBjDU?m8H z<f*_+<2>kmW%iXo{#o?a7pOFY(BIha?D+AvyR*kivF#_@8RKYU_WWkD5wWglWfHCR zqHuF(*Y^^EON2*p+u3E!S!-=>WIw3VSpDGn-6V*@9tn~tlP^$iC9d~w-R-8_9GuWr zv>$u^^FV1SZMi`_uf~=b#e&2LOo=K?f$9ZJ5{p>UabMyA9_n}`@fc4euHu@+b<_mL z&ulsoC9#YJvU#+`QIrD1r(XXaPirXOwC+AfUH-q%$AkaNjz5~WKK2s7!?uxXJC@lU zM9vn^H=#|w+o6BeRL$A4fZkQ0y^#AZkfX#_QbcO<cI<jS>bzycyqq~c^fF!1PUZpx zEgoYW=hq_tYs?kv2*R=tk+bFwp?zYB=gesGrUHYE5+&Z&AwB|^Q9Euh!7PX<SYMDk zIN3Ik7DpJbTnN?vhAKfkKgv<EHYh5`Y<)xi%@GPs+Z<2?edw=kv&f~UmY-3|mWF-W zFH>AYk<?Z8Y_RJDd*#Vc=F1Dhs90VwE0&7Y$6z1wplSCpBo0^xbT%mS_o)eWRwik} V6zkKtK@6vSspBT`b$;bA`3nHG&D;P0 literal 0 HcmV?d00001 diff --git a/antifurto/bin/code/Publisher.class b/antifurto/bin/code/Publisher.class new file mode 100644 index 0000000000000000000000000000000000000000..4d607d806d239c2b6883e4b242d430e7d963e18a GIT binary patch literal 1051 zcmZuwTTc@~7(LTgmX@XEj!=uDBBd>?3f?F}4AG|+F>OqIoG#;bu<WkeS)#v)XA>!j zCdOxfgg?Xw@tbWCie|Il%y&C;=FH5G-(S7~Si@EdY1~d?7z^6mF|e3I0{Ik{P|&8R z-I6xTDXhRUa5se^+%s_Bz$!z+_VzeKx<aF{svlp4A{1qYWKB9QS79I+vVF;ouD8o& zP~N1<0lOuIs~ASQiD#~oZ^J-&I=3NRsWutr^L-fQ%cV=NiOM!nV8~RYD|W(zh6w7s z(W1yoe{(;9{~=|#<H*o;<hFOf-93+CF<;r|hums$*Rg6UkgikyH=<d@gU}_L*Yn|; z;`X~L_ah>aWQ!yqL#pP5fh}H0O)tG0Hd?aX6v2vK!^9+VCNdZ?F^&n6GLly7rBhi0 zYbGAxp@~O$Y~l&lO_Z^2V8g^yWEo0c;8=oG_1nVodDFAH3R?&7l{#Ftsx&<RU<+SK z&o!}$9C7HbaYlp=<9xgIW+3<;gL(0YN$$3ADLQ#knU{@yVXLy<yAcRm$V1xSM1JXl zRJ{_0K}V>%=S%x?MNeKjeX6LooilcSF9r$gcbQg&YI;N><I{<#NbP#SZGm~Z%xSve zG5SbJFpNgt82KbB&EpiC#1#3{<gL;er!iAF0V@=b5i69A5&uLXhO1=9=mh}!9Sk7} zlfZ|2kTX;<i!9kLP$H@v|BA$$V(A1|b_$;nTkc@s94sBJH9~Ns1UyEq*O2Q0gp|`v z7Ia$&#&;wtG>sQK7^FYhLFx#D)lvuM(dkcW8lu&6WMdJ}SqxC~H2E_W*RZpgBX&1w dHb<E$0zajA%)oU6H^2<c|02eWDzsd;{s4iZ<ca_Q literal 0 HcmV?d00001 diff --git a/antifurto/bin/code/SubscribeCallback.class b/antifurto/bin/code/SubscribeCallback.class new file mode 100644 index 0000000000000000000000000000000000000000..23929201c5cbee84789f64070e14972ad29b922f GIT binary patch literal 7464 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 literal 0 HcmV?d00001 diff --git a/antifurto/bin/code/Timer.class b/antifurto/bin/code/Timer.class new file mode 100644 index 0000000000000000000000000000000000000000..453e7f52694373063e3dfdbee7b4c29d1ec4ba84 GIT binary patch literal 856 zcmZuv+fEZv6kTW9GBQj7!Kz%Pcq@ZY?>CTy7)Yx1l9cqp7jtNjb+DajhBHJyz>n|? zc-B}nKKKECf$x5WFXB1}6UF#2`*QZ$d+oF4eEs?P3xMlb@sP)ve)yO%rfAHpF=suT z!+8%EaM3_YF6R0XVBW(eEVx*7Q5MKGRa@=~h>AcTV=W&FWYxB62n<&naZ{Don4~&R z)Dj_*QAY~o4{NJ7HHGCc3iXP>Y^hTDx9<pcu1<pc94s(Y4I}k9?QE)KLvFTtl1b8t zwq!v0nwE`Mk7U=@xV?Z^i_@f`)<c8!Ho}fd7PsV%^ijaLk3kIi7&hiOMtqFogp12Q zuHdSRYd*EQ;o~N52~3-&a$82NawXC#Nz$%X&9&DJ)zx7fxw!4)4(_^G^0AD2<g!Xw zLhACTd*fxIWK&?k)(_R-y=0`r7ips7RjtFF*xu-wz~E6m*(O`9FpXMaUAC!8sbcP( z+iok>HR%JB{>4_?-PWqZX>qCr3RSyD7?+<WVWexCt91A)M*njx;C2nDO?3;U!$y1k zC!1TUp_k_BDDuhV`J%FLjF5~Rqowtf(|RguJ%`{V1WqwqCoV@n9(;rdCVFs!$sRJn zLJ!$sEZalw9jgMT4F-L*{p9dy2gqaoQXXTB1nv0mnO)9wh@1~TAh(acw+BBMW%*_H z;nF#8KH=Ej!T0KWc=P)h*gN>f)&iz5!@-Uvn}*8~BcvL&>rRnihAS6YEis;8)g|`1 Mi%B+5F?BHg3$_rirT_o{ literal 0 HcmV?d00001 diff --git a/antifurto/bin/conf.xml b/antifurto/bin/conf.xml new file mode 100644 index 0000000..b0ba5f7 --- /dev/null +++ b/antifurto/bin/conf.xml @@ -0,0 +1,12 @@ +<?xml version="1.0" ?><set type="pathnames"> +<attribute category="generic" name="agenttype" value="antifurto"/> +<attribute category="generic" name="agentname" value="antifurto_$HOST"/> +<attribute category="generic" name="homedir" value="/home/debian/hat_home/antifurto"/> +<attribute category="generic" name="emergency_homedir" value="/home/debian/hat_home/antifurto"/> +<attribute category="generic" name="description" value="Local Antifurto"/> +<attribute category="generic" name="port" value="8090"/> +<attribute category="generic" name="threads" value="threads"/> +<attribute category="generic" name="mqtt_domain" value=""/> +<attribute category="generic" name="mqtt_subdomain" value=""/> +<attribute category="generic" name="mqtt_service" value="antifurto"/> +</set> diff --git a/antifurto/bin/logger.xml b/antifurto/bin/logger.xml new file mode 100644 index 0000000..6bd6903 --- /dev/null +++ b/antifurto/bin/logger.xml @@ -0,0 +1,10 @@ +<?xml version="1.0" ?><set type="pathnames"> + <attribute category="generic" name="log_theme" value="from/$MQTT_DOMAIN/$MQTT_SUBDOMAIN/$MQTT_SERVICE/logger"/> + <attribute category="generic" name="status_theme" value="from/$MQTT_DOMAIN/$MQTT_SUBDOMAIN/$MQTT_SERVICE/$LOCALNAME"/> + <attribute category="generic" name="notify_theme" value="from/any"/> + <attribute category="generic" name="describe_theme" value="from/$MQTT_DOMAIN/$MQTT_SUBDOMAIN/$MQTT_SERVICE/description"/> + <attribute category="generic" name="log_msg" value="{$LOCALNAME:$MESSAGE}"/> + <attribute category="generic" name="status_msg" value="{status:$MESSAGE}"/> + <attribute category="generic" name="notify_msg" value="{$INFOTYPE:$MESSAGE}"/> + <attribute category="generic" name="describe_msg" value=" $MESSAGE "/> +</set> diff --git a/antifurto/bin/templates/interruttore.xml b/antifurto/bin/templates/interruttore.xml new file mode 100644 index 0000000..e0f6b5a --- /dev/null +++ b/antifurto/bin/templates/interruttore.xml @@ -0,0 +1,6 @@ +<?xml version="1.0"?> +<set type="interruttore"> +<attribute name="type" value="booleanin"/> +<attribute name="name" value=""/> <!-- DA RIEMPIRE CON IL NOME SPECIFICATO DALL'UTENTE PER QUELL'INTERRUTTORE. SE NON SPECIFICATO, IL NOME SARA' LO STESSO DEL NOME LOGICO DI QUELL'INPUT --> +<attribute name="capename" value=""/> <!-- DA RIEMPIRE CON IL NOME LOGICO DELL'INPUT --> +</set> diff --git a/antifurto/bin/templates/sensoremovimento1.xml b/antifurto/bin/templates/sensoremovimento1.xml new file mode 100644 index 0000000..706315a --- /dev/null +++ b/antifurto/bin/templates/sensoremovimento1.xml @@ -0,0 +1,6 @@ +<?xml version="1.0"?> +<set type="sensoremovimento"> +<attribute name="type" value="booleanin"/> +<attribute name="name" value=""/> <!-- DA RIEMPIRE CON IL NOME SPECIFICATO DALL'UTENTE PER QUEL SENSORE. SE NON SPECIFICATO, IL NOME SARA' LO STESSO DEL NOME LOGICO DI QUELL'INPUT --> +<attribute name="capename" value=""/> <!-- DA RIEMPIRE CON IL NOME LOGICO DELL'INPUT --> +</set> diff --git a/antifurto/bin/threads/MqttClientThread.xml b/antifurto/bin/threads/MqttClientThread.xml new file mode 100644 index 0000000..f17afa1 --- /dev/null +++ b/antifurto/bin/threads/MqttClientThread.xml @@ -0,0 +1,11 @@ +<?xml version="1.0"?> +<set type="thread"> +<attribute category="generic" name="status" value="ON"/> +<attribute category="generic" name="host" value="localhost"/> +<attribute category="generic" name="port" value="1883"/> +<attribute category="topic" name="to/$MQTT_DOMAIN/$MQTT_SUBDOMAIN/$MQTT_SERVICE/#" value="mqtt_sub"/> <!-- Sottoscrivo i messaggi che provengono da qualsiasi mia componente, ovvero dall'interruttore on/off e dai sensori di movimento --> +<attribute category="topic" name="from/$MQTT_DOMAIN/+/gpio/#" value="mqtt_sub"/> <!-- Sottoscrivo i messaggi che notificano il cambiamento di stato dei sensori --> +<attribute category="topic" name="rpc/$MQTT_DOMAIN/$MQTT_SUBDOMAIN/$MQTT_SERVICE" value="mqtt_sub"/> <!-- Su questo topic ricevero' le richieste di inviare il mio stato attuale --> +<attribute category="topic" name="rpc/$MQTT_DOMAIN/$MQTT_SUBDOMAIN/$MQTT_SERVICE/#" value="mqtt_sub"/> <!-- Su questo topic ricevero' le richieste di inviare lo stato delle mie componenti, che prendero' dallo stato corrispondente del gpio --> +<attribute category="topic" name="to/all" value="mqtt_sub"/> <!-- Su questo topic ricevero' un messaggio del tipo {request:descripion.json} Dovro' quindi mandare la mia descrizione json --> +</set> diff --git a/antifurto/res/CONF/deltaSensoriMovimento.json b/antifurto/res/CONF/deltaSensoriMovimento.json index 798edf6..cfa0e95 100644 --- a/antifurto/res/CONF/deltaSensoriMovimento.json +++ b/antifurto/res/CONF/deltaSensoriMovimento.json @@ -1,5 +1 @@ -{ - "IN1":33, - "IN2":4, - "IN3":8 -} +{"IN6":33,"IN5":5,"IN2":4,"IN1":33,"IN3":8} \ No newline at end of file diff --git a/antifurto/res/CONF/zona.json b/antifurto/res/CONF/zona.json index c58acf8..c2f6770 100644 --- a/antifurto/res/CONF/zona.json +++ b/antifurto/res/CONF/zona.json @@ -1,9 +1 @@ -{ - "interruttore": "IN0", - "sensoriMovimento": [ - "IN1", - "IN2", - "IN3" - ], - "outputSuono":"OUT0" -} +{"interruttore":"IN0","sensoriMovimento":["IN1","IN2","IN3","IN5","IN6"],"outputSuono":"OUT0", "nomeOutputAntifurto":"OUT1"} diff --git a/antifurto/res/stato.json b/antifurto/res/stato.json index 13ac491..a8a6224 100644 --- a/antifurto/res/stato.json +++ b/antifurto/res/stato.json @@ -1 +1 @@ -{"stato":0,"valore":0,"codaVal":[],"codaMsg":[{"msg":{"status":{"stato":0,"interruttore":"off","allarme":"off"}},"topic":"from/gruppo2/luci/antifurto"},{"msg":{"status":{"stato":0,"interruttore":"off","allarme":"off"}},"topic":"from/gruppo2/luci/antifurto"},{"msg":{"status":{"stato":0,"interruttore":"off","allarme":"off"}},"topic":"from/gruppo2/luci/antifurto"}]} \ No newline at end of file +{"soglia":30,"stato":0,"valore":0,"tempoAllarme":"2022-07-24T19:48:50.175953"} \ No newline at end of file diff --git a/antifurto/src/code/Antifurto.java b/antifurto/src/code/Antifurto.java index a0c44f8..9c13607 100644 --- a/antifurto/src/code/Antifurto.java +++ b/antifurto/src/code/Antifurto.java @@ -20,6 +20,8 @@ public class Antifurto { private static String brokerUrl; private String interruttore; private String interruttoreOutputSuono; + private String nomeOutputAntifurto; + private static JSONArray sensori; // sensori di movimento private static ArrayList<String> topicsSub; private Date date = new Date(); private String clientId = Long.toString(date.getTime()) + "-sub-pub"; // unique client id @@ -30,11 +32,12 @@ public class Antifurto { private static String mqttSubdomain; private final String CONF_FILE = "../res/CONF/conf.json"; - private final String CONF_ZONA = "../res/CONF/zona.json"; + public static final String CONF_ZONA = "../res/CONF/zona.json"; + public Antifurto(Automa automa) throws JSONException, IOException, MqttException { this.automa = automa; - JSONObject jsonObject = new JSONObject(leggiFile(CONF_FILE)); + JSONObject jsonObject = new JSONObject(Helper.leggiFile(CONF_FILE)); brokerUrl = jsonObject.getString("protocol") + "://" + jsonObject.getString("broker") + ":" + jsonObject.getInt("port"); mqttDomain = jsonObject.getString("mqttDomain"); mqttSubdomain = jsonObject.getString("mqttSubdomain"); @@ -45,22 +48,32 @@ public class Antifurto { topicsSub.add("to/all"); // Su questo topic ricevero' le richieste di inviare il mio stato attuale - topicsSub.add("rpc/"+mqttDomain+"/"+mqttSubdomain+"/antifurto"); + topicsSub.add("rpc/"+getMqttTree()+"/antifurto"); - jsonObject = new JSONObject(leggiFile(CONF_ZONA)); + jsonObject = new JSONObject(Helper.leggiFile(CONF_ZONA)); interruttore = jsonObject.getString("interruttore"); - topicsSub.add("from/"+mqttDomain+"/"+mqttSubdomain+"/gpio/" + interruttore); // Sottoscrivo i messaggi che notificano il cambiamento di stato dell'interruttore + + topicsSub.add("from/"+getMqttTree()+"/gpio/" + interruttore); // Sottoscrivo i messaggi che notificano il cambiamento di stato dell'interruttore // Per ogni sensore di movimento, sottoscrivo i messaggi che notificano il loro cambiamento di stato - JSONArray sensori = jsonObject.getJSONArray("sensoriMovimento"); + sensori = jsonObject.getJSONArray("sensoriMovimento"); for(int i=0; i<sensori.length(); i++) { - topicsSub.add("from/"+mqttDomain+"/"+mqttSubdomain+"/gpio/" + sensori.get(i)); + topicsSub.add("from/"+getMqttTree()+"/gpio/" + sensori.get(i)); } + nomeOutputAntifurto = jsonObject.getString("nomeOutputAntifurto"); + topicsSub.add("from/"+getMqttTree()+"/gpio/" + nomeOutputAntifurto); + interruttoreOutputSuono = jsonObject.getString("outputSuono"); - topicsSub.add("from/"+mqttDomain+"/"+mqttSubdomain+"/gpio/" + interruttoreOutputSuono); // Sottoscrivo i messaggi che notificano il cambiamento di stato dell'interruttore + topicsSub.add("from/"+getMqttTree()+"/gpio/" + interruttoreOutputSuono); // Sottoscrivo i messaggi che notificano il cambiamento di stato dell'interruttore + + topicsSub.add("to/"+getMqttTree()+"/antifurto/soglia"); // Su questo topic mi arrivera' un messaggio {"soglia": 30} e dovrò impostare la soglia di conseguenza + + topicsSub.add("conf/"+getMqttTree()+"/antifurto/sensore"); // Su questo topic mi arrivera' un messaggio per l'aggiunta di un sensore di movimento. + // Ad esempio se mi arriva il messaggio {"in": "IN3", "delta":33 } devo aggiungere il sensore di movimento che si + // chiama IN3, il cui valore di delta e' 33 (devo quindi aggiornare il file deltaSensoriMovimento.json this.mqttClient = new MqttClient(brokerUrl, clientId, new MemoryPersistence()); @@ -69,13 +82,18 @@ public class Antifurto { public void startClient(Esecutore esec, Publisher publisher) throws MqttException { MqttConnectOptions options = new MqttConnectOptions(); options.setCleanSession(false); - mqttClient.setCallback(new SubscribeCallback(this, publisher, interruttore, interruttoreOutputSuono, esec, automa)); + mqttClient.setCallback(new SubscribeCallback(this, publisher, interruttore, interruttoreOutputSuono, esec, automa, nomeOutputAntifurto)); mqttClient.connect(options); for(String t: topicsSub) - mqttClient.subscribe(t); + addTopicToSubscribe(t); + } + + // sottoscrive il topic passato come parametro + public void addTopicToSubscribe(String topic) throws MqttException { + mqttClient.subscribe(topic); } public void publishMethod(String topic, String msg) throws MqttException { @@ -83,17 +101,17 @@ public class Antifurto { msgTopic.publish(new MqttMessage(msg.getBytes())); } - private String leggiFile(String path) throws IOException { - String line; - String answer = ""; - FileReader fileReader = new FileReader(path); - BufferedReader bufferedReader = new BufferedReader(fileReader); - while((line = bufferedReader.readLine()) != null) { - answer += line; - } - bufferedReader.close(); - return answer; - } +// private String leggiFile(String path) throws IOException { +// String line; +// String answer = ""; +// FileReader fileReader = new FileReader(path); +// BufferedReader bufferedReader = new BufferedReader(fileReader); +// while((line = bufferedReader.readLine()) != null) { +// answer += line; +// } +// bufferedReader.close(); +// return answer; +// } @@ -180,7 +198,7 @@ public class Antifurto { Antifurto antifurto = new Antifurto(automa); Publisher publisher = new Publisher(codaMsg, antifurto); Esecutore esec = new Esecutore(publisher, codaVal, automa, antifurto.interruttoreOutputSuono); - Timer timer = new Timer(30000,-5,esec,automa); + Timer timer = new Timer(6000,-1,esec,automa); antifurto.startClient(esec, publisher); publisher.start(); @@ -188,11 +206,21 @@ public class Antifurto { timer.start(); } + public static void stopSystem() { + + } public static String getMqttTree() { return mqttDomain+"/"+mqttSubdomain; } + public static JSONArray getSensori() { + return sensori; + } + + public static void addSensore(String newSensore) { // aggiunge un sensore di movimento + sensori.put(newSensore); + } } diff --git a/antifurto/src/code/Automa.java b/antifurto/src/code/Automa.java index 8e5baa6..9b0a8e8 100644 --- a/antifurto/src/code/Automa.java +++ b/antifurto/src/code/Automa.java @@ -1,8 +1,4 @@ package code; -import java.io.BufferedReader; -import java.io.BufferedWriter; -import java.io.FileReader; -import java.io.FileWriter; import java.io.IOException; import java.util.Hashtable; import java.util.Iterator; @@ -18,7 +14,7 @@ public class Automa { private String statoSuono; private static final String FILE_AUTOMA = "../res/automa.json"; public static final String FILE_STATO = "../res/stato.json"; - private static final String FILE_DELTA_SENSORI = "../res/CONF/deltaSensoriMovimento.json"; + public static final String FILE_DELTA_SENSORI = "../res/CONF/deltaSensoriMovimento.json"; public Automa() throws JSONException, IOException { @@ -29,7 +25,7 @@ public class Automa { private synchronized void setStati(boolean write) throws JSONException, IOException { - JSONObject statoJson = new JSONObject(Helper.leggiFile(FILE_STATO)); + JSONObject statoJson = new JSONObject(Helper.leggiFile(FILE_STATO)); if(write) { // devo aggiornare lo stato nel FILE_STATO Helper.scriviFile(statoJson.put("stato",this.statoAttuale), FILE_STATO); @@ -37,14 +33,15 @@ public class Automa { else { // devo capire in quale stato mi trovo e impostare di conseguenza lo statoInterruttore e lo statoSuono this.statoAttuale = statoJson.getInt("stato"); - aggiornaInterruttoreESuono(); } + aggiornaInterruttoreESuono(); } private void riempiHashTable() throws JSONException, IOException { this.deltaSensori = new Hashtable<String, Integer>(); JSONObject jsObj = new JSONObject(Helper.leggiFile(FILE_DELTA_SENSORI)); + @SuppressWarnings("unchecked") Iterator<String> keys = jsObj.keys(); while(keys.hasNext()) { String key = keys.next(); @@ -53,6 +50,10 @@ public class Automa { } } + public void addDeltaSensori(String nomeSensore, int delta) { + deltaSensori.put(nomeSensore, delta); + } + // private synchronized void scriviFile(JSONObject json, String path) throws IOException { // BufferedWriter b = new BufferedWriter(new FileWriter(path)); // b.write(json.toString()); @@ -93,6 +94,7 @@ public class Automa { // e' cambiato lo stato dell'interruttore, per cui cerco nel file json in quale nuovo stato devo andare private synchronized void calcolaNuovoStatoMsgFromInterruttore(String newStatoInterruttore) throws JSONException, IOException { + @SuppressWarnings("unchecked") Iterator<String> keys = jsonObject.keys(); while(keys.hasNext()) { String key = keys.next(); @@ -100,12 +102,12 @@ public class Automa { if(riga.getInt("stato")==statoAttuale) { this.statoAttuale = riga.getInt("cmd"+newStatoInterruttore); setStati(true); //scrivo nel file il nuovo stato in cui mi trovo - aggiornaInterruttoreESuono(); } } } //in base allo stato attuale dell'antifurto, calcolo lo stato dell'interruttore e del suono private synchronized void aggiornaInterruttoreESuono() throws JSONException { + @SuppressWarnings("unchecked") Iterator<String> keys = jsonObject.keys(); while(keys.hasNext()) { String key = keys.next(); @@ -124,6 +126,7 @@ public class Automa { jsonKey = "eventValMaggioreSoglia"; else jsonKey = "eventValMinoreSoglia"; + @SuppressWarnings("unchecked") Iterator<String> keys = jsonObject.keys(); while(keys.hasNext()) { String key = keys.next(); @@ -131,7 +134,6 @@ public class Automa { if(riga.getInt("stato")==statoAttuale) { this.statoAttuale = riga.getInt(jsonKey); setStati(true); //scrivo nel file il nuovo stato in cui mi trovo - aggiornaInterruttoreESuono(); } } } @@ -149,8 +151,8 @@ public class Automa { } - public synchronized String getStatoAutoma() { - return "{\"stato\":"+statoAttuale+",\"interruttore\":\""+statoInterruttore+"\",\"allarme\":\""+statoSuono+"\"}"; + public synchronized int getStatoAutoma() { + return statoAttuale; } @@ -163,6 +165,14 @@ public class Automa { return statoSuono; } + public synchronized boolean getStatoSuonoTrueFalse() { + return statoSuono.equals("on"); + } + + public synchronized boolean getStatoInterrutoreTrueFalse() { + return statoInterruttore.equals("on"); + } + // Ritorna true se l'antifurto e' attivo public synchronized boolean antifurtoAttivo() { diff --git a/antifurto/src/code/Esecutore.java b/antifurto/src/code/Esecutore.java index ff582c0..77614b9 100644 --- a/antifurto/src/code/Esecutore.java +++ b/antifurto/src/code/Esecutore.java @@ -2,8 +2,10 @@ package code; import java.io.IOException; import java.time.Duration; import java.time.LocalDateTime; +import java.time.LocalTime; +import java.time.ZoneId; +import java.time.ZoneOffset; -import org.json.JSONArray; import org.json.JSONException; import org.json.JSONObject; @@ -12,11 +14,12 @@ public class Esecutore extends Thread { private MyQueue<Integer> codaVal; // coda in cui vengono mantenuti i valori da sommare alla variabile valore private int valore; // variabile numerica cumulativa inizialmente impostata a 0 - private static int soglia = 100; + private static int soglia; private Publisher publisher; private Automa automa; private String outputSuono; // nome logico dell'interruttore che fa scattare il suono dell'allarme private LocalDateTime tempoAllarme; //valorizzato solo quando l'allarme sta suonando. Contiene l'ora in cui l'allarme ha iniziato a suonare + private static long allarmeTimeout; public Esecutore(Publisher publisher, MyQueue<Integer> codaVal, Automa automa, String outputSuono) throws JSONException, IOException { this.codaVal = codaVal; @@ -26,26 +29,41 @@ public class Esecutore extends Thread { JSONObject statoJson = new JSONObject(Helper.leggiFile(Automa.FILE_STATO)); this.valore = statoJson.getInt("valore"); + setSoglia(statoJson.getInt("soglia")); if(statoJson.getInt("stato")==2) this.tempoAllarme = LocalDateTime.parse(statoJson.getString("tempoAllarme")); } + private int getSogliaMax() { + return Math.round(soglia+soglia*0.2f); // il valore non puo' andare oltre il 20 % sopra la soglia + } public void run() { - final long DURATA_SUONO = 5; // l'allarme dura 5 minuti e poi smette di suonare + final long DURATA_SUONO = 5; // l'allarme dura 5 minuti e poi smette di suonare. int delta; + int valoreToSend = valore; // ogni volta che aumento / diminuisco il valore di 5, notifico la web app pubblicando un messaggio while(true) { while(automa.antifurtoAttivo()) { System.out.println("VALORE = "+ valore); delta = codaVal.receive(); valore = valore + delta; - + if(valore < 0) + valore = 0; + if(valore > getSogliaMax()) + valore = getSogliaMax(); try { - Helper.modificaFileStato(codaVal, false, delta, valore, Automa.FILE_STATO); - if(valore >= soglia && (!automa.allarme()) ) { + if(Math.abs(valore-valoreToSend) >= 5) { + JSONObject msgJson = new JSONObject(); + msgJson.put("event", valore); + publisher.aggiungiComando("from/"+Antifurto.getMqttTree()+"/antifurto/valore", msgJson.toString()); + valoreToSend = valore; + } + + JSONObject statoJson = new JSONObject(Helper.leggiFile(Automa.FILE_STATO)); + statoJson.put("valore", valore); + if(valore >= soglia && (!automa.allarme()) && delta>0) { publisher.aggiungiComando("to/"+Antifurto.getMqttTree()+"/gpio/"+outputSuono, "{cmd:1}"); tempoAllarme = LocalDateTime.now(); - JSONObject statoJson = new JSONObject(Helper.leggiFile(Automa.FILE_STATO)); - Helper.scriviFile(statoJson.put("tempoAllarme",tempoAllarme.toString()), Automa.FILE_STATO); + statoJson.put("tempoAllarme",tempoAllarme.toString()); } else { if(automa.allarme()) { @@ -56,6 +74,8 @@ public class Esecutore extends Thread { } } } + statoJson.put("soglia", soglia); + Helper.scriviFile(statoJson, Automa.FILE_STATO); } catch (JSONException e) { e.printStackTrace(); @@ -72,7 +92,6 @@ public class Esecutore extends Thread { public void aggiungiVal(int n) { - Helper.modificaFileStato(true, n, Automa.FILE_STATO); codaVal.send(n); } @@ -81,6 +100,23 @@ public class Esecutore extends Thread { codaVal.removeAll(); } + public static int getSoglia() { + return soglia; + } + public int getValore() { + return valore; + } + + public static long getAllarmeTimeout() { + return allarmeTimeout; + } + + public static void setSoglia(int newValue) throws JSONException, IOException { + JSONObject js = new JSONObject(Helper.leggiFile(Automa.FILE_STATO)); + js.put("soglia", newValue); + Helper.scriviFile(js, Automa.FILE_STATO); + soglia = newValue; + } } diff --git a/antifurto/src/code/Helper.java b/antifurto/src/code/Helper.java index b765038..7732e4c 100644 --- a/antifurto/src/code/Helper.java +++ b/antifurto/src/code/Helper.java @@ -31,93 +31,93 @@ public class Helper { // se add = true, aggiungo il valore n alla codaVal; // se add = false, rimuovo il valore n dalla codaVal - public static synchronized void modificaFileStato(MyQueue<Integer> coda, boolean add, int n, int valore, String path) { - try { - JSONObject statoJson = new JSONObject(Helper.leggiFile(path)); - statoJson.put("valore",valore); - JSONArray arrayCodaVal = statoJson.getJSONArray("codaVal"); - if(add) - arrayCodaVal.put(n); - else { - int index = -1; - for(int i=0; i<arrayCodaVal.length(); i++) { - if(arrayCodaVal.getInt(i)==n) - index = i; - } - arrayCodaVal.remove(index); - } - Helper.scriviFile(statoJson.put("codaVal",arrayCodaVal), path); - } catch (JSONException e) { - e.printStackTrace(); - } catch (IOException e) { - e.printStackTrace(); - } - } +// public static synchronized void modificaFileStato(MyQueue<Integer> coda, boolean add, int n, int valore, String path) { +// try { +// JSONObject statoJson = new JSONObject(Helper.leggiFile(path)); +// statoJson.put("valore",valore); +// JSONArray arrayCodaVal = statoJson.getJSONArray("codaVal"); +// if(add) +// arrayCodaVal.put(n); +// else { +// int index = -1; +// for(int i=0; i<arrayCodaVal.length(); i++) { +// if(arrayCodaVal.getInt(i)==n) +// index = i; +// } +// arrayCodaVal.remove(index); +// } +// Helper.scriviFile(statoJson.put("codaVal",arrayCodaVal), path); +// } catch (JSONException e) { +// e.printStackTrace(); +// } catch (IOException e) { +// e.printStackTrace(); +// } +// } +// +// public static synchronized void modificaFileStato(boolean add, int n, String path) { +// try { +// JSONObject statoJson = new JSONObject(Helper.leggiFile(path)); +// JSONArray arrayCodaVal = statoJson.getJSONArray("codaVal"); +// if(add) +// arrayCodaVal.put(n); +// else { +// int index = -1; +// for(int i=0; i<arrayCodaVal.length(); i++) { +// if(arrayCodaVal.getInt(i)==n) +// index = i; +// } +// arrayCodaVal.remove(index); +// } +// Helper.scriviFile(statoJson.put("codaVal",arrayCodaVal), path); +// } catch (JSONException e) { +// e.printStackTrace(); +// } catch (IOException e) { +// e.printStackTrace(); +// } +// } +// +// public static synchronized void modificaFileStato(boolean add, Pair p, String path) { +// try { System.out.println("pair = " + p+ " path = " + path); +// JSONObject statoJson = new JSONObject(Helper.leggiFile(path)); +// JSONArray arrayCodaMsg = statoJson.getJSONArray("codaMsg"); +// if(add) +// arrayCodaMsg.put(p.toJsonObject()); +// else { +// int index = -1; +// for(int i=0; i<arrayCodaMsg.length(); i++) { +// JSONObject msgJson = arrayCodaMsg.getJSONObject(i); +// if(msgJson.getString("topic").equals(p.getTopic()) && msgJson.getJSONObject("msg").toString().equals(p.getMsg()) ) +// index = i; +// } +// arrayCodaMsg.remove(index); +// } +// Helper.scriviFile(statoJson.put("codaMsg",arrayCodaMsg), path); System.out.println("FINE"); +// } catch (JSONException e) { +// e.printStackTrace(); +// } catch (IOException e) { +// e.printStackTrace(); +// } +// } - public static synchronized void modificaFileStato(boolean add, int n, String path) { - try { - JSONObject statoJson = new JSONObject(Helper.leggiFile(path)); - JSONArray arrayCodaVal = statoJson.getJSONArray("codaVal"); - if(add) - arrayCodaVal.put(n); - else { - int index = -1; - for(int i=0; i<arrayCodaVal.length(); i++) { - if(arrayCodaVal.getInt(i)==n) - index = i; - } - arrayCodaVal.remove(index); - } - Helper.scriviFile(statoJson.put("codaVal",arrayCodaVal), path); - } catch (JSONException e) { - e.printStackTrace(); - } catch (IOException e) { - e.printStackTrace(); - } - } - - public static synchronized void modificaFileStato(boolean add, Pair p, String path) { - try { - JSONObject statoJson = new JSONObject(Helper.leggiFile(path)); - JSONArray arrayCodaMsg = statoJson.getJSONArray("codaMsg"); - if(add) - arrayCodaMsg.put(p.toJsonObject()); - else { - int index = -1; - for(int i=0; i<arrayCodaMsg.length(); i++) { - JSONObject msgJson = arrayCodaMsg.getJSONObject(i); - if(msgJson.getString("topic").equals(p.getTopic()) && msgJson.getJSONObject("msg").toString().equals(p.getMsg()) ) - index = i; - } - arrayCodaMsg.remove(index); - } - Helper.scriviFile(statoJson.put("codaMsg",arrayCodaMsg), path); - } catch (JSONException e) { - e.printStackTrace(); - } catch (IOException e) { - e.printStackTrace(); - } - } - - public static synchronized <T> void getFromFileStato(MyQueue<T> coda, String key, String path) throws JSONException, IOException { - JSONObject statoJson = new JSONObject(Helper.leggiFile(path)); - JSONArray arrayCoda = statoJson.getJSONArray(key); - if(coda.getClass().equals(Pair.class)) { - MyQueue<Pair> codaMsg = (MyQueue<Pair>) coda; - for(int i = 0; i<arrayCoda.length(); i++) { - JSONObject pairJson = arrayCoda.getJSONObject(i); - Pair p = new Pair(pairJson.getString("topic"), pairJson.getString("msg")); - codaMsg.send(p); - - } - } - if(coda.getClass().equals(Integer.class)) { - MyQueue<Integer> codaVal = (MyQueue<Integer>) coda; - for(int i = 0; i<arrayCoda.length(); i++) { - codaVal.send(arrayCoda.getInt(i)); - } - } - - } +// public static synchronized <T> void getFromFileStato(MyQueue<T> coda, String key, String path) throws JSONException, IOException { +// JSONObject statoJson = new JSONObject(Helper.leggiFile(path)); +// JSONArray arrayCoda = statoJson.getJSONArray(key); +// if(coda.getClass().equals(Pair.class)) { +// MyQueue<Pair> codaMsg = (MyQueue<Pair>) coda; +// for(int i = 0; i<arrayCoda.length(); i++) { +// JSONObject pairJson = arrayCoda.getJSONObject(i); +// Pair p = new Pair(pairJson.getString("topic"), pairJson.getString("msg")); +// codaMsg.send(p); +// +// } +// } +// if(coda.getClass().equals(Integer.class)) { +// MyQueue<Integer> codaVal = (MyQueue<Integer>) coda; +// for(int i = 0; i<arrayCoda.length(); i++) { +// codaVal.send(arrayCoda.getInt(i)); +// } +// } +// +// } } diff --git a/antifurto/src/code/Pair.java b/antifurto/src/code/Pair.java index 87880af..977d71e 100644 --- a/antifurto/src/code/Pair.java +++ b/antifurto/src/code/Pair.java @@ -22,10 +22,18 @@ public class Pair { } public JSONObject toJsonObject() throws JSONException { - return new JSONObject(toString()); + JSONObject js = new JSONObject(); + js.put("topic", topic); + js.put("msg", msg); System.out.println(msg); + return js; } public String toString() { - return "{\"topic\":\""+topic+"\",\"msg\":"+msg+"}"; + try { + return toJsonObject().toString(); + } catch (JSONException e) { + e.printStackTrace(); + } + return null; } } diff --git a/antifurto/src/code/Publisher.java b/antifurto/src/code/Publisher.java index 5326a20..becc9b0 100644 --- a/antifurto/src/code/Publisher.java +++ b/antifurto/src/code/Publisher.java @@ -13,8 +13,7 @@ public class Publisher extends Thread { } public void aggiungiComando(String topic, String msg) { - Pair p = new Pair(topic, msg); - Helper.modificaFileStato(true, p, Automa.FILE_STATO); + Pair p = new Pair(topic, msg); coda.send(p); } @@ -22,7 +21,6 @@ public class Publisher extends Thread { public void run() { while(true) { Pair p = coda.receive(); - Helper.modificaFileStato(false, p, Automa.FILE_STATO); try { client.publishMethod(p.getTopic(), p.getMsg()); } catch (MqttException e) { diff --git a/antifurto/src/code/SubscribeCallback.java b/antifurto/src/code/SubscribeCallback.java index a28648b..77e98d5 100644 --- a/antifurto/src/code/SubscribeCallback.java +++ b/antifurto/src/code/SubscribeCallback.java @@ -15,14 +15,16 @@ public class SubscribeCallback implements MqttCallback{ private Publisher publisher; private String nomeInterruttore; private String nomeOutputSuono; + private String nomeOutputAntifurto; private Esecutore esec; private Automa automa; - public SubscribeCallback(Antifurto client, Publisher publisher, String nomeInterruttore, String nomeOutputSuono, Esecutore esec, Automa automa) { + public SubscribeCallback(Antifurto client, Publisher publisher, String nomeInterruttore, String nomeOutputSuono, Esecutore esec, Automa automa, String nomeOutputAntifurto) { this.client = client; this.publisher = publisher; this.nomeInterruttore = nomeInterruttore; this.nomeOutputSuono = nomeOutputSuono; + this.nomeOutputAntifurto = nomeOutputAntifurto; this.esec = esec; this.automa = automa; } @@ -57,45 +59,62 @@ public class SubscribeCallback implements MqttCallback{ @Override - public void messageArrived(String topic, MqttMessage message) throws Exception { - System.out.println("nuovo: "+topic+" ; "+message.toString()); + public void messageArrived(String topic, MqttMessage message) throws Exception { + if(topic.equals("to/all")) { System.out.println("MESSAGGIO MQTT = "+message.toString()); if(message.toString().equals("{request:description}")) sendDescription("from/"+Antifurto.getMqttTree()+"/antifurto/description"); if(message.toString().equals("{request:status}")) - sendMyState("from/"+Antifurto.getMqttTree()+"/antifurto"); + sendMyStateToAll("from/"+Antifurto.getMqttTree()+"/antifurto"); // DA FARE: vedi cosa pubblicano gli altri microservizi e implementa di conseguenza questa funzione } else { - if(topic.equals("rpc/"+Antifurto.getMqttTree()+"/antifurto")) // DA FARE: capire quale messaggio voglio ricevere per poi pubblicare il mio stato - // DA FARE: vedi foto foglio Alfredo - sendMyState("from/"+Antifurto.getMqttTree()+"/antifurto"); // CONTROLLA SE VA BENE PUBBLICARE LO STATO SU QUESTO TOPIC O SE IL TOPIC DEVE ESSERE UN'ALTRO. NOTA: NON POSSO PUBBLICARE SULLO STESSO TOPIC CHE HO SOTTOSCRITTO + JSONObject msgJson = new JSONObject(message.toString()); + if(topic.equals("conf/"+Antifurto.getMqttTree()+"/antifurto/sensore")) { + if(msgJson.has("in") && msgJson.has("delta")) + handleConfSensoreMovimento(msgJson); + } else { - JSONObject msgJson = new JSONObject(message.toString()); - - if(topic.equals("from/"+Antifurto.getMqttTree()+"/gpio/"+nomeOutputSuono)) { - int newStatus = -1; - if(msgJson.has("status")) - newStatus = msgJson.getInt("status"); - else { - if(msgJson.has("event")) - newStatus = msgJson.getInt("event"); - } - handleStateMsgFromOutputSuono(newStatus); + if(topic.equals("to/"+Antifurto.getMqttTree()+"/antifurto/soglia") && msgJson.has("soglia")) { + handleSetSoglia(msgJson); } else { - int event = msgJson.getInt("event"); - if(event==1) { - // e' stato premuto l'interruttore / il sensore di movimento ha rilevato qualcuno - if(topic.equals("from/"+Antifurto.getMqttTree()+"/gpio/"+nomeInterruttore)) - handleStateMsgFromInterruttore(); - else { - // il topic sara' from/gruppo2/luci/gpio/IN0 dove IN0 e' un sensore di movimento - String[] t = topic.split("/"); - handleMovimento(t[4]); + if(topic.equals("rpc/"+Antifurto.getMqttTree()+"/antifurto") && message.toString().equals("{\"request\":\"description\"}")) + sendMyState("from/"+Antifurto.getMqttTree()+"/antifurto"); + else { + if(topic.equals("from/"+Antifurto.getMqttTree()+"/gpio/"+nomeOutputSuono)) { + int newStatus = -1; + if(msgJson.has("status")) + newStatus = msgJson.getInt("status"); + else { + if(msgJson.has("event")) + newStatus = msgJson.getInt("event"); + } + handleStateMsgFromOutputSuono(newStatus); } - } - } + else { + if(topic.equals("from/"+Antifurto.getMqttTree()+"/gpio/"+nomeOutputAntifurto)) { + if(msgJson.has("event")) + handleLuceAntifurto(); + } + else { + int event = msgJson.getInt("event"); + if(event==1) { + // e' stato premuto l'interruttore / il sensore di movimento ha rilevato qualcuno + if(topic.equals("from/"+Antifurto.getMqttTree()+"/gpio/"+nomeInterruttore)) + handleStateMsgFromInterruttore(); + else { + // il topic sara' from/gruppo2/luci/gpio/IN0 dove IN0 e' un sensore di movimento + System.out.println("TOPIC = "+topic); + String[] t = topic.split("/"); + handleMovimento(t[4]); + } + } + } + } + } + } + } } @@ -104,12 +123,28 @@ public class SubscribeCallback implements MqttCallback{ private synchronized void handleStateMsgFromInterruttore() throws JSONException, IOException { + if(automa.getStatoInterruttore().equals("on")) + publisher.aggiungiComando("to/"+Antifurto.getMqttTree()+"/gpio/"+nomeOutputAntifurto, "{cmd:0}"); // voglio spegnere l'antifurto, quindi invio un messaggio per spegnere la luce che indica che l'antifurto e' acceso + else + publisher.aggiungiComando("to/"+Antifurto.getMqttTree()+"/gpio/"+nomeOutputAntifurto, "{cmd:1}"); // voglio accendere l'antifurto, quindi invio un messaggio per accendere la luce che indica che l'antifurto e' acceso + } + + private synchronized void handleLuceAntifurto() throws JSONException { + try { automa.changeStatoInterruttore(); if(automa.getStatoInterruttore().equals("off")) { publisher.aggiungiComando("to/"+Antifurto.getMqttTree()+"/gpio/"+nomeOutputSuono, "{cmd:0}"); esec.reset(); + } + JSONObject js = new JSONObject(); + js.put("event", automa.getStatoInterrutoreTrueFalse()); + publisher.aggiungiComando("from/"+Antifurto.getMqttTree()+"/antifurto/antifurto", js.toString()); + } + catch(IOException e) { + JSONObject jsError = new JSONObject(); + jsError.put("error", e.getMessage()); + publisher.aggiungiComando("from/"+Antifurto.getMqttTree()+"/antifurto/antifurto", jsError.toString()); } - publisher.aggiungiComando("from/"+Antifurto.getMqttTree()+"/antifurto", "{\"event\": {\"antifurto\":\""+automa.getStatoInterruttore()+"\",\"allarme\":\""+automa.getStatoSuono()+"\"}}"); } @@ -118,7 +153,9 @@ public class SubscribeCallback implements MqttCallback{ String statusOnOff = automa.converter(newStatus); // lo stato e' della forma "on" oppure "off" if(! statusOnOff.equals(automa.getStatoSuono()) ) { automa.aggiornaStatoSuono(statusOnOff); - publisher.aggiungiComando("from/"+Antifurto.getMqttTree()+"/antifurto", "{\"event\": {\"antifurto\":\""+automa.getStatoInterruttore()+"\",\"allarme\":\""+automa.getStatoSuono()+"\"}}"); + JSONObject js = new JSONObject(); + js.put("event", automa.getStatoSuonoTrueFalse()); + publisher.aggiungiComando("from/"+Antifurto.getMqttTree()+"/antifurto/allarme", js.toString()); } } } @@ -126,13 +163,62 @@ public class SubscribeCallback implements MqttCallback{ - private void handleMovimento(String nomeSensore) { + private void handleMovimento(String nomeSensore) { if(automa.getStatoInterruttore().equals("on")) esec.aggiungiVal(automa.getDelta(nomeSensore)); } - private void sendMyState(String topic) throws MqttException { - publisher.aggiungiComando(topic, "{\"status\":"+automa.getStatoAutoma()+"}"); + private void handleConfSensoreMovimento(JSONObject toAdd) throws JSONException { + // aggiorno il file che contiene l'associazione sensore-movimento, delta + try { + JSONObject sensori = new JSONObject(Helper.leggiFile(Automa.FILE_DELTA_SENSORI)); + String nomeSensore = toAdd.getString("in").toUpperCase(); + int delta = toAdd.getInt("delta"); + sensori.put(nomeSensore, delta); + Helper.scriviFile(sensori, Automa.FILE_DELTA_SENSORI); + + // aggiorno il file zona: ho un sensore di movimento in più + JSONObject zona = new JSONObject(Helper.leggiFile(Antifurto.CONF_ZONA)); + zona.getJSONArray("sensoriMovimento").put(nomeSensore); + Helper.scriviFile(zona, Antifurto.CONF_ZONA); + Antifurto.addSensore(nomeSensore); + automa.addDeltaSensori(nomeSensore, delta); + client.addTopicToSubscribe("from/"+Antifurto.getMqttTree()+"/gpio/"+nomeSensore); System.out.println("from/"+Antifurto.getMqttTree()+"/gpio/"+nomeSensore); + publisher.aggiungiComando("from/"+Antifurto.getMqttTree()+"/antifurto/sensore", toAdd.toString()); // invio questo messaggio per confermare alla web app che il sensore di movimento e' stato aggiunto + } catch(IOException | MqttException e) { + JSONObject jsError = new JSONObject(); + jsError.put("error", e.getMessage()); + publisher.aggiungiComando("from/"+Antifurto.getMqttTree()+"/antifurto/sensore", jsError.toString()); + } + } + + private void handleSetSoglia(JSONObject jsSoglia) throws JSONException { + try { + Esecutore.setSoglia(jsSoglia.getInt("soglia")); + JSONObject jsToSend = new JSONObject(); + jsToSend.put("soglia", Esecutore.getSoglia()); + publisher.aggiungiComando("from/"+Antifurto.getMqttTree()+"/antifurto/soglia", jsToSend.toString()); + } catch(IOException e) { + JSONObject jsError = new JSONObject(); + jsError.put("error", e.getMessage()); + publisher.aggiungiComando("from/"+Antifurto.getMqttTree()+"/antifurto/soglia", jsError.toString()); + } + } + + private void sendMyState(String topic) throws MqttException, NumberFormatException, JSONException { + JSONObject json = new JSONObject(); + json.put("stato", automa.getStatoAutoma()); + json.put("interruttore", nomeInterruttore); + json.put("sensori-movimento", Antifurto.getSensori()); + json.put("output-suono", nomeOutputSuono); + json.put("soglia", Esecutore.getSoglia()); + json.put("allarme", automa.getStatoSuonoTrueFalse()); + json.put("valore-attuale", esec.getValore()); + json.put("antifurto", automa.getStatoInterrutoreTrueFalse()); + long allarmeTimeout = Esecutore.getAllarmeTimeout(); + if(automa.getStatoAutoma() == 2 && allarmeTimeout > 0) + json.put("allarme-timeout", allarmeTimeout); + publisher.aggiungiComando(topic, json.toString()); } private void sendDescription(String topic) { @@ -153,5 +239,9 @@ public class SubscribeCallback implements MqttCallback{ // publisher.aggiungiComando(topic, msg); } + private void sendMyStateToAll(String topic) { + // DA FARE + } + } -- GitLab