From 64911e7fc0d67337379b649f0677d07c33c6dc8e Mon Sep 17 00:00:00 2001 From: shinedday <shinedday@gmail.com> Date: Wed, 11 May 2022 13:36:12 +0200 Subject: [PATCH] iotAmak v1 --- .gitignore | 4 +- README.md | 3 + dist/iotAmak-0.0.1-py3-none-any.whl | Bin 0 -> 10793 bytes ihm.py | 145 ------------------ __init__.py => iotAmak/__init__.py | 0 agent.py => iotAmak/agent.py | 7 +- amas.py => iotAmak/amas.py | 11 +- environment.py => iotAmak/environment.py | 6 +- iotAmak/ihm.py | 163 +++++++++++++++++++++ scheduler.py => iotAmak/scheduler.py | 16 +- {philosophers => iotAmak/tool}/__init__.py | 0 {tool => iotAmak/tool}/confi_reader.py | 5 +- {tool => iotAmak/tool}/mqtt_client.py | 0 {tool => iotAmak/tool}/remote_client.py | 0 {tool => iotAmak/tool}/schedulable.py | 7 +- {tool => iotAmak/tool}/ssh_client.py | 12 +- philosophers/agent.py | 100 ------------- philosophers/amas.py | 22 --- philosophers/env.py | 69 --------- philosophers/fork.py | 16 -- requirements.txt | 3 + setup.py | 10 ++ tool/__init__.py | 0 tool/config.json | 25 ---- 24 files changed, 225 insertions(+), 399 deletions(-) create mode 100644 dist/iotAmak-0.0.1-py3-none-any.whl delete mode 100644 ihm.py rename __init__.py => iotAmak/__init__.py (100%) rename agent.py => iotAmak/agent.py (95%) rename amas.py => iotAmak/amas.py (94%) rename environment.py => iotAmak/environment.py (90%) create mode 100644 iotAmak/ihm.py rename scheduler.py => iotAmak/scheduler.py (94%) rename {philosophers => iotAmak/tool}/__init__.py (100%) rename {tool => iotAmak/tool}/confi_reader.py (91%) rename {tool => iotAmak/tool}/mqtt_client.py (100%) rename {tool => iotAmak/tool}/remote_client.py (100%) rename {tool => iotAmak/tool}/schedulable.py (95%) rename {tool => iotAmak/tool}/ssh_client.py (98%) delete mode 100644 philosophers/agent.py delete mode 100644 philosophers/amas.py delete mode 100644 philosophers/env.py delete mode 100644 philosophers/fork.py create mode 100644 requirements.txt create mode 100644 setup.py delete mode 100644 tool/__init__.py delete mode 100644 tool/config.json diff --git a/.gitignore b/.gitignore index 5cc30b1..af6a8da 100644 --- a/.gitignore +++ b/.gitignore @@ -4,4 +4,6 @@ desktop.ini .idea venv *.bat -__pycache__/ \ No newline at end of file +__pycache__/ +build/ +iotAmak.egg-info/ diff --git a/README.md b/README.md index 4ad75c4..b327709 100644 --- a/README.md +++ b/README.md @@ -183,6 +183,9 @@ if __name__ == '__main__': Pour ajouter des attributs a l'initialisation aux agents il suffit de rajouter des `type(sys.argv[x])`. +**A AJOUTER** +un .config dans les experience avec la version du coeur + # Topics ## Agent diff --git a/dist/iotAmak-0.0.1-py3-none-any.whl b/dist/iotAmak-0.0.1-py3-none-any.whl new file mode 100644 index 0000000000000000000000000000000000000000..e38251787425c0cad929d37ca11b93eef2c65cae GIT binary patch literal 10793 zcmWIWW@Zs#U|`^2s7YKL!oa}5zyu-~7#M^Z7#K41OB{0(v-RWSGxIV_;^XxSDw!D& zS|+%z4heRj_x1rZ1A_%G1A_pPmc;bbyb`^F%B^9(s~?+*+-3hHuXpRpvUz*-yce{( zNAH@o&|tGPn{u?5&b%Z^&$`OYm-X+b>f9`nNxx+DRc%{|{W;t3FWg!tynXibL^Su- zCC3gpdhEL^u)XHOE0!w}0?Yj}xq~9st<?FcJvH%qoYh6S#Ru0f+IIVFnXuj2qdo6s zxAuxmy?ylQ+~0RPuNCBOmgh1EOFx+Oo&8^0>dS&DseRL=4nE!a`HN=jrt|8*Hf{Dg zId`S>xhhZXlgb_amnVI`nb)?frZ;la%=g=+4;-KVDo!h_Ld7w2!8t`k$v8=Shsdt5 z8=KDXOmAmmads{gh<We0Wm|*SYVmd67vIJvTJHHRX}4lpd(FGTKI?-ImLIW9EAVG3 zE}xpq6UXq;RPe{W&*DjZK4*ny?lamdCVJlELHBF*_<NUU?)$J$`Dnt6eW&(CyJhUO zFq?XbO|bsorW-YzpT>5xFxUnP7sWFl_x~jF*u`VYM#FDH)3a<Xo4h`%Z*|&w^U|`{ z+L}I-C;kdryhNgmsabfEf7#q)`%;gzGVPzg{B4|CVPXE((kYXw?Mx3H=)CP_Xu++y z@X>+$6?dc0HAHRTt=rBMqO_t$HLQJ+kK)obEU{OD3e@+>ofla=O>D+(iIiWf9qJbb zDJ>~J9L;~Kd^y9}Y`wUh+K%0~R1$tM{@KttiM?y_!5ywT+S68PGGEI!mz{8+FI!$$ z*Yk4lksbX9joOq|%IECh*?7b>tmd{8hm45$N{!owaoTNOuirkr+pprUarMrZON$&X zJATvulfR<YeK+6i8N3VAH%)vc5oIj4(}?%k-GH~+`LX(oE7lZkoFMSzl7krMx2wtb zU0z7Zt$EM0EMe95;2nSGJfFH`-zG=L$CWe7_Wqn}-2K9%F!kThpWpA>)%;@GE|c(n zI`guVh1axhzcyQHd`L=T>nh=`>R$@ywsWkw_Mq|5mn%OLxKAw;S)Jpwb_45;l?$%B zy2h*ilv|s3v3Z8q9x3m`E~|e8)*POhqH}ehlHY5#nyzYA%bAlcryc##v;4o|g!j#F z?wT0(zEUkVC|vh*@q%3j%N|MgFmq|}1#c;uz1&^EJ%oFQ1>=YOpN1Rc-5Xv_&F-!1 zUm|CuBXs%Jzxk1df0UkHFf%{2@9X?q^%MDbofDLb(QIe)XSi$nxiHP)%zvK`sR2T_ zE*Rg_la06)=df_<vBIhV*G1M`XYOa^r%4|Z`Qyr>{JUcHZ);tL@BDISzl*R}CYbe1 ze!{lPz}~#VzAfygqIUh^-_EV(k7}#_OGerSCtg0?T74w(C0F?Q8lLk`alP|v&Su#B zUM==;$J%$hgE#K7eEEIbNsA12!HG$;Hm}_F$!7oaJ$tPFF(XQYR@c=bOEx)Xa<Vco zBnvVy@FSN7xrxP~!XVr`|FN0CKK2v!3R@hsOGPWchp}WdD!E=fyiLPwuWF-%cXD@! z%PN(veZOB@I|pr&3zKs=<(xF>^N%zOeb>N}%8%ZMd9}0h&OCK>VYgl@b*wjaQRdWb zYsAD%)))Uc_PQXuf9-_d^B!~?eEan1lTyyvi#+?I^HxXYycFv<zLn-Ab;0c46r<!) z8I4W*Kh)28ZXM`6Pu*js<1H0MzvV$1-5&DBt3&2yW=v__vw~IVtHHiqho#HQ`c8_7 zPKiCc-Smsj_T`H=%PgDqa>w4kceOok`UVT_IL-as+AXig{nI7k+@jjbg9VoFFZFLc z-Ol}gbBpZhV#U_8pKmzq^}ZRl+Wo@LjP)lIH9vRs+*W<_D*fB?Ndh4kq#93Lb6KjR zBoKJ%_0p?Zin%gJ)Rz~p-hJ@8{l?uJ=O<5md+=D`(w?b%8Z|s4Ena<?>V8{nt*u6^ zo9Cf2FXMwPb6Tz~_>tI`v82AKyx_x~Gp202&a%lb&^`QKviIe-WfzjT3q=;OeMu9s zpUqs~vaUDC-*5Mx?CHByY;ML(S@H7nqrUeiZ|%u=@#|e;;rb=UULT_VoL(DX<QJy- zDQ-sF=OqvKF|KxX{H2k0$NI?^zFDVjk0hTsDKw!x<67D6s2N&)7Hk*V#Fyyn2g+0_ zTd|6;ellk8OfurSrD&dUSK}w|l5TUCn3a<vk2Wp&bz+V{!ZxO7N0TNb+C7w=(i2_I zxG5#;_%gYe!0WqQYz{t4efhDiplP|7$s$dK<r4gvC%(!RPso!0HTh1Zp168d-RmWv z#h6^C2pzb&wN=h4uPIX|pa0$t;oqj$T<+;yyb!<X>P*|1M~|<mzF^(mu6x0&a*6Nt z9iP%<<RmJsDt^ca@NT>O>6YZ~ByCLxUzLhyLQ(Hdx!2Z*tXTGNQjy}MRj;D1$$fmP z+C5E0e&RE`U!rFghrV6*^Z2cr^?hD>8!D0m?BYbd4yz@}Ki_v~a>nDHleZq%Zc&=O z>ynCSNAF#C{Q&;0M=ts=4PLbH?3Ao?|AX_-EKzI?-<kBQ{G#zzmB+c=8|9PByO@JF zt?^#`>siFy&F60I{iwQleMz6yl!=wSmCYBT-YysVn9%vD=3wC>L#=AYy$_~d>X!R$ z<M(dc;bnEF-ic5C#vk9XVfM~D2Gg>uy|{8rSKSWhQEwHk>o$yhzV^U@bqBBS&AFMR z>F~>QvHo$}bR%wYb*J)4^Q=wIide7w$kv<mFz?j%eNE5g{W$!cgtpz}af@NE{n0Uh zvcvx<Rpu|EH`h=7Ji*4<a@Xh0&C<m|-(NjE8nb%VmX(Su&U@e2dI|fS)b-!UE!iBR z&vv?3|4BR7l6-%Y7nvFkHH#PZY0a3wZsoUkbA{L^bAEq!Y}%^L+MAkf%j2*7Yy7%W zwBg~7nl+;On}xVSlbFiN%D*c2MuoVqc)UXFw_V{^nRicmq-*m2@1M8e%g3rSXXLdn z*?qZI|5fOe9DDbrmjXX0IbYgnzt8^pgt+Bwm#<#AeP8AOk@t6Bw%O~SI)89c&pg?4 z@2d8-H-7x%an-+d{i>w;@EaY6bxH+FeS_I;953EHdcx$)rIS$#=Z>kigvfCJ$+>+f zZjZ8De3qc#heb(#N23J;)ob$q?~&x4_9}dvRG(?Wb^gx8MUOY<A7!1+y)ZC*_Lqy! zt@khcXuUr9fHS_Vd;YfT$%`CMHF8UzKc&rA#2sc9T_<OwT_h%RQgYJv+VC&0oi(06 zRE^6#D<a%_{I}w#<l|x04--H9;72VrRdYWbIn2nwFo~6cK@6$XOwB9HEXvQzg|wvB zhMdm3Z6L6R`+~jBjqa9RMb*3)m@J>%SmaQx?vW*`>obu_zU<O^eND@*pxdrI75Yjm zAD(&RoYXV*X!Fg<o6{VG9Wo!*MsBF_JDd^A@c+&9uNqG4J*T-wE_tk$FKr|jyTUI2 z0DHKs;MwzE)>ypvP<~$Ow96&_`p>lIZx~Vz|5YgS-4JFT_w|OG?h-c(t-n>ar^-(y z6|rfrzsePKe=6&e88y$3&YUyt`{zwZ`7G3(8$X{~{LV~a?%jotP3}Dn$@=kyw=SaD z{hf^V$!C|I@@`mi?v?mL8OcjOH1-y$Y)m@daxpi2Wj=pWdtu6K$$8~AeamgG`J7TQ z`77ACW~HB@SFqP!$;DTm{O($KGr#pz!o6ivCb3nQ&hReunpJu3YQoCGzWcV75(Zzk zwK8Y&3Ng+PING4w!LZQ3`f^jO=<a<7O#O1Jl09u#o7fA<zig|k5y(6+Nm*o7yXT`Q zcg>}<uRqT+*W0&Q<36k8i$ybk&0m^!^)Ks>h5quo64K8C4=ul9I@9j5=wG9BcE`lK z7i6yd{h!3wu4uJc?sn^^`P;6iD}?)g_pV|1Xz`ctnb3aYncJro-Oo?U*p<0t_Rfco z!+!*c)iWZZ-8gD>$YkN(V?JyQ3@5}G82FH)Ju@R$ub}d7#NE8xW+MCeCzLB(VVY#% z?zw9>kKTl(nc@lA&07xZ**Gsyy_KdsQOeWQ@S1JF{Kfj)idX!%SHIa6>(h`p+vfR) zKQ+&lS8ko8IdRqplgXzh^vrtu@SqfX>Aq7_dS<LsU!Qu+#WK6%)T+X{2GeBaWaL8J zgtD#$E&b|{yh`$x>HfltE$c5Z@v#3ef8b=Cx@WTFMYqbOE(N^z<0RHq9y)Y^-ScS6 z$J#4f;tDg*1y@N+Xiip`lyuhlXvUe4r&|BGx86I~6|b$DKT|5$@4tasj}YHC?Yr>_ zFAnwfXf|A&_viO_d(lV6MH7#`c>K_DO2CQdSIxdkWp8%7WbdrV<bURx3eV05YCN`Q zCw=X?QDLU|jOnSz&j%?1EJB}p&fK0@nLF2QX{7awwHHmzl=*hN+G3LJ|GO(R$y)nY zsL9s(Z|st}7AX77@X+w#`L}ObXPWKKo^Ib0r5PdTq$aAFuHaEB`&edVbhP#3oTKO8 zpNo&(Te~^ucig$yoX8SyDfe@3DJRm4zD&Bn%Qoxn3CY4Vv84~}ue(+I6~y>j{aaGy z^>s;^q50Y~N0w{eO<J}1)b-2n1hpQWe0p3>`}f){@7CUDUlAC-rRT{eF}2nL>&rY^ zRc5QU{doK5nXcISP?bYl3wm=I6~u~;pPe>CceBt$M)QIhQYqZ4codrNc!oq6PV!v) zQ!BCWK3l*xe%tH67c?I`$j|t?NV8+&l8ovFo`K&oJ_LGSycX`mFT^T0xy!(1;@wLD z_PQY#MXuacet64k`WGpNNU3R6brVilzbKu5#_>g8cf`HS>uM4uO53w_CuMfI&Y#@c z?OBk1l*#zfyhHB~wI*n96*NgbUB*6r;*(Csw{4f3JJdSEZyn`2Vr2gL+Mlmizb=(c z_xgH#?Pc|5Q=Q(-?sG{;_sOTa)@l7!Nk4a>JVC$caETi0qbp@WiK}m07?|}P?p}6+ zCt<7Cj(cT>G231H*X?Sp<GFO-yJMjXb553u_!r@)oH|^IPa=JIH&^I?a4led^XTTc z-zp2v-;de%cZ2xF2^?Cxc-=Fa*6dT(5@$-8!#8*O*JEC~yAB>qdtU0krbg=gT%XCx z1>cNsYD^O}zdcho<$CF^M|JF_H`Hx%tXu;(CdM6Vx&BUazkhf#L#DQl*6h=K33aW> z$L(&)JUcGHV9BNEvVPK>tDLV=)_z#E`h85|yK+}f!}o#fKEzDEGIRdKxo0}>owDha z{S@o}cbYn9lQQeJ=9G<X%z}m{r-kGKxgXCm(-tZS+&=do-?D_SQh~Y__YZH|-=yqc zAHS|RF!x+tzRhc1re|z-jkmoNx$*AF$2@LXhZd7w>vUm}kGo%N*SW%3^IYk4;;&Tk zYd>t1r$3tf<VLH@=iUXJ3lDs@%t`K9;-S7_<&#r-cdxc|9H^MxFDp`XuI=xIL*Wyi zPK&W=&%d0!`T@V_txA24W$#P3q;lC!T`jf8Bw^m>B?qRlT?#963Y@#Pp|`w6bduWk z<G0w89Jg3B+uWYwx5@Eq&t|99Dwp3F%)WM7B>MC3otuAr{PcDA?9)q)^<MeUsAviH zu$SzgSUIm+Snd$R-rcJ2=8F|Q`Pscc=0CfTcT)6c%N3994}NnMI(;GQeD(2%`69>m zpM3lCHUD(;$tz{~`1yE${Bf4bpYwD5i#=8IoL>L1Q8qCb;#(+lE|ybOvo83P;7le7 z<-(h`Z`S&_<lJcEFN-T=k$5~Y|59ba61$)$qL;V3r5*qFZudlM&Ax|S+~uve7jt}@ zn#s`Pw7~w$es+ho!6K)n9Z$6W`qe6WC1y@zaqjxgisx3>4%{uAw?RrTvUPff_tj^w zr?Uqpng1(nTKDbNLsq`?jLEk@R0I`FpBVJ`Y`1H*cIm|vPrrSc=+(g;*q}ba>c+;k z>r$Vx@VzTIeey(B`u_AMB5oTlFB9or%=qqOg$=_3-8sT5_7}g>QD4w{-Z{NVt#0;{ zZ?`vEP3d&-JGh~?^qKC5uVE7>JW6@b=6m(wx!&*VP2TNqjr4mc9KXAAx$tJ?KBY^` z7U(@%W!mVz=)ehq;|$^7X5HGquy4zD-mgdR1)Sc__wIwK@V>{{KOgwF+6al1oNF<@ z|Gsot#c9J2sg^7Lc+5`~$$0G9zRT&c;kM$BC9kKRbN-fVoRPzpv-D!!jF`h&Hfjtx zpVce#McdYMeYXtcz9m+{s9cZKNdwh8zREtkwOJV$u8T4-fX03@p`$#-$r-6Br8%iZ zdIgnxBXaW}oALaUQ~2LlU}$n|spoBf=K|>fnXoqvr4|dM-yJRxNQusDxmA>K^6aPg z?x*rMC8^iWwck?aGqJ|wmEuzcj%Aa7S13<15@kK2d0pz7k?3VlhxON7=QU28$uKkb z^PvX6)*F86mpwo4x&HR=wAsE|%2nO=`Y#F<r;4@Cj6LT#J1NXtXWzsBlF2C@8wFIk z7y3wC^2!c;_Dt<@KlkM4FP*~QebmU^yW@S`BGb#BPb;`no^iCSe#!D-Q^kv8&DQLh z=S)Q`S6)vjayZRY63Jm8&1myj!@1namNA_3gUQ-^HVdvxHGZ`9Xk8evF?rQ4-y>2I zlf9&lr9~}yZP`)p8Y4ARd)wJy$@k$qZk$on`s5yHuroGrh0~57qW{iJjWC@hbDi_r zq06`Q<~v_d;yIM3+o_xLD?;UrAIH&0wLJ^!8@;a|lZ;tsFjdOp@7%*zxhgV?{4XkS zggpKKPIvO`9?6oB(6H+F+xA>hIw)Q*y0pM{Q+{ZOf%J#Qsk?egVorFRVLEl~(kb1k zH&{P=Ex4n0hvV8S3y$vf3flyPdiF0rq<Ku)YeUezHO$UiuejyRK3Y=mbjNMO#O?g* zVpCRaUs7kYQRDRFGS<88>^nCZrdjLthVVQ8e8qHO`l~0~Sg&2y`O&4yXV$WC_u>;d zvEK`|SaapS>^|_~lVyri_Ll>99eb}$V}7wqcdD=8ksS*+ekhaH@xFCEzJ7mm#o?>W zn;cGyrWCnce9-3LuvvSDM4jXz|AMznn+pF&xLj+g&2p4I{P^v$d)E2l<p!^qenlv3 zofz)0^XW>vwx_3#I{kiox6$Rdm|OSC)rL9tH{9P{G~m4TfBC6(#s4Qi|F3wn#v|&8 zu+_aUCsnte;H?+3aMoCP(a6ka#f%Hv{9GdPe<Uwx`?0X;ddJl-2X5@Omf3RZch1Aj z|7Sn`aCD^?-;MNDfekVbJe%?hIyTI_n=F{xcYV);$YfUQG^U@oxVCBaxh{R(@HaxH z#NhT{rXMNp>uyQqHPz1goHDUv#tCDMv%elaSKtZMiMZvs;QA^puI2HE8dv<!RgPL5 z=eT*r*MfgKm-niavfVef-Db6tW$p59MkkM~UbX4|Rkv3kk4ag*iP&;x<v#JLHyAxl z?AClf#J6~l*{fXJ81-(c=N&WevbldyteC&I$ExmD!v&eli8?x)T$a?lKhMjY+#oJ6 zf6hI9oxnV^X_IoAI;WkveaQHT=lqAiObaay|82SGm{<QkDf9F`HMty@<qNHKh3?ky zKJq)<dVT4&O&8h}4eg5KBPx}GoCPdG+-Hd13Hbh#_wt<U$E9qZ*qqq7Cu+G?Q)JF* zjiXI7SaYvT^J|)BZNoFoq=o%m;;S=KELpAB7|-93T%f(_M5vo|vCk^*S-bgvHS0}( z#d=Zk<H83KbsPNGb9-D3a&r#6%pW>4eMxgfVLZRgynXSLs)Xvpp0#@YTfgVKPjAXz z_0K(X#FtjZIlR-j{W?u;b@`VYE^l^uehZu-ecSfVd+lk8FLxhu%>EsBxkI`3Lun#M zc>34s^Q$gT?7y|ze$yJhv>wODaZ@jb3eG&`TP)(dQR94Y|M9HN@vl}DoxN%Dt>lvG z^<;K?6;FpvrRU`4t=)It<@3WC?-J8rc5xk)uU(!cBEDVMmu+6w>g$Pj3nC829#(07 zZ5<^Q`H$T`ZQt!5?181XP9E64N-;IJtx8>C*SUsA-}`p|=hcaPxQlP~`KgoaxU}YR z9$OJ}PI9wg>hschrstUN9{1tWtPOa2^zdc-aQj19yYlLH{u8{`_N8eDvpn($*rT*% zC`0HHNR9fE{QMkT<LG-`SBFF|4_~Ul$iOgxiGe`|U0-s3URq{+QEFlexNzPYaM16t z0ngs>SN0KmO(uFB5mbEJ@PqM)=t8Y%A*pM}rasPm^xpH*wA_MY;>Y#h-#q{Aa?g<u zl7?5N#&`V?t-rVVS>l)9yH>4cSskM#zerW=yR3`aMx!g<rxv}RE1!G+^br;53g4h- zY<&ex{eMheE>1cUIC1WT+<J*xrGr+Vwl<t+J-um{(KW`%++PyyM*eo!M3-1p%Q2)& zbKP?E&Sf`~x$xt|#%%vL@8qI5t(u}mEqm+@-kds@<&xW?{q2+Z%^7v~?oB_Xc<`C7 z$jo0GbY`)3-}F;nFQvZqQt_tbBVUCc9Xer{@MMAd?&w=Oy5<`u-qrm*C9n4InFI3I z)+E~~&y;?~X7<TxT2b^Af00d(<JIp8%jy38KK1m6(~i>@-h6J3=w?l}SskK(Ghh8V z0|SFN69a=ZddTJ$mXyRN=VU^<*rgL3`<e}ST)$7PYVQcuQsfKh482~=rp*$(NUcyx zI&|+}hsJ3u+0s*A|9$_yWM-4svgKNLT(w@yx&`W~oLZ!}{$0h4d0*Qi|Mpz4vGsR0 z4eOrERB(~AA?-`-%2__<XC4HtOmi-H`_krdu<w;!tKzo3FpsP^`R}!=(a>F3;1aWh z>-yT*n3tX#HI6sWke_mU7srwB2Rj2cCZ}n-ZCO;EwDSJJ@&x}W4M$ThE`R&i#w2HR zcEL}Eg->!;?oxa=C$?5Zzbrl8A+6YT!?EATZb;AAc2)XwZkvh8y~6+I2a`5TPr6!j z@%UkVMEHc-t`6BJHSgYZ1_lNdMg|61^zbQ4&CM@KMTAhSza!Tn1A#s4pW0Q`xi7Md ze0jwG$3f$)7;~o5O<lPo`)5alWqqG?_S~6sZzR~2c08OTx!y40QJnVL1=Egm&f(VF zP|SYFB63IiBa<^3iHbU6a-o0D94-H=m3eiBy5gaq%WoRqYU<jS-hSdzm)GvzBR2)r z{`+1z_>sx3XU|9d6W*R5jFNJG{r3^`DW3YVs#8!~^7Q|;SJ@Fh0_7#|*IRflFfuS0 zv0#aDXe%c%DJNC0pmJ)kZ~hzufxXHf<=vhzX(etCUt+5gSk*1Ea$?mM9-i*4$CiD& zQ1ZX__<^*Wcee!99*EDsH``opl1k@d^K8>AQC0j`JejWYOI4e&O#QNoEtO;L8qY{$ zW~(dA6I#P0pIS@IS$nbiOW_ojeb;Wvd3=?au}1lWRAI+r3#+&N|B`JzUTs-*NLOAw zF<RsC#lT%>4^H+Lclmg#Sj%O#3D-o!ONCvhr=&I}2!&0PtE$xKh!y?ouN0UqdPb*7 zzvhd{+?ELzvwG{-Tj#jxYWKdBoH(_R#YQbU@uP;V-qNhK&F!|$W;)N!&p*3<?7Yg0 zu)xoo4vMurD4Hm+(*5qU0Ly9z^(z5v(=E?La$WWLJ-JBYc}>^;!Zn9BPfn9y4118z zw{nM!YK#7x2eYrptq-VMQ}Z^YHPc9A^Zk|;D)ELs=kN6J<%{|}b*WurI&EQOL_#%d z#dMzw3#J_xipqW3qPZ<TKY?B3u|h}gOwsE*JGhfR+Rr|h_@pjV<)lnip3BbTr9bm# zK0M7AcB%Z%L7k~;_7YbPSg71wx@3`OzVEKCz#~t&6qoP*-WUDF_@?aa$U>i!t?|lx zR|S4M|Kz>B|G%3i!K<d9jNf;se)`+Rr9Wiv-8o_V87(0gMYOJd$;`l@$<4qZg`TvF zi!%`EdTm&4_hU1GfBQE4cVwA%VnT2pKbPtR{?mIe9FmRQb=&`Rl1TNO6&qE<C#^rZ z|9wV^`nJb1(K~89z8HNzbK7|FoqHnJLe9u%FWv4Fx^?5c+R$_N@7=k#<#tq5<jTF4 zvJ&M{yB5Db`7?H<nd4-KY>O)se)4U#v)Il(eT8z<nt)r4U;q4Vvdphstta<!`tr<$ zULKcORCP1%|5G{187uie;N;#9$EF-|O0`)MxiVmd@eg&`x+R+zlvPijddc$J##7;m z$3IMVK6oi4^XcU&)*9Wcr$1O(Y)RPZnZ0^T{6=1>#O!Z5(h(bOIW6Q<X-?l9xv4AS zp|Apr(gW7I{&Utgd)`b_?&RqGUU>2Qua_^kOPu1bRp;EkNNC>|;SW_WQ>XCGI~FQ` z-OTDJ1KS4eHoomYH3j$gzj(WGyRx)mS3r^DeH+QR=MS9Ze$Cr+<o@-A3QIfL3pW~{ z%Z^Os%($&keJizB^4IknH7Q3rFXc@ACx6TN@1clkGgnQrI(|d*(?SQ6M-I=IUOEtc z)1e{7YlGXPYjtzFJ_Nd^zc@09Gx&K;$)SnrHyo0fU+8wo7)@rLZ@#bM`)iw>9GyW) zvl@j9PAtfi4yjqzYxK)7XJ!dcSg`2Ki5A)_-!jkjq)o{(^j_AY_;T{<mBlX`cU*lg zkh=SAf^EXF6O8#w%dR|neYrsB{9VQ8fvdwm@XJqn!qsx3=bFXRiU-aU;<n$KC@*We z>vFb>c1`cO8f&}S%DNt2^+Qv<{L6l1nl98@Rl81Se&<v5g6jNNsbBlQzq}^X8~13z zWQ!N~QX}r&Y+AYYm@60i8;3bJUmHwbrttdMa+Y0dw!}a4{!+ESBrdNp^n3CJ^N4wy zCQd!Z=zq?6)qI9Jt+PMZXqP8AK2MM_JZEBdIH)pnyMcu6=bv-_hE8{T*7s93VSa{x z^J$SS{j+!$Zs<8CH`BaCZsLnjp*NN6%1lRYZ=S}+!N#-rjMYK8Q<HY4UG~%{a5<g9 z8^2gFE{)N0?q;{=3DG5n97!G}PZx4kut^KO4OHT=lAI{3-u&{Ox44|^z1;t17Pofo zVcnCm#=CV<Iji))UALOfzQ6P7+}WG5k1u}Z`yixm_JzMjVwJ<oW1koIdc9Jv4^(8I z!tLdCWAB+GVLu&CnXK)fd8X`#eS^iSq6u4mygM{u_TGJdtUi89lKT1UeiWSwdUGgy zXGQSq-pzhI|2=2cCx1IHEB3haujmu;HHWsWt>3wSf6vqIBTss6zgu`S>`GS45i@tS z&o+Mor+CCvsW=_Zc>Ge5!<Dx;e1_2%hc}A_zpDRJH!+R4CojW&D(=#>$8UZ-?f&{( ze*Rk1Z<~_cF8Yf6oun9kBXMcbjo1H?hG6w$R)>^|+6Q+sFfeRpU|>){6cD-wdIoxi zdMTO3CAyh;Y5DrTt|5*tjv<b|XAXj@Kb8x>>yG|&@cud@S|H?tnp42X9j~&SeS;>6 zyu2^1fAzLO{)}nHcQu1cAI-@5z%>0UlZd5QhV!((su?R+&TdL8>3gK|q5E~jviAbj zTjbg`%MTtlvslMgHLZK`EzR06h2u(r3o@T_Y2SI#9hULKOEdc0hVACxUgp<V1lF~@ zsN+5J5UEEG^2VLrs~ck&7#KhpsS3yNM!1Kos}J{i58tyFdA)VD&Yd~GImqCO@q;4& zv);O1Iw$ov1$lU#)Y0qIXI~k3!Qg_i*=6HPPq<E<*T48x=NhkuuGiU<KAVCxG_`!6 za(Vh}57Jm+a_#Kt^WIl|&#Zp(hzV(J2*_Cpo9`as0xvFMU{J*qx+VDq@j0nwsX2Nj z6(y(7=og;xJ@X9RuxQ8VX&0Cn7_PA}Fv#ICEXdW_Kgeb6#gmg3MM$(gtc~T4@M%xH z$Soi+!O?}~j(`IDOn#$|s;_r12F_eLHE{Q?M)iIF>%C1nbA$f(Jl>?e+#>EPe~yk2 z*M|QFbJpyrJ(@jf`h$;-`OGpB*%rGC;<q2zR;6r_`{K~-P<iFLDf<^ZVcPxD^(N!{ zhq7;%&F|Quy5N?xXNWR)xvchm`9r!qpICpr3yNfMyKM8Bb?eC=k1`IomTi(-=pZWR zUt*kfF*vg(<mrWzNv{<xuI9bAKEAo~pak25`FwBko;K|IRx8$Rykg21b;&-Z`FFP# z=w0$$sjB?yiCRQ>;l*o9UcF;0KIqYwWWRG$M!ZBx?XsMt%n*ZH8OPt3JmNanwdmLm z^EXpF7{s0KZQEMlB+m1}<m<_v=S*qE%<bYiuOACm2Ak}?D6{!?^}QnD&FN`Bq}!&; zUgTJmd$wJi{gW75!-vvGEdigubNyRCH*os&j|`LF<SsHW_`Uqe&$|mfeC;3PC>Ont zT5J|vlKNgzM04|{M<!d+1(O+n=WV;5*>&FcXIzp<(8-kydGCy`*~wl^71*`*i_5Du z56=~)iI^Nd^YT{U6+?&S@}dUaSr5v;RNc?}q!iL;y!F|o*fm8v1KAUuCMm7#InRAV zCi45j`CHCPE@pWp`}eAvr}PgeyKJ>ppVk~+UoxY(#X8IE`Q^1OK9%gr%TvAxr_Wva z<B6bzXTh2LXAw2=l?-vy?n~Ln`Ktx3Te@M*Q_lt0_Hg+=eb<odI`y#b*8cyj%PS7l zPO#Xh6!t_*`#7imZkfMZrZj7Gvwvh(^U$l%dAsvcuIVcO-0yRkx~_}=`ZOW)YQ&`$ zwuE<+UOY@vQU7z1*TmJ(KH&MT^`T5|35$Cdx3X=`y3|~!YVqn?_TE!MJKuHXJmxGH z{9X0Zyx6Js&H?G1u*<c-HoP|$f0*ifpS9h>vqC?`Z==YG)x4e?Ki*K6ZN4DCOu5wN z*#C+5w6oLolW+8cW{wz{M8KnU*jH*n7i}?YYXq@iBYH^dwgS8n24Gva1=0q>+Zv4# znM)tGiVImcwsjsLogloe(UAqQY%CG7>H}S~D%x}>NFxYuYb@tPXhxm<L^cC7hKW9R z2GS40+Zyw@5oSPU($MvykAH&nf$+A*XMza5(0&5A!;NeLwoX1sHwbTQbQVXLfZpXt zHU-p8LGSW|OaS3+jn(L;pbY>Zn}n^43o-?Sw>4gsKywdjhZor(Y<)qHAt1c1@v9`7 zLFhe0WTQa7L+^xvi~-?ojmM?XjDiL=v`dC=5PBmXWC#dvYrG(XZV+;l9@!jFZG>Le zgUkToZH*rl;O1adnXsB4-LyNqQL9{#Ng%wfafc#q)4&xlx>4xWB*+*L-qz@^gxe^T qN)z2k^vV)s90+e=oP)<mNYxqO&B_K+E5IPYkj=utumV(dGXMbG!U<vk literal 0 HcmV?d00001 diff --git a/ihm.py b/ihm.py deleted file mode 100644 index 6e520c4..0000000 --- a/ihm.py +++ /dev/null @@ -1,145 +0,0 @@ -import pathlib -import platform # For getting the operating system name -import subprocess # For executing a shell command -import sys -from os import path -from subprocess import Popen -from time import sleep - -from tool.confi_reader import read_ssh, read_broker -from tool.mqtt_client import MqttClient -from tool.ssh_client import SSHClient, Cmd - - -class Ihm(MqttClient, SSHClient): - - def __init__(self): - self.broker_ip = read_broker(str(pathlib.Path(__file__).parent.resolve()) + "/tool/config.json") - MqttClient.__init__(self, self.broker_ip, "Ihm") - SSHClient.__init__(self, read_ssh(str(pathlib.Path(__file__).parent.resolve()) + "/tool/config.json")) - - def run(self): - - exit_bool = False - experiment_folder = "" - - while not exit_bool: - - print("\n") - cmd = input(">") - - # Envoie un signal a tout le monde pour exit - if cmd.lower() == "exit": - self.client.publish("ping/exit") - exit_bool = True - - # cherche tout les potentiel agents sur les raspberry et les tuent - if cmd.lower() == "kill": - - commands = [ - Cmd( - cmd="ps -ef | grep 'python '", - prefix="[BEFORE]" - ), - Cmd( - cmd="for pid in $(ps -ef | grep 'python ' | awk '{print $2}'); do kill $pid; done", - do_print=False - ), - Cmd( - cmd="ps -ef | grep 'python '", - prefix="[AFTER]" - ) - ] - - for i_client in range(len(self.clients)): - print("Hostname :", self.clients[i_client].hostname, " User :", self.clients[i_client].user) - self.run_cmd(i_client, commands) - - # affiche tout les agents en vie - if cmd.lower() == "agent": - commands = [ - Cmd( - cmd="ps -ef | grep 'python '" - )] - - for i_client in range(len(self.clients)): - print("Hostname :", self.clients[i_client].hostname, " User :", self.clients[i_client].user) - self.run_cmd(i_client, commands) - - # automatise la mise a jour de l'exerience sur les raspberry - if cmd.lower() == "update": - commands = [ - Cmd( - cmd="rm -r Desktop/mqtt_goyon/iotamak-core" - ) - ] - for i_client in range(len(self.clients)): - print("Hostname :", self.clients[i_client].hostname, " User :", self.clients[i_client].user) - self.run_cmd(i_client, commands) - - self.update() - - # charge une experience et verifie le format - if cmd.lower() == "load": - print("Give Path to experiment folder(relavive)") - cmd = input(">") - # check if exist - print("Check experiment:") - print(" | -> folder : ", path.exists(cmd)) - print(" | -> agent.py : ", path.exists(cmd + "/agent.py")) - print(" | -> amas.py : ", path.exists(cmd + "/amas.py")) - print(" | -> env.py : ", path.exists(cmd + "/env.py")) - if path.exists(cmd) and path.exists(cmd + "/agent.py") and path.exists( - cmd + "/amas.py") and path.exists(cmd + "/env.py"): - experiment_folder = cmd - print("Experiment loaded") - - # Crée les processus amas/env/scheduler de l'experience chargé - if cmd.lower() == "start": - - if experiment_folder != "": - - # choose exec - print("Choose execution mode for the scheduler") - print("0 : step by step, 1 : auto") - while cmd not in ["0", "1"]: - cmd = input(">") - - # start subprocess scheduler - p1 = Popen([sys.executable, 'scheduler.py', cmd, self.broker_ip]) - sleep(1) - # start subprocess amas - send_client = [ c.to_send() for c in self.clients] - p2 = Popen([sys.executable, experiment_folder + '/amas.py', self.broker_ip, str(send_client)]) - # start subprocess env - p3 = Popen([sys.executable, experiment_folder + '/env.py', self.broker_ip]) - - if cmd.lower() == "pause": - self.client.publish("ping/pause") - - if cmd.lower() == "unpause": - self.client.publish("ping/unpause") - - if cmd.lower() in ["s", "step"]: - self.client.publish("ping/step") - - if cmd.lower() == "ping": - - for client in read_ssh(str(pathlib.Path(__file__).parent.resolve()) + "/tool/config.json"): - param = '-n' if platform.system().lower() == 'windows' else '-c' - command = ['ping', param, '1', client.hostname] - - result = subprocess.call(command, stdout=subprocess.PIPE, stderr=subprocess.PIPE) == 0 - - print("Hostname :", client.hostname, " Responded : ", result) - - if cmd.lower() == "mode": - self.client.publish("ping/mode") - - self.client.publish("ping/step") - sleep(2) - - -if __name__ == '__main__': - a = Ihm() - a.run() diff --git a/__init__.py b/iotAmak/__init__.py similarity index 100% rename from __init__.py rename to iotAmak/__init__.py diff --git a/agent.py b/iotAmak/agent.py similarity index 95% rename from agent.py rename to iotAmak/agent.py index 958e026..52a1bf3 100644 --- a/agent.py +++ b/iotAmak/agent.py @@ -4,7 +4,12 @@ Agent class file from ast import literal_eval from typing import Dict -from tool.schedulable import Schedulable +import sys +import pathlib + +sys.path.insert(0, str(pathlib.Path(__file__).parent)) + +from iotAmak.tool.schedulable import Schedulable class Agent(Schedulable): diff --git a/amas.py b/iotAmak/amas.py similarity index 94% rename from amas.py rename to iotAmak/amas.py index e8e97d3..8424890 100644 --- a/amas.py +++ b/iotAmak/amas.py @@ -4,9 +4,14 @@ Amas class from ast import literal_eval from typing import List -from tool.remote_client import RemoteClient -from tool.schedulable import Schedulable -from tool.ssh_client import SSHClient, Cmd +import sys +import pathlib + +sys.path.insert(0, str(pathlib.Path(__file__).parent)) + +from iotAmak.tool.remote_client import RemoteClient +from iotAmak.tool.schedulable import Schedulable +from iotAmak.tool.ssh_client import SSHClient, Cmd class Amas(Schedulable, SSHClient): diff --git a/environment.py b/iotAmak/environment.py similarity index 90% rename from environment.py rename to iotAmak/environment.py index 24ea96e..9adb398 100644 --- a/environment.py +++ b/iotAmak/environment.py @@ -1,8 +1,12 @@ """ Environment class """ +import sys +import pathlib -from tool.schedulable import Schedulable +sys.path.insert(0, str(pathlib.Path(__file__).parent)) + +from iotAmak.tool.schedulable import Schedulable class Environment(Schedulable): diff --git a/iotAmak/ihm.py b/iotAmak/ihm.py new file mode 100644 index 0000000..1347488 --- /dev/null +++ b/iotAmak/ihm.py @@ -0,0 +1,163 @@ +from os import path +from subprocess import Popen +from time import sleep + +import platform +import subprocess +import sys +import pathlib + +sys.path.insert(0, str(pathlib.Path(__file__).parent)) + +from iotAmak.tool.confi_reader import read_ssh, read_broker +from iotAmak.tool.mqtt_client import MqttClient +from iotAmak.tool.ssh_client import SSHClient, Cmd + + +class Ihm(MqttClient, SSHClient): + + def __init__(self, config_path): + self.broker_ip = read_broker(config_path) + MqttClient.__init__(self, self.broker_ip, "Ihm") + SSHClient.__init__(self, read_ssh(config_path)) + + self.experiment_loaded = False + self.ping_is_true = False + + def loading(self): + print("[LOADING]") + print("Check experiment:") + print(" | -> agent.py : ", path.exists("./agent.py")) + print(" | -> amas.py : ", path.exists("./amas.py")) + print(" | -> env.py : ", path.exists("./env.py")) + if path.exists("./agent.py") and path.exists("./amas.py") and path.exists("./env.py"): + self.experiment_loaded = True + print("Experiment loaded") + else: + print("[WARNING] experiment isn't conform with the expected format, starting won't be possible") + + def ping(self): + print("[PING]") + print("Checking connection to clients in config.json") + res = True + for client in self.clients: + param = '-n' if platform.system().lower() == 'windows' else '-c' + command = ['ping', param, '1', client.hostname] + + result = subprocess.call(command, stdout=subprocess.PIPE, stderr=subprocess.PIPE) == 0 + res = res and result + + print("Hostname :", client.hostname, " Responded : ", result) + if res: + print("Connection established") + self.ping_is_true = True + else: + print("[WARNING] Some client are unavailable, update the config file") + + def agent(self): + print("[AGENT]") + print("Checking if an experiment is already running") + + commands = [ + Cmd( + cmd="ps -ef | grep 'python '" + )] + + for i_client in range(len(self.clients)): + print("Hostname :", self.clients[i_client].hostname, " User :", self.clients[i_client].user) + self.run_cmd(i_client, commands) + + print( + "If any agent is currently running, you should" + + "kill them before starting the application with the command 'kill'" + ) + + def run(self): + + exit_bool = False + + self.loading() + self.ping() + if self.ping_is_true: + self.agent() + + while not exit_bool: + + print("\n") + cmd = input(">") + + # Envoie un signal a tout le monde pour exit + if cmd.lower() == "exit": + self.client.publish("ihm/exit") + exit_bool = True + + # cherche tout les potentiel agents sur les raspberry et les tuent + if cmd.lower() == "kill": + + commands = [ + Cmd( + cmd="ps -ef | grep 'python '", + prefix="[BEFORE]" + ), + Cmd( + cmd="for pid in $(ps -ef | grep 'python ' | awk '{print $2}'); do kill $pid; done", + do_print=False + ), + Cmd( + cmd="ps -ef | grep 'python '", + prefix="[AFTER]" + ) + ] + + for i_client in range(len(self.clients)): + print("Hostname :", self.clients[i_client].hostname, " User :", self.clients[i_client].user) + self.run_cmd(i_client, commands) + + # automatise la mise a jour de l'exerience sur les raspberry + if cmd.lower() == "update": + commands = [ + Cmd( + cmd="rm -r Desktop/mqtt_goyon/iotamak-core" + ) + + ] + for i_client in range(len(self.clients)): + print("Hostname :", self.clients[i_client].hostname, " User :", self.clients[i_client].user) + self.run_cmd(i_client, commands) + + self.update() + + # Crée les processus amas/env/scheduler de l'experience chargé + if cmd.lower() == "start": + + if self.experiment_loaded and self.ping_is_true: + + # choose exec + print("Choose execution mode for the scheduler") + print("0 : step by step, 1 : auto") + while cmd not in ["0", "1"]: + cmd = input(">") + + # start subprocess scheduler + p1 = Popen([sys.executable, './scheduler.py', cmd, self.broker_ip]) + sleep(1) + # start subprocess amas + send_client = [c.to_send() for c in self.clients] + p2 = Popen([sys.executable, './amas.py', self.broker_ip, str(send_client)]) + # start subprocess env + p3 = Popen([sys.executable, './env.py', self.broker_ip]) + + if cmd.lower() == "pause": + self.client.publish("ihm/pause") + + if cmd.lower() == "unpause": + self.client.publish("ihm/unpause") + + if cmd.lower() in ["s", "step"]: + self.client.publish("ihm/step") + + if cmd.lower() == "mode": + self.client.publish("ihm/mode") + + self.client.publish("ihm/step") + sleep(2) diff --git a/scheduler.py b/iotAmak/scheduler.py similarity index 94% rename from scheduler.py rename to iotAmak/scheduler.py index e42d8cd..51ecdcc 100644 --- a/scheduler.py +++ b/iotAmak/scheduler.py @@ -1,10 +1,14 @@ """ Scheduler class file """ -import sys from time import sleep -from tool.schedulable import Schedulable +import sys +import pathlib + +sys.path.insert(0, str(pathlib.Path(__file__).parent)) + +from iotAmak.tool.schedulable import Schedulable class Scheduler(Schedulable): @@ -26,10 +30,10 @@ class Scheduler(Schedulable): self.subscribe("amas/agent/new", self.update_nbr_agent) self.subscribe("amas/action_done", self.update_schedulable) self.subscribe("env/action_done", self.update_schedulable) - self.subscribe("ping/step", self.step) - self.subscribe("ping/pause", self.pause) - self.subscribe("ping/unpause", self.unpause) - self.subscribe("ping/mode", self.mode) + self.subscribe("ihm/step", self.step) + self.subscribe("ihm/pause", self.pause) + self.subscribe("ihm/unpause", self.unpause) + self.subscribe("ihm/mode", self.mode) self.agent_waiting = 0 self.schedulable_waiting = 0 diff --git a/philosophers/__init__.py b/iotAmak/tool/__init__.py similarity index 100% rename from philosophers/__init__.py rename to iotAmak/tool/__init__.py diff --git a/tool/confi_reader.py b/iotAmak/tool/confi_reader.py similarity index 91% rename from tool/confi_reader.py rename to iotAmak/tool/confi_reader.py index 66ae9e9..ca9b344 100644 --- a/tool/confi_reader.py +++ b/iotAmak/tool/confi_reader.py @@ -1,9 +1,10 @@ import json -import pathlib import sys +import pathlib sys.path.insert(0, str(pathlib.Path(__file__).parent.parent)) -from tool.remote_client import RemoteClient + +from iotAmak.tool.remote_client import RemoteClient def read_ssh(path): diff --git a/tool/mqtt_client.py b/iotAmak/tool/mqtt_client.py similarity index 100% rename from tool/mqtt_client.py rename to iotAmak/tool/mqtt_client.py diff --git a/tool/remote_client.py b/iotAmak/tool/remote_client.py similarity index 100% rename from tool/remote_client.py rename to iotAmak/tool/remote_client.py diff --git a/tool/schedulable.py b/iotAmak/tool/schedulable.py similarity index 95% rename from tool/schedulable.py rename to iotAmak/tool/schedulable.py index 2b6f5ae..e1e1e71 100644 --- a/tool/schedulable.py +++ b/iotAmak/tool/schedulable.py @@ -1,13 +1,14 @@ """ Tool class that implement basic interaction that help to finish processes """ -import pathlib -import sys from time import sleep +import sys +import pathlib + sys.path.insert(0, str(pathlib.Path(__file__).parent.parent)) -from tool.mqtt_client import MqttClient +from iotAmak.tool.mqtt_client import MqttClient class Schedulable(MqttClient): diff --git a/tool/ssh_client.py b/iotAmak/tool/ssh_client.py similarity index 98% rename from tool/ssh_client.py rename to iotAmak/tool/ssh_client.py index ea20d4e..3f7d2e2 100644 --- a/tool/ssh_client.py +++ b/iotAmak/tool/ssh_client.py @@ -1,14 +1,16 @@ -import os -import pathlib -import sys + from typing import List import paramiko -from pexpect import pxssh +import os +import sys +import pathlib +from pexpect import pxssh sys.path.insert(0, str(pathlib.Path(__file__).parent.parent)) -from tool.remote_client import RemoteClient + +from iotAmak.tool.remote_client import RemoteClient class Cmd: diff --git a/philosophers/agent.py b/philosophers/agent.py deleted file mode 100644 index 6826aed..0000000 --- a/philosophers/agent.py +++ /dev/null @@ -1,100 +0,0 @@ -from ast import literal_eval -from time import sleep - -import sys -import pathlib - -sys.path.insert(0, str(pathlib.Path(__file__).parent.parent)) - -from agent import Agent -from philosophers.fork import Fork -from random import randrange - - -class PhiAgent(Agent): - - def __init__(self, identifier: int, broker_ip: str, total_agent): - self.total_agent = total_agent - Agent.__init__(self, identifier, broker_ip) - - def on_initialization(self): - # 0: thinking, 1: hungry, 2: eat - self.state = 0 - - self.subscribe("env/fork/" + str(self.id), self.left_fork_update) - self.left_fork = Fork(self.id) - - right_id = (self.id - 1) % self.total_agent - self.subscribe("env/fork/" + str(right_id), self.right_fork_update) - self.right_fork = Fork(right_id) - - self.fork_wait = True - - self.subscribe("env/agent/" + str(self.id) + "/ask_spoon", self.spoon_response) - - def spoon_response(self, client, userdata, message): - res = literal_eval(message.payload.decode("utf-8")) - if res.get("response") == "True": - if res.get("side") == "right": - self.right_fork.taken_by = self.id - self.right_fork.state = res.get("state") - else: - self.left_fork.taken_by = self.id - self.left_fork.state = res.get("state") - self.fork_wait = False - - def left_fork_update(self, client, userdata, message): - res = literal_eval(message.payload.decode("utf-8")) - self.left_fork.state = res.get("state") - self.left_fork.taken_by = res.get("tanken_by") - - def right_fork_update(self, client, userdata, message): - res = literal_eval(message.payload.decode("utf-8")) - self.right_fork.state = res.get("state") - self.right_fork.taken_by = res.get("tanken_by") - - def ask_spoon(self, left): - if left : - self.publish("ask_spoon", "left") - else : - self.publish("ask_spoon", "right") - while self.fork_wait: - sleep(self.wait_delay) - self.fork_wait = True - - def on_decide(self): - super().on_decide() - - if self.right_fork.taken_by == -1: - self.ask_spoon(False) - - if self.left_fork.taken_by == -1: - self.ask_spoon(True) - - if self.state == 1: - if self.right_fork.taken_by != self.id: - self.ask_spoon(False) - if self.left_fork.taken_by != self.id: - self.ask_spoon(True) - - def on_act(self): - super().on_act() - - if self.state == 0: - self.log("Is Thinking") - res = randrange(100) - if res % 5 == 0: - self.state = 1 - elif self.state == 1: - self.log("Is Hungry") - if self.left_fork.taken_by == self.right_fork.taken_by == self.id: - self.state = 2 - elif self.state == 2: - self.log("Is Eating") - self.publish("done_eating", "") - self.state = 0 - - -if __name__ == '__main__': - a = PhiAgent(int(sys.argv[1]), str(sys.argv[2]), int(sys.argv[3])) - a.run() diff --git a/philosophers/amas.py b/philosophers/amas.py deleted file mode 100644 index af9eeb2..0000000 --- a/philosophers/amas.py +++ /dev/null @@ -1,22 +0,0 @@ -import sys -import pathlib - -sys.path.insert(0, str(pathlib.Path(__file__).parent.parent)) - -from amas import Amas - - -class PhiAmas(Amas): - - def __init__(self, broker_ip: str, clients, nbr_agent): - self.agent_to_create = nbr_agent - super().__init__(broker_ip, clients) - - def on_initial_agents_creation(self): - for _ in range(self.agent_to_create): - self.add_agent("philosophers", [str(self.agent_to_create)]) - - -if __name__ == '__main__': - s = PhiAmas(str(sys.argv[1]), sys.argv[2], 5) - s.run() diff --git a/philosophers/env.py b/philosophers/env.py deleted file mode 100644 index 8ababf9..0000000 --- a/philosophers/env.py +++ /dev/null @@ -1,69 +0,0 @@ - -import sys -import pathlib - -sys.path.insert(0, str(pathlib.Path(__file__).parent.parent)) - -from environment import Environment -from philosophers.fork import Fork - - -class PhiEnv(Environment): - - def __init__(self, broker_ip, nbr_phil): - self.nbr_phil = nbr_phil - super().__init__(broker_ip) - - def on_initialization(self): - self.forks = [] - for i in range(self.nbr_phil): - self.forks.append(Fork(i)) - self.subscribe("agent/" + str(i) + "/ask_spoon", self.ask_spoon) - self.subscribe("agent/" + str(i) + "/done_eating", self.done_eating) - - def ask_spoon(self, client, userdata, message): - res = str(message.payload.decode("utf-8")) - agent_id = int(str(message.topic).split("/")[1]) - - if res == "left": - fork_id = agent_id - else: - fork_id = (agent_id - 1) % self.nbr_phil - - if self.forks[fork_id].state == 1: - message = { - "response": "False" - } - elif self.forks[fork_id].taken_by == -1: - message = { - "response": "True", - "side": res, - "state": 0 - } - self.forks[fork_id].taken_by = agent_id - else: - message = { - "response": "True", - "side": res, - "state": 1 - } - self.forks[fork_id].taken_by = agent_id - self.forks[fork_id].state = 1 - - self.client.publish("env/agent/" + str(agent_id) + "/ask_spoon", str(message)) - - def done_eating(self, client, userdata, message): - agent_id = int(str(message.topic).split("/")[1]) - - for fork_id in [agent_id, (agent_id - 1) % self.nbr_phil]: - self.forks[fork_id].state = 0 - - def on_cycle_begin(self) -> None: - for fork in self.forks: - self.client.publish("env/fork/" + str(fork.identifier), str(fork.to_msg())) - print("Fork : ", fork.identifier," taken by ", fork.taken_by, " and is :", fork.state) - - -if __name__ == '__main__': - s = PhiEnv(str(sys.argv[1]), 5) - s.run() \ No newline at end of file diff --git a/philosophers/fork.py b/philosophers/fork.py deleted file mode 100644 index 8e59e66..0000000 --- a/philosophers/fork.py +++ /dev/null @@ -1,16 +0,0 @@ -class Fork: - - def __init__(self, identifier): - - self.identifier = identifier - - # 0: dirty, 1: clean - self.state = 0 - - self.taken_by = -1 - - def to_msg(self): - return { - "state": self.state, - "taken_by": self.taken_by - } \ No newline at end of file diff --git a/requirements.txt b/requirements.txt new file mode 100644 index 0000000..a48456a --- /dev/null +++ b/requirements.txt @@ -0,0 +1,3 @@ +paho-mqtt +paramiko +pexpect \ No newline at end of file diff --git a/setup.py b/setup.py new file mode 100644 index 0000000..c1654f3 --- /dev/null +++ b/setup.py @@ -0,0 +1,10 @@ +from setuptools import setup, find_packages + +setup( + name='iotAmak', + packages=find_packages(), + version='0.0.1', + description='AmakFramework in python', + author='SMAC - GOYON Sebastien', + install_requires=[], +) diff --git a/tool/__init__.py b/tool/__init__.py deleted file mode 100644 index e69de29..0000000 diff --git a/tool/config.json b/tool/config.json deleted file mode 100644 index 84fb1a9..0000000 --- a/tool/config.json +++ /dev/null @@ -1,25 +0,0 @@ -{ - "broker" : "192.168.153.209", - "clients_ssh" : [ - { - "hostname" : "192.168.153.18", - "user" : "pi", - "password" : "raspberry" - }, - { - "hostname" : "192.168.153.227", - "user" : "pi", - "password" : "raspberry" - }, - { - "hostname" : "192.168.153.61", - "user" : "pi", - "password" : "raspberry" - }, - { - "hostname" : "192.168.153.75", - "user" : "pi", - "password" : "raspberry" - } - ] -} \ No newline at end of file -- GitLab