From f23aac175aed9e9e0ad6d86e2dad266cb5a09d8f Mon Sep 17 00:00:00 2001 From: Maaike Date: Wed, 3 Jun 2026 15:45:22 +0200 Subject: [PATCH 1/4] wis2box-1.3 updates --- .../img/fm-12-synop-form-gts-headers.png | Bin 0 -> 49860 bytes ...lorer-wis2box-broker-everyone-everyone.png | Bin 41253 -> 79972 bytes .../mqtt-explorer-wis2box-broker-port1883.png | Bin 0 -> 76579 bytes ...qtt-explorer-wis2box-broker-websockets.png | Bin 0 -> 77683 bytes .../accessing-your-student-vm.md | 6 +- ...dding-gts-headers-to-wis2-notifications.md | 62 ++++++++++++++++-- .../connecting-to-wis2-over-mqtt.md | 2 +- .../initializing-wis2box.md | 46 ++++++------- .../gts_headers_mapping.csv | 4 +- 9 files changed, 84 insertions(+), 36 deletions(-) create mode 100644 documentation/docs/assets/img/fm-12-synop-form-gts-headers.png create mode 100644 documentation/docs/assets/img/mqtt-explorer-wis2box-broker-port1883.png create mode 100644 documentation/docs/assets/img/mqtt-explorer-wis2box-broker-websockets.png diff --git a/documentation/docs/assets/img/fm-12-synop-form-gts-headers.png b/documentation/docs/assets/img/fm-12-synop-form-gts-headers.png new file mode 100644 index 0000000000000000000000000000000000000000..350d37456a70f178d375cd5118bfd32f08133699 GIT binary patch literal 49860 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

+LSy=~T#ePX=pG1tf}? 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 Q=TOj^uKios)Ze%MKgs$b4FCWD literal 0 HcmV?d00001 diff --git a/documentation/docs/assets/img/mqtt-explorer-wis2box-broker-everyone-everyone.png b/documentation/docs/assets/img/mqtt-explorer-wis2box-broker-everyone-everyone.png index 874b567262b6958c94edbd58c34eeed23210920c..2dd79ec9ac6824bde2df1112d0b57638f1650e8d 100644 GIT binary patch literal 79972 zcmeFZc{JBw`#$;>Q6gjJDU}8#L@84uB9+QK4~dMKB0^GzkV>dj=8{>4kf}@+GL)2= zQb>jplHpvtKHuN@oxgwU{BhPg)_R`DqxZ01d*AyWuIsw*P_3hCjPyM86bgk={gBED z3WdgxLRm4eiWYy_s$*4%|Dkd_p>}|h{f2J@|A)p#>4*}Ak{7vV!D1!;|LU`c4BRM` zwbkT5RQ1kjrzn)=RCN_4Z72TXP09=b*Dnud_kQ&~bxCNIknq2sB-MJ2(u*Pg{qWGy`u(rpxBj2}en)84 zCHH|qp}l*#oy(?ZSy@@bV{%NMaV*aN+GVJFl2gpMYI@}Djhi=x#p2}7OMZECe~pii zPqJgi31j2%4_ zYT-AE*0@sP`^U1sD&VY##}!SHsEU<6^{-#Q&b4V4NYman_xrcH-iAGUIGrmOcdzB& zM>Cu~k&qxXa$4o@&n)B2+>Ma%@XNXx(PG&*tm?0Euk^JO-MpEu&+pHU`Cs3HUqx;H z^k<^7{_)92H3>|Vdy4)7al0K~gmdo_H?N{J-j!bS`0-<}{hvIgW8&h%;{E1VD+e*K zL^_^2mBKY0F#ciuLmqX$O>

QsCs$pNS1Sb~Fw94liw7wPJ8^P~3Okz3kU}qhgP5 zG45=CPcca~G(a$Pc-Z!owY55@UPf*%^YP=y+iInSSFKnpAQ!TlO~ia^uvYbXNV=^Q zk3(m{>SVRZx>ApCTDrO-J)Z+MuUc`9Up8p#$%p+>#}t&jy-VHM@~7+1jlO#fYcMze zt`Hj=8@#h}f%VVqL~Qmy%dvYW^X{Obm&mk!y|FbEG!lU%>`%PPQHs|N7?sT;KAN4Z9|< zlr8fE@6oL^w6rf?y;`lStE*Z+Gu!81k1eSAe*fOR$yPPNfvI}IoS!y{&oUk=7u%Kc zvyh+G#Y^&j?zC(9wk$1IE-!`s_~DxTONWJq3WgeFm=*NwnXLA{;>7`sdG|pW+>9sH>xuyu)xLZnw07&77;N>!qx$thwHz zqN1~|u96?$Otxbey;m9@eIOTlFpMKqNzly9EE9K5acOP?Et3F)jg5`I!D8PIb1#R= zrFr{>g`drn)6+EWBsIQ8A zbCHU=|I;VxVeg4UKI7V{2?-QDIW2`|<;wQrr!DOndQ%NMD?^mxaak@bFV1qwoK4`m zo~t4f^}M;63D>js}NZrQPe(ai66s!TycU!Ndeaj?>FFAu3D<6;+muu@NMHUCr>QAlqr zz59|7JmP`IlF#Gg*JgWtjxmh2U)B^+hQE37;zf=1^3tE3*{0=o1^g_>kKC8{;ea`8 z5fj^OnB8vYGWJ1&Z?9|0>-G7C(YJ10#y;#hLKl7r%AnY><}LDIL8=+|`8(3;fP!akn{U#(TobeP(wb5?&}P zle;H(p4F(x;rVELMxNiIH=oQ|${wfgG>;{@MVqc7N8TSlf2L+k&=(r|s^$D@YdcX> zS9i7kXS3pR4V+PioWLcae(a#k*?tQAW2DEo_ZC>#A$4_$uEX70etrr?j$J|6e|5bc z9i5(JovaPQ-dYlq$;sN=TFZSrr~2w61#?=@?o?uC=H^}usfeRlD7WAw7^{pfInRZ5TF&EuhzN$=v{F;gE6OSi9M;)_-_c^4gDPk(SAv$Jj6QbJoxZ{B46{N>AwrY6Ss z@87F_8(+C;(yxs|pPnamNen+UcJ<^&HUFW{0QdF|ktC(4fa}cGG-kWrrsg z3ksz2t-BTnUq_3sVq&WQ{qrjo<-vmow(m2!PnE?@HU#;+xaj?TBGYNJ!{B2wYgWpslT4 z)zoyPbTm7CR3OWapQSbMYJebh&oj^9oSdCnVFRXj?%a`a8Kg<*s&wosYCF=n4^M)7 zOw}Wv@;s2PLp1&fo+Lcz_I(B4&J>;BN;j@wH`lfhl(M~k+%K`yYi=Mo?{pJS*;F0x zDtda!I2oe}Sov*fdyXI`!E3nX9FLCPXAPc8ee}qxuflh(KaffM)Jx_}!@}1Nq9vQ~ z?YDQ?ti@Y4e@O_)4(`aasuy?em1E$Rq>0<(oPGQ{RcY{ZEY}KY26^+@$$q7&pCY){ z)j^D0ihgpY{)@kOnu2r<4X^5C=vu(2$;)#6m;EFvPhj_uJzT~mR+H^|X55=(D|@En9T6_^7us`UA1r=+^!q); z37Zl?2$mfD^eJK{=je$OtPhXHU$cq#<-k%onw7{|P4q=R?e$(mqC2*4;@j1Mzyryx zLa-l1UJ+|wB_*n>SFiSuj@lKJRdhaejy&`BVWRJ!nKm71T?2#AxjCR59I9O=UX4vcGWM@-c-SKbsuS4xqkinLHPtu7M1|`#e&yPpUSfm;xeQ;iZJP;GI=-bEF|MWOWJB!EdSu2kP=>`QpV27C6DlCuLV;E?2}jJ>_Rldx!!i8y2gC2n7Z z#l+s2JC|}kZnr}sR^8g#YFpyBO7-WLriqfP>)boMRaI%bySrPmjP@jRZ$pYQ@bxR5 zprByN!-v9~H`m*mdFPr``tjqbhPz94brzhlVxM&P@HmLIIXF06fAHYV18!+8efXDm&VsF%E?r8{ z-sUp&dR@LU{b3D_8dE6fnX*QZ22tQcxzC;_Po7XHY$BTb5l@ce z>q0_S?cZ}b-E*RMFw>CiDhapn%gA^Fv55j=Vq!Aqe{8%asJNCwV$=NWg!4OJ#a+AD zcy~KgMey#SP>#t>T|VCOFdGSM?MPexlP9=BhTmH@DkD@g2d-)1k3uHM?RZiT1~212 z%#8a)r!OPMn3$46BYSSF>dG2U3T5%nZ2jawwS|?{hMt1wx%TtmP;vVDOdvC?YCfhVW5b5}U7+U*na=115(9xr+aG{g6 zoMz@r3%|McIPuk8;}1iszd!ZFdNHxJSFT*yvU8`}`SW{W8R6S(TYkL^4GF12665l{ zQ<`s|`zj=uUQ55fPJMscH;9j^fm;%H8B~$`{W({LH(`FSHxR;iePXF8(9UW~k z(w3_K?A(roHD2m{Zt$C4GaqdR1_y<|(1eDC1?px<|5>Cm@5nZp8_RF5p?{7VC->AV z*0P^(WVvL|ZGUj#hq~O)#$9LK-BsM(rLdDMyu4xWvy76Fom_u)%C@gUzAl_QP$`gh zy@-gagMn$012-I@*o=P5E;-fQvrM*yh6vBJFzdo%2l$*hr1Deq-*T+r$Gm>L+RVbi zLF@1DzfnX)SX6Wk9-jmt-1^p}gKLs!FFSGU^DS}ducA72>QqSI`S+Oyn-QSC)u{AN4L6c+rGU9iA2Qow7ZwL_W`k3 z<&1V=Y3X&Fk3CR1b!uZ$QquJsHv*6zO4+~9d_NQeJ05C?P1N3olp~zAv9Hu)4a(#F zVH`VJNa5m}_n}-$pVBpN_)?In|^3Xj6UmiHe7P~@H zcg!=)C+@_fvD?H-xqqr-yc`_7Vbi9SQU1M8hO z%LnD<<-L6Q@*>uQZ0yK2HuvfSR`~kCn$>)Yete;!p)VU60?W(g+3Bx%ZNGW*X0F@U zqwE|UNhoen%qiR1Z8I!#I5YJ#HadC$A%@YF3F(G8ip@hB8VA0;&x*(nzUxPqr5lFF zzZDbnqNAh3LF=U8^eq@sNA~^JzQ<{4RjG$#&o0cl@X33#kBp4u=H&&zpW~zP(?2w1 z?J8&IW;$K3@>u(BQxmcqm(h1y7f{(Fj_oSxn|@~}z1ykV)-@s_ro+{Pe$5&dPEI-| zCMMKjb+%@AG=q=>rKF}lZ*SLGh}bG7rh4GO3Y^$g-1|7WH6K5GAb13}(zd6xQ2moN z&ILFLahy|pJTap5S5{z;WL!V5A{8CH;ekZ0s^`zCP^!S1kdW68R0k7RN7Ag1A3u&c z>mWwMyw0Kux+m+o_V@4K#3y215!ak`W^Li3cVtIB;1y1yJJRIuBETFF5MX&Qw{*bN zz`#JpW0akepcW}$`}Sc3YFP5FA9;ra$G^SC^7+zfd#EP@A7*AY4uA0W^13a@wR>aM zM)jx2<6^{2uC^wt@h+O+iE&e{-rU=Z6fCBA0XaKoFukrdfEN8c%awpeY^JMD+1rQV z<)3;y`_{!CR8un=E7~EAq^s=D_%o3XbDZ213U$svIwp?T`};gzJ7kQFynQrkz6j&S!0K^P zflI9yUW;HMM>2FH;^pP$qemn$z+G2?sUgmzh_!h4 zr{&cv^|9mJf`ZQO&ZuAe;Y~p`!p9#8Dz`p$%6xXbhm;5ec^MfA6*+RZzb*Cfhi9HU#mp+UJJ|!(h}mKE;?0}2 zs3j~XGt-3vva%cld#GdHeUW`R2+U2d)9doRQA8bXMeR}uSXGl)(-M@b$ zHrB?~_e`PTR2lEgws*1eO?Rbt`8Xjrf!955Z0t}(=Y-_*-o1PM{ry5FSH{L1#=4#| z5ibnigy40FByw;q#qeTp;uRwiqmz@8R_rh=*ze*ZaWr1RarcA?oZ*Y=YM0+XtYu_m za3Q$?@_l&fEZEl87G9L~KLya6A17<5(}B;Z=KJVKUmpB1)L^;B_w3oT5!4Jk5wu&k zZXK-r#U%a98uipW!;`TaOJ|>5y0jvBfEJ+0X`@@bSEbZv0UOy$YQMg2ELMMO>q&8- zYx_NSVCRxMFK8mANqbV5u9ssv+@8Uika79_soQ6_>;(%7Ok*}tx>O9lGT_rAINdH_%5S3xZ^GndF@&qPMOL?+z|=e zX`}E&*@q}HRDmH-nJ_&DUORG{@jynqB@DpQFFSymPI&wF#+2xH*CQjDdj0-5PW@C< zQPKYMySt}n>fOm>I=}D3a8?0Cpi}|z(p*8s#N+Ad`QgKd+cZ@gNZVdV8)ogMXBhse zhrfjc#5Oi+qTEb8`RFLAx=3+HDihR5!|xumkqv%5arfn`S9!OqH*eTLy>{)|!RyMt zshjrf=}0jaXR!M^G{mi=`)luI7(+&x0Pp-CWMBiR`$z=qvLEa$v`2Nl`hnNrY7`bc zL!NtmW-^bbW;`TdK2n_uDv>mit?FwZ)$N3P|!d(Rz z1r_)Jo?MBK7sMaVE-jpwNYgofe0>aebud$X+VSKX<30E-7`9B{5#%BJXMKS}uF})f z!!0B*Ho&rrwE~;H89kV8pX{2@V(Z8;Q^Sox9$u3Gocf@#F(16bREsi`1I>+0)yjJSL;9;LJ%N zDcxn~*-+wJ{?;-zy>|IBjWNaJKYeal4Ulv!UZI`#E*~GCxc9W}RA2j$ z6@2@p`1pADJQkqM$&{o5wM%<}!HWD=O<{EVJKNkAfu|~^o>1rHJ=0rO!o{GS(JqoT$Hb$irdC{BjAFh%t?^BBGfCt2 zd5$w2y0n>~J?GBtCa2BueQ?kc-%sMj@V+N`c}hS)`f;ehjgozo;=9|8C5?S+JB`=I z1HL|GW0MTLcTm#|U=k_Lj~=~t-1*{@Cz79shDg2jH#5obM_z#?6WpN4=9;NVMf|39 zw69L1aI)WR7K4z5vMc-&$NYjArN%nv zO;%f53!LhXdNT{sESEVmb#*{uopxzHRri9H*20!UA|rzl0?W$EYWkXRRgiuq0*70* zYL)oD3WR44wk;h)Wgj{_Vc2Y_LA4Hhd)j*_wB=T|wcqobp}FVpZpOP}?K`n-4(Ddxu~ zn~;xd0T?2g$jWE@{QRv?tPiuZvxg{&C^4T!amBuFT_UO))sh6bh=GX-vrpb>qvVQpKJGEPPXe;n=o3A43ioj!VhpAK(A zE6`COHS-I?-q_b-*P*L(&SqwP+eDwh@q6~3r>k6?;XU2_AVN*xyh^EhARH`G|s@k;0-)t6jxqWqGmPNE%d-cHW4O-$@(% zt2&e6k$wlA^3A9y)GroN?2lo5UJFz8z?f%wzW#32%QPymwP>?51qq1Cq`=^ z-3H_~#MnMQN&Prm`1ENoaBUc9jj5O99nG;&H$?g5{tz$(T3XBpl$GtZMf6e=$Ennn}@N`q>?je1P!D(>OFs@7c2_zufGbt7*cwq3@qRUk(pvNKTAK z&NwKZGs<(Q5hiFHjSR%N%!>toMIn6o(WA}8mf&vRz0*b(*D+U~9u*ZuZEtU%FTXBv z&8SB64J>`^`*&bp4w40J*qMc|3zu95-zx78vF(>*+P=9E;osEA12 zm{g;Si_74x0eIxcIx96FYhP8CYPneA<48X)vaD80$cxy#WVSjfw|_ zjO9ccHj15-v%1Orst0lfFCQPo3jSxF6Lo_A3&=Ruf@?0RE9Yid$H5`oAru_Be(~&% zGr6UJIEiNicQ9x0t9&;$vLBxe=a;v_D6`?LOKn4Y>IX?VuuUKvk+<%I*2%Hs7L{0r*xWTYq3^eXRe z39TBm(bUj*0hixYG0nJQUcd+-3c;?Tqt_u@i~u7?-SyPD{?0C&>v!&aG+*~CsFbep zOxgtCuWJB46Hw&Jdrymdb6k3Uc7xk<)?tNUcN3H5HSU$QPN#!>dJux)08X=6cc}R0 zSi7MRCHQ}YY9OK!0Xn$$xo=U8;Q7lsVgtc#X0&S^ISeopuvZHLaa8}c2L}?v+DVI|L=5hDV4OehWzWq_|kky7KH7VAab<7Av%B(>S}@Nwhfvs9+0ro(R^9gCJ{ z-J#?C?R94-&&Y+W{Vq0SyYAJCr2ILBw-s{gW-u$XzHotK(Mq5|+DpeGW0CzLa zmz%cc7vhgNl12C77AllFFW0ar<@% zo+qiGfSsg9;3+lV9P^;sct`WJ>yh@aWrXlX;xi~uW8%CUB+ur}kGeYJo~7FxXxNMI z@G&<}XuZB=_<!|I|ns`^l^A3q6%1Eobb4vE-mwH)jRaE-G_ zZFn5XU#=dsphrCHN6xC^cZ9FEf=~O_ePK&~)>uB8V7J`L`% zv){&JC>35`{b0p5Wd5j$uauXUtGB?S_d6`$bO{RW#5|5cyvT02FdIM1%pgmgn+{qrf_p607Q@6{J?7k%F5@USexFg*qEB5ANPkBk&nb`u7r-wqfPG_jb6Wc6##(pv+G`x zE5U&yl6?OBnNV8lS06*S~K)^($LX$q;0=$AoV@RW}0xlJ3~CWF@_FNiUpl6yVl(&b zK=*!VXlPT}1hI_P7WTosV5gbN(wMD<7WVdQt{hlDb70q_^*pLT>jMPCK%Im?eDa=Y zcH52}>!`N_j-Q;GlK7DEh45LvY;0_}pA~k3bKnyLR<7Y7xQs|o;xV992sa_i;~(=M zy_yW5yP}bL05yEA|3qJ9-x&3=BQ-TO{kW2Ym5idYzMNNU z7<2M)ao>+58l@xIP_15@{@UOD5yBIZ1nlR3sI`ZIp$G{@-HtJBS%6_cS&76*-I*5J zj?J4llVg;YZvSlf7FDs^7lw1+JFRcoXf*fsR&)x81#KUi49K<|f)>T)_AQ0u&M14@ z-oC9hVL~ewh+Mb5ILVuY1uBA- zA!V!vqPbmd`ga)8n#Pz-L!~rD^Nx%@>V%>~d4ghA86K&%!q=z3zGE$*=s^X>=in<5 zo519V|0$nVesylVd+Qg&SMcme70&+ntRB^O{*LDR{^)P>-T&hc`XP}R%&mg^(23hp zf?SuxFM_*Vifr*+>(=39@+Ry7QUW9#8+N}W@u;MveYjZvM7;e+J}{^dh3p78{wSL+gf;Iy z;jApJ%a4hV=txwin;vanBhEE$E#vE9ZZ2eOccY{Bx<)GNBTw3kxPPCpVAU=z*idaK z+h$VmFaVq&YMHson;wzmyfYUMee6NpPUDd#%fgjn>WCc_{j$&a&oWS zj66=vv@8U70^Fa=p`%eEN5HI{9ckNST;f`r=4u2F5)+50D?(KW$)Mq^S6Z{Yxw=V3 zHPE)}&?sRkNk9nOdv~=&FB5x*-viAZ;T-@8;rf01IvuDF!#LLy%%P+Nlr$AW{#j4Y zJtfZe$=MxGHUW&B{P6?Mh5F3{d9u;m_X81~pru(4PJ`5;d!rkM1}mF!z*2#>78Z%c z$AG`rtbYWa>}6vkdoW$E6A^GhGzTLHuBlO(nymn)3T~$wtW3%?t{c6{LH`JRi~dLS za2%Eg%@n)80fUDg>>{EY0NEn~ZFU+^6G8ZA+3^ER&jm1*9RB@JJWhIzeuvzqS?(vp z`)rdiP^-d7KwApG$p3nGQs-Q%)7U9VZdwMei%8O`OEu~^%`OCB5hD*dqGMtPJIwrR zQB%}dZ%_>v=bq>V5+HHN1x%5Os;c4G`z$@M&PYVBE|0gRHu(BfpxzXn$!@cif}$p; z=w=c~edI$BVGY8nK^vzWzk)zc3t({FGCw!>nOiEIe4wUqngfKq140f)&grmuDm*Bv zthl)e|E1sc4x;JrP$J|4yWj5_NlQ!HdxLJ2?uLSdqc$M~j_VBS|^`L@DqK5?a?naf}7w)WCI0u;mVbPyh zubCP97zpu%B?#Ru+qbJA6@B#^4DcEvE~;E}s;fjCOovI_`YL$(sCZY$_FXW@1J{CZ#?i0B8s zykwwjB03CGaKk$*DJcy~KJw>Ix+&xbDx-^z8zeaEOUm%T=4a6eSC5=z-SBL z8syPny^sy91?Cp_J@jPkPs>A~>7eukm=6+zuxYL320aq7=?#V9c1zb_@1>p-*N_Gf ziUChi3j?hE+=&fThVB2|itk@XN9h$66#>Fopmh6C;)w6>5E2Fx!bXq~xlIhEIM-(KbH>^vg2f8DID$G4CW0qvN0nblCB z0@Pn;Ds7vX7 zAe60_lQZrfFYGW?wzW-r{(wmYfE+Y-I&z-m%}_2~X3>Yaq?G(*(XSx*2PBf z%W@EDjJmZ+r2Vygz`CrkJ{dKk#av)mAa1z_k{CYuSgR8zKPnTnSzkJg`K`Q z?#^fzI4azrx($(X!f$4xP?dwPC+eI?`I+0tH@#x@T`PDdm#b8=uCudq%cG#Z^gY`( zTYeo9FMIfXY^-L{#Kgp2&OLW`Uk*}5-I4|Zvpk1qP525<+-<^aLkn=^bSOzcLA`MaWeb|!K5U5YvzfiD4#T!z(=%zkm+1DN{yEn8NBK@@qufG}VQ%^D;& zYoM7X{|xsJx_TYnLyCup6%?3@pPwImJ!|l^j?SAy?Oz3QQ+D?$CAYq_+mg8+5ENJ# zYVsW!8KUI70W`}kOjeV_`{+aOA-6N=Kb~&So~L%fDeWqbIYW1Wg{Z=A=6I6?X-B_* zj{uVmK1skb$zEPmRMdU+-D<+cqKeki(h~Zz62es>fcdq)1ihh+tpU;(<0QQ5k`N%k zleZ1TVnmxAfbFRK?Preh6y^PMo+o{r#X`wlNEI zFB_cta?BJhpjy5JY~$%;&`p4sMTpXVxO{oGa`}$@TKJT#_Pm<{eF#t*dsuMpmveK) zUE=QEGpn`-FQ*9{_lA=&Ispc-5~+DpXrr0&DW}~dQRA(GqA|7wU*hr%e9LMqXqUHQ zIUb(({xe|0YM?;VKh8?Y*?hTn1|SU~(Ou$pR?NK^UKnow%r%lDT0QaSOPn)3Qo7y0 z9pG_yZL=ZF|BU=f^^&QkJ$;At;?iE(Y!VhOjo&09LJwsgD^ict3_#x;A3iW z7cFe&VJ)BFEK0M0J$)D6rak(Yu9MMH>F*!TBTbKYctLAG5Vgj8d)e@L7qg$f^O-2O zk;wCa8|d}=#F)3I74$f15rF`;=Ck~-uMW7JUW>mvj$C_8iqtW6grs2bgwRDpr(l>N z){pCX@}cH)c*a_5A|Znk=7>TU_~9)_cYX&455eBuTbutit~_Oe6mp@(MG_4|PEmHkJehVj>d;H)&At4IxST(9-7Z8fu z%_{f=eWzI}et+T3TX7fOdDG#TesX!zFDRrn!Zg2_y%ktIDO;Fg~Yh^HL;qM~t zG+1Qac+az`Znx%kyKoyTJm#xx+a8WL$3SC2_m&?mY=<+o^$KZ zeIzN*CMv@GmlrvKZcCth!-3s)^{Q1>?;f9=!iN$~I>}}tX7-?Qi5^jj3nlhdB+izQ zyr~AnT)aprTblnyGE0T|;pA;@55X!9Jc{>wad|acxPqRc;oa6o32AGHanPBf^XDT; zc5R+2&4 z@#&^Ejlk(X6%}_M^#=Qq${jaiI@!Vu?n-9L91>;8+|SG+z5R?q(~r3EgA5DkrDN&Y)W%`C2weed zT76)}k}r7d8hRR|>!Be$Ya5(Pp9%A9{Fr{k*?JpOjUG)Y z&)1Mx6O|qMbJX>)?fLqC`3n_&J>{Y?c*8K2xs1wwW*XbV&S!>aT71x`vL5VF^A*`! zTcm(bl0Hf?5#iFWxeL4Ne*9VTn9VUH`%ZUpfO`J>_)Rl5qPiYV3?4sZt+Wkq0NFsu z+u4mVeanJa8A3U+n5Ur@hcgp+Mb7Rl;P~b--10n4n%6U}ovYM>`plU#f8Rk9(-)Js zP_f)Ct0(r?&7PXu@0X*)cXyBTS{s|MvbqM>uZD$1iQy=0auzN+2N2Ubvs!eIoD z^z7=8XH)J%h5vt+7ssV=QBPO5H)F6!Z><(W}vOQr|DG9tYVf6cA5% z7z$|>g1|#vkGw&C63{_`VV3)p36LXqJvTiVw#NVdzV-1C#mJ4kxC>mc8ck;;3xr@` z1&X38fVu#qM2J;^0f(qF5l>8X3B_fZnG8@~*C2P#b@`;ausGXCDn#JkhCotEjMq|d zU^S?>SK%fBC>-l7Ttj*l0PSi4BStR*6$R+{6(G`sNJkDpk^^?UCDUM6a`TDf#{0jRv;*-RC#60TkT)=pwLmxkrwMP`bg(ou6zy>f5b^?1QOiHw zM0$_Z1bx{d!5~luLBPPTaeZeK6pRFfNu-95y+I061?(me&A7av)78*0fTrdk(pZZ= zNg!d#t?X_9$v)&+(f!R`3JsyZV@F}Hif1L<););Evd={WAxf%KU*0d~TU5eH^lg%N z#;)nGrx0M?1m3#Y{I?@FZk<{njbB2XMz;U*5`|zVda|EI6%+&jE0Ep==v^;UQPY}Z z!w7l;PzHJ?2TA#ElosTH0IXTGBq-gMI>U-oiJ&$51_lGD0ZHp3NvXqm_pAlrjGKE= z%#fF#KLTodQaq5h9HfBZ&^!)A>zOK{DEr%?U~SF4c!b#Pe2e0BBLjoPvNGe+`D}o8 zv0|lGa&mGIeuCHdN7`xXK&Zl2_j5$oGdZ~*L=2@L$W5{P2rE=G%VCago;3WIc=z0I&g##rb0*<7B7)L=NPK!2ZCO0a`FGXzGEc#O4;~;L*_!c^eF$ zI_>!1_v=_7t)EuddNY_I0aDSAd=W&k6@V+!Zw_{IyGV##XTjr-RmU6=x6neoVqjoE zHHYNwD6xoaVB`$()7nP!!7jd5xBe2h(x4f}LycJ=ydVJRXV((_^WqDQPosi^>AYvh z{~s$j8Ayi{18$6F**uxg8IV_^bB!pvNhw+O`%4^Y3Yz?A6F&fP;Q>+-6geLP98-hN zz#zzs@Av|An|aXi{wS6)yJu0k1p5mP^~Rk$TOo`@&B%31@*}^q#0)MInsHJ{{8LB# zQ^b+vbg|As00g}D0OU+){S8HH3RhM$d=$7GWN@jk3#{v^& zu%yE{MTpJAp&m`HGy+PGvMi~r?B2;X68i!rGNty%Zhir^C^W(VaA=Xajk)|;ed!{c z!VAzYt|i@{clBP=KpP7ku3X~)m5O`c^_bAVX+*P=5f%b~jwn4%7{FZ;6%t5)Al-G4 zlI8;Q&(zObfv@_Huc3mlzo+ocsZ!HJm|^e&rC^@xkOo11@frfE66ps4G5{mAnUI(} zdhj9dHgjw1l|a_EL~Gy*d_oo4cEtG^6d;Mv1rh1IUr5kK$g~0Qd3kvy0Px|Gu%v-R z_Kiw{io2QR@1`HmB(AUiwMyqJt!u@;lGqFW42HVr%+}MX0UPMq#n2yNYe~<62K{RdYL??jhaUdbZAiZq^yHqBdiTPIRItk1PlOu zK>3kwvDQ`=$lEN1wRCwxLhOQu_VncZmqb@L>Ik5?N0STum=?4};Qfe{6}AcEB3}=X z^R_Yj#oOI)A)kU8oM`LerMFe!4zEBm20at64wwEJA>njhvU?zr4-GGynVr9wJ!lTj2Je+R)25QS1^-Qh001yc^|z3@mVr4=D9!1AD`1`- zGISANScVW19~83F*FMir7ILb0cA5U%Yge~8*VE%1s&B@83|ekR@wDl`;>kKF(yEP~ zhLZQhd?fFPnFMkf)@8@y?z6IpV=}1c{Hp$|=MESKjcn?m5jA9B1h75c{7D&2VkbI@YX>A}CfZUIl z8~zSsL9jMCLPPR-6<60M?h?d0Sfqt#wfpN4v=Ef>XGzk&GBRoih_nuzBAmt4tIhG| zpl1*lDHQOXB)^;}pB1>Jv8l-6xUNrTBwXaqeFEw2eLYH2B~ury~iRgAAA0~5$#kaNqB?`$_NX2u7R zPIIDqL5dW2q|Jl~9f`t?tQXyKTSwzi96ka%R)owbURM+F}Ne1069mlNi zzn#1TA)6&xqt7}DU0>{^ZhB$&_`ApDr}M0P_!PIyfSrH*6mAp?N2jZ z-5@m7C;!}wt}|5W4VJE+sb>#fQm*bywzg9&;vk$h41ufH<&TvTY6DTmqRw(ZB&ZzJs-eaKFCn#AU zsX>J=AO8MMK1y8D*H36JRAx*hza@2y!tc*)0MMyW=u35O-oBjySqq53UE4*(L6p@& zoIwSS*0_|1!i?G&$u>6x9jt;}&}arA-jk|8@((kSJWo!ZCEQgQ=S~hqH)ME_6ikg~ zW;OJS zrH0yo5|HUwLG^Ly*fCBs$fYl43opW%TM}=HQBpM%@gUHVwf+4AlHMj=dh{Jmp#zu< z7a`ny?WYwz)IF$kFOgYg&^(Al>);wfS3&AuP=p7(z4u`d92trP`a?k0b3F42s~OvW z6I@6$Fdh$j2`UOUFOp1tNmh+`0fJ`-?P}6L0}%l}IV7H?bdht1;brWTL0NA)e2?(V z30aTPTOTQF-0Qa^un@vsnMwXs!BI?{z%T`JLXfZ{or-uL_o=_10!=Yxzq@sLM-WkTEFh|L$m``v0tqG@&r`#^$$w@;6 z1sP~-dOTe)+vcN`Qpv9f9k=Cuc4Jl*Gs@Y5cvGltNhbz4sN2SBIPyApO2-qX2Iw$E z3pIz3hzRX5`Csh4=fCo!%5d@Z9j{MEmpqA8@R2vwEf?To2SA9`LQQ-lI(k!2w17Af zieW$(rHA^Fl=vBSWSImPqQKcH;fPY=qzs3Kh5&U6il1rQm_IZen66NtiUJ<-spg4w zLyfCAv|*4z=RQgQ`Dxsd2o;HRoJ@#-MqLFkdwHuY}ZS#Ew#hF-X9U!%)u-qJgvc!f#2!q+uW%v}|NPoA~M$3`$cZ z^zRLr@z)1FYr#N+mS-grJZby)r2az4tAb`JV%yPc*RFZ}9*QL?JRBeqTQOXOVACA_ z7&m&=nl;Mt3cd_WmhC7WT;?V%DEoot{2lh8Qh+%yWbPp(9@Ur#fnfr{!~pP#n3zX; zu@sgU+|Une{`}I)!QV(Js>EaUU+Aa4G`Xfwv6U{cObSju2 zDl!m{xF7>$gvZpUdMNwDp;9cHAI%_j=(l#^xcK-;s4j>AfD^8Z6sk4#^&7D1xR2GM zIc1knzBR_}VIqC>znv%qz-o+F6eMgdx-e?jUnYa*NOcUS2Q|-ank|I81xe0?Hc5O} zlogf9*+Iaqm=j1C{P24*s8vf;4eFfLU>v1lO{XFNNv`B6Qg748SwY%djXg z#S{&c+W*PNVjrcZ4k#}FW!ukHhwVjII6+q>a+A?V z7EHz~p}&rZQ3+#8WQ+Uwq1wSRCi^h908pUnpBN|z;W3|M2FXgyn#6!V0qB2#&AtFq z8AjFygEYG^g_grp-sno3n|^zY*aCWwEztssrexNRj$eM-kG08Ij|$A{qg0`^W`WH^ z@;Oz;4{q@pl@0fL61z=b8j4ZPDU+2dAFkUqRSDVaWtoFz_o|k z7ocashq*Q`bi|`SvR&rTOhQ_-i~8Zi)vy!H&-pv*1wM+b7(EXualIaZf6}LX54cx; z19C`|V`*t=Jmtt8MSRytR{aPZO@9+02&Dz?^QZKV*#$v6TcQbM+Sm%))- zF3iulhBoE|A{GCZf`MaXst7VlOJwEfb)%sG6Giu{1@-|*1SXY=P~A?4D#-#G1zaF9 z7Vz(o#r+-6Mi67_k|P!9q1(dr01Sv^g!o`R>H1}1Sx>8z!22-&+;>CNzr@PPR50Ls zj3Acq`pcIu_hVS$W#q0zfD_fb1Ky@?SF;>7We#$+8@F!JK%WU@Ydut>L=B~{ub(Aw z^Ow9dl4qj!G;t)O3b@co4I4-Q(}(;mkdEVgW$^-dW*c_}WTC2&0ujd)e$!ynk?TmM zfB5qCs}&~UQ7(3v`Y@8#2^pGW{+c#TcUMAd0*}MJl0pWN+INWIxU62^+6pOM&f;dhV3MiJ_jX;ERc)|@|`gtp9fLgU>|xoIGQK0QMvdQx#<>VQnly2ZC3chfVrwl z7y(J9w7iRhN$oUW+_T;%xtZ;_s1l4*H!y?*h4!QpEL`u}`+6J=DwAF7#OzsMw^2=6T1 z7m{OeK{khi1+p&oWcnnbRhFV=U^sWIt!{hEk9Qo*h_v^7gJmWq@ z_4Ysm$4uli(BF{Chww|NFfdSs5z%1^(;T0pJH5Xr{ZV`o)b6~Hx3{&6Kug|4%L>Wv zc9BNE=~lI-2hXai_7lDaf>QK_gcr-9g9pz~##*39$KqTc5Wmo`Ex9-E#>5065vl@H zjLVjy{ze3z2rJtlBlE%b{1FI|@;d5kLfM*h58$$@hI3Kj(a3S5L~A=jA$lXp-xpvF zm^ZV+{cDnll@sQ`)(o(H3Gzt=tdFn*kclZ7H7xfzP`AXHS)T^<^{gFcG&x-{`9%A)#Lx+^!rMKDq@ za~{6S5tpe%tfeua0K|spbgUGU8_Z24Y`tuzl4Y*(@2M4^_Kg;1M`>Wy?xHZ zqZU?+F&x3bA@_5NlewFiYFFz@Ku2Q#kcFZVgeVnzXn=1(+qN3Ypq*sMAp}2pA3y2F z|H<2iud@{YiYn!_PudaG8>Gy@eL-8^W|JdKT-5`Qk#(N-&tOD*?bYfs(pGeF({bMs zY6bYB>E(9O$+sAwMU*rMN$5_8lT!0r&t663jVwo74R_^@R%; z2%o^c>vTWi9?{*celYtXz|Xu3zg$41miZkvSo$-dI$Dp3xrLuK$a@Hx27~ZTr46FU!0T z%CIbi5K$V;ERlI=k_wqpM3kXaW|ow-BvDccO)5zwlBrsTC{045&_sy_O1eM0b)MIC z-P`?a+w;75UR>LDUtXNsI;sEg`yIdI*!S5aj`7WU&Ts%ooGPj$Pn;q_#A&CAbT5q0<*Cv4dDY_R}z zKplVJ;K5&<^vDo!+c^;WHRf$g`-I!0*FN1LWi8K^UKz*1N6LOVZiP#c1|jC{bmxkc zFiB$334&qY&A!-&ycn$>b<@raL=DIp0m$7?RdvSo(Zlq!-wym-SvhI?^aJU-&bu14 zUT&Q-OEvPzfL&KKPE0X89j0$TxcErWW2k#!8``$LOI(|^##qJpdKc&`Nmji3d%59& zUHQb?BDWZ-a$BH=VJ_nvR)?=CsCkB504#9tz2;rGGhr9cBWJxu>eGrNUtBm@6AlodM3EqtHZOL27P|xwza#ih zL4hUFsd_`B3^h;oKf@u!qd;4B`Ch_`$XO%4`My)Rj#Taz-xpx(BYAp0FNz##nIyK{ zprt2GyPi}-B(H3*&N412QW~@Qd{XN@)(cz=YJH7q;qlZT@7ZSN%408Srvjb~$j@#p zpH0}U>h63G*0^KQ;uLA^T=N{= z;xfs--hTllgeXkKH%z#h#PAj8#ta0z+eKqbT=C`mt-4HMiBYb$I5vDq`?+)HB8k27 z?9CHH2hWUJ4-VgCgvQXtNfiiQhX_6&?VUQw#IQK`4q(V3P2A zcF6k*AtTCP1`QtEsgH(KxFHW$6yzjUU7bRw9e&;le1r&wnGf?vZhANC_Y?Orf;xo7 z+U7kgP>+p?33r$~C;^>0tivsdbsMnwadNU=+l!D`K5gyRz(pqAcQFU(vU}?Fdc^34 z5ySiR@mH$dc>mF(%U>p{Ws$JPdR5N5QfILoW%D$8!`Gygh{vQ!C_)5rd5Op(|3<|Q)rnJPZks9<8G`8lIkY#E)|Ic zzZhF=Yk@jJ%Xh57gtlbhZ&pcgYYPdZ{&XXGc@wvcQ!Zc94H?5IYWa4>P45E;Y1a4K zKBj!y6d-ABDx;mx+B0Rb_&TaS~a2DxHx3;l5HAm>W-Rr@%8a-o8?G& zz|R-XQ9^?593Q>TNBg>Q1t;Ja0*gQ1ZZrJ&o9wV5R5EnE0?G)RE%7UmVz7)nffgg~ zH4b2#*bfW;!MliaZ!L92)%y`j0Pe=M*BI6}*{KTw@61BXYv_zGz zgW>x@{sp-5-~Q-DQ=3LRJ-^S73k|L`7To|EKWWBlJ#ezU#tVJV}Ylr z-~;b%@xegy(z({$bCZeb;d`pqU?bA?sx z8lOu=v#h!_OEc0t!_N@fQb7z5^Hja00iu}G*KaM9G{??usvV4M((*={UH#3-141Cs zC_J4M3#At7XoU1Udj3Jz-UdFj^Zq~4-3mmVB+f`~oYcziXNP;AIPpj0_u9mQKSM!s zmhxh&cK6gAKu+5#H`uo*Wa65L&D>X6Z?v-uz4)7HXTuhA%A2n#TgmxFRn$Q)Gmwmi z&xd;_{x*)Yi* zo7FvXwOV(Bg_y5b_0hGK$aiY=p$e}!PqglxwI2vg$==dUo*k43ci#%`fSBq4)OtZe z?aR(l9e#tIjIMpeVjA{tBu8%N;L`T3TX*`b19nwFL?C>{p4>g}>4^6MzzR-DpOLA3 zV3C)!`E|8Ao8J98dbH83;zn8~%iN1AX>pH~w=BMY5cz&fj#^Q)A5WXGNUP)~TeWpB@Y!Hs^9QJdxSejV;h-2_FC$QprCQLf)LO zi97!JZs)l&M#J^{*MSNFD32_oV!%X|3VoRDBz53!!XIR8N;l%Y;mVh5s(vtngMki?V=gCT8*0+68H{8j|>4v@L za`%Ar$06@4DmrjnlvvA6MLq~kq0R+#zkhhpsLnrSo%wd*_a%{{myl>%+E|iaha4Ni zF1!~}zv6HU;arj|KdvH~RgNx`@)Flk{!DJ5_gee(!mWbJfNKvfoimup@uMe_sMoh! zh<1zaO&&ZV;?Zl;gI`ZbNZQ_)hnd?ekiwNKSE@b?C8G(4e5b|BNm}>d9xpk$a}e%C zNRg3F8Ix=8e23;cIBN7Tu2-{`Z9^P7P9pL=C|mJP@4nSuJb_?4hTm!_pqFVpFg6E9 z(fm8pwXW60Qj2{p{#y1R>_+uPoJo?yBKw#m(z1v;H|zBdkB!OD1EqI1Xg^F)(bn$H z0ZdxME$Yj@OzWWiY5zGaG9ao=!+GbrZ)Q{n5@|)~QujmP4gCNY)Xd^`&91Buz5*6cJ1b(<-nW$3QdmDqK3b;GoXk`V`wdX_NlT z*#(O#>hpON{he!iNK_vnl&oIP#PEyNXVq$#&n7La;IC=DrO4U?j3?iP{kGr^IOXDx zV24^J7ktZI>prQ*A3V{VqE_@IP-ip0wc8*0b`z_I3w?{HY1S_nCsf|;YOD9k=sI2qa7MMKm|2h+X0ss7KTAn99XK_?7yVFv}3rOBT@Og`? z8_yc%``EFA9kP!#)dF^)DeOLW>xdh5r9+@*o3joS6o@1?IImsu;Or0R zbkhiEwxKn1GA1;a-f>)MSlEFQr=QpYQr_%zhQAf9xP(8``U*t;^zu62^oKjGcGO2- zu1e6MT4llDhE+UhdIPFDS=1qNQyw6uxOhGP1kbku#|YK~h+|zk;2FYzZJ9 zfqhGWsFWZfjhydHOF;ePoe+!~JJN`>#S_jSjksDV>UavUu!W9 z9uwofgd2dV{PbXHd~lC2WbXs9^bx#baVN# z_o4|V7bH+@lfbraD}#=nt&VBn^42p7hVXy1;Or!(DSF5BE!bsd9@-+tY3r? z=iz1=Mp$->9S9!5dnKPIy58A=fB&ubHPi?>bVVYgDkn*>JpkuANMbJmY!F$&p4G&q}Sy4Ega}BrO1)iGd*bk z@tkw2b+@muDQULb1$D*8|M?`|T&y)ptwNgIZDfx1#luG9)A`?ndo$ zL-wP}#KwjWg(-)%p1VCkM=A&#g6AKIn@8`lfThLs&r4rVGFg&tr0P|ipO~0_rwUiQ zv~0_WYTwd7#09C0m4=V%KugKjOu9Ip(?^8)Hc<(yJ}H>@xiZRbjQ!h{4z1r4iLg`V zg8|2mGl)M^2YkTIBsnP}ccS+xmm_;u?0(a@4^*}6#mAhqs;gxPXszsy2;nC1w|Hwe zP0n6@@n9*v@*g`-?(gmR_u9RkTPEI8a(@@uwv|eJ25d@_*{OFbMo1RBJ$Qm4VA07J z=awY8h%QRnsbA7AYrJ;10N?=WUB5Zb+vT{iz{qoKf9c-cswVfvg~Ge^k)?TQGPP@b zhLPsi13^JS$CU(vUZp&g_H-8U?mI7pxhNNxhi`e+D&F_@g9mNsbCbA9vsR6M^7uO{ z^u4?Ycg(o0qG1ZULC`44B$pV0%LVuqRUb8dLuCE<5kjG0w6yH@lJ@xN`!DxPaq&D~ zd*LpCwf_U!ijt2EJ<*TjdQ=c zCcGV7nvlH@dn^xuHIf#JvW6gzHNSj8B10z=e$i%|;n5jqO%~-QI90M#0g5!#41s#?;P4jLKqn-=#$@HI+!Hz;vq%9PBYoyr4MN=3Z=} zAgZm(z=>+!l3Xya^phi`>dcyNi3gJbGn!5RHWs;UzG`shzK6}WH+0TO(#9CAw@@ya2 z@Q;xclmG%o0ksayJM*aO>vfC{LtpMk7i~DcN|}pI!VC=nuyph9_4$oPxsL1ZeVFsY zBBOcDf;zoDrKT0tF*a|Dirf-@Yj>~g&+v-PMDxp35n7p7%#JZPAEN1Z{$9vhsOvlVYgXU6esso4ug7JE4L6EcH-qiaBM!&jA%dRu;G~nKDt**@u3Q$GbIxVD zQl6_)|Bpd)n>!(Bk{XkogwgSTdd(OBT+SZ+*ZBu!3p`K#>?kpT>^cy!zs?B^j=D~$ z)p8UD9Q(@r!w?SW=gqrU?N1_8z55CW3J4|)o3Va{k1ZC?NR8Aie8%g=s0Cav9k!2ej-A zW+|6qJERXEOyUel>}^CMWx|B7t*MO4!M#3xmR=qCRtJ_}$s@Sy%-to<)n3{S{q1vJ zNIQ)zgADN?>F+O?G6u1z77*pOpdXaZfndp`ACssoaPro}b8u7_PwGEnL`V3p{s>v+ z3iKSiwIl7KM38$P=*?3?RRdS%9p^s);m#d=-wFx>F%T*o7dgJRU)$c=kOPOBZlnO> z6cd@3nC>Oepq6N%AAKgl4ozFfuLz0#Fje2(mw*j;A9jL6=UNOOGNkir1s0RKZwI14 z+p;qXj!Xi;PY??tT-{2CRmtK|PCc19FU;ve)C>xGnAig{bc!umS_dgAgq&wYo}d1! zGK-~=t=^y-x>vH-agNcXs(=fZFYAd;kuiz1u&wP_v7lMQ zh$x@&QN{z3Zm+!(%ZGbdbMs8AnK-qG={%%X${jkp~Ki!5I^&GS&yKlx}0;y4%K6_T^O+78crE_s2PuLNJ;e!BoA{R&MUlzWqMr z)Q}P%pDsTvAweQ;Wgyhn@d0gKl?3nq4u6dxcIl;jq&bxWw?gW)uy5hFY|5Fhl)fSb^ip&b{(>mISv$V z%g}5)L=MW_`~4dXt0XbAQ5U@5Y$!q!G3D^~>ce-jYkIkfrfGqu*Cfsb_zYg_55*OUG6W6Wz;)K1ZwoN*d!Jj4tdd5@%jhzJ_eSl zjG^_Ad4CAGk2CrcBidaXTYz$yE;3&RF^kZ;N~_`9H<^HRAmzajD9iKbhUB1Jys+WZ^6U?#lEjn=cht#XPr90)YX z^%C`;L;xdgk$64{$Pfb|4>YObKdFu?p_@Uwv2DWw zv#L$3l$TyS=#%#N>B77+cdeIymd~iV850{D@p+tua@}9O_jxJ-zqAA!*L1OnI(XIW zLhRYKJMK*@{+{#e&OUeS4qOq4noNh~{pOM#gjB3w!u+tzAC)=6ILE_O7k1VL~`xC)9wX1g1WM$D9V z)-wXhnF>?_xvnNP-|e%tNMTeSG2DDx!xDj~-K z>rSM9HRhSubx5cjP-FgFMl*^WIxW-ypB= zSfO>Neghv&)Ovmcdz0_=-k;`@7eXh=CJLR>EzsY^GIc-2fBU{Pr$RJKjODLEx zaHzvn4r!){A_?@Ko{<3}9{3mBCZ)%}Je=m2FQ3IKelvdIV$}*sk(CdK&&=m~)c5W$ z%DRq;AM+1owS#_4eaRoMcVD;^ew8g%WGLYDU+U^CaZ3p*DzW=A@Qeps+Os!csbv&uFrPdf;Y$b12N+;k4A%sQ?B>1Wz*X4Nnt@yrMmv&z;r%X+QO-^t{d@>!YITIIv?_2eMjQ9Fw>~ql&s)PpE?Cm&vcOmpWsg`8xl#h334Wq{6{br`^aP_K%{Tv1eaNsw^{XvYSORSmmHC?neu+f z!Y;*)#j-6#iM$?y)u&c{5-?gVgHBo1c=>e^Uokx01?e7ZDn@?h`ltIt(zRndNtU9$tEVp z?>P+kX_t(<1{j@4Rjo)WPQTYk+V#r*DDS3uwaDglnA76NPe#|}2Zr5$!qL=5?h2x< zBaCk%YVE%XnZ$e1f#c)7+M5LF_hAOx|Vuaj5Bv&GV>_nBEvpSxv&8( zx#}JuM7afq+5KQw_dopZEzVy+rT?aw>gB zisQ>^_*-dWfuMH_>bt@!PzQChHWDAUlM1Wx^l-&T4%dJA@`_EC!AMiFz{_BYOdI35 z{!_wLS%o<2z11Q|ap+4?W;t?INq&w}e-G~`rJouMxv;H&WKp!VPfV%XzWCiQpR={> zoD8d4zt3X0+4`4jkL1tGUu@vBN9?BsE@BKQ`KwKy-6GsrVoB#l8RxnspDgv5IVGbg zsOb)PYKC6TjBgFKX@^3XxfO2Xvdcy-YJt+EooAV{%p_sM6MGV@Q~}zhRZh+Xffc}a z-36?QcB-|-TQ%}aFI@mU&NQoy!$q)?IHbDAv9k>L#j_&EGwGkAW~nF)6MBGrw7=98 z2R3<9dvSEn`-=^~F8kxf(ocVht%^rgC1rBQ=29OEa0#9(d1RMPmAkh6Hg>6W0$2lH z5iu)4o%Wh}Q>tRzMR5uV3y|!UG{e(?3CV&C;FBthPU#(f(RVQECNjK)BBB{*qUdzd zPD1xvjV_{^+}(ZY7q*hSXNuFj_R5T`Hp8#a3xA!OWoK{SrSsL{7T3EAakgJ~6^$Fu zjfm#YTx$})ET`_Z4~WC>OiAtj)02VcT`|@iIufl+FWxzLz>V!+FX|UOs)KYqI63ep zS4(OkDq5MkC?Y3XBJ>z+gQDS~-w};!LB}O`3J1*IKKv({jw-V5?bN?0jrJubx<(9{ zpViBI-?_(r#mM*)2~v*r5*pY{ZK}*B+FubjXF$Ns6$^UJjAAN_XTa~~p$4i_ z-Tfmi*{hwt-=*M~oU(vABnbSOd$frrq0f5=PwopqDpGdI-sI+&tWx1pe}tba;GS9T zzD@fibDY^uj?emakJ8aT$0Xeio6*R{k&I9zd-z38SpT!M#L_3{-l7dm$b()!l#e zYuc^KTvt8?_I^VFD_j7q?di%XmQBmp5e*=lVi|;~|og(Vsv@EC%tys|& z07ioN0%pF-Lvtjgn`OXE|7+_&$%O}!wwx4jwB3>mzO^(ocmsd}Wz8}Mvwrgnc6ugm zN_4oM`VK=A#Om-vNITl$H&CRN_q(w9=2@NY&~SGc&&M95@6bv8T5c};Pp#d4FdTLk zn<^KsgN)jc%V^iM@11+oUT*(9+tcEEmRFx+)JS4^!ih0zurW=C$mIxc6>*A+=c##x zH*Y>}_BX{1?YAyM^%Y0^A1fcm8E@HUD;S{5x5{bw^i1MU{DCi3>}*j9H9p6ipEyu# zD^rrAED{vVn|=v9vQsu?zO&YejuQGIs!N%?PJ+RKNs?xpRbM+(#Z%mS$XKqWH*e3T zZvr28Z0Mqd;-`o8Izy{xcSiW^Ajp8ZS z@7uni(U+`R>#;NY=Pg+=+1cL*DU$r@J&&Ay>4wm}$|ktzec%#&$tWf)A-W{}6$*Op zbgjPe!=4sOC;)##JY-xWLHGhGSVoRK?bQ08cqK4IO@aqh-mS0atPWOx7K?zMLu-VoF-9;^J#pvs9x#+jbY!Ua2w6?FGB?K^je?;Wo5oZ|ciU^u4@&uW zP+*=S#Y>8yR-E8B@7$SUb_##;J7|r}boZc^sjY0RSO#{4>o*&3tyI)jw%vT-|mg>$d}RnJ6v*REXr^2=5JF z#xTJyT*9Yi`+Il)&(GGWc@t#Bi~(y)P2uiXU))*iF!Ki$HjtCX&Y7k9*Cyis`Mr;< z>wY}696GeX$>$fvFi7_g)lDrK3oWymg%=?{zAv9<(0_iKbHotK*ef6i1oeH*&4=T< zm#Es0{{kOSYANi%aGOmY$j0%?YHSUT1f8LW#Ke#m|4ycy!j`8u2pbca!ufh)?i))Ud zLSYBR6NP6bfw8A~9>HwA-ZwOEb8?yjM2xC|KqRk7mH+y(l7P;IP?(75MKtj+5BQGf zo0|Syd}P{8&rysN_%9OuL)kqTf3gqDjEp+_VcyRy{*Tzpb`1J4nC0^VwQNbL<9y=E zD=V8QfDr#MN>WktW@>qtX3zugMuUOt=6JsYA?p8Re6U?9VO?ke;b?ESTSBgZBBVQ$ zuy86JF}YDoRNfyFwG=>)(L=||jm|!^o%`>Y4S4}GHutk`rKu!6qhr$K%-Qwo)l!8W zdO^1+aVxVIuV2PaDCob_r;a`T2~YX)d&Gv?&)+Q~mj5?>QPCmu-*x|UB?IK{TM&9w z?Zz-pCk9u@G*S^c3rWA~;qfL4^fXrPP3LmZk_G49{@*)I=C4rkGB{7+CMV3<@G>Gs zT8L1F&I~)Int8kbjp|hlwtk$NI+eg0a0#rD{aNt;<-*?v;N=lf*nosns*Cv6_&@Le z4Dv%6D%lTNs}SZ=S-rwN4*PiYo_)E(pA4g9wi8Bw8RU%7`cF0pQj6H30GbGR)BG>r zQ?l=QYhrz@)bCwHON3WUZ0FRlNozY!gE?;p=+{(1zPpGtx@$aP>Io(0jV}dlsI-ym z5=4`T|MRYAGHZ;EVB>MyE{;du`kO?QW9Qwk?B zl2P0UF!v8+JOTwHOGp4ruvLT_-Zxs{M#Wy(K>@6BpCs6HKCQR^-Y`T zseD-TjxI)2`!aY|y@x&CjofwZxN!d#Z<1)sbn(^-Jh=Zx>)_TG_k8C-!Z<9U5QgY2 z{^Sumx?-}!7DYMgIERKwygfIU;SP5R6mEggszhZ=l3;62HETu8FL2k7I1WDEI2V>A ze?lf93|Ers2q{#jUcH8yI~!B>7XqVGSKNkr?_L$ys%5hYRgF)teU1w&z1vt=(Pr0B z)q-7Z)V4P1+ND{iEitoVG$PjCuQ`8ieZ8*d+oSHDsh3g>MrqEzyr%w)$EssjXPcI{ z*|qD}iwBekg&a7)YlEw6+uHAO``hd~T~JxQeQbG!}3jDD$P;{FL zeVM}txI}UVjH9x#P6a*nc~m#0=X`B9GImg{Me_;r(>wHXqL)uY%Rdz%l32prlZp&o zTy79K7C>EG8ebL}6x%^<@V|a~lO?dI4+EXJu|b4jBVumjn|cnZfIfN4*;6`Z3QX+smAUWXt{3G|rGr@gFWf2fSQ4)Yf3M?`&W?RW&suW)wts=gCw_PEb;~ zrnjatgN_^)C8GrKSr{=}6wGsdV1S8NJml*a%kEtw`gZUhd&RF^m(HLX&S}+WdjJs2 z@=m;vTBjG`O{|W-A~9)3V#9~^eij|Ze%v8#vANTSSa?Z)^wiYz4af+{o?c?vMP60sxvIk}pj@NQp=jql+It`z&74HeSQ z?b{y%KUAD~1QhfVV-LZE79e=HW_B<8(iti#N=wEYZ!-nIMv4%LcKiYLJF=XEhY#n# z*a#?L&E+P|X+B$GCg#FLLlxh?dsm9wg$SQ(_JE5K773;l$cD&~-oAd_mmQFd86?{V zfNM_(NANmwVIMlXXF(S0n;N%llEC zKU$QyNTXe~j$;23N&#{V4R98aS@*`o!as4_HB3SXbLNOX4#%AYH{i)Pq0shl0ErBx zCC@){hAKG1BziLB`zFV^T&&~9&XIH7YprYQPf*zeqLF^e3Goj!x?RJ zbW~*+gz!7`?1%w>Yd}U2`!c+VcH*NoZhiDs2MtOC@PhLg5 zUtYgT7?S3eax-UabHD-_biolYEoXy+%V^xm#Js+Cv@caeW}>SrV%EXG{yGubc|Pz@ z7TK@4Ye%okzhMpnc7x_7f_kvb$0qVGupdP=vk+_&$!lJC;v|sIRY%*wsPe$@s2ipn z;0N8^c`xU;#h;(0H8icBpP#s`K3=X7CwSLiemM<;5lU+`WA^MUxWr2&-smr2V$ilCU3+|oK5@62S34EJAmM}{NSxP!MlBZG!11W6B#n=Sdd5iPjmApE5NZa^@?@Y z42V$EYnvl%6RM3EC~wABDP^V~FL@NdFb#M>pB@q!HyP0fgPHv+ms1Vg zJoD&{#Roo`Db`Bh&XC2nSEm}AJ9sfQ3eRyS&?M_;$hdLl1Y~@wsWGy%iv|%7WFhC- zrSzh$UI5Diq=u|B`m%MVjf`sAp-`SeYEp75*IH&KUu|J>+8oHTRc>;`onW$ zmKZ2K0H-yRJYZ~@_Pkr8M zt=gbL8+2RpOrL>TF+dD>HAB4xmDtS1Q_8cD9nz&~RF`B-;|tHp@nT(NQc+_42<12k zu4QJ98;@P#rM43@(g)o-9PXP(j;9q?Gsl8I25OKB$D^#f4$(;zHg%n0eCq|&bBLkd zXAXO)#xuv*>G}K(`jnMJkA*!cBfSQZtUiAH5sKh_3*|d7wU|o_dVYp~rEHvolweL7 z;W)E8tISG+zgAtpzM|!aZr&=!F)9YG=8RjIQ>In5{st{aDGpD8SsDuaG^W9kpMfK1 zckiLamsC))k1{eb31PK{@S|$iRyq*s#ZHw$4efV~nM;?G8+z|J7c_rYA7ia+I5Q4M z#ufbRQ1T>cWt--1Neh;L1!Zw~^LMAtN-mO90<$tyXV#Sl=q3gp({dnpu8ke9%#9o25bH`8wq07l%J)t_MYeF`j>B=k%6LRU0%E)*!-O}&1P^xZhA?< z+)YP^7v+PwyEW0Uo2~k#vbx%fXM|V_vzOQ3y?Im28W4wStb+#uO$gFtS;7`7yRoI5 zgA+kZFy|A$#D2-Y%G0ZK%RO~f1~99P#~jS;-bwW>N`v~kem-&uPjc$1af=7eIr%5w zfO%A>iB>4y*{XLM$iEkf_Rj`t^4WF_VO;DyuG}T0?%o}eYAf=ixN{>G58d$BngzG! za@xtparWFfRjjJqV~>j@7|H>~ase{-4$=usvYgM|SeVqMXV3F2xiy^9bD9l%zIHU! zoBS4Hu}`(N#z+8UvqMd7B|lNY?DBAyzP9Zn<%?WMrB7NF9JCO%0|pKp!qm<+8;VE; z;z1R=gooOGtPGq$+uSE2HdEMe7Om{hty`y)&ri+p&OTuqz}32!*B7xpVKm?P?2*^A z@+^guu0?BgYo9$0-ZXsh;Q1W13;WD>OFGTQUIxR%_$V)kD=%;FVCn`rc64zF;9H5n zoJvgqW~HMVz(&L!AH;J719=oC9MQoUv>v@kj3#fojvTT}oDwZswUR>2I{ozCp^9!C z{4CkiNZv}Yh;!Q)GHnT1HVitO*kmKL9-k^JLu*|IsQc9qICCTAHUe3;vEt*85&~U6 z%aJ6{%XcGk1|pCzTSGs@mxhJQ5yK}VPGSZUA*r)?iZeM}&)KuM<9^Sqt-GYl8kHxS zACMELhIU6m^4KTmj8lDxJ>+7};#k3nI%(IT1T zPOxE22QymjhaT`v*z5DjvMq3iKMP^_nlr;9HY^K4Ma)_qT&us z?Y1X%)k0u*DsG#hx=~bI8ssLp6V^$soLn%<$kbHUObM*`LKyj#v8I{;c?qDsGv>_M zyr^5wG>RN*2wd#MaF1PX=ea?ByPm?1ZM;bdXRe)YtGUNVOp-6a9(yP}hpewa5lVpP zY&e-%c5T>>bFYuIbwR0ml%tm*ah|K-i%*^`00Z8FD%_@8~3^; zR$(Vu^!-CaLZ&Bv`{X8!QQoG<VaNgK$#`+xtP zM)i7*im31%HEAX_b0Alf&pjKOV;+-rW$r@W=I86=N0GdQBL3;F)gtY#*~VLs0k&|% zo}r=-m4d_aLvGA8NOY2P|HQ`}-CcWlZ`W^je7s_DnJQ|UP;?@>IZszK4&GiqFn*Uo zZb`qfmofy>3X=Qap+lKyRI8vGl(+1hc_7O=3q?T)M&0>F1c$s>%I8WWJ);Z#h_u8? z=$L|RdHaaoTVFL9C$q9tRiB_YKI-dh^CD^LaE9Tg$KS&tYtmNXrVjq7AS&?bM_g*J z<(JU@NI}g>f=TNfBV^}`N`Ri)#;lPAz6Mjc+-+uM^+td0{I63-&UrM@ZoGFXEHixD* z*-%b&?)wbGxm%zy*O;}i8bKq>DM&=ybZP8>73{iRy>`upuuZ83_PT@2b^LopQU1X22F zwiJu)l~aQ|hxs*_Y$GnpkU^1tt0unP*SilpgEeDU88H%xTylAI|9h6vu!) z96TDFAH{hTK_zEewrgwhJYZL>^E&|d6op-~4LyinLdH!HTO)#9?Nh6=QeZ>F@jW+i zw~w6Ri(bvHNcpmUU7xljBAlfI++=!1w{WwA^EAHj0^BtcXQKZEVc#&DajlwKU{vMP zX5`OtsL6JVZD+JTCbtUhg-%1mDccQ2JP(=OfBgnrl*xm4o)SPOVlky8u!S@q@Zp+j zN*|=bN3$$U@uhXWKY#vQO_B7#H0A2dBdndC zDK6$^p}lvH(W?5Qpb*fvH2$&;Ac5Uq2AV3?rlzKTwNsHviKT1XhGu5XA8CJS-L|a( z+XD)&SmcDuCDiTc$&*73^X^iFjq!S(@{DY=G%Dd<54O+)UMr8E>H77-5;!-NlurO$ zvH|;O+nwfFH4FMAWj^}F6%lV&Ei!DDTmIr|O!m+3skb~{1+!A*4pYd5mafn2J`db} zjO{6^FtheAd^rgy_-N?DIbo752d>_@9aj_pL$wz>mw8#7;b`B~^efL(QzMc)_tk$! zMhSB7FhnT~Ww8h=y19eW5GSF}gGntu_T{)h5-@>+ z$exHjD}ePmZ&yE96|)Babo|?6i%))!_^^A~1U4K;s5bQeeGAX6uIlACn3c{4XRThl z{%VH4K3=B3q^feR-@H7!-+MTd&EIiFf(f|W9Hv27 zmwRz)Sp2z=m&&(YTytn#loI;Cr`kTtQ^Rq(hAWk9sWAKR9<3%I-ItZ!e+{5XvL#!T z_V)>#Kvb7=-qu8K#u1f?c`Y>T(^poW*U6LbH5Asd`NKs;jj6c4P!2AR$OwR#;D)Re zKmaxsH96s^J(CM`SJyYS?%botVEy|KAD&kq;AmuYtk48aow0jB00$UR6hHs;(>!3E zg(uRljvY^B`95x01y$^W;0ZrGs?}xHJe@<-)#o!jrw;XYSf?!1%-+%B^(-@gvVIu>D7yB;Hd z-|}+X>WE?bX4}41rpV^Q?=?>!D2m`7dhcmEKcuK-LY)8(4-#4)}mn0Lhuu!a%Hk{CseRz$2U?~NeZIyu%kN&TRkVo)iC!(5 zH%ChtnVr3sC^#cz!OYgRPaZY#R0(ADL}xiEaAm}xMytM(*f3l6zBOw?sY2PO&dAA1 z=YK+u22Oe1%R?w~06Y5Md;B;m+ivbSoDDguv3|pwXtZ11^P4mr0A*p0BNrvybLKhX z;$_A=*a#j1z8g_#Fj`a7kOWNw!1tbgXK@Nrh-kne%dzUw#A=wL8UO$pc~z*2=v?Um-N|+`7P! z$RdQ0o8^3P}eo1gzSC9QuspG>h zPg_k4sz=#QpqL)uIDJ`RA*Ncp;p~G42OI|3jea9gJtJ_$V!#|tS~_#%pV$TiqE~F)`Bx* zA+?(QmyfSUxgf`w$zO~rf0l_1AY72^QKJ@e$vxiID0X9wIKJB1s!PX?IAQw-8+EI> zm5gsXi*=u}(fHB3FCl^(N%89X{j)!qQWmGE^}2)++rMmZ@2PW9&nAu;1Um7R#1=0S z2q~=TQl}grYX31!50)ZA(4)XsH$uFP1 zhn3C{OrGi~*k}@a5aY7Lwipknuh_~l>0Q_wL_pvmN1CCz%9hUrjFCCXRG^x;tjvj; z_DCE~wF-ndXyCwURI7GltwPkawM_)8vx~MrmLJ4Bvi0=OdXo3xW$F-J-MT}GDaqR7 z6%@4nIK=3DRKcN4-fT5-B?rTFv6s>MKWumeENrw!D9nDasKtaD+m`s8r94>v6*rt0 z_>EQTz_9YAH3MVVMUClDiQMd!cikYO4+W8rsDuTU!vJWn^K|tT0Y9)z2x`I}y>w{g zrpr+??{O`IImnc|QP%svRVS5?{C#8cHcEA~9q|_|b5`yOq zJhgQ)4PrcGY&GMTH+VFe_5S=W|I)m+VOsmI9R8XC#wA1tP?dwD(z-szr=gqXMA*DH z*FqB|3<35KYkZ5+^?k1jo**@z=Bex1-VNjGt4az#sRTyy6l)TJk_qkS?pCG&qag@Z z+?ONiqoEI_^U^%7CGethjmg60z57t1OJPUy&N-*LSlby{ zSVU47$T8021S05RG^xgQiBnDvCzp4`vP0a`DtwG`dSP@9l2M<@ta1 z;XdxnDYAw4T>e~yt#ac`gBg>e-raFsM4Ca?fHcE4K`~!@8&+>o?9pRU&^6;~TMM?) z(9g$1XD;v6M?oQT6?QUHCaUw0RZ{{PQVvOfPuC1G8b#M*CJSF!V1n#ltn{`lymPoT zY)k8AX_x#AKL%OnwWS;o4g|{*^-37&0Hky57d{QbCpb7=paxd>1GjhRp-U*IvS_|O z#HEj+_m(0j54Ti&d3+f%oC3%ErB6RRjh@0WAOHU1gF{nQbyL?a@jk6=8#hVZgKC@C z5bYWNdY|$kx8Z|p7L|uJ`q3IK=3dF!BTzewOlpOz)|baPb??!&t6`D*5(js??T8Ue z7#NU-*CPN%unakL=JLbijG}xSpP39jrj)XgmG6G*)MEok&!A8{(mAZ#1riUIr=(R= zW4tb=LGyC*7Y`){bKFTceDJaW_;ez}4}Wgg&Ja{djzDVqLBod4X4l$c@7xXq{gR4K zuX^n!#K2|Jb(IzS9A__=8c*xRhTXRDB`VO&fsY3617&suhUnStG^Iz~nhCor*OzTa zcbHB_bN?w@hC69R;SdZZnr2@_X_We5j^9JlJDMNly(&KS4T7JbNjbw0!M10W%i2?(H!^ri#)^_$}Q-gBXkfBUu@8bxt)pnOc^HuWRH_~U z8<{WvD2L;CQ24SJ7h=A8Jo=rjS&$e`Z#g0mad;@)pbdi`^31Y!xTGCEK4j~Z+qO^{ zjFXs+c}%ojqHUmod!!zdN4uwi)ENw3Ny{s&rKbzb;iXlnO4OB;0o#lclKS25yg`mTy9ZgYatSJ%^l|tC+l(!Zg>lC>v8P7gTr9ktS~Rm95qAV+j*=aI}Zlu z8gJWnHDmNo?0zx9606A zK2W>%a7~S(F{cd3t^>SXF`Z8)_sjubk{nsUt1}aP6}h_xvQl|M_>PB??uRVre&yk* zH!IU9WV7idxRzYg@6oa0Z00@UxH$(~R#^RfhrJNgb*5Eia@l<1`IO=1+kl zv_sduKuSPboLk!xO5KZvzeEoP2lZ zvEdjZ7O;erv}{i@si|6bx8xwEObt$WeryO57q!IT=8w=swjlLh02u z`q6f$rk1buI1KrgfQLk2wJzPehcF~#Cj9iDzKa{ecN{u&$aL;EPHj2Id16?r1N9f6 zyy?}g3I7|O{@dT>oG}#0z6P4^n;pPx1Ss?ZXr+`bJGR)??%}6u5)1~98<)4HAvq0t zQVum8ovV*--tv+MQIcDFI;;gm2OB+U>Kkh67Q@lE?nT`Eu+p%_eK1Kq5%_`EvtepS zvLze>aLQZ(YYnRXjQY5(0;v}``G@jheS%>Wmen<_re40HXqa{N>}5p@j+hO(D@)hj zm^Ox6Ic;VH`05~fQofhc`0ZQW)&Ecm`%%JJFKlQ+6+FXz|4P|4JffY${8zvC)a`HV z8+XTwlZ0c-n+2nsxvTrluf~nnZsAGY=z9|uGt zFfqRui(+PZG`m#K)DHwG7)7b;zh9WrsznQ(RqI2`?PHu@yV_p+Fgj&+!AfuQbI)zB zrN-SK@c8?dQzuWJM}Rwo3L6Z()97c5&Cxg)Q$ZOZ213$X+R(gl*5M8m;+TcA)2-hT z0I)%4SbfQPv#Se0Uy_p$E(=iIUmv{E-roEC_yIK{DR>hW?HW6c&%XH~P~Y)2&ulb_0|GEB1D%i3>=@z(haMEW&+b_@f-Y+$=cupJ zaoUt0KXoG>1XMh=N*LgTz)2bZsA|kblc63RBO{L)#)iJU_z5d_6nY^QfH=6~G1<{q zwCnLA3gFYO`-p&-%eDXn2<<9Jmt0;%R(4$hwo9ql7Z}N&T;(6AEIp>#dY@OZu#K+)l`83Fz2g{iSacb&-^8kb2%x z^kLo^hl}345e7zZAM`lL3PUN48^|8a5tRr19&-h54W1_$m4I!?YsMigsjF~p42REy zofIh6wf=d26^RQA`3AI?*G_t*v;DKN+&DrbDDtLhey@v)f}t&q+1jNUVf53YvW4fL zfycd=KaJ%zMssJ)=g*tA9|Iz=<`ap$2%LUpOfIBOxLh6%lL=l_N*t)u{eZqV3< zz>+9@&I)PCI5Lk!PwYIUyE}|eLm5baP+;|SArd(>F(O+-OeA0kSoq z_l_J>9yf)nFFO#3#+a1+mpl*n@rJMA8S(wLi>rlfr^oNg zo-OCBWZxhyT@jOO4-qAr9DKY2yFwRlFv|09a?;$vaYgID(y)jmwK0_q27JHsO^g?0s@?%=1j}ZD$tq zcw=x_;tcOHBIMKTgA;osHJ~yD$9Kx5Tf{49wYWpYsl;gi;&GyqZgcotd z573p1M{V^3NZ9EZJlof3`R0*mBBY1(P}CK*E7f#Y7&0Uja#N)7z;6QASsH#`cL4TgPHoSGrsnO%e1gCEoZ<|bf=8Mo(!*gEvUt8 zXR`UTLk*X6F!*>$Q$_H8QVN_MYe&epA+31a#YBl;8BC>JwN}1 zpY7%00fF!H))-W4l@%2g8Q89O2n@Rwt^Dl%`M{KEplu0@`<$FZ4N%1{VqKaU>Y+B7 z^e)*nzgI`OW;uS&158a|z={vjYIdfgOkJ+isdP5z0Ms=1Do+dvTU9CB8ZEQ%`Z+%x z%*)GjxYJGx^w<=J)@Rh}IT3{&u37?}W3G{H&BLgRwD)#vI7mcdO50^BtxZp@?_qT> zNC`SFa@xlF#758H;NYNHt3US26)A@_D!l^rDREKp`elc@B@77+Gxfh(`pkO0-DnW+ zlmPd3%lyN>^9k*gYQyWcEK11A;Yv}$Ene55T@k$&XV@fR$s%vmStC=wPlqq?t>}x# z;kiS;Ioejm?`^G#IfWvLsK4qffoS*WaNxs?Dbo2V$#_>Pfy;7zbo^G&*~pao zUZ}DKblqe&3QS7?**g5mn#kb`S1I`X>J|~`-2We8&W8C`NB?a&v2y&$<)6Qub&vt- z^5^E6{}z8W6b5mXnTdp7pRnt+!AO|;!ry*;!VQWrpd@|M5k;<5m1`^p*cxT=)O^5dWi!2!2_z}`Xa5w94~ zp9)ilgXSe#B2A4MZvM0vKm0ud^l49im?98d6snxNLdL5zsurr&QHtWU@!ms+lM^?W z6eMVxoiZX;C<>04WM;Fuhs@vQFP!v0CLj8uifY%!TGu0IK*N#DWX7EcH8e6(>h|NM zjtVDQ+xq{(3UqaI%N?6|tv<$_TEbm`uL@^_OC;G)_As+uL{gkX3?n*P^a0*4rdTRy z`@dKX;czGJ!VTemvAxh%gh0L}TZ#e}>g327kfd1{ytf<$Ih717vEay1z#q+3%<98r zxME{keD!KWuOja)^yLxJzKV53)X~(+tdh*YDXoM61k)DTBuR7;@&VR8H4*n^OHG_Wn zp;ULG3M8aQNqa+p@Iwe2frXe$vqY8xiur#`E>dNSTZ>|vl9LwFSCmocD|sw*=1ipR zmX#p<6nQZru8rS?hX+^{TbMim)a%IN5uA9_d=TWM38y4a2*IukvYt*LlPVn$Q&@X> zN&uE*oryTRx;T9b|Mz^&@YV|5_Sc!cd64vDC82I2GSQtY%hPn08x3q~4f9R9gdvNr z&{BtsAtjB7%GrlPV8QUY92MDu$cwCFb=B^V8aYxFwV=L#V>W>?^WxJXDUTpCQdLV! z3`}BBf)EU4wMlC(Yno0diyvSxL~i3SS^$AJ#6cp+FGvO#p+8#8bs!hQtfJO<^Wj4T z067uyLo_rpD+A8-O&p@2F`!y!AmhbniL`|K>yW$BI~0hhU6@UolYiQupAU^&iidD> zW}`S7xx;vTBGJZ(T@7qXE;4M2I$fVHqU>&dbdl&N!Cky!$fg(5tQ5S1U8mT zK7jasq)V5EACNBS;-mZbHyRuTTV-WsOEU#yX$`XD;V|WY^IRRFE)OTq!iK1fcp?L( z7nP26bM8uAyMjGTpDCYS_~F)E$PztwrL$P%kVi@{gd0PAbNCtqY0Lgb!pLn$0+R^| zB4COv4$uS?XHP(erD5kJ5!9sgX><^K7&LbXsVIX+j+7a19<^f~t3m{J5w{ta0zwdb zWvr}PPL^;~Hv3%HC|K2%Zu)C@w_9_O^2pA_`2-BSNT>l&D0^K`-E%#8~2`y9ysA)lC6jrMV>d&QDMzQacpaJ3I=4U3w;N!G-^}= zK43h6Cq~)|)Zq*G&*CeawiQezB|Zwi98i?NPZe2dA%-YT@HMiqvA>jOQD&aOf`{Ca zYxckdo(+lPq(xV;i$rxdWDAZ+R4OiI4Z!h^KwkJ|gtwZ={R9i(c5rY5;af*XkLvKr z<2*w~W0Pi`rGq9vCuu7J%tl{^gb5s=1h+~G93di6oXVOS8ujj~g(Q-|0zG(M=fE}` zM%0?$oD{y@U^U>@vGJTzmf;8%fG5OXQWp0VAXN=C?%_q%S5Mc81q>(v7QVH>Ks9xA z2KL^IgXu`(gtQ~j4CQtUgqLK31Ei%Xp;!;C>T0{v2#a~y0F~K7gdbG|B)~nR4x?F_ zu;@7$RXVnoa{3eK6N2cWB{mXB88kgvP(6Ui=Yx{S);O^~nFJKo&WS(-H)!wDaE=0s zlGl`2OFBrvCsJ`oV0GN-dAx`&MCf-HlL#CG_%`s#KZ5l=E(!Vq;S;o-Zffd>xfI;wFo?sX3A*bOwntu@U4YfA@l(k| zONGFkBnLTZNq{Yz=;@4;9XZiouKnLeC5+PXq6`cl{{}OUBw#pW$Ra}E8u^Xpf*Qgw z=^t#|l+$ zjS0pMMzl22JD@qwG0D1~lE1~p)pehMfCkQ1H>ihc;1QYuEkZa+-53W?MEOv(;?3$O z$mIhj$=4e4a`{bq1;x_ui95Sm4TNiLjH4T-73=cVSli)9y zkzhYoml#5#5n*(oRb=DfX=b8-u5`x*MgQhJR!C84$gF1f_%BTC#*e_S;W*X5e6+Iq1_Tq^H*$(Cpv-{_LYng6 z_#&2J4Ui{73OP(Tkt1LisF&(J#Fhc+NV$s`5J}QU3FJHn8KoL-Xl82cARHS=mQT9! zi2ei)C8Ht>`yQJMTzEslJAGC5ac0sx0LewshnzPZK;k^-ND)|T(VFLpLA_gR_R9xve2^iWj^C%hXc@y5X+0=QW%;}^y-3D_9;g>d_5z47w`t}*9(@Z zShDCgrbJJzK_)_ztR_TSJQCuG04XAf*asl}F8|7a{cHw_3qr?BjKm~Q8|g)O>7^PR zFMnx{{afY9;04kwm|9h49~3q3F*Fo?Tys_g*j~^G<;hXO%+IW6LCwX5_a)ijEF=jA z=pd#@dO#t)1IZ?czW!*=c7#h84*FCiyDa>dZV-_T(Wj%!yZ^v} z`ynAAgm8}hKc8)EJE#EO^TX!}={m6&-y!(;`h&2reMm-0r4G7`17?bnt&anPMbPX% z2y8p>4hu9ZyG|Z)r%az8W+r+_ahK-}Zds^$$8XekyqqWCzM%O7lA59_K&HJPD+z99 zwK%*pQCsmKz@(VPyMlT)(pl2^ynm6}j`&)KKBR%++>LDN9eZuV0#!sVy}dY3Snd8M zsHhGQWk{k);uPV2jC-R-CBXunds94pLMjP-i~NThy9xO($uNSeO|}19C!Dz6{71jK zd)^B&q#zz;Wa1Sx{`&={;W?TQDK{gr&47D=jaezw^#k?sgJ_UuuOwJ|62fz9M8c_;jD(n z_m}5^fuPsOG9RRwzD@=aENeAI>5~Ed7}SICS$3vVvoMbF#VD#XL^uNJSbWOc`#AgA zRE$SJRmQ?~K-pL>EdGzom)IFaJ$~DIZWF0lQ5)F)D9WPtw^4QYe&Y;hRPY>X@on29 z@Ll{_%D4TMp;=vSy9gVpWTdA&P{jhb8EVN%t<#A`iv=kDJ=hp@Z&A}MDFG(p z$THm=HZ&!O=2)*`f1B|E`5r+F*NO6L@&<2SdV~(GagtEO| zANxlX88TswfCh%Br-GrZ4Wvj!#gvK!fEcs@E=M3F3|)3~O0Xd9biKj4ZvlYum(8t_ zOBO20opDf`?1%yXA4M;slOmKH8o*1gfLx=WirN>nj}&|;S=&URNGcMfR|6@j8RTs5 z#cc!4AZ=@$+6WNZP-zjX2%Pl-hLyijw9|&xM4;*UDjL9hIV?kmduW87EpkWSgOk%u3I3~!tQ81f=yo?g8 z0U0o^W*@d0vcr8SK}fVjB1u+0DT>jjJ44bAB32%1Yk6EF^fE2BpU*Ilx5(FlW;XCQ zNqdAp{XO0>>n+m_e2AExxN$-?N7{=yW=U8fNL+DHOM@Z%6+8_`s-|`_4(#A+48Yil z-%j2dQeb#O-$F9aKE+5HZJ-A9ynQjQXK0K(HbY+wAzKgFmp6M!E0T*GP^plx>mpYc z%w6WwBB1b79ghX=S<&JHnst?UC|VdMXs_4i2Bv$0_?M3#Rk27=)slmR=B5vLRY}7elK7r^4y^?ufeQhQq##^8v_aexdF)-@uC#uuF;Im#KtXeB3E(Oms3Z~t1psEbX^wJ85V;fS&tmf-m(~F1fv{Q-9gswtqK!wi z-fXcU`hFYO3409}zZW|hDBZ80KZ)-EdGsRsFsEzP!V1;InN56Pa3867J$PPq=om+p zy-FT=S{Qp}y@WHf3|o=!aw)T}e_r)+srBjq5hM{k!1jh-^dRJH<+hdvpame*5CJ#~ z0(G5FCGu;M-lGGGIwKAdg~)i2U)7St1l4N8zBHj|^OT97KUEP`k;o+ygaQRUR`XZl zZA0t~@Y8&G%P86hauprclD+evplvCEE-4hoVtdgtw71AVd~Day-X#Cr+cEvu%7}6( zSDYp=oj`Z(-?jh{Z&WNO)5#2htfb?l z%KrxfW)0xeP1xWCtwfGR^I_7y1e*3&wu&Ji^(YVop;bsc{P%*s{wC)lfjL!FgtkS6 zq4onG-Dz)X2e2C`|~r^~rR9KS#h4c^`pAJ6!vt zPSJa6P_GSOwrUM}@Bn)*9eADe@aQyTMvd4h1ms6?N{|8^N`WW;e!!D87#v*(gpyD# z4eu(Vj;Mu^d87gUa5$r{7QYjgBx!ZQTkG#XI{NS8=nF+yB;_Se`m(1iAcY9RDqI4} z9>HrdP`K*C|C~5v*=Dn_{E9xk@!z##@(VS~-%oQY#>rbtI1-3%fEYVh>H@TNf29yT>b>hqY=pHXlT)zgY-^%7&34Mgg_wa#f#d(c}?nfb4=1DGML@+ zparMmw!qo=i+Y)HY@Yyurbp%zJ!33lXn4Jh$>64|R@7&%i>|LJ# z!ZYE5z>2VDAlk6Hnh`m1^otk0{mk1u&qxA3zz2x*U zfCNXZhQ9xwYGcB;AnJTla>2Q(XNY2>jPPxadan>)C$>YNCV($@nsm*vnxh(Wnk{B9 za-Gf59;dmwt0SBhP1A=3ze|j4!$>lGH?dYA@=~b0P)cON24t9Ue!y=abTqJ&@~Yf@ z!44xzXXlbx{h*7xu>gJ(u0&EeQm=Ev{V84i}@*aT=&;}ufB;Y!r>e9dukyZ&f zm}hXwiUfWjiRxB(Qx4@2N=EkPk*hEX)_Y zZtdFt>e~QDCkY5R#k=M41E7l4At@*NQ3AQ335OYi6P4tq2xq6^oV8jb*Q(xtWzrgCtHaz&`6sp!YDTd1rc#Vxk1s2Ev4*fjUI! zprkF3a%~R4Hs11SL@70-MZ4v3DB?L0>l;9x~Vh(A+PIj^!&yjAZXJB zj7cVm*FyzFT)lwdpj{SOu}2KW4b*#@|3DaH`FHnXeRe_uNw~6WArvA4aWwu2Mu}+P zhVgBrg+M6T_I+Q72b66iMxI0&c>TFT4s0pR=mDm8A1y>eNF@&#WaDcq)|puV_edg& zF5EUzuoL?vKsNhuaipmT;4Btu)`3j#`BXwx%3a}8W`{1s{5N`URWyzWl!J|T9P6EI zaniLU?Fi&;(8}6~3p^lE6lnyhU%9y6n#MR0)B-<uY{(A+qalw#n8@e;5sAivQBJ_*XSU&ydYzC+e8 zYD4AOml0CluOx!!|#*i=&aA$*Hk)-mSVpk&;MlhvMUi?Xgq{h zU={B}LlI|(DYR9O;o-YWWPc^0vm)^!O-HnsI9$JPL^e+Z;OI#>{x}FshlsXuzZ@Pv zj}!9~A~L}@tVo1JrP684zu8Q|8*FG=mwQDip2AfiF^XaQUJak z4V#?QPw0-4Eu^WfA5Zd_P*OJ$05i*rBt9_4CU!hXz7h>wzO5koKKwxNoVToJJwTJWU;_WzZ}~*2xGKxB^p5Kan`^&6xqf0`9Ia(4d|e~1jaNEnL+T^SR84f zzdhVVEYSoDZIe@0m|$~}RTwL?YVbg3-2hP1GiU}9X*H@3G@CzGR44+2Qe&sz2Oatr zNHCxTB|WszScBJS@(J4aDG^>rvVj*&wMb=$#YxhQ9H(-!PiaM+^U8#hPj5 z7_}pt4UNOsgy-D_8$>qce> z24l%(5aMVh*Afb28GZ)|xme@65Oiw>%@~A|oPzuvML0<@3|#@FqE1#HzE=-f2%2T0 zWfs|D5mRY=&}Nmno(e^jNylSR%xUwv3=KIVFcE&PT^pKWB}vXupz=h#h^S~1R1IK6 z!0x*ofd&Z^9|=L^=MgkScLP~Xyn@pZHQ$4jLQhTa8N%EC54Ezn1&=%)+do=mZ>gTK znsPyI0kMDr}96Aq)hO z`qg8mjHrqMrZY1tYWCj)qdA;@A7D-5ZX!>HIE-dbHVWCrK00;YA238#WrW3Fh%;rIfunyXjOf7On;!heB_gTJ4j9})U z=J2O>DC{A-zy?mTU8YtX(MUjRl{4$mi9{1YUJW2>%Kda}*QW4K zMn$3Z0^gv(0K%F;+`zU>Z?I2H@iNw2aS~7woI`|paP4Y{==eS}hk~RGAXhjk>ImkH zcwPPr-DRxSLJLdNu|7diThWFTeh@R_-U4)^Vdg>s-pTF2K!-nf-a#k~Ri-li`#Ky| zXvG8VC|_o){cnf!@8YARRG}{n#G8cZE>k{1u5$oF@I~fVIPw)bT)`^8^u3EEi5G zY|8Z$o=jNC$qHG6ELQ(nZ%|&Ib9#SC3&x759R6Z5ICLfE4|wY(Wobt!Hn~3>?IF!G z+_q1f)D@_$&H@Wkb|j&KuyqSe$OA)N+gqQ~Z_!y-)!ts*U@uMMA4JF)tfw|WCeO`X zHfZ16I0)%>h1NqS!T_)-liX?Nh&*Jy=pKQ;5vIzBjomQdZK1$redt;O`xUY9`W5uA zq8inXQV~EP2m$zN4y#VV=(rZFAErac5NMBBIaO(LT9c7q!C8zy+Ft>|8~D8?FDdDk zmH@@(0l^1|nz`Wt9ud|fqN`4jl}i70Po+ZiJ7FlHKrM8|`8I_3?>wUyD7*H_K9gT> zRrEjEySj=nHd4NRXfjq5ZyyfRHn1JqVS(6y449;%h3=YIDj3tF8}lG~(7hqt^OZj; z7os>tUPLql4ihP_RiKfR&C6WZiy^bYK z36S;Goim5BT|pQTPPcYGI(C+Gl7EmC6X5R^(s>63S>^?@qDXbgL{MDKX(L-V-R^_@Y{qS&o`bP9&GJ*u&0MLj4pd` zYD4h`Cr8!*)-PV8;@CGq{MRX69$Af*WlIKF-vOm0yFSI}&;fW;IZXUb(Z{V=dL)LQ z%{+AY*DCVqFeD9tE0c0cz@{&MNob6hC~sW*K>xvJ z{ZyL2YW+pdpTeMy07we9GQcIK*mAY$;AvxVD%Y(WLzaiFL%3LInCTem&mMaOx=R{O z8aYHKe*_p37oLe<$%zpgdCN@ETa8SWul$tx-dUe=p#A`rh>rtN#a#Mui>2qM0C|@4 z7f&E*CYc@XmITOYDJnc{Ph#JqjBuu#8&d$_i`s+=gf;v~s9^mcalF|UfVDvZdI2O1&o3mw+OyO^qpk;O%JVN95TSjJ4_3r5D$>> z0MXPiJO_h1*c#6d{Vqa|jM2`|utZ3s_^;6?4^L3)01y$PD0QqmEo2IXB3~mjYK5L1 zu8{wPUNmb%Fq0VG2^0gY9RPQ=7=nyX{%#kz21yx->eyv)7K}mp+sC4!3)qKrkJ9yv zwD6Q@g?p1jK&<#recdnV5`ej!u)QKas_1krL`pKRvN1L5d|ix{xl0~jDX3uGi$)Nb zt_IqAwl_Iog;?$)LWQO68IpVBX?tNJHc8)M=)5sQyOF$0BrIBh!N~3*M)cQt?1ul1$2Za0lq%HO-494Dg)N%2_z=2-?E!XxpJL=i85AghTy> zV^9MJY*5h>pX_clhlmL!G%PL8FJ31O69i*PSX&Ly6Kqi8CW80qNeFZzR9D*ed8|)W z+<(QWhS`Uyw2&dgTA(^A*fk{Yt*{+Huh1+#9Iug(w1`_bF##ul2~=YF9$#&_|Hgqv zZskawOgL8YUByVeZ~Ob-#V5n@Fr#=<7sZ$kDn+QkUm)GN z(sonBlBE-ACu!b=>pML%3|#)K%&mInd5F-(MLn#qOhJKh(0l=1CA*In$dXLd9uh7j zgMc8R3BC;^jrQe8wFyvDLEZIHLI3v}FzNu`5=syk)J+&rtPPNfpwEO`2aqP%jf`oo z0~^T^4s-(mk}`5Q=-~YV%_w#fp*!Fgv1r?xq)nyK&pvd(2uX5}NXf1BN@Ix}9U~>o z>nreCB*!K82{6jh#f{qqy^XCd`y16BqeBlmP_&z4P>i6tR#4W4`T2Q4j87+aXl?_s zetIkAv0)vL@?}i`s)mTEZg0<#=!2(4r?Yep5XTfUYz9=7^9?DFWQhY4(F~G}XHNIS z2+FHO@X*X)YKih0ZU*kzd2`HY(l1PxONs8!M=e}lrvpz>)DJZT28R#ODF9Hm^{pgD zAbu>+WWt!x6*Z|%)KwW;g8&ITfFT1@h5tr#oQ%MafV(AC%_Dmd)tzm#tKbd38vY*& zF)S~WV!jJ3?~vG{*G2GanxE9%TYlk`l*bBElTC(XuPux%E@ak3?_cJ_gPMdGz0okK z-4p;>u(=%;=|1%YlZClI1l%<&;6dxlx!w?+FJk_OO`P~o@t4D6)>wkGB`1$WW4Ah0-2DReDJVg?Mk-lW|S{f0z@H&VUhU+^`2l_i~_ z`VbK32^@y{6-121THxqGspyt%gjK*-e0n-4-h(-f2KFMO3_kXIfH4wK37zz;kMRWb zV7lcBpqOU0m8kqN%_zQslALT_i^eo1{|x_0=^)pOUA2T3euciOEFfn5f4tIKTw}aT1ch0w<>4O_)22GlCL||_)3x%-V-NO z8?`V&NhO<->?ib}NOWivZ4#iodG$krju6hEgEt4s=jFn3zU^o$leVgg1ns`zTuK>K zw6uD46;m*E8L7vrG8oYLQw;z-FKVO%IIf03(#XeIwU<%!mJ(hxj&ago#?<&*2CltZ zb!RE3eLTPR1E6|-#@E{)j7zixTxx>*dp@6(__y=uqmL#JDeZw-0%+X(zdLW>wj<^d zIwGUzFo*WPy*HnI;2YM9Myuelo@V~d^xxe`!~eH^$$xr@&n1a}4is^3&KAP7Brt$) zZRBRklW|*R3Z*HkQsi6Ubz}+?F=Z!Vg!~%^77L^P7U4aVV?8~Q6v}h42>W+%kNn$q zqnNZX_56R;)8A+DKTQVtKVJX!`BHYXMcGY8-OY1y$L?Lo(g_TBEFNt9Mx3uqboFW0 z{?!7z84cOX`Iif@pDx&7y6LUT=IPaMPNpVn9%8G06Ca;UJ#Nw>EZcRdu6{^3n5(P1 zR%7VSx@~jy{g%Vo8*Gx3RN~LXI9A=9VN0c*U3IKZGiD}Ua=5EjJ!Ymva+uPu<~fu( zlV;CX-#?vHElR11nyII!o$c2v*pA5`c@8;Bjt5rpZFSUS$oQNs#hYpahMJZ+kuhXv3D7T~ZE9*O6OFgVzQRO$mGRM@J z5-YVV{IKEfny)de5#!Sq1JxAF^%jkfmFlUzls3USbHwH~^KhE)LR(W{`3V{Cl{Q|? z!#8{vJTjv4y2_`IPR67j%p6%FmFu&4E$ys0Wtql1&!pRekO|Hii4s?|0U#)lGu>!lX_%>l*p8y&4WEnI2s_UHE zTh%PLK1{WvEE=XA2;6!r)vhPkIG~3)-+_5}n_+QJN?ShfmmvG)d`4x36*`#(`-QCB zbIB)!XIUL;V9od()EceW&pT~P>m162-3(#Ip}mxnmgdm1%4ZQnA5Vk9^)K;_ZL5El zvz!V0+X!i|6KPb-uj1S-X|}nIC=T*-L)Ux{8u3>u5PEO)-8agME{|!SJ2J z$hxk?nT%9zEvmQVKa6}0bPX*PDKzxYV*zBQpeXBqCH>81xav3xcS&ePRpUoFL zl+sOK3RE3qn@HpJLz);jvz?A%h5l$j~IhL=U$sj?Rm z?G5}Qt3=j$>1i5J7fVnq;7B9{F`$Auyh{XbfDr^DHYP2AS|$`8cDwzN)?T)1ikZFS z&_BPrNn!Fc&-|2{t8xzS)c_w^ABF3S`vaV(?6u0N{Y;;~h{lz7c%AnPVb9Fn?URrp z6Vc!{HYmHLzMw}WRc7dYW&V?_f|QRSNok-tkIt#prmNWim1FToNDLRox?4)spO(EF zr+YKt(SS8EBr5ANvd9`s&!^lg@~dSrZ$hn{>PS~SQ<`@}^3BPCpIJR_v;gaBMRv7t z`%QC9QXaJPRSSTN6U0`3l_RZdJw3f=hxs`IjNj$c_biA+FNv(crjHmGJL+zc-x%QT&#y+1O?3i@*d^krNUxh+}H`M%1BeVH^TC46aQ#P z5A!j{{=yB?bw+cqQ)70vDL9FwuhR>}|3}q{R^^urm4B_0aF1$OVKd%bU_2(0E~DHZ zxl$@+X7`VhTg98;u_Ju2gw1AOmgev(gZYQ%Ukrork(O1m>^Bn9bM0^JX9{1=t!g_L z*=U=?E>pfPATV`l{ztZh2e72%^jRdPlSi(%dhc`Jz4FO;Gf!w)$_ca9Rpm!0+AKx5 zD6LlKFCt5gs7;P~ma|<#7}+2j$%Buf#WYgwN>~TKuSdZTWr7{(1DB_9wa)A}~vW zG5)&#VqFp+g}K+8vcE}F;+%sz78IFU2cg^f!svv0Cr_=P&A06l0NJUhJK&UI zr-T0fa(g8FRt3G=db(L8=YOk%`Od<)EUET?|ISN)f2Vq9YhrK2M9|5gAtCMD8rBfU zBYb5ihdh=`Wdw5_Ss}%LQG)hqU5WkNT;>X?f%EIOiKQ=lNWDqtRW-{bb`?8!euOFF&*T#M5DjEdLj0GCn0oy5WN_#wRNQMe{Q~6JOTE~$2 zh5cK3y=-b`Nu7c5u|3`P-LT!K!fw%6ukEtHWZk49AMKB|Q)2nqTE?Cgb*#Cgax?nR&e^T}z+trl;tMDsRygo)=G2 zStsGDSboZNMedYCOCCF~H`s=ozyVWN#H_o`D&nzVD%4-mE+(83U{F{FrYPt5iZ&R5 z7fz}+@;z`RHsq%~S;N|vcr!Y(E$fVd{!+bFQak3Zexi+bXexFt1h_emnH>=2={GBR z6Yra0kUtP*#WGq}U!VBf>W9@fBjM;6m+m!*B_U*t6e?OxbSlu5rXHDT^@mOnEi57r zBH#~!%JMidH^^$XW|HWkA#iO^kk?ZY@LQj^(+ z)e)yyLCiqzxl}Jh)-GMSy*|-COU-?wFDvbD!xIsJC0S3mn>=Kk~#~5qR~ZsWC&S?c#lKmr5H3HGctA*1Gx#1 zM&?l13hse!ua0wZT9$ytXx(bVXxDb@9u)V4Hb8ozke?C@Nw8i?%Z-%9#NoN2FkfSfz4r4x^->@sp?*Hz?RVxQ1u@kWZH^x)t(jKldhuETUX^uq-kqr*RXOM92e&(p zbS2lmP$)hurg;9K)Fr)Q<%`EV+@>CFKf5e~HK2;;8fRnQ!k?3g+e9313eeVj>CQ}> z42pScDROd_ztDG|8h*fNV5^(Sb?Kek(1V(tf=`@Pa;$2kM@JWj=j>jj={3uSnD#!f zocTT*zkffkpw&?A;AEa#tCMHW4`X)82gYsn-=3MOn5)KggvM3M7ybTzZc%h(_MnHS z@3m!O`}U0GFZ|4GZi#$Zai*bZHe$TBNO17>Mdjf}*_pQ%?bB^^J(u5E7=o|inq zbv3GYcw{#Kdm!IWL)GHhztp~3Tu3Q37h(|->#5!)e-fglib!j{(J7DoJ8$Xri_L&j zuK`K%G!a}Ac82G#PkW$T;?MBq-i4+&w)~)oYm|H{gPseG`S~Bchae>|2eHCsi?G!Q z78!~uI2vQj<;sbYj*oG05Nr*w18JFKW~J@^Ohr&*{~h}RaHB!^qF~urE*K0%y|i^} zRgZmSGIC;Keo#ng6$AhVv7D&1Kr74v@xK@pPq*)PWeJA|SsIJ8Z3oeyf>Tm+q+0wL znOp;e=TOGdt{sPHF|#i{>IRLs^6;kCOD)>#G)fjLW_sU^r>$ABfB*b>{mb;%qdnX+ ztsWMht2o-5`Z~m({`-BAr72Hq6)aoM#@+t>nALf#N$>r^+4I}C6s5|Y+)Ybe6`;tI zV^`-d=mIqrGV8oBZa;2UJRj6DsCEo-8pNZv4ElR!+@cg?@$O(39Ccde5xSyB^m*b-wRq@m&n#G4Pz0 zES94Ai%tn$nWN53hA}#H-pEpJZR~sT^+LPEs5kvrRvE*w%q%@-&qrRto$R;i z)@!Zfv`&2U>}E*b4w>t;U(2Qj=8ZYE@!QMvyXf?O@p=(V8gOlM{%rzdfh`3fNi6z1 ze7=H+5t+GoY(|GdLhgJ)Hv~T*Eff?jF76QsqIUNyNx|k@9ZZ&rv3}4LsboeHcux|u zKeEX{Alt2o1IexvixNRudDB_C>5nn71f;mjdhNSaRH|7P%V^_+B9ZOGmmXCnXT{{6 zM+~#9>g|;AjQrI31$Y$gGf!qxe!dPNL4aVSXFmLBh$UMY#G1denFv*aaA&+=tS3r6 z1GCe88s`+F%ck3RB}2MQyq$+EO4VbwNtFk)*Aes(T*PGjmsr6ILZ*PeD-p<$lm|AT zU%G%KVl zMTQ|@Wovw>$=JPqy5`ouokqnfrw4(i0%SmTXv3nXau zacq-KWqWod;uq~FtNWJvzDe%o z6qt}AdL>GE{)%s~QV|$cetR`aVE(n(7V41`_*n#+mOFRib`R&_BP@T>e$`HYyDs4M z@fdAg7I-BPU5Cxs&T|(Fn+MxEEAu*FP;reo`I~ww>$5`L0fEVdAL-_wRibL&QHNhj z@V+-~ZTZf)ZLo2AdC#SGJ1YG6`dGg=zSBmx$#m6=mzU>_(mQhX2UlfN8(HGcoeHTB zn?GoumTlV4Cox~OD)@n-XZrD>ngXMC=BC$C34tZLk_MGq^ThNgycekXw?Fgj-x40G zWz3Ui@4roo@ea5&s6)+O5jhtbHVcsZF^P`yweN1O%W)df?cs~8&y~{7M1>qZ={uwp zHQ4`L=Ky*K=~=;;fC1@wT#D8baN?5AjH0=)+A}44m13ErxjVBp(^X%H2h*l}D*HcU zQWs0x&>pZI2`dtWIU-*ntCLtIpc5UK+K`fKSn}FYm(aU#EX&t|(*WV}u*N7c5{3Z- zAF)4sSYepY?W5Gm^)w*u3?>-w}>Pkn)WYmjf+l@@p-lFe7Cv^!j3^%Sp6;a@iIa41j7-s_8| z*Tweq9RUgpjqhYb%hp?_OG>=j8l#)G-aliQniMU`(vTT{I9tWcQ+mG2{9I_jeWxcH z?+=H&YF87#| zu8~J)%e0&8U;%IkdX|{=h55G^wTTcQoCxQBa$iF(#|5?Ysf(Q8U|hGQ(598c$#Gq`jf_kVU(g zSu7S}KBO>9Sy;F0z?y(#8&x$<9BbZuQm+R7wNqy73GC+^ofFcd%n}U~)1BB`YX`r) zjJog(+X+gxy;yI2aA@0w?$08x`=;I z2>P(O3#_t~A!0720px48>`e}YX6I#hSxfaZq3@b}CpUdtK z6BYQBtq}k2>as$5MQ|!H>_q8exH1Id@jUA?&V2Rjv?I%N{$0zxjh9?7i+aeNYpRT6F z{o3$q+&d_X+L`sxRmNBydF9rp6j8SKbV8xzfJJclk2K1l6t} zZ|~rB;g08Bc9+t>lgaBeQZw%OV*2qk=NgU>zruj4=2W}l}yY76{`l?39 z)nivF&MGV+Z7(B=Z3C0*%|32fi?wUo547yn%RpMkj%uyPhkmK*~!Uw z@~v#l3r)I7_RJ5y>7CD>Wp4(H?%|G4C$!XdoC^|u^Lh6Trga-Ol)-fPD%`gHtTk41 zjZW36^y!O@oW+ZV!s8Zvb>((#`cPVWe8=7GQc|3VX&>Oi+$8hE?z^L2vD;QnO-~ZTuI^e2(-9-Or_U;jM#P4TNh)*a zIcblc(JoIf0wpJS1ITFfb_Hy}#ZEyFd9L&e=9FE7ed#yYn`J-RWw!^<2R*f&d-klt zw;^Br`H?I9hRgNSQn_7?2OC7Mh-r?!`m-H#j6Yd=OT973T;$?kBFC}m#{Jm0CZ^dO z>t5ihZf;TNuz+ylQ^l<>66ox@9|;YYj7{7B%_T znlXoVU%%5RA;mB*QCD{BG>3Q26s7;0cCeYnYv0Vt$CJA*#dL;>+pb)?Z25pj^79c@ ze`;JvM{_{9&A?^B%WGG#Wa!;YdoSQGy3<+U+OlOe$!ZseukLiJ_8a|Popq$}V9m-? z8{Ulcls$*LnL-YWSP0v7h4fPwd??w8%I|KyZAY&pmVV}R+lxD5@<}ac!XG7+NycgeSTopMuE>wAgp%FZS{_UFvUq^kv z1Steuu8adtlPP!i=QjGEaKXQ9x|9lj{25Kno9GCBC@+8C*~tkJjC3pmn(@jp9~!lk zHm_cOM{d`#sa;=SJ5bUzbWarj77USXewm`f#p8cG+CUy=l5i6k8Xg{RHjX*YUAJDl zDIpyy)UvIH>);KskEeUR<095HRG}O z)DkT$54RRyWZSs4Y86EzM*Yc9|AvUoLbAT&<745cF4PTwdU)5|)9Yg&>;5?xB_aR$ z{ND`ASG)L9-)87(fAgz78gNg1&xaM#p-)rQ)p)aKbOSdl7MOBv>!;iC`fYw5J;j4o zcl=&?RatbWLAUYHz=2&K2Hh;q7uER6gtfiS_ja7$^YCZHoqjw(r}w1{gb<^oGu7>uYMR-d@|TGXS>B z`?%LLy^X`e!?t7^I(Otq=}V~6ux&LoHDePJ$}Y!b0UO3&xS(k7UjDwy%NiED4~48b z5HeBa`GOo{FS(6^cUSZEs}GO>I_67-YyE{ltr7kzF||?batK3ryPEIHi)vbX@r*Av zNA&+3nh6m0G`Psm|6bGb`qEzG%M5$g-F@&RBIGpFcR%^Fh0!AJ6|G;JEIQU55&yvH z+I@&}?9;yCH5sgGf|KlxnSEPtKcN&-e`=QTxC$B+`wrPNDou)=qZO<(dF3`C8h+1A z@@1RO(DT^UgVFZSWB=^mKRkqoE6=vY_~At2V2fj_vVUq=>PIVQ|~ zIqn6v5uzWbchNFl%aN{emxuQs1wxcK_f5}P1 zV0>ZyW=1%aMNNENE-lw7r>xv}-^13Sm)D&}lP4p;ox(L~G@7u-^dV5wwr>kqf8>wf z&6^iN@1XcV6v*;`#d)PWKktqm@4iOFVKj|}RN*~QY#xdabig-!A3F~^m%87R+m#Qk z-x3Py@qJZMb)FHWHzh?jF*EzytkOFDTVqCkij{?B`&e&n!3~D$!-u4Ou9O5G?|yQu z?M_OTm-&%VmlrICj4>a2tQ&fyI?v0rmnv8JZ;w|9h>~sHu5NP3EpBzz86o$B!5sUp z37@_7i$x?jD!1*Pokfb3oK7>d$k4&F9HX%JUbZ_ijwyy?sqKqi`6&M>!*FXU&){>_ z?H!k5{5;vqcD$E<+du5aC8Td}!L>%Q`{@oYh5@&4BBDQ%USx2jw@ci=dHibr6(3qP zXOV&fPq3)~%Z=67$G`qQ=Pr1n0--ATmTEhr_kPFl_lw>iMD~vN_+Wxc?#C}6FWdqL zM>%5QoQ?L+`;AK|IXO94h0)Cux-AQsGgLDq@WB+EcvV%^3%Lh!qvduTrZeqU*m1Xs z?Ud2*p93{!Il{Kx%Rwac1>O6e!CsvG5X0j5=@zefvD2bd0P#a}Cg&cD3A$bw&r-o`xY^USs4&Pj9Sm%%$()?@E__UnIlgK(PT}u(>lQXB1zBi2n92OpL^uk!MfLyXkYX%D&}_K%}S$3vWJtUjCD}h-;ItA zZfVgCsCXD7Y`YZuvbe zA&R%F$KDNIcY;F>Y4TAs|UHT)Y!4zhkNO+d09`-;!1-fJMMmb{_erf&0O{u4i#7= zr@f)wr#CA;5I?$SWjyO)Vav1f0v3V73Hp4p+RiGR7w`Nr-Xe=l?bo;E@=bpS@At?` z`Xe%)7gf$VS9|@~C$=Q$)b&Gm8UEBIvh*Q>YmBelS`=aEQQ z3r!-!Rs4OM;)mkB!j0cFT32$ismR+OQk}@_FM!pge7x4$|DDy$W|Hm!jcO)2HC79PCJ$!p%`7qma(}^!vac-_o*UThbI?IPBLn$(|^U=qTiE{b_Hw znX=uni9vikwb^2;-|tC}#&|W0X6KKixf28YAGahFuZ+mhUqxB|a|P2D_A4(!@>lKl z5*`{DIMnw0Ls^+_vHXr3E*p|HZUbA(DqX3Tyaj!Ii>%Z5UoF4jC2uf6!(vpZp{*?t z$wY2b0!VaEiuI?y6$|B;y@Ub+^IV?1e$BB*C3^Y80(Us1@K$a8o-qY=GzSTFSFJHc_nz=<< zT<`Sh^>FI3avlwbi&6H;qs^%$Xlxxg|GKSj(}3Gd{MXH!HvNRi_wo8QhdUO2`bkmR zWu8_=ew)1dc3TGj>Fo?m+;1|Hl8(vBu4-v%u|YrT#L1Hv!Aacao|%tq-$h*MvA`PO zPuKML${~Wk*4Jm0`}nwngMgZvgW{V94<59PaNQVPu82K|@$CUnKv#{n$&F$&UV{pS zatuRGWbWPGEX_9Y#`12{OrKnvWR-(pbZhxd!{LaXk7fSZ)#cRj$D;3-H|~?^ zxf^!>qZa?pwQH~Ky0ZM;3F%$*%oYQJC*6EENwGONI9vdHc&DQGz<_#c8RXshrn_={1hRH*5*TV!k8SAJt)qD?Exl5qC zADf!>53pZ6oOB>vD*$G<03w@|-fWb1J1EG-@(qXTF#Er!E576Qxw*gRQs=mWMs&KL zR_aL$ja?j%ZFzt~%&YI&;d;wT`2$a*^#$t!Ly1rR`xNGyV%3tLLy~FH{9*;FVeAKK z6tw4p7`l%`V=7Fax6}vC7Iq*emjg~?yw(O3Zx&ga2&`~zw#YheX!z`+GOPcIrN^fZ zhd0o%34c9Q^CG90S}-85g!xX#KykR3--x%hJ-mYd;=APm<&&lEipWC1FkVL?lFmy1 zr;zC#0##bC$Z0)PoTcc#e9_`JF*kn?_gC8=P5ird?Ye+=vr}hCs%efcoVC88`@4z) zv-D+%!WM$kx9*AG<*e9t_CpQ_W5%%X7VSwGh?*5c2F8$8CZ zXH31LW%V1n2v>{}b(#BzKeF-qX+tz7#gSC=bS z*mS3{T`|7=@c!1d@@r4OYdg;-aiy@O-_q~{cSzL8>wTM*II^p)KN*X8ooIffYm%e8 zYeVq+&o}9HPum4DvH3AR`11bFLlep|&3RXk+#cC`qA_E08;cY^KdCWc*vx!2v9GeU zNn`kYbgxRx?ef01>kJnUiE8fmD4yCLtf84r{UPc;zGs7MO?rC+j{inG`sxvh38&T<6SZC4x*ZM7u98%=_+=BY+t- zeynmE);RMKqYDs-{NOu+9S+b%*2;=6B_-u2j;`3vdTL$ls_Imy(%&57?$%~@Mnl|fxIj`qVv07xcgX3~HuIH1>%R5`V= zyQ1lveuGVVIrT#t!<RD?)i$5I%B+cNg^Tu@x4%?8u zw~5$NjDm|qI<*b6*RJAmc>k&_;ik=F2Uj^Iid~(<`{E5T_n-dpbv>x$8TISPVT*R} zWr;&#q{Kb*t&NdxP{Yi&SijO$eeYm)?4Ccd8bb9t)`O8n`bSO25Hr3+{8@MJ@Z=xf zyZg3GPZvey+Y~UPRxB`m_Iy02KWpaO&5x&9S5Q96DZNpj@bagRId`>Yr=x^DU!Gq1 z?0HXfTRE+_zACnHLofLr3GCf)lgG<1FWO~!U3u_I%7+uDx*GF3eM1bUcWPC6Ga%9r z4Aowkjoq|moA;;a;B5Ll3z@;e#|G&KjMDb>2drN6R^nc{eT&g)Ci4fETb*BRituh* z^+=ikx&fnw?B^GHuZY_%>ic%+;PcB`OT4!noHvqux^v}#q&Bh-!HE3o6(G_; z!=*T2BJp|jFh9^wWIAlXCXFo1YZl!Nf0(yEzqpJ{9>R@&c`Ue&OsL?u**+z|Nx!n0 z|CYxI* zO9>g2txp~?A32zKvis4W>kQ0JNB+E+x8ZrP&}$4h`P+Gw-P>JP=UGqE%9p%(oakqm za5L_KZ4{2eG*2Vp7xyfurqApZbaC|DxiB%W=@hPSEyYhabvmo<+}pAsT8gTr2!kNDS_f?{rAjx-Sf@pm52LoBRA?(>X;BH%31W-io8Fmw z?{ojY&+|RW^Cn+TzH{Dl&U=>kocDctq!0mUx)Qh7Z!7MqIGUwIT#vzM2nhPKZZG>ZUd?EDZjsFZo=UhO@g76zCSvLd&XR008+a!{U;RyOVAPy{$vx-7E zWswl`bdIxNot3xzlhASNw#@u=PXj3L?Fv$6XBW~PM>z?M>2$EoX$G9{;hm-e>J}le zy)6Uu77_!8RTzhbX%lgutt|Zgl|k}93GAfe0!63?fbLz$Nvk~pOd;U9)PeIGqd_&S z1875JDo22!hD3$_N|p;Z#hcD3wr(uKEs==3Z$}O!?d1p^lP(3p+Q7`tWsBtdvV?hV z-Y}_vBOIjMMETyy6K2OeFXrD=eA#GL(%pwkx0!HV=t&nq1)tvZ>&6=;wU|k{2q#t|`J$erd*hCQc5s z`mT?1em2V}z%q4Mn~lx2w7+a!`~ng#hH9#Re0sTzHR|P0-ZqeS_g>sGlMI9PZd6Gdb;fa+W$Wf44RGnjNO!&t`9#YGZ? z^lL#aGRatG<8+#_%rT&zLDwrH=tMC8@n&caS*lZJ zRq4EC^U~@=Vr=v@v1&hbx}qqHRpF}In=>(xiv-RO>CvEwU*O1Fi>XU3* zk~hNQCW|l`_Afp9`~u5eRdr4(5Q9uZcHyOlA-lSYNF8k$4Z8*b2GBc$Y{Rdl`P#-lZ%Kjl0F@2!&Lg`>h*F7?H#_C2}V^Z0>TW zOG*r{9DF5cJic(dtJB=N*u?tVd5(@J9&{M(s!LqxcJ!hAR&z7tEW+n55?6FqCcE~W z_1wFV+;;DPbrq2b5dFiU?F&gCeG~E<`d$SAAAMi(W@lOMsI&rsBk2C=`|!X~)dGCq z^FR;>3?#dr4fpi%_vP-XtaM*0isHdKTWr6W+~oyA8Z2NA@Iz&v&&tb#L^kg`C|5$6 znRDAaR@TA*g4lPD0nmeARSMVVe^`yLALPE=l!jg?*n5Ca z^B5?|Op$IBZ4Ls;nF`cKS-?XeigCu-GMZTM*&FKZoNYrV^?DDslhNvMn-5pObu)#B2EEv>5F>-{sQR9V_yX_xcw}EMQV7S$C)MIks^D zc$UB;0Kp!C6yo1mr*Ye-{$&HS9^Hs^0^kl?;stcV6?IPPxQ>-@q3#BS@yL{9ENjIJ zU?KYpv&ryL1mPaDOb-Yfn93h7(L!v|`|nYnvjDbc@tHAf3BiUybTFEL;Ubf#;3!D= zQx1@se|`p%&mbp;i{>F*0{2=7CBRVa>7J6P3Y~4Gq!t7Ed;7pV_-yq5h2i+Agn8hI zI?kn1ZOYCKt$>0wZPCY-w;vpDuTW!^?9A$Mp=w47Xp@gqO53CH#HjzOnSL@3$9=&%J0Y3(C%VY6hcgZ-)&u1$y_uon7*o>M@6?!@%rxs{U}n z1h!;QZRaOo>|RD&&ujeqLX}dk3T2akF3r-MW4YBUm@{ z-Qz~$C`kV?#DB|?XQtCD1!=(u92*Zz&0_t*tn9Z#)Hevmxy^ALlLk z15EUC1E*DxU%F;Y%}K`_)SEa`L0`XRs2`7qo&g-ZR70rVaYw3t0(N8V+U@VA_r_4r1MqGrKM)d`ULVHS#A`KZ zZMt0>k$Z*+U(LoSOE;%#7D*dP&M+YUH1E8T(OAW?{pS~-`jB9#wu*6I;4SmS8B=;X z8nE6EH!NWuziYA|dRbyb(TRswEysWe&#am`S8m%tR#6|aLqyKkh?BT~^56$LzvW3S z9DQqorx^m2y$>iWxcv~c;pGJRp0%xL=FX0hYQdxW`uFp?IG7Hwh(QQNKERwZMBbQi zrfxkk5X5~FPat{YV<}WEoFF{2zEe2M_eMK%)}UhQnC>Z;16F5S`|*-dm?mD{l$4$j z{vnfh55;olV5pK)UKe;uqJp%OAmi8QB=X!o*gXDbKx8AoQM6{2_aVS*#0R*ee~ynI z0kKoyCEgAVeG3xkpf?G%jF@#(=~r$Vjn)#gcV^623p59Ti;0my4LR)aLGa|czm!wl z9|cT#(!>DS88$0-e~`V{>6MA1*4vhfKEpIiSoJHxxR~O#%}aI30;5%zU2!fn$<)Yo zwID~PACuDrY(96?@41K&IC|9G#asq=n6-FWX{7A3;rKZt8W&x*ljA^=si{Z4?4h3m z-w4|t>U5PbYMH&^`m=VIuEWy)I7RH)xbN+-Fx=D2ptal~DJdxs5kCjq2@r1|^KJBK zhl{qMajmHs7;|eYZg{~+QAh@jmIS3`Fg`vLaM;t#*M8jx14pwqCTCplGXAFdl3vNqCoev=9J zOdVc895i=#KMoGx;*B$YV^eDIAuzIySC*}12yC8VBXWcw{sWP{Z4JNyqY!_3d?Eb} z2=lqRx+blp^*Gzxi~cN;f%?<&j3{dFz(?k~Vdt<+T%p%pizL~ zO(tNoR^*m>F7>-W15PIdY?i={{DYlmdzsz@_t9`SAT;}q$PSm?Q5aomo1=_hjP+Si zVL5g~(@Exn8-?k>mY(zbU%387`RhNR`UO2nDylZS9p>B+)Dz z({WgJu2*mR8df5`s^AY&u3#{rz_; zHY`c2cs$<@S!}0}q2@nO1?Yd&-x7~R;F0=>kMeAW+9DUe#c20n!nB&@V;IT?auXV0 z?Xq|q=XdXvqi>ZPr2@Q7hL@h6SsH$XNs=fDuGc?mk-MweqJz z3Ni?0y|E!U>Nd$O(zNk=PTPiWAQlBhkyACBHnLg$(^?(VF}P2Cc9KBb{z`2;7PZ5L zTEU;PCQmK+67rcN%X3uIY}XlAB0c*&+>>#763-^f32~= gv`zhg8GYM7fUfZ}J~wQ>$Sw>wJ7;ZNgL9An4^s&F#{d8T literal 41253 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 D1&5oE literal 0 HcmV?d00001 diff --git a/documentation/docs/assets/img/mqtt-explorer-wis2box-broker-websockets.png b/documentation/docs/assets/img/mqtt-explorer-wis2box-broker-websockets.png new file mode 100644 index 0000000000000000000000000000000000000000..23598401c7ba32ea2f552e2e9c568db40516f341 GIT binary patch literal 77683 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
      }*lBWu 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 + +Provide the required authentication token and submit the form. + +You will likely see an error message because this station is not in your station-list. You will need to add the station "0-20000-0-64400" to your station list in order for the data to be converted and published successfully. + +### Viewing the GTS headers in the WIS2 Notification + +Go to the MQTT Explorer and check the WIS2 Notification Message for the data you just ingested to see if the GTS headers are included in the notification. + ## Conclusion !!! success "Congratulations!" diff --git a/documentation/docs/en/practical-sessions/connecting-to-wis2-over-mqtt.md b/documentation/docs/en/practical-sessions/connecting-to-wis2-over-mqtt.md index 2fe99b835..c12c2d2d0 100644 --- a/documentation/docs/en/practical-sessions/connecting-to-wis2-over-mqtt.md +++ b/documentation/docs/en/practical-sessions/connecting-to-wis2-over-mqtt.md @@ -57,7 +57,7 @@ This is an example of the WIS2 notification message structure for a message rece "href":"https://oscar.wmo.int/surface/#/search/station/stationReportDetails/0-20000-0-76679" } ], - "generated_by":"wis2box 1.2.0" + "generated_by":"wis2box 1.3.0" } ``` diff --git a/documentation/docs/en/practical-sessions/initializing-wis2box.md b/documentation/docs/en/practical-sessions/initializing-wis2box.md index 267324ecf..313c80e03 100644 --- a/documentation/docs/en/practical-sessions/initializing-wis2box.md +++ b/documentation/docs/en/practical-sessions/initializing-wis2box.md @@ -16,7 +16,7 @@ title: Initializing wis2box !!! note - The current training materials are based on wis2box-release 1.2.0. + The current training materials are based on wis2box-release 1.3.0. See [accessing-your-student-vm](./accessing-your-student-vm.md) for instructions on how to download and install the wis2box software stack if you are running this training outside of a local training session. @@ -148,11 +148,11 @@ When running this command for the first time, you will see the following output: ``` No docker-compose.images-*.yml files found, creating one -Current version=Undefined, latest version=1.2.0 +Current version=Undefined, latest version=1.3.0 Would you like to update ? (y/n/exit) ``` -Select ``y`` and the the script will create the file ``docker-compose.images-1.2.0.yml``, download the required Docker images and start the services. +Select ``y`` and the the script will create the file ``docker-compose.images-1.3.0.yml``, download the required Docker images and start the services. Downloading the images may take some time depending on your internet connection speed. This step is only required the first time you start wis2box. @@ -205,23 +205,21 @@ docker ps --format "table {{.Names}} \t{{.Status}} \t{{.Image}}" You should see the following containers running: ```{bash} -NAMES STATUS IMAGE -elasticsearch docker.elastic.co/elasticsearch/elasticsearch:8.6.2 "/bin/tini -- /usr/l…" elasticsearch About a minute ago Up About a minute (healthy) 9200/tcp, 9300/tcp -elasticsearch-exporter quay.io/prometheuscommunity/elasticsearch-exporter:latest "/bin/elasticsearch_…" elasticsearch-exporter About a minute ago Up About a minute 7979/tcp -grafana grafana/grafana-oss:9.0.3 "/run.sh" grafana About a minute ago Up About a minute 0.0.0.0:3000->3000/tcp -loki grafana/loki:2.4.1 "/usr/bin/loki -conf…" loki About a minute ago Up About a minute 3100/tcp -mosquitto ghcr.io/world-meteorological-organization/wis2box-broker:1.2.0 "/docker-entrypoint.…" mosquitto About a minute ago Up About a minute 0.0.0.0:1883->1883/tcp, 0.0.0.0:8884->8884/tcp -mqtt_metrics_collector ghcr.io/world-meteorological-organization/wis2box-mqtt-metrics-collector:1.2.0 "python3 -u mqtt_met…" mqtt_metrics_collector About a minute ago Up 10 seconds 8000/tcp, 0.0.0.0:8001->8001/tcp -nginx nginx:alpine "/docker-entrypoint.…" web-proxy About a minute ago Up 9 seconds 0.0.0.0:80->80/tcp -prometheus prom/prometheus:v2.37.0 "/bin/prometheus --c…" prometheus About a minute ago Up About a minute 9090/tcp -wis2box-api ghcr.io/world-meteorological-organization/wis2box-api:1.2.0 "/app/docker/es-entr…" wis2box-api About a minute ago Up 36 seconds (healthy) -wis2box-auth ghcr.io/world-meteorological-organization/wis2box-auth:1.2.0 "/entrypoint.sh" wis2box-auth About a minute ago Up 10 seconds -wis2box-management ghcr.io/world-meteorological-organization/wis2box-management:1.2.0 "/home/wis2box/entry…" wis2box-management About a minute ago Up 12 seconds -wis2box-minio minio/minio:RELEASE.2024-08-03T04-33-23Z-cpuv1 "/usr/bin/docker-ent…" minio About a minute ago Up About a minute (healthy) 0.0.0.0:8022->8022/tcp, 0.0.0.0:9000-9001->9000-9001/tcp -wis2box-ui ghcr.io/world-meteorological-organization/wis2box-ui:1.2.0 "/docker-entrypoint.…" wis2box-ui About a minute ago Up 35 seconds 0.0.0.0:9999->80/tcp -wis2box-webapp ghcr.io/world-meteorological-organization/wis2box-webapp:1.2.0 "sh /wis2box-webapp/…" wis2box-webapp About a minute ago Up About a minute (unhealthy) 4173/tcp -wis2downloader ghcr.io/wmo-im/wis2downloader:v0.3.2 "/home/wis2downloade…" wis2downloader About a minute ago Up About a minute (healthy) - +NAMES STATUS IMAGE +nginx Up 56 seconds nginx:1.30.1-alpine +mqtt_metrics_collector Up 58 seconds ghcr.io/world-meteorological-organization/wis2box-mqtt-metrics-collector:1.3.0 +wis2box-auth Up 59 seconds ghcr.io/world-meteorological-organization/wis2box-auth:1.3.0 +wis2box-ui Up About a minute ghcr.io/world-meteorological-organization/wis2box-ui:1.3.0 +wis2box-management Up About a minute ghcr.io/world-meteorological-organization/wis2box-management:1.3.0 +wis2box-minio Up 2 minutes (healthy) ghcr.io/world-meteorological-organization/wis2box-minio:latest +wis2box-api Up About a minute (healthy) ghcr.io/world-meteorological-organization/wis2box-api:1.3.0 +elasticsearch Up 2 minutes (healthy) docker.elastic.co/elasticsearch/elasticsearch:8.6.2 +grafana Up 2 minutes grafana/grafana-oss:12.4.2 +loki Up 2 minutes grafana/loki:2.4.1 +elasticsearch-exporter Up 2 minutes quay.io/prometheuscommunity/elasticsearch-exporter:latest +prometheus Up 2 minutes prom/prometheus:v2.37.0 +mosquitto Up 2 minutes ghcr.io/world-meteorological-organization/wis2box-broker:1.3.0 +wis2box-webapp Up 2 minutes (healthy) ghcr.io/world-meteorological-organization/wis2box-webapp:1.3.0 ``` These containers are part of the wis2box software stack and provide the various services required to run the wis2box. @@ -352,13 +350,15 @@ Make sure to click "SAVE" to store your connection details. Then click "CONNECT" to connect to your **wis2box-broker**. -mqtt-explorer-wis2box-broker.png +mqtt-explorer-wis2box-broker-port1883.png -Once you are connected, verify that your the internal mosquitto statistics being published by your broker under the `$SYS` topic: +Once you are connected, you will see the internal mosquitto statistics being published by your broker under the `$SYS` topic: mqtt-explorer-sys-topic.png -Keep the MQTT Explorer open, as we will use it to monitor the messages published on the broker. +The same connection can also be achieved using MQTT over WebSockets on port 80, using the following connection details: + +mqtt-explorer-wis2box-broker-websockets.png ## Conclusion diff --git a/exercise-materials/gts-headers-exercises/gts_headers_mapping.csv b/exercise-materials/gts-headers-exercises/gts_headers_mapping.csv index dcc34e4b2..cdcdb3fe1 100644 --- a/exercise-materials/gts-headers-exercises/gts_headers_mapping.csv +++ b/exercise-materials/gts-headers-exercises/gts_headers_mapping.csv @@ -1,3 +1,3 @@ string_in_filepath,ttaaii,cccc -SMRO01YRBK,ISMRO01,YRBK -SMRO02YRBK,ISMRO02,YRBK \ No newline at end of file +SMRO01YRBK,ISMD01,YRBK +SMRO02YRBK,ISMD02,YRBK \ No newline at end of file From 4805f37d2b42b7c5fbf7e7bc19feea529794a6e1 Mon Sep 17 00:00:00 2001 From: github-actions Date: Wed, 3 Jun 2026 13:56:37 +0000 Subject: [PATCH 2/4] Auto-translated docs --- .../accessing-your-student-vm.md | 40 ++--- ...dding-gts-headers-to-wis2-notifications.md | 105 ++++++++---- .../connecting-to-wis2-over-mqtt.md | 90 +++++------ .../initializing-wis2box.md | 146 ++++++++--------- .../accessing-your-student-vm.md | 50 +++--- ...dding-gts-headers-to-wis2-notifications.md | 99 +++++++++--- .../connecting-to-wis2-over-mqtt.md | 40 ++--- .../initializing-wis2box.md | 85 +++++----- .../accessing-your-student-vm.md | 30 ++-- ...dding-gts-headers-to-wis2-notifications.md | 107 ++++++++---- .../connecting-to-wis2-over-mqtt.md | 78 ++++----- .../initializing-wis2box.md | 111 +++++++------ .../accessing-your-student-vm.md | 52 +++--- ...dding-gts-headers-to-wis2-notifications.md | 107 ++++++++---- .../connecting-to-wis2-over-mqtt.md | 70 ++++---- .../initializing-wis2box.md | 141 ++++++++-------- .../accessing-your-student-vm.md | 48 +++--- ...dding-gts-headers-to-wis2-notifications.md | 119 ++++++++++---- .../connecting-to-wis2-over-mqtt.md | 60 +++---- .../initializing-wis2box.md | 152 +++++++++--------- 20 files changed, 987 insertions(+), 743 deletions(-) diff --git a/documentation/docs/ar/practical-sessions/accessing-your-student-vm.md b/documentation/docs/ar/practical-sessions/accessing-your-student-vm.md index 18918a623..f4654c0ed 100644 --- a/documentation/docs/ar/practical-sessions/accessing-your-student-vm.md +++ b/documentation/docs/ar/practical-sessions/accessing-your-student-vm.md @@ -10,7 +10,7 @@ title: الوصول إلى جهاز الطالب الافتراضي - الوصول إلى جهاز الطالب الافتراضي الخاص بك عبر SSH وWinSCP - التحقق من تثبيت البرامج المطلوبة للتمارين العملية - - التحقق من أنك تمتلك مواد التمارين لهذا التدريب على جهاز الطالب الافتراضي المحلي الخاص بك + - التحقق من أنك تمتلك مواد التمارين لهذا التدريب على جهاز الطالب الافتراضي الخاص بك ## المقدمة @@ -26,23 +26,23 @@ title: الوصول إلى جهاز الطالب الافتراضي !!! note - إذا كنت ترغب في إجراء هذا التدريب خارج جلسة تدريب محلية، يمكنك توفير جهاز افتراضي خاص بك باستخدام أي مزود سحابي، على سبيل المثال: + إذا كنت ترغب في تنفيذ هذا التدريب خارج جلسة تدريب محلية، يمكنك توفير جهاز افتراضي خاص بك باستخدام أي مزود خدمة سحابية، على سبيل المثال: - GCP (Google Cloud Platform) VM instance `e2-medium` - AWS (Amazon Web Services) ec2-instance `t3a.medium` - Azure (Microsoft) Azure Virtual Machine `standard_b2s` اختر Ubuntu Server 22.0.4 LTS كنظام تشغيل. - + بعد إنشاء الجهاز الافتراضي، تأكد من تثبيت python وdocker وdocker compose، كما هو موضح في [wis2box-software-dependencies](https://docs.wis2box.wis.wmo.int/en/latest/user/getting-started.html#software-dependencies). - + يمكن تنزيل أرشيف الإصدار الخاص بـwis2box المستخدم في هذا التدريب كما يلي: ```bash - wget https://github.com/World-Meteorological-Organization/wis2box-release/releases/download/1.2.0/wis2box-setup-1.2.0.zip - unzip wis2box-setup-1.2.0.zip + wget https://github.com/World-Meteorological-Organization/wis2box-release/releases/download/1.3.0/wis2box-setup-1.3.0.zip + unzip wis2box-setup-1.3.0.zip ``` - + يمكنك دائمًا العثور على أحدث أرشيف 'wis2box-setup' على [https://github.com/World-Meteorological-Organization/wis2box/releases](https://github.com/World-Meteorological-Organization/wis2box-release/releases). يمكن تنزيل مواد التمارين المستخدمة في هذا التدريب كما يلي: @@ -56,24 +56,24 @@ title: الوصول إلى جهاز الطالب الافتراضي ```bash pip3 install minio - pip3 install pywiscat==0.4.0 + pip3 install pywiscat ``` - إذا كنت تستخدم جهاز الطالب الافتراضي المقدم خلال جلسات التدريب المحلية لـWIS2، فسيتم تثبيت البرامج المطلوبة مسبقًا. + إذا كنت تستخدم جهاز الطالب الافتراضي المقدم خلال جلسات التدريب المحلية لـWIS2، فسيكون البرنامج المطلوب مثبتًا بالفعل. ## الاتصال بجهاز الطالب الافتراضي الخاص بك على الشبكة التدريبية المحلية -قم بتوصيل جهاز الكمبيوتر الخاص بك بشبكة Wi-Fi المحلية التي يتم بثها في الغرفة أثناء تدريب WIS2 وفقًا للتعليمات المقدمة من المدرب. +قم بتوصيل جهاز الكمبيوتر الخاص بك بشبكة Wi-Fi المحلية التي يتم بثها في القاعة أثناء تدريب WIS2 وفقًا للتعليمات المقدمة من المدرب. استخدم عميل SSH للاتصال بجهاز الطالب الافتراضي الخاص بك باستخدام المعلومات التالية: -- **المضيف: (يتم تقديمه أثناء التدريب الشخصي)** +- **المضيف: (يتم توفيره أثناء التدريب الشخصي)** - **المنفذ: 22** -- **اسم المستخدم: (يتم تقديمه أثناء التدريب الشخصي)** -- **كلمة المرور: (يتم تقديمها أثناء التدريب الشخصي)** +- **اسم المستخدم: (يتم توفيره أثناء التدريب الشخصي)** +- **كلمة المرور: (يتم توفيرها أثناء التدريب الشخصي)** !!! tip - اتصل بمدرب إذا كنت غير متأكد من اسم المضيف/اسم المستخدم أو واجهت مشاكل في الاتصال. + تواصل مع المدرب إذا كنت غير متأكد من اسم المضيف/اسم المستخدم أو واجهت مشاكل في الاتصال. بمجرد الاتصال، يرجى تغيير كلمة المرور الخاصة بك لضمان عدم تمكن الآخرين من الوصول إلى جهازك الافتراضي: @@ -119,7 +119,7 @@ Docker Compose version v2.21.0 لضمان أن المستخدم الخاص بك يمكنه تشغيل أوامر Docker، تم إضافة المستخدم الخاص بك إلى مجموعة `docker`. -لاختبار أن المستخدم الخاص بك يمكنه تشغيل docker hello-world، قم بتشغيل الأمر التالي: +لاختبار أن المستخدم الخاص بك يمكنه تشغيل docker hello-world، قم بتنفيذ الأمر التالي: ```bash docker run hello-world ``` @@ -135,9 +135,9 @@ This message shows that your installation appears to be working correctly. ... ``` -## تفقد مواد التمارين +## فحص مواد التمارين -تفقد محتويات دليل المنزل الخاص بك؛ هذه هي المواد المستخدمة كجزء من التدريب والجلسات العملية. +افحص محتويات دليل المنزل الخاص بك؛ هذه هي المواد المستخدمة كجزء من التدريب والجلسات العملية. ```bash ls ~/ @@ -147,7 +147,7 @@ ls ~/ exercise-materials wis2box ``` -إذا كان لديك WinSCP مثبتًا على جهاز الكمبيوتر المحلي الخاص بك، يمكنك استخدامه للاتصال بجهاز الطالب الافتراضي الخاص بك وتفقد محتويات دليل المنزل الخاص بك وتنزيل أو تحميل الملفات بين جهازك الافتراضي وجهاز الكمبيوتر المحلي الخاص بك. +إذا كان لديك WinSCP مثبتًا على جهاز الكمبيوتر المحلي الخاص بك، يمكنك استخدامه للاتصال بجهاز الطالب الافتراضي الخاص بك وفحص محتويات دليل المنزل الخاص بك وتنزيل أو تحميل الملفات بين جهازك الافتراضي وجهاز الكمبيوتر المحلي الخاص بك. WinSCP ليس مطلوبًا للتدريب، ولكنه يمكن أن يكون مفيدًا إذا كنت ترغب في تحرير الملفات على جهازك الافتراضي باستخدام محرر نصوص على جهاز الكمبيوتر المحلي الخاص بك. @@ -159,7 +159,7 @@ WinSCP ليس مطلوبًا للتدريب، ولكنه يمكن أن يكون انقر على 'Save' ثم 'Login' للاتصال بجهازك الافتراضي. -يجب أن تكون الآن قادرًا على رؤية محتوى دليل المنزل على جهاز الطالب الافتراضي الخاص بك والوصول إلى ملفاتك. +يجب أن تكون الآن قادرًا على رؤية محتويات دليل المنزل على جهاز الطالب الافتراضي الخاص بك والوصول إلى ملفاتك. ## الخاتمة @@ -168,4 +168,4 @@ WinSCP ليس مطلوبًا للتدريب، ولكنه يمكن أن يكون - الوصول إلى جهاز الطالب الافتراضي الخاص بك عبر SSH وWinSCP - التحقق من تثبيت البرامج المطلوبة للتمارين العملية - - التحقق من أنك تمتلك مواد التمارين لهذا التدريب على جهاز الطالب الافتراضي المحلي الخاص بك \ No newline at end of file + - التحقق من أنك تمتلك مواد التمارين لهذا التدريب على جهاز الطالب الافتراضي الخاص بك \ No newline at end of file diff --git a/documentation/docs/ar/practical-sessions/adding-gts-headers-to-wis2-notifications.md b/documentation/docs/ar/practical-sessions/adding-gts-headers-to-wis2-notifications.md index 584eae3b5..16e664ae0 100644 --- a/documentation/docs/ar/practical-sessions/adding-gts-headers-to-wis2-notifications.md +++ b/documentation/docs/ar/practical-sessions/adding-gts-headers-to-wis2-notifications.md @@ -8,17 +8,18 @@ title: إضافة رؤوس GTS إلى إشعارات WIS2 بنهاية هذه الجلسة العملية، ستكون قادرًا على: - - تكوين تعيين بين اسم الملف ورؤوس GTS - - إدخال البيانات بأسماء ملفات تتطابق مع رؤوس GTS + - تكوين خريطة بين اسم الملف ورؤوس GTS + - إدخال بيانات باسم ملف يتطابق مع رؤوس GTS - عرض رؤوس GTS في إشعارات WIS2 + - استخدام نموذج FM-12 SYNOP لإضافة رؤوس GTS يدويًا إلى إشعار WIS2 -## مقدمة +## المقدمة -الأعضاء في المنظمة العالمية للأرصاد الجوية الراغبين في إيقاف نقل بياناتهم على GTS خلال مرحلة الانتقال إلى WIS2 سيحتاجون إلى إضافة رؤوس GTS إلى إشعاراتهم WIS2. تمكن هذه الرؤوس بوابة WIS2 إلى GTS من توجيه البيانات إلى شبكة GTS. +أعضاء المنظمة العالمية للأرصاد الجوية (WMO) الذين يرغبون في إيقاف نقل بياناتهم عبر GTS خلال مرحلة الانتقال إلى WIS2 سيحتاجون إلى إضافة رؤوس GTS إلى إشعارات WIS2 الخاصة بهم. تتيح هذه الرؤوس لبوابة WIS2 إلى GTS إعادة توجيه البيانات إلى شبكة GTS. -هذا يسمح للأعضاء الذين انتقلوا إلى استخدام عقدة WIS2 لنشر البيانات بتعطيل نظام MSS الخاص بهم وضمان توفر بياناتهم للأعضاء الذين لم ينتقلوا بعد إلى WIS2. +يسمح هذا للأعضاء الذين انتقلوا إلى استخدام عقدة WIS2 لنشر البيانات بإيقاف نظام MSS الخاص بهم وضمان أن بياناتهم لا تزال متاحة للأعضاء الذين لم ينتقلوا بعد إلى WIS2. -يجب إضافة خاصية GTS في رسالة إشعار WIS2 كخاصية إضافية إلى رسالة إشعار WIS2. خاصية GTS هي كائن JSON يحتوي على رؤوس GTS المطلوبة لتوجيه البيانات إلى شبكة GTS. +يجب إضافة خاصية GTS في رسالة إشعار WIS2 كخاصية إضافية. خاصية GTS هي كائن JSON يحتوي على رؤوس GTS المطلوبة لإعادة توجيه البيانات إلى شبكة GTS. ```json { @@ -29,45 +30,55 @@ title: إضافة رؤوس GTS إلى إشعارات WIS2 } ``` -ضمن wis2box يمكنك إضافة هذا إلى إشعارات WIS2 تلقائيًا عن طريق توفير ملف إضافي يسمى `gts_headers_mapping.csv` يحتوي على المعلومات المطلوبة لتعيين رؤوس GTS إلى أسماء الملفات الواردة. +داخل `wis2box`، يمكنك إضافة هذه الخاصية إلى إشعارات WIS2 تلقائيًا عن طريق توفير ملف إضافي باسم `gts_headers_mapping.csv` يحتوي على المعلومات المطلوبة لربط رؤوس GTS بأسماء الملفات الواردة. -يجب وضع هذا الملف في الدليل المحدد بواسطة `WIS2BOX_HOST_DATADIR` في ملف `wis2box.env` الخاص بك ويجب أن يحتوي على الأعمدة التالية: +يجب وضع هذا الملف في الدليل المحدد بواسطة `WIS2BOX_HOST_DATADIR` في ملف `wis2box.env` ويجب أن يحتوي على الأعمدة التالية: -- `string_in_filepath`: سلسلة تكون جزءًا من اسم الملف الذي سيتم استخدامه لمطابقة رؤوس GTS -- `TTAAii`: رأس TTAAii الذي سيتم إضافته إلى إشعار WIS2 -- `CCCC`: رأس CCCC الذي سيتم إضافته إلى إشعار WIS2 +- `string_in_filepath`: سلسلة نصية تكون جزءًا من اسم الملف الذي سيتم استخدامه لمطابقة رؤوس GTS +- `TTAAii`: الرأس TTAAii الذي سيتم إضافته إلى إشعار WIS2 +- `CCCC`: الرأس CCCC الذي سيتم إضافته إلى إشعار WIS2 + +اعتبارًا من الإصدار `wis2box-1.3.0`، لدى ناشري البيانات خياران (اختياريان) لإضافة خصائص GTS إلى إشعاراتهم: + +1. بالنسبة للملفات التي يتم تحميلها إلى MinIO، قم بإعداد ملف الخريطة "gts_headers_mapping.csv" مع الخصائص المطلوبة. + +2. بالنسبة لإدخال البيانات باستخدام نموذج FM-12 SYNOP في `wis2box-webapp`، اختر "إضافة رؤوس GTS" وقم بإدخال المعلومات يدويًا. ## التحضير -تأكد من أن لديك وصول SSH إلى VM الطالب الخاص بك وأن نسخة wis2box الخاصة بك قيد التشغيل. +تأكد من أن لديك وصول SSH إلى جهاز الطالب الافتراضي الخاص بك وأن مثيل `wis2box` الخاص بك يعمل. -تأكد من أنك متصل بوسيط MQTT الخاص بنسخة wis2box باستخدام MQTT Explorer. يمكنك استخدام بيانات الاعتماد العامة `everyone/everyone` للاتصال بالوسيط. +تأكد من أنك متصل بوسيط MQTT الخاص بمثيل `wis2box` الخاص بك باستخدام `MQTT Explorer`. يمكنك استخدام بيانات الاعتماد العامة `everyone/everyone` للاتصال بالوسيط. -تأكد من أن لديك متصفح ويب مفتوحًا مع لوحة تحكم Grafana لنسختك بالانتقال إلى `http://YOUR-HOST:3000` +تأكد من أن لديك متصفح ويب مفتوح مع لوحة تحكم Grafana لمثيلك عن طريق الذهاب إلى `http://YOUR-HOST:3000`. -## إنشاء `gts_headers_mapping.csv` +## التمرين 1: استخدام ملف خريطة للبيانات المحملة إلى MinIO -لإضافة رؤوس GTS إلى إشعارات WIS2 الخاصة بك، مطلوب ملف CSV يعين رؤوس GTS إلى أسماء الملفات الواردة. +سيُظهر التمرين الأول كيفية إضافة رؤوس GTS للبيانات التي يتم تحميلها إلى MinIO باستخدام ملف خريطة باسم `gts_headers_mapping.csv`. -يجب تسمية الملف (بالضبط) `gts_headers_mapping.csv` ويجب وضعه في الدليل المحدد بواسطة `WIS2BOX_HOST_DATADIR` في ملف `wis2box.env` الخاص بك. +### إنشاء `gts_headers_mapping.csv` -## توفير ملف `gts_headers_mapping.csv` +لإضافة رؤوس GTS إلى إشعارات WIS2 الخاصة بك، يلزم وجود ملف CSV يربط رؤوس GTS بأسماء الملفات الواردة. -انسخ الملف `exercise-materials/gts-headers-exercises/gts_headers_mapping.csv` إلى نسخة wis2box الخاصة بك وضعه في الدليل المحدد بواسطة `WIS2BOX_HOST_DATADIR` في ملف `wis2box.env` الخاص بك. +يجب تسمية ملف CSV (بالضبط) `gts_headers_mapping.csv` ويجب وضعه في الدليل المحدد بواسطة `WIS2BOX_HOST_DATADIR` في ملف `wis2box.env`. + +انسخ الملف `exercise-materials/gts-headers-exercises/gts_headers_mapping.csv` إلى مثيل `wis2box` الخاص بك وضعه في الدليل المحدد بواسطة `WIS2BOX_HOST_DATADIR` في ملف `wis2box.env`. ```bash cp ~/exercise-materials/gts-headers-exercises/gts_headers_mapping.csv ~/wis2box-data ``` -ثم أعد تشغيل حاوية wis2box-management لتطبيق التغييرات: +### تطبيق الخرائط + +بعد إنشاء ملف `gts_headers_mapping.csv`، تحتاج إلى إعادة تشغيل حاوية `wis2box-management` لتطبيق التغييرات. يمكنك القيام بذلك عن طريق تشغيل الأمر التالي في جهاز الطالب الافتراضي الخاص بك: ```bash docker restart wis2box-management ``` -## إدخال البيانات مع رؤوس GTS +### إدخال البيانات مع رؤوس GTS -انسخ الملف `exercise-materials/gts-headers-exercises/A_SMRO01YRBK171200_C_EDZW_20240717120502.txt` إلى الدليل المحدد بواسطة `WIS2BOX_HOST_DATADIR` في ملف `wis2box.env` الخاص بك: +انسخ الملف `exercise-materials/gts-headers-exercises/A_SMRO01YRBK171200_C_EDZW_20240717120502.txt` إلى الدليل المحدد بواسطة `WIS2BOX_HOST_DATADIR` في ملف `wis2box.env`: ```bash cp ~/exercise-materials/gts-headers-exercises/A_SMRO01YRBK171200_C_EDZW_20240717120502.txt ~/wis2box-data @@ -80,7 +91,7 @@ cd ~/wis2box python3 wis2box-ctl.py login ``` -من سطر أوامر wis2box يمكننا إدخال ملف البيانات النموذجي `A_SMRO01YRBK171200_C_EDZW_20240717120502.txt` في مجموعة بيانات محددة كما يلي: +من سطر أوامر `wis2box`، يمكننا إدخال ملف البيانات النموذجي `A_SMRO01YRBK171200_C_EDZW_20240717120502.txt` إلى مجموعة بيانات محددة كما يلي: ```bash wis2box data ingest -p /data/wis2box/A_SMRO01YRBK171200_C_EDZW_20240717120502.txt --metadata-id urn:wmo:md:not-my-centre:core.surface-based-observations.synop @@ -88,17 +99,55 @@ wis2box data ingest -p /data/wis2box/A_SMRO01YRBK171200_C_EDZW_20240717120502.tx تأكد من استبدال خيار `metadata-id` بالمعرف الصحيح لمجموعة البيانات الخاصة بك. -تحقق من لوحة تحكم Grafana لمعرفة ما إذا تم إدخال البيانات بشكل صحيح. إذا رأيت أي تحذيرات أو أخطاء، حاول إصلاحها وكرر تمرين الأمر `wis2box data ingest`. +تحقق من لوحة تحكم Grafana لمعرفة ما إذا تم إدخال البيانات بشكل صحيح. إذا رأيت أي تحذيرات أو أخطاء، حاول إصلاحها وأعد تنفيذ الأمر `wis2box data ingest`. -## عرض رؤوس GTS في إشعار WIS2 +### عرض رؤوس GTS في إشعار WIS2 -انتقل إلى MQTT Explorer وتحقق من رسالة إشعار WIS2 للبيانات التي أدخلتها للتو. +انتقل إلى `MQTT Explorer` وتحقق من رسالة إشعار WIS2 للبيانات التي قمت بإدخالها للتو. يجب أن تحتوي رسالة إشعار WIS2 على رؤوس GTS التي قدمتها في ملف `gts_headers_mapping.csv`. -## خاتمة +## التمرين 2: استخدام نموذج FM-12 SYNOP + +عند استخدام نموذج FM-12 SYNOP في `wis2box-webapp`، يمكنك إضافة رؤوس GTS يدويًا إلى إشعارات WIS2 الخاصة بك عن طريق اختيار خيار "إضافة رؤوس GTS" وتقديم المعلومات المطلوبة. + +بالنسبة لهذا التمرين، يمكنك استخدام البيانات النموذجية أدناه أو تقديم بياناتك الخاصة: + +رسالة FM-12 SYNOP: + +```{copy} +AAXX 03094 +64400 42460 71004 10285 20245 30113 40133 8493/ + 333 59005 83813 81930 87363 94966 95836= +``` + +رؤوس GTS: TTAAii=`ISIH01` و CCCC=`FCBB` + +!!! note + يقوم المكون الإضافي `synop2bufr-plugin` في `wis2box` بتحويل رسائل FM-12 SYNOP إلى BUFR، لذا يجب أن يبدأ TTAAii بـ `IS`: + + - I = بيانات الرصد (مشفر ثنائيًا) – BUFR + - S = سطح/مستوى البحر + +### إرسال نموذج FM-12 SYNOP يدويًا مع رؤوس GTS + +انتقل إلى نموذج FM-12 SYNOP في `wis2box-webapp` واملأ النموذج بالبيانات النموذجية أعلاه أو بياناتك الخاصة. + +تأكد من اختيار خيار "إضافة رؤوس GTS" وتقديم معلومات رؤوس GTS المطلوبة: + +fm-12-synop-form-gts-headers.png + +قدم رمز المصادقة المطلوب وأرسل النموذج. + +من المحتمل أن ترى رسالة خطأ لأن هذه المحطة ليست في قائمة المحطات الخاصة بك. ستحتاج إلى إضافة المحطة "0-20000-0-64400" إلى قائمة المحطات الخاصة بك لكي يتم تحويل البيانات ونشرها بنجاح. + +### عرض رؤوس GTS في إشعار WIS2 + +انتقل إلى `MQTT Explorer` وتحقق من رسالة إشعار WIS2 للبيانات التي قمت بإدخالها للتأكد من تضمين رؤوس GTS في الإشعار. + +## الخاتمة !!! success "تهانينا!" في هذه الجلسة العملية، تعلمت كيفية: - إضافة رؤوس GTS إلى إشعارات WIS2 الخاصة بك - - التحقق من توفر رؤوس GTS عبر تثبيت wis2box الخاص بك \ No newline at end of file + - التحقق من أن رؤوس GTS متاحة عبر تثبيت `wis2box` الخاص بك \ No newline at end of file diff --git a/documentation/docs/ar/practical-sessions/connecting-to-wis2-over-mqtt.md b/documentation/docs/ar/practical-sessions/connecting-to-wis2-over-mqtt.md index 302f8a626..9edabc2e8 100644 --- a/documentation/docs/ar/practical-sessions/connecting-to-wis2-over-mqtt.md +++ b/documentation/docs/ar/practical-sessions/connecting-to-wis2-over-mqtt.md @@ -9,14 +9,14 @@ title: الاتصال بـ WIS2 عبر MQTT بنهاية هذه الجلسة العملية، ستكون قادرًا على: - الاتصال بـ WIS2 Global Broker باستخدام MQTT Explorer - - مراجعة هيكل المواضيع في WIS2 - - مراجعة هيكل رسائل الإشعارات في WIS2 + - مراجعة بنية المواضيع في WIS2 + - مراجعة بنية رسائل الإشعارات في WIS2 ## المقدمة -يستخدم WIS2 بروتوكول MQTT للإعلان عن توفر بيانات الطقس/المناخ/المياه. يقوم WIS2 Global Broker بالاشتراك في جميع WIS2 Nodes في الشبكة وإعادة نشر الرسائل التي يتلقاها. يقوم Global Cache بالاشتراك في Global Broker، وتنزيل البيانات الموجودة في الرسالة، ثم إعادة نشر الرسالة على موضوع `cache` مع عنوان URL جديد. ينشر Global Discovery Catalogue بيانات الاكتشاف الوصفية من Broker ويوفر واجهة برمجة تطبيقات للبحث. +يستخدم WIS2 بروتوكول MQTT للإعلان عن توفر بيانات الطقس/المناخ/المياه. يقوم WIS2 Global Broker بالاشتراك في جميع WIS2 Nodes في الشبكة ويعيد نشر الرسائل التي يتلقاها. يقوم Global Cache بالاشتراك في Global Broker، وتنزيل البيانات الموجودة في الرسالة، ثم يعيد نشر الرسالة على موضوع `cache` مع عنوان URL جديد. ينشر Global Discovery Catalogue بيانات الاكتشاف الوصفية من Broker ويوفر واجهة برمجة تطبيقات للبحث. -هذا مثال على هيكل رسالة إشعار WIS2 لرسالة تم استلامها على الموضوع `origin/a/wis2/br-inmet/data/core/weather/surface-based-observations/synop`: +هذا مثال على بنية رسالة إشعار WIS2 لرسالة تم استلامها على الموضوع `origin/a/wis2/br-inmet/data/core/weather/surface-based-observations/synop`: ```json { @@ -57,69 +57,69 @@ title: الاتصال بـ WIS2 عبر MQTT "href":"https://oscar.wmo.int/surface/#/search/station/stationReportDetails/0-20000-0-76679" } ], - "generated_by":"wis2box 1.2.0" + "generated_by":"wis2box 1.3.0" } ``` في هذه الجلسة العملية، ستتعلم كيفية استخدام أداة MQTT Explorer لإعداد اتصال عميل MQTT بـ WIS2 Global Broker وعرض رسائل إشعارات WIS2. -يعد MQTT Explorer أداة مفيدة لتصفح ومراجعة هيكل المواضيع لأي MQTT broker لمراجعة البيانات التي يتم نشرها. +MQTT Explorer هي أداة مفيدة لتصفح ومراجعة بنية المواضيع لأي MQTT broker لمراجعة البيانات التي يتم نشرها. !!! note "حول MQTT" - يوفر MQTT Explorer واجهة سهلة الاستخدام للاتصال بـ MQTT broker واستكشاف المواضيع وهيكل الرسائل المستخدمة في WIS2. + يوفر MQTT Explorer واجهة سهلة الاستخدام للاتصال بـ MQTT broker واستكشاف المواضيع وبنية الرسائل المستخدمة في WIS2. في الممارسة العملية، يتم استخدام MQTT للتواصل بين الآلات، حيث يشترك تطبيق أو خدمة في المواضيع ويعالج الرسائل برمجيًا في الوقت الفعلي. - للعمل مع MQTT برمجيًا (على سبيل المثال، باستخدام Python)، يمكنك استخدام مكتبات عملاء MQTT مثل [paho-mqtt](https://pypi.org/project/paho-mqtt) للاتصال بـ MQTT broker ومعالجة الرسائل الواردة. توجد العديد من برامج العملاء والخوادم لـ MQTT، حسب متطلباتك وبيئتك التقنية. + للعمل مع MQTT برمجيًا (على سبيل المثال، باستخدام Python)، يمكنك استخدام مكتبات عملاء MQTT مثل [paho-mqtt](https://pypi.org/project/paho-mqtt) للاتصال بـ MQTT broker ومعالجة الرسائل الواردة. هناك العديد من برامج عملاء وخوادم MQTT، حسب متطلباتك وبيئتك التقنية. ## استخدام MQTT Explorer للاتصال بـ Global Broker -لعرض الرسائل التي ينشرها WIS2 Global Broker، يمكنك استخدام "MQTT Explorer" الذي يمكن تنزيله من [موقع MQTT Explorer](https://mqtt-explorer.com). +لعرض الرسائل التي ينشرها WIS2 Global Broker، يمكنك استخدام "MQTT Explorer"، والذي يمكن تنزيله من [موقع MQTT Explorer](https://mqtt-explorer.com). افتح MQTT Explorer وأضف اتصالًا جديدًا بـ Global Broker المستضاف من قبل MeteoFrance باستخدام التفاصيل التالية: -- host: globalbroker.meteo.fr -- port: 8883 -- username: everyone -- password: everyone +- المضيف: globalbroker.meteo.fr +- المنفذ: 8883 +- اسم المستخدم: everyone +- كلمة المرور: everyone mqtt-explorer-global-broker-connection -انقر على زر 'ADVANCED'، وقم بإزالة المواضيع المُعدة مسبقًا وأضف المواضيع التالية للاشتراك فيها: +انقر على زر 'ADVANCED'، قم بإزالة المواضيع المهيأة مسبقًا وأضف المواضيع التالية للاشتراك فيها: - `origin/a/wis2/#` mqtt-explorer-global-broker-advanced !!! note - عند إعداد اشتراكات MQTT، يمكنك استخدام الرموز العامة التالية: + عند إعداد اشتراكات MQTT، يمكنك استخدام الرموز التالية: - - **مستوى واحد (+)**: الرمز العام لمستوى واحد يستبدل مستوى واحدًا من الموضوع - - **مستويات متعددة (#)**: الرمز العام لمستويات متعددة يستبدل مستويات متعددة من الموضوع + - **مستوى واحد (+)**: رمز استبدال لمستوى واحد من المواضيع + - **مستويات متعددة (#)**: رمز استبدال لمستويات متعددة من المواضيع - في هذه الحالة، `origin/a/wis2/#` سيشترك في جميع المواضيع تحت موضوع `origin/a/wis2`. + في هذه الحالة، `origin/a/wis2/#` ستشترك في جميع المواضيع تحت موضوع `origin/a/wis2`. انقر على 'BACK'، ثم 'SAVE' لحفظ تفاصيل الاتصال والاشتراك. ثم انقر على 'CONNECT': -يجب أن تبدأ الرسائل في الظهور في جلسة MQTT Explorer كما يلي: +يجب أن تبدأ الرسائل بالظهور في جلسة MQTT Explorer كما يلي: mqtt-explorer-global-broker-topics -أنت الآن جاهز لبدء استكشاف مواضيع WIS2 وهيكل الرسائل. +أنت الآن جاهز لبدء استكشاف مواضيع WIS2 وبنية الرسائل. -## التمرين 1: مراجعة هيكل مواضيع WIS2 +## التمرين 1: مراجعة بنية المواضيع في WIS2 -استخدم MQTT لتصفح هيكل المواضيع تحت مواضيع `origin`. +استخدم MQTT لتصفح بنية المواضيع تحت مواضيع `origin`. !!! question - كيف يمكننا التمييز بين مركز WIS الذي نشر البيانات؟ + كيف يمكننا تمييز مركز WIS الذي نشر البيانات؟ -??? success "انقر للكشف عن الإجابة" +??? success "انقر لعرض الإجابة" - يمكنك النقر على نافذة الجانب الأيسر في MQTT Explorer لتوسيع هيكل المواضيع. + يمكنك النقر على نافذة الجانب الأيسر في MQTT Explorer لتوسيع بنية المواضيع. - يمكننا التمييز بين مركز WIS الذي نشر البيانات من خلال النظر إلى المستوى الرابع من هيكل المواضيع. على سبيل المثال، الموضوع التالي: + يمكننا تمييز مركز WIS الذي نشر البيانات من خلال النظر إلى المستوى الرابع من بنية المواضيع. على سبيل المثال، الموضوع التالي: `origin/a/wis2/br-inmet/data/core/weather/surface-based-observations/synop` @@ -129,17 +129,17 @@ title: الاتصال بـ WIS2 عبر MQTT كيف يمكننا التمييز بين الرسائل المنشورة من مراكز WIS التي تستضيف بوابة GTS-to-WIS2 والرسائل المنشورة من مراكز WIS التي تستضيف WIS2 Node؟ -??? success "انقر للكشف عن الإجابة" +??? success "انقر لعرض الإجابة" - يمكننا التمييز بين الرسائل القادمة من بوابة GTS-to-WIS2 من خلال النظر إلى معرف المركز في هيكل المواضيع. على سبيل المثال، الموضوع التالي: + يمكننا التمييز بين الرسائل القادمة من بوابة GTS-to-WIS2 من خلال النظر إلى معرف المركز في بنية المواضيع. على سبيل المثال، الموضوع التالي: `origin/a/wis2/de-dwd-gts-to-wis2/data/core/I/S/A/I/01/sbbr` - يخبرنا أن البيانات تم نشرها من بوابة GTS-to-WIS2 المستضافة من قبل Deutscher Wetterdienst (DWD)، ألمانيا. بوابة GTS-to-WIS2 هي نوع خاص من ناشري البيانات الذين ينشرون البيانات من نظام الاتصالات العالمي (GTS) إلى WIS2. يتكون هيكل المواضيع من رؤوس TTAAii CCCC لرسائل GTS. + يخبرنا أن البيانات تم نشرها من بوابة GTS-to-WIS2 المستضافة من قبل Deutscher Wetterdienst (DWD)، ألمانيا. بوابة GTS-to-WIS2 هي نوع خاص من ناشري البيانات الذين ينشرون البيانات من نظام الاتصالات العالمي (GTS) إلى WIS2. تتكون بنية المواضيع من رؤوس TTAAii CCCC لرسائل GTS. -## التمرين 2: مراجعة هيكل رسائل WIS2 +## التمرين 2: مراجعة بنية رسائل WIS2 -افصل الاتصال بـ MQTT Explorer وقم بتحديث قسم 'Advanced' لتغيير الاشتراك إلى ما يلي: +افصل الاتصال من MQTT Explorer وقم بتحديث قسم 'Advanced' لتغيير الاشتراك إلى ما يلي: * `origin/a/wis2/+/data/core/weather/surface-based-observations/synop` * `cache/a/wis2/+/data/core/weather/surface-based-observations/synop` @@ -147,33 +147,33 @@ title: الاتصال بـ WIS2 عبر MQTT mqtt-explorer-global-broker-topics-exercise2 !!! note - يتم استخدام الرمز العام `+` للاشتراك في جميع مراكز WIS. + يتم استخدام الرمز `+` للاشتراك في جميع مراكز WIS. أعد الاتصال بـ Global Broker وانتظر حتى تظهر الرسائل. -يمكنك عرض محتوى رسالة WIS2 في قسم "Value" على الجانب الأيمن. حاول توسيع هيكل المواضيع لرؤية المستويات المختلفة للرسالة حتى تصل إلى المستوى الأخير ومراجعة محتوى إحدى الرسائل. +يمكنك عرض محتوى رسالة WIS2 في قسم "Value" على الجانب الأيمن. حاول توسيع بنية المواضيع لرؤية المستويات المختلفة للرسالة حتى تصل إلى المستوى الأخير ومراجعة محتوى إحدى الرسائل. !!! question كيف يمكننا تحديد الطابع الزمني الذي تم فيه نشر البيانات؟ وكيف يمكننا تحديد الطابع الزمني الذي تم فيه جمع البيانات؟ -??? success "انقر للكشف عن الإجابة" +??? success "انقر لعرض الإجابة" - الطابع الزمني الذي تم فيه نشر البيانات موجود في قسم `properties` من الرسالة مع المفتاح `pubtime`. + الطابع الزمني الذي تم فيه نشر البيانات موجود في قسم `properties` من الرسالة بمفتاح `pubtime`. - الطابع الزمني الذي تم فيه جمع البيانات موجود في قسم `properties` من الرسالة مع المفتاح `datetime`. + الطابع الزمني الذي تم فيه جمع البيانات موجود في قسم `properties` من الرسالة بمفتاح `datetime`. mqtt-explorer-global-broker-msg-properties !!! question - كيف يمكننا تنزيل البيانات من عنوان URL الموجود في الرسالة؟ + كيف يمكننا تنزيل البيانات من عنوان URL المقدم في الرسالة؟ -??? success "انقر للكشف عن الإجابة" +??? success "انقر لعرض الإجابة" عنوان URL موجود في قسم `links` مع `rel="canonical"` ومحدد بواسطة المفتاح `href`. - يمكنك نسخ عنوان URL ولصقه في متصفح ويب لتنزيل البيانات. + يمكنك نسخ عنوان URL ولصقه في متصفح الويب لتنزيل البيانات. ## التمرين 3: مراجعة الفرق بين مواضيع 'origin' و 'cache' @@ -185,11 +185,11 @@ title: الاتصال بـ WIS2 عبر MQTT ما الفرق بين الرسائل المنشورة على مواضيع `origin` و `cache`؟ -??? success "انقر للكشف عن الإجابة" +??? success "انقر لعرض الإجابة" الرسائل المنشورة على مواضيع `origin` هي الرسائل الأصلية التي يعيد Global Broker نشرها من WIS2 Nodes في الشبكة. - الرسائل المنشورة على مواضيع `cache` هي الرسائل التي تم تنزيل البيانات الخاصة بها من قبل Global Cache. إذا قمت بفحص محتوى الرسالة من الموضوع الذي يبدأ بـ `cache`، ستلاحظ أن الرابط 'canonical' تم تحديثه إلى عنوان URL جديد. + الرسائل المنشورة على مواضيع `cache` هي الرسائل التي تم تنزيل البيانات الخاصة بها بواسطة Global Cache. إذا قمت بفحص محتوى الرسالة من الموضوع الذي يبدأ بـ `cache`، ستلاحظ أن الرابط 'canonical' قد تم تحديثه إلى عنوان URL جديد. هناك العديد من Global Caches في شبكة WIS2، لذلك ستتلقى رسالة واحدة من كل Global Cache قامت بتنزيل الرسالة. @@ -201,8 +201,8 @@ title: الاتصال بـ WIS2 عبر MQTT في هذه الجلسة العملية، تعلمت: - كيفية الاشتراك في خدمات WIS2 Global Broker باستخدام MQTT Explorer - - هيكل المواضيع في WIS2 - - هيكل رسائل الإشعارات في WIS2 + - بنية المواضيع في WIS2 + - بنية رسائل الإشعارات في WIS2 - الفرق بين البيانات الأساسية والموصى بها - - هيكل المواضيع المستخدم بواسطة بوابة GTS-to-WIS2 - - الفرق بين رسائل Global Broker المنشورة على مواضيع `origin` و `cache` \ No newline at end of file + - بنية المواضيع المستخدمة بواسطة بوابة GTS-to-WIS2 + - الفرق بين الرسائل المنشورة على مواضيع `origin` و `cache` في Global Broker \ No newline at end of file diff --git a/documentation/docs/ar/practical-sessions/initializing-wis2box.md b/documentation/docs/ar/practical-sessions/initializing-wis2box.md index 428f495a9..9aaa4ee00 100644 --- a/documentation/docs/ar/practical-sessions/initializing-wis2box.md +++ b/documentation/docs/ar/practical-sessions/initializing-wis2box.md @@ -8,7 +8,7 @@ title: تهيئة wis2box بنهاية هذه الجلسة العملية، ستكون قادرًا على: - - تشغيل سكربت `wis2box-create-config.py` لإنشاء التهيئة الأولية + - تشغيل سكريبت `wis2box-create-config.py` لإنشاء التهيئة الأولية - بدء تشغيل wis2box والتحقق من حالة مكوناته - عرض محتويات **wis2box-api** - الوصول إلى **wis2box-webapp** @@ -16,13 +16,13 @@ title: تهيئة wis2box !!! note - تعتمد المواد التدريبية الحالية على الإصدار 1.2.0 من wis2box. + تستند المواد التدريبية الحالية إلى الإصدار 1.3.0 من wis2box. راجع [accessing-your-student-vm](./accessing-your-student-vm.md) للحصول على تعليمات حول كيفية تنزيل وتثبيت حزمة برامج wis2box إذا كنت تقوم بإجراء هذا التدريب خارج جلسة تدريب محلية. ## التحضير -قم بتسجيل الدخول إلى الجهاز الافتراضي المخصص لك باستخدام اسم المستخدم وكلمة المرور الخاصة بك، وتأكد من أنك في دليل `wis2box`: +قم بتسجيل الدخول إلى الجهاز الافتراضي المخصص لك باستخدام اسم المستخدم وكلمة المرور الخاصة بك وتأكد من أنك في دليل `wis2box`: ```bash cd ~/wis2box @@ -33,15 +33,15 @@ cd ~/wis2box تتطلب التهيئة الأولية لـ wis2box ما يلي: - ملف بيئة `wis2box.env` يحتوي على معلمات التهيئة -- دليل على الجهاز المضيف لمشاركته بين الجهاز المضيف وحاويات wis2box، يتم تعريفه بواسطة متغير البيئة `WIS2BOX_HOST_DATADIR` +- دليل على الجهاز المضيف للمشاركة بين الجهاز المضيف وحاويات wis2box المحددة بواسطة متغير البيئة `WIS2BOX_HOST_DATADIR` -يمكن استخدام سكربت `wis2box-create-config.py` لإنشاء التهيئة الأولية لـ wis2box. +يمكن استخدام سكريبت `wis2box-create-config.py` لإنشاء التهيئة الأولية لـ wis2box. -سيطلب منك مجموعة من الأسئلة للمساعدة في إعداد التهيئة. +سيطرح عليك مجموعة من الأسئلة للمساعدة في إعداد التهيئة. -ستتمكن من مراجعة وتحديث ملفات التهيئة بعد انتهاء السكربت. +ستتمكن من مراجعة وتحديث ملفات التهيئة بعد انتهاء السكريبت. -قم بتشغيل السكربت كما يلي: +قم بتشغيل السكريبت كما يلي: ```bash python3 wis2box-create-config.py @@ -49,9 +49,9 @@ python3 wis2box-create-config.py ### دليل wis2box-host-data -سيطلب منك السكربت إدخال الدليل الذي سيتم استخدامه لمتغير البيئة `WIS2BOX_HOST_DATADIR`. +سيطلب منك السكريبت إدخال الدليل الذي سيتم استخدامه لمتغير البيئة `WIS2BOX_HOST_DATADIR`. -يرجى ملاحظة أنه يجب عليك تحديد المسار الكامل لهذا الدليل. +لاحظ أنه يجب عليك تحديد المسار الكامل لهذا الدليل. على سبيل المثال، إذا كان اسم المستخدم الخاص بك هو `username`، فإن المسار الكامل للدليل هو `/home/username/wis2box-data`: @@ -68,7 +68,7 @@ The directory /home/username/wis2box-data has been created. ### عنوان URL الخاص بـ wis2box -بعد ذلك، سيُطلب منك إدخال عنوان URL الخاص بـ wis2box. هذا هو العنوان الذي سيتم استخدامه للوصول إلى تطبيق الويب، API، وواجهة المستخدم الخاصة بـ wis2box. +بعد ذلك، سيُطلب منك إدخال عنوان URL الخاص بـ wis2box. هذا هو العنوان الذي سيتم استخدامه للوصول إلى تطبيق الويب، وواجهة API، وواجهة المستخدم الخاصة بـ wis2box. يرجى استخدام `http://` كعنوان URL. @@ -82,41 +82,41 @@ The URL of the wis2box will be set to: Is this correct? (y/n/exit) ``` -### كلمات المرور لـ WEBAPP، STORAGE و BROKER +### كلمات مرور WEBAPP وSTORAGE وBROKER -يمكنك استخدام خيار إنشاء كلمات مرور عشوائية عند المطالبة بـ `WIS2BOX_WEBAPP_PASSWORD`، `WIS2BOX_STORAGE_PASSWORD`، و `WIS2BOX_BROKER_PASSWORD` أو تحديد كلمات المرور الخاصة بك. +يمكنك استخدام خيار إنشاء كلمات مرور عشوائية عند المطالبة بـ `WIS2BOX_WEBAPP_PASSWORD`، `WIS2BOX_STORAGE_PASSWORD`، و`WIS2BOX_BROKER_PASSWORD` أو تعريف كلمات المرور الخاصة بك. لا تقلق بشأن تذكر هذه الكلمات، حيث سيتم تخزينها في ملف `wis2box.env` في دليل wis2box الخاص بك. ### مراجعة ملف `wis2box.env` -بمجرد اكتمال السكربت، تحقق من محتويات ملف `wis2box.env` في الدليل الحالي: +بمجرد اكتمال السكريبت، تحقق من محتويات ملف `wis2box.env` في الدليل الحالي: ```bash cat ~/wis2box/wis2box.env ``` -أو تحقق من محتويات الملف عبر WinSCP. +أو تحقق من محتوى الملف عبر WinSCP. !!! question ما هي قيمة WISBOX_BASEMAP_URL في ملف wis2box.env؟ -??? success "اضغط للكشف عن الإجابة" +??? success "انقر للكشف عن الإجابة" القيمة الافتراضية لـ WIS2BOX_BASEMAP_URL هي `https://{s}.tile.openstreetmap.org/{z}/{x}/{y}.png`. - يشير هذا العنوان إلى خادم OpenStreetMap للبلاط. إذا كنت ترغب في استخدام مزود خرائط مختلف، يمكنك تغيير هذا العنوان للإشارة إلى خادم بلاط مختلف. + يشير هذا العنوان إلى خادم تجزئة OpenStreetMap. إذا كنت ترغب في استخدام مزود خرائط مختلف، يمكنك تغيير هذا العنوان للإشارة إلى خادم تجزئة آخر. !!! question ما هي قيمة متغير البيئة WIS2BOX_STORAGE_DATA_RETENTION_DAYS في ملف wis2box.env؟ -??? success "اضغط للكشف عن الإجابة" +??? success "انقر للكشف عن الإجابة" - القيمة الافتراضية لـ WIS2BOX_STORAGE_DATA_RETENTION_DAYS هي 30 يومًا. يمكنك تغيير هذه القيمة إلى عدد مختلف من الأيام إذا أردت. + القيمة الافتراضية لـ WIS2BOX_STORAGE_DATA_RETENTION_DAYS هي 30 يومًا. يمكنك تغيير هذه القيمة إلى عدد أيام مختلف إذا أردت. - يقوم حاوية wis2box-management بتشغيل مهمة مجدولة يوميًا لإزالة البيانات الأقدم من عدد الأيام المحدد بواسطة WIS2BOX_STORAGE_DATA_RETENTION_DAYS من حاوية `wis2box-public` والواجهة الخلفية لـ API: + يقوم حاوية wis2box-management بتشغيل مهمة مجدولة يوميًا لإزالة البيانات الأقدم من عدد الأيام المحدد بواسطة WIS2BOX_STORAGE_DATA_RETENTION_DAYS من دلو `wis2box-public` والواجهة الخلفية لـ API: ```{.copy} 0 0 * * * su wis2box -c "wis2box data clean --days=$WIS2BOX_STORAGE_DATA_RETENTION_DAYS" @@ -124,7 +124,7 @@ cat ~/wis2box/wis2box.env !!! note - يحتوي ملف `wis2box.env` على متغيرات البيئة التي تحدد تهيئة wis2box الخاص بك. لمزيد من المعلومات، راجع [wis2box-documentation](https://docs.wis2box.wis.wmo.int/en/latest/reference/configuration.html). + يحتوي ملف `wis2box.env` على متغيرات البيئة التي تحدد تهيئة wis2box. لمزيد من المعلومات، راجع [wis2box-documentation](https://docs.wis2box.wis.wmo.int/en/latest/reference/configuration.html). لا تقم بتحرير ملف `wis2box.env` إلا إذا كنت متأكدًا من التغييرات التي تقوم بها. قد تؤدي التغييرات غير الصحيحة إلى توقف wis2box عن العمل. @@ -148,11 +148,11 @@ python3 wis2box-ctl.py start ``` No docker-compose.images-*.yml files found, creating one -Current version=Undefined, latest version=1.2.0 +Current version=Undefined, latest version=1.3.0 Would you like to update ? (y/n/exit) ``` -اختر ``y`` وسيقوم السكربت بإنشاء الملف ``docker-compose.images-1.2.0.yml``، وتنزيل صور Docker المطلوبة وبدء الخدمات. +اختر ``y`` وسيقوم السكريبت بإنشاء الملف ``docker-compose.images-1.3.0.yml``، وتنزيل صور Docker المطلوبة، وبدء الخدمات. قد يستغرق تنزيل الصور بعض الوقت بناءً على سرعة اتصالك بالإنترنت. هذه الخطوة مطلوبة فقط في المرة الأولى التي تبدأ فيها wis2box. @@ -164,14 +164,14 @@ python3 wis2box-ctl.py status كرر هذا الأمر حتى تكون جميع الخدمات قيد التشغيل. -!!! note "wis2box و Docker" +!!! note "wis2box وDocker" يعمل wis2box كمجموعة من حاويات Docker التي يتم إدارتها بواسطة docker-compose. يتم تعريف الخدمات في ملفات `docker-compose*.yml` المختلفة التي يمكن العثور عليها في دليل `~/wis2box/`. - يتم استخدام سكربت Python `wis2box-ctl.py` لتشغيل أوامر Docker Compose الأساسية التي تتحكم في خدمات wis2box. + يتم استخدام سكريبت Python `wis2box-ctl.py` لتشغيل أوامر Docker Compose الأساسية التي تتحكم في خدمات wis2box. - لا تحتاج إلى معرفة تفاصيل حاويات Docker لتشغيل حزمة برامج wis2box، ولكن يمكنك استعراض ملفات `docker-compose*.yml` لمعرفة كيفية تعريف الخدمات. إذا كنت مهتمًا بمعرفة المزيد عن Docker، يمكنك العثور على مزيد من المعلومات في [وثائق Docker](https://docs.docker.com/). + لا تحتاج إلى معرفة تفاصيل حاويات Docker لتشغيل حزمة برامج wis2box، ولكن يمكنك الاطلاع على ملفات `docker-compose*.yml` لمعرفة كيفية تعريف الخدمات. إذا كنت مهتمًا بمعرفة المزيد عن Docker، يمكنك العثور على المزيد من المعلومات في [وثائق Docker](https://docs.docker.com/). لتسجيل الدخول إلى حاوية wis2box-management، استخدم الأمر التالي: @@ -179,7 +179,7 @@ python3 wis2box-ctl.py status python3 wis2box-ctl.py login ``` -لاحظ أنه بعد تسجيل الدخول، سيتغير الموجه الخاص بك، مما يشير إلى أنك الآن داخل حاوية wis2box-management: +لاحظ أنه بعد تسجيل الدخول، سيتغير الموجه، مما يشير إلى أنك الآن داخل حاوية wis2box-management: ```{bash} root@025381da3c40:/home/wis2box# @@ -188,7 +188,7 @@ root@025381da3c40:/home/wis2box# داخل حاوية wis2box-management، يمكنك تشغيل أوامر مختلفة لإدارة wis2box الخاص بك، مثل: - `wis2box auth add-token --path processes/wis2box` : لإنشاء رمز تفويض لنقطة النهاية *processes/wis2box* -- `wis2box data clean --days=` : لتنظيف البيانات الأقدم من عدد معين من الأيام من حاوية *wis2box-public* +- `wis2box data clean --days=` : لتنظيف البيانات الأقدم من عدد معين من الأيام من دلو *wis2box-public* للخروج من الحاوية والعودة إلى جهازك المضيف، استخدم الأمر التالي: @@ -205,28 +205,26 @@ docker ps --format "table {{.Names}} \t{{.Status}} \t{{.Image}}" يجب أن ترى الحاويات التالية قيد التشغيل: ```{bash} -NAMES STATUS IMAGE -elasticsearch docker.elastic.co/elasticsearch/elasticsearch:8.6.2 "/bin/tini -- /usr/l…" elasticsearch منذ حوالي دقيقة قيد التشغيل منذ حوالي دقيقة (سليم) 9200/tcp, 9300/tcp -elasticsearch-exporter quay.io/prometheuscommunity/elasticsearch-exporter:latest "/bin/elasticsearch_…" elasticsearch-exporter منذ حوالي دقيقة قيد التشغيل منذ حوالي دقيقة 7979/tcp -grafana grafana/grafana-oss:9.0.3 "/run.sh" grafana منذ حوالي دقيقة قيد التشغيل منذ حوالي دقيقة 0.0.0.0:3000->3000/tcp -loki grafana/loki:2.4.1 "/usr/bin/loki -conf…" loki منذ حوالي دقيقة قيد التشغيل منذ حوالي دقيقة 3100/tcp -mosquitto ghcr.io/world-meteorological-organization/wis2box-broker:1.2.0 "/docker-entrypoint.…" mosquitto منذ حوالي دقيقة قيد التشغيل منذ حوالي دقيقة 0.0.0.0:1883->1883/tcp, 0.0.0.0:8884->8884/tcp -mqtt_metrics_collector ghcr.io/world-meteorological-organization/wis2box-mqtt-metrics-collector:1.2.0 "python3 -u mqtt_met…" mqtt_metrics_collector منذ حوالي دقيقة قيد التشغيل منذ 10 ثوانٍ 8000/tcp, 0.0.0.0:8001->8001/tcp -nginx nginx:alpine "/docker-entrypoint.…" web-proxy منذ حوالي دقيقة قيد التشغيل منذ 9 ثوانٍ 0.0.0.0:80->80/tcp -prometheus prom/prometheus:v2.37.0 "/bin/prometheus --c…" prometheus منذ حوالي دقيقة قيد التشغيل منذ حوالي دقيقة 9090/tcp -wis2box-api ghcr.io/world-meteorological-organization/wis2box-api:1.2.0 "/app/docker/es-entr…" wis2box-api منذ حوالي دقيقة قيد التشغيل منذ 36 ثانية (سليم) -wis2box-auth ghcr.io/world-meteorological-organization/wis2box-auth:1.2.0 "/entrypoint.sh" wis2box-auth منذ حوالي دقيقة قيد التشغيل منذ 10 ثوانٍ -wis2box-management ghcr.io/world-meteorological-organization/wis2box-management:1.2.0 "/home/wis2box/entry…" wis2box-management منذ حوالي دقيقة قيد التشغيل منذ 12 ثانية -wis2box-minio minio/minio:RELEASE.2024-08-03T04-33-23Z-cpuv1 "/usr/bin/docker-ent…" minio منذ حوالي دقيقة قيد التشغيل منذ حوالي دقيقة (سليم) 0.0.0.0:8022->8022/tcp, 0.0.0.0:9000-9001->9000-9001/tcp -wis2box-ui ghcr.io/world-meteorological-organization/wis2box-ui:1.2.0 "/docker-entrypoint.…" wis2box-ui منذ حوالي دقيقة قيد التشغيل منذ 35 ثانية 0.0.0.0:9999->80/tcp -wis2box-webapp ghcr.io/world-meteorological-organization/wis2box-webapp:1.2.0 "sh /wis2box-webapp/…" wis2box-webapp منذ حوالي دقيقة قيد التشغيل منذ حوالي دقيقة (غير سليم) 4173/tcp -wis2downloader ghcr.io/wmo-im/wis2downloader:v0.3.2 "/home/wis2downloade…" wis2downloader منذ حوالي دقيقة قيد التشغيل منذ حوالي دقيقة (سليم) - +NAMES STATUS IMAGE +nginx Up 56 seconds nginx:1.30.1-alpine +mqtt_metrics_collector Up 58 seconds ghcr.io/world-meteorological-organization/wis2box-mqtt-metrics-collector:1.3.0 +wis2box-auth Up 59 seconds ghcr.io/world-meteorological-organization/wis2box-auth:1.3.0 +wis2box-ui Up About a minute ghcr.io/world-meteorological-organization/wis2box-ui:1.3.0 +wis2box-management Up About a minute ghcr.io/world-meteorological-organization/wis2box-management:1.3.0 +wis2box-minio Up 2 minutes (healthy) ghcr.io/world-meteorological-organization/wis2box-minio:latest +wis2box-api Up About a minute (healthy) ghcr.io/world-meteorological-organization/wis2box-api:1.3.0 +elasticsearch Up 2 minutes (healthy) docker.elastic.co/elasticsearch/elasticsearch:8.6.2 +grafana Up 2 minutes grafana/grafana-oss:12.4.2 +loki Up 2 minutes grafana/loki:2.4.1 +elasticsearch-exporter Up 2 minutes quay.io/prometheuscommunity/elasticsearch-exporter:latest +prometheus Up 2 minutes prom/prometheus:v2.37.0 +mosquitto Up 2 minutes ghcr.io/world-meteorological-organization/wis2box-broker:1.3.0 +wis2box-webapp Up 2 minutes (healthy) ghcr.io/world-meteorological-organization/wis2box-webapp:1.3.0 ``` -تُعد هذه الحاويات جزءًا من حزمة برامج `wis2box` وتوفر الخدمات المختلفة المطلوبة لتشغيل `wis2box`. +هذه الحاويات هي جزء من حزمة برامج `wis2box` وتوفر الخدمات المختلفة المطلوبة لتشغيل `wis2box`. -قم بتشغيل الأمر التالي لرؤية وحدات التخزين (volumes) الخاصة بـ Docker التي تعمل على جهازك المضيف: +قم بتشغيل الأمر التالي لرؤية وحدات التخزين الخاصة بـ Docker التي تعمل على جهازك المضيف: ```{.copy} docker volume ls @@ -241,11 +239,11 @@ docker volume ls - wis2box_project_loki-data - wis2box_project_mosquitto-config -بالإضافة إلى بعض وحدات التخزين المجهولة التي تُستخدم بواسطة الحاويات المختلفة. +بالإضافة إلى بعض وحدات التخزين المجهولة التي تستخدمها الحاويات المختلفة. -تُستخدم وحدات التخزين التي تبدأ بـ `wis2box_project_` لتخزين البيانات الدائمة للخدمات المختلفة في حزمة برامج `wis2box`. +وحدات التخزين التي تبدأ بـ `wis2box_project_` تُستخدم لتخزين البيانات الدائمة للخدمات المختلفة في حزمة برامج `wis2box`. -## واجهة برمجة تطبيقات wis2box +## واجهة برمجة التطبيقات (API) الخاصة بـ wis2box تحتوي `wis2box` على واجهة برمجة تطبيقات (API) توفر الوصول إلى البيانات والعمليات للتصور التفاعلي وتحويل البيانات والنشر. @@ -253,7 +251,7 @@ docker volume ls wis2box-api.png -هذه هي الصفحة الرئيسية لواجهة برمجة تطبيقات `wis2box` (تعمل عبر الحاوية **wis2box-api**). +هذه هي الصفحة الرئيسية لواجهة برمجة التطبيقات الخاصة بـ `wis2box` (تعمل عبر الحاوية **wis2box-api**). !!! question @@ -269,8 +267,7 @@ docker volume ls - المحطات - إشعارات البيانات - - بيانات وصفية للاكتشاف - + - بيانات الاكتشاف الوصفية !!! question @@ -280,13 +277,13 @@ docker volume ls اضغط على "إشعارات البيانات"، ثم اضغط على `Browse through the items of "Data Notifications"`. - ستلاحظ أن الصفحة تقول "No items" حيث لم يتم نشر أي إشعارات بيانات حتى الآن. + ستلاحظ أن الصفحة تقول "No items" حيث لم يتم نشر أي إشعارات بيانات بعد. -## تطبيق wis2box-webapp +## تطبيق الويب الخاص بـ wis2box افتح متصفح الويب وانتقل إلى الصفحة `http://YOUR-HOST/wis2box-webapp`. -ستظهر نافذة منبثقة تطلب اسم المستخدم وكلمة المرور الخاصة بك. استخدم اسم المستخدم الافتراضي `wis2box-user` وكلمة المرور `WIS2BOX_WEBAPP_PASSWORD` المحددة في ملف `wis2box.env` واضغط على "تسجيل الدخول": +ستظهر نافذة منبثقة تطلب اسم المستخدم وكلمة المرور. استخدم اسم المستخدم الافتراضي `wis2box-user` وكلمة المرور `WIS2BOX_WEBAPP_PASSWORD` المحددة في ملف `wis2box.env` ثم اضغط على "Sign in": !!! note @@ -296,11 +293,11 @@ docker volume ls cat ~/wis2box/wis2box.env | grep WIS2BOX_WEBAPP_PASSWORD ``` -بمجرد تسجيل الدخول، حرّك مؤشر الفأرة إلى القائمة الموجودة على اليسار لرؤية الخيارات المتاحة في تطبيق `wis2box`: +بمجرد تسجيل الدخول، حرك مؤشر الفأرة إلى القائمة الموجودة على اليسار لرؤية الخيارات المتاحة في تطبيق الويب الخاص بـ `wis2box`: wis2box-webapp-menu.png -هذا هو تطبيق `wis2box` الذي يتيح لك التفاعل مع `wis2box` الخاص بك: +هذا هو تطبيق الويب الخاص بـ `wis2box` الذي يتيح لك التفاعل مع `wis2box` الخاص بك: - إنشاء وإدارة مجموعات البيانات - تحديث/مراجعة بيانات المحطات الوصفية @@ -309,7 +306,7 @@ docker volume ls سنستخدم هذا التطبيق في جلسة لاحقة. -## wis2box-broker +## الوسيط الخاص بـ wis2box افتح تطبيق `MQTT Explorer` على جهاز الكمبيوتر الخاص بك وقم بإعداد اتصال جديد للاتصال بالوسيط الخاص بك (يعمل عبر الحاوية **wis2box-broker**). @@ -326,17 +323,17 @@ docker volume ls !!! note - الموضوع `#` هو اشتراك عام يقوم بالاشتراك في جميع المواضيع المنشورة على الوسيط. + الموضوع `#` هو اشتراك عام يشترك في جميع المواضيع المنشورة على الوسيط. الرسائل المنشورة تحت الموضوع `$SYS` هي رسائل نظام يتم نشرها بواسطة خدمة mosquitto نفسها. -استخدم تفاصيل الاتصال التالية، مع التأكد من استبدال قيمة `` باسم المضيف الخاص بك وقيمة `` بالقيمة الموجودة في ملف `wis2box.env`: +استخدم تفاصيل الاتصال التالية، مع التأكد من استبدال قيمة `` باسم المضيف الخاص بك وقيمة `` بالقيمة الموجودة في ملف `wis2box.env` الخاص بك: -- **البروتوكول: mqtt://** -- **المضيف: ``** -- **المنفذ: 1883** -- **اسم المستخدم: wis2box** -- **كلمة المرور: ``** +- **Protocol: mqtt://** +- **Host: ``** +- **Port: 1883** +- **Username: wis2box** +- **Password: ``** !!! note @@ -346,19 +343,21 @@ docker volume ls cat ~/wis2box/wis2box.env | grep WIS2BOX_BROKER_PASSWORD ``` - لاحظ أن هذه هي كلمة المرور **الداخلية** الخاصة بالوسيط، وسيستخدم الوسيط العالمي بيانات اعتماد مختلفة (للقراءة فقط) للاشتراك في الوسيط الخاص بك. لا تشارك هذه الكلمة مع أي شخص. + لاحظ أن هذه هي كلمة مرور الوسيط **الداخلية** الخاصة بك، وسيستخدم الوسيط العالمي بيانات اعتماد مختلفة (للقراءة فقط) للاشتراك في الوسيط الخاص بك. لا تشارك هذه الكلمة مع أي شخص. تأكد من الضغط على "SAVE" لحفظ تفاصيل الاتصال الخاصة بك. ثم اضغط على "CONNECT" للاتصال بـ **wis2box-broker**. -mqtt-explorer-wis2box-broker.png +mqtt-explorer-wis2box-broker-port1883.png -بمجرد الاتصال، تحقق من أن إحصائيات `mosquitto` الداخلية يتم نشرها بواسطة الوسيط الخاص بك تحت الموضوع `$SYS`: +بمجرد الاتصال، سترى إحصائيات mosquitto الداخلية التي يتم نشرها بواسطة الوسيط الخاص بك تحت الموضوع `$SYS`: mqtt-explorer-sys-topic.png -احتفظ بـ MQTT Explorer مفتوحًا، حيث سنستخدمه لمراقبة الرسائل المنشورة على الوسيط. +يمكن تحقيق نفس الاتصال أيضًا باستخدام MQTT عبر WebSockets على المنفذ 80، باستخدام تفاصيل الاتصال التالية: + +mqtt-explorer-wis2box-broker-websockets.png ## الخاتمة @@ -366,6 +365,7 @@ docker volume ls في هذه الجلسة العملية، تعلمت كيفية: - تشغيل سكربت `wis2box-create-config.py` لإنشاء التكوين الأولي - - بدء تشغيل wis2box والتحقق من حالة مكوناته - - الوصول إلى `wis2box-webapp` و `wis2box-API` في المتصفح - - الاتصال بوسيط MQTT على جهاز الطالب الافتراضي الخاص بك باستخدام MQTT Explorer \ No newline at end of file + - تشغيل `wis2box` والتحقق من حالة مكوناته + - الوصول إلى `wis2box-webapp` و `wis2box-API` عبر المتصفح + - الاتصال بوسيط MQTT على جهازك الافتراضي باستخدام `MQTT Explorer` +``` \ No newline at end of file diff --git a/documentation/docs/es/practical-sessions/accessing-your-student-vm.md b/documentation/docs/es/practical-sessions/accessing-your-student-vm.md index b8803a61d..164d085f2 100644 --- a/documentation/docs/es/practical-sessions/accessing-your-student-vm.md +++ b/documentation/docs/es/practical-sessions/accessing-your-student-vm.md @@ -1,22 +1,22 @@ --- -title: Accediendo a tu VM de estudiante +title: Accediendo a tu VM estudiantil --- -# Accediendo a tu VM de estudiante +# Accediendo a tu VM estudiantil !!! abstract "Resultados de aprendizaje" Al final de esta sesión práctica, serás capaz de: - - acceder a tu VM de estudiante mediante SSH y WinSCP + - acceder a tu VM estudiantil mediante SSH y WinSCP - verificar que el software requerido para los ejercicios prácticos está instalado - - verificar que tienes acceso a los materiales de los ejercicios para este entrenamiento en tu VM de estudiante local + - verificar que tienes acceso a los materiales de los ejercicios para este entrenamiento en tu VM estudiantil local ## Introducción -Como parte de los talleres de entrenamiento de WIS2 realizados localmente, puedes acceder a tu VM de estudiante personal en la red de entrenamiento local llamada "WIS2-training". +Como parte de los talleres de entrenamiento de WIS2 realizados localmente, puedes acceder a tu VM estudiantil personal en la red de entrenamiento local llamada "WIS2-training". -Tu VM de estudiante tiene el siguiente software preinstalado: +Tu VM estudiantil tiene el siguiente software preinstalado: - Ubuntu 22.04 LTS [ubuntu-22.04.5-live-server-amd64.iso](https://releases.ubuntu.com/jammy/ubuntu-22.04.5-live-server-amd64.iso) - Python 3.10.12 @@ -39,13 +39,13 @@ Tu VM de estudiante tiene el siguiente software preinstalado: El archivo de lanzamiento de wis2box utilizado en este entrenamiento puede descargarse de la siguiente manera: ```bash - wget https://github.com/World-Meteorological-Organization/wis2box-release/releases/download/1.2.0/wis2box-setup-1.2.0.zip - unzip wis2box-setup-1.2.0.zip + wget https://github.com/World-Meteorological-Organization/wis2box-release/releases/download/1.3.0/wis2box-setup-1.3.0.zip + unzip wis2box-setup-1.3.0.zip ``` Siempre puedes encontrar el archivo más reciente de 'wis2box-setup' en [https://github.com/World-Meteorological-Organization/wis2box/releases](https://github.com/World-Meteorological-Organization/wis2box-release/releases). - El material de ejercicios utilizado en este entrenamiento puede descargarse de la siguiente manera: + Los materiales de ejercicios utilizados en este entrenamiento pueden descargarse de la siguiente manera: ```bash wget https://training.wis2box.wis.wmo.int/exercise-materials.zip @@ -56,16 +56,16 @@ Tu VM de estudiante tiene el siguiente software preinstalado: ```bash pip3 install minio - pip3 install pywiscat==0.4.0 + pip3 install pywiscat ``` - Si estás utilizando la VM de estudiante proporcionada durante las sesiones locales de entrenamiento de WIS2, el software requerido ya estará instalado. + Si estás utilizando la VM estudiantil proporcionada durante las sesiones locales de entrenamiento de WIS2, el software requerido ya estará instalado. -## Conéctate a tu VM de estudiante en la red de entrenamiento local +## Conéctate a tu VM estudiantil en la red de entrenamiento local -Conecta tu PC a la red Wi-Fi local transmitida en la sala durante el entrenamiento de WIS2, según las instrucciones proporcionadas por el instructor. +Conecta tu PC a la red Wi-Fi local transmitida en la sala durante el entrenamiento de WIS2 según las instrucciones proporcionadas por el instructor. -Utiliza un cliente SSH para conectarte a tu VM de estudiante utilizando lo siguiente: +Utiliza un cliente SSH para conectarte a tu VM estudiantil utilizando lo siguiente: - **Host: (proporcionado durante el entrenamiento presencial)** - **Port: 22** @@ -73,9 +73,9 @@ Utiliza un cliente SSH para conectarte a tu VM de estudiante utilizando lo sigui - **Password: (proporcionado durante el entrenamiento presencial)** !!! tip - Contacta a un instructor si no estás seguro del nombre del host/usuario o si tienes problemas para conectarte. + Contacta a un instructor si no estás seguro del nombre del host/nombre de usuario o tienes problemas para conectarte. -Una vez conectado, por favor cambia tu contraseña para asegurarte de que otros no puedan acceder a tu VM: +Una vez conectado, cambia tu contraseña para asegurarte de que otros no puedan acceder a tu VM: ```bash limper@student-vm:~$ passwd @@ -88,7 +88,7 @@ passwd: password updated successfully ## Verifica las versiones del software -Para poder ejecutar wis2box, la VM de estudiante debe tener Python, Docker y Docker Compose preinstalados. +Para poder ejecutar wis2box, la VM estudiantil debe tener Python, Docker y Docker Compose preinstalados. Verifica la versión de Python: ```bash @@ -117,9 +117,9 @@ devuelve: Docker Compose version v2.21.0 ``` -Para asegurarte de que tu usuario puede ejecutar comandos de Docker, tu usuario ha sido añadido al grupo `docker`. +Para asegurarte de que tu usuario puede ejecutar comandos de Docker, tu usuario ha sido añadido al grupo `docker`. -Para probar que tu usuario puede ejecutar el comando hello-world de Docker, ejecuta el siguiente comando: +Para probar que tu usuario puede ejecutar docker hello-world, ejecuta el siguiente comando: ```bash docker run hello-world ``` @@ -147,11 +147,11 @@ devuelve: exercise-materials wis2box ``` -Si tienes WinSCP instalado en tu PC local, puedes usarlo para conectarte a tu VM de estudiante e inspeccionar el contenido de tu directorio home, así como descargar o subir archivos entre tu VM y tu PC local. +Si tienes WinSCP instalado en tu PC local, puedes usarlo para conectarte a tu VM estudiantil e inspeccionar el contenido de tu directorio home y descargar o subir archivos entre tu VM y tu PC local. -WinSCP no es necesario para el entrenamiento, pero puede ser útil si deseas editar archivos en tu VM utilizando un editor de texto en tu PC local. +WinSCP no es requerido para el entrenamiento, pero puede ser útil si deseas editar archivos en tu VM utilizando un editor de texto en tu PC local. -Aquí te mostramos cómo puedes conectarte a tu VM de estudiante utilizando WinSCP: +Aquí está cómo puedes conectarte a tu VM estudiantil utilizando WinSCP: Abre WinSCP y haz clic en "New Site". Puedes crear una nueva conexión SCP a tu VM de la siguiente manera: @@ -159,13 +159,13 @@ Abre WinSCP y haz clic en "New Site". Puedes crear una nueva conexión SCP a tu Haz clic en 'Save' y luego en 'Login' para conectarte a tu VM. -Ahora deberías poder ver el contenido del directorio home en tu VM de estudiante y acceder a tus archivos. +Ahora deberías poder ver el contenido del directorio home en tu VM estudiantil y acceder a tus archivos. ## Conclusión !!! success "¡Felicidades!" En esta sesión práctica, aprendiste a: - - acceder a tu VM de estudiante mediante SSH y WinSCP + - acceder a tu VM estudiantil mediante SSH y WinSCP - verificar que el software requerido para los ejercicios prácticos está instalado - - verificar que tienes acceso a los materiales de los ejercicios para este entrenamiento en tu VM de estudiante local \ No newline at end of file + - verificar que tienes acceso a los materiales de los ejercicios para este entrenamiento en tu VM estudiantil local \ No newline at end of file diff --git a/documentation/docs/es/practical-sessions/adding-gts-headers-to-wis2-notifications.md b/documentation/docs/es/practical-sessions/adding-gts-headers-to-wis2-notifications.md index 3843cf1c6..b6f38621c 100644 --- a/documentation/docs/es/practical-sessions/adding-gts-headers-to-wis2-notifications.md +++ b/documentation/docs/es/practical-sessions/adding-gts-headers-to-wis2-notifications.md @@ -6,19 +6,20 @@ title: Añadiendo encabezados GTS a las notificaciones WIS2 !!! abstract "Resultados de aprendizaje" - Al final de esta sesión práctica, podrás: + Al final de esta sesión práctica, serás capaz de: - - configurar un mapeo entre el nombre del archivo y los encabezados GTS + - configurar un mapeo entre nombres de archivo y encabezados GTS - ingerir datos con un nombre de archivo que coincida con los encabezados GTS - - ver los encabezados GTS en las notificaciones WIS2 + - visualizar los encabezados GTS en las notificaciones WIS2 + - utilizar el formulario FM-12 SYNOP para añadir manualmente encabezados GTS a una notificación WIS2 ## Introducción -Los miembros de la OMM que deseen detener su transmisión de datos en GTS durante la fase de transición a WIS2 necesitarán añadir encabezados GTS a sus notificaciones WIS2. Estos encabezados permiten que la puerta de enlace de WIS2 a GTS reenvíe los datos a la red GTS. +Los Miembros de la OMM que deseen detener la transmisión de sus datos en GTS durante la fase de transición a WIS2 necesitarán añadir encabezados GTS a sus notificaciones WIS2. Estos encabezados permiten que el gateway de WIS2 a GTS reenvíe los datos a la red GTS. -Esto permite a los miembros que han migrado a usar un nodo WIS2 para la publicación de datos desactivar su sistema MSS y asegurar que sus datos sigan estando disponibles para los miembros que aún no han migrado a WIS2. +Esto permite que los Miembros que hayan migrado a usar un nodo WIS2 para la publicación de datos desactiven su sistema MSS y aseguren que sus datos aún estén disponibles para los Miembros que no hayan migrado a WIS2. -La propiedad GTS en el Mensaje de Notificación WIS2 necesita ser añadida como una propiedad adicional al Mensaje de Notificación WIS2. La propiedad GTS es un objeto JSON que contiene los encabezados GTS que son necesarios para que los datos sean reenviados a la red GTS. +La propiedad GTS en el Mensaje de Notificación WIS2 debe añadirse como una propiedad adicional al Mensaje de Notificación WIS2. La propiedad GTS es un objeto JSON que contiene los encabezados GTS necesarios para que los datos sean reenviados a la red GTS. ```json { @@ -29,45 +30,55 @@ La propiedad GTS en el Mensaje de Notificación WIS2 necesita ser añadida como } ``` -Dentro de wis2box puedes añadir esto a las Notificaciones WIS2 automáticamente proporcionando un archivo adicional llamado `gts_headers_mapping.csv` que contiene la información requerida para mapear los encabezados GTS a los nombres de archivos entrantes. +Dentro de wis2box, puedes añadir esto a las Notificaciones WIS2 automáticamente proporcionando un archivo adicional llamado `gts_headers_mapping.csv` que contiene la información requerida para mapear los encabezados GTS a los nombres de archivo entrantes. -Este archivo debe ser colocado en el directorio definido por `WIS2BOX_HOST_DATADIR` en tu `wis2box.env` y debe tener las siguientes columnas: +Este archivo debe colocarse en el directorio definido por `WIS2BOX_HOST_DATADIR` en tu archivo `wis2box.env` y debe tener las siguientes columnas: -- `string_in_filepath`: una cadena que es parte del nombre del archivo que se utilizará para coincidir con los encabezados GTS +- `string_in_filepath`: una cadena que forma parte del nombre del archivo que se utilizará para coincidir con los encabezados GTS - `TTAAii`: el encabezado TTAAii que se añadirá a la notificación WIS2 - `CCCC`: el encabezado CCCC que se añadirá a la notificación WIS2 +A partir de wis2box-1.3.0, los publicadores de datos tienen dos opciones para (opcionalmente) añadir propiedades GTS a sus notificaciones: + +1. Para archivos cargados en MinIO, preparar el archivo de mapeo “gts_headers_mappings.csv” con las propiedades requeridas. + +2. Para entrada de datos utilizando el formulario FM-12 SYNOP en wis2box-webapp, seleccionar “Add GTS headers” y proporcionar la información manualmente. + ## Preparación Asegúrate de tener acceso SSH a tu VM de estudiante y que tu instancia de wis2box esté funcionando. -Asegúrate de estar conectado al broker MQTT de tu instancia de wis2box usando MQTT Explorer. Puedes usar las credenciales públicas `everyone/everyone` para conectarte al broker. +Verifica que estás conectado al broker MQTT de tu instancia de wis2box utilizando MQTT Explorer. Puedes usar las credenciales públicas `everyone/everyone` para conectarte al broker. -Asegúrate de tener un navegador web abierto con el tablero de Grafana para tu instancia yendo a `http://YOUR-HOST:3000` +Asegúrate de tener un navegador web abierto con el tablero de Grafana para tu instancia accediendo a `http://YOUR-HOST:3000`. -## creando `gts_headers_mapping.csv` +## Ejercicio 1: Usando un archivo de mapeo para datos cargados en MinIO -Para añadir encabezados GTS a tus notificaciones WIS2, se requiere un archivo CSV que mapee los encabezados GTS a los nombres de archivos entrantes. +El primer ejercicio demostrará cómo añadir encabezados GTS para datos que se cargan en MinIO, utilizando un archivo de mapeo llamado `gts_headers_mapping.csv`. -El archivo CSV debe ser nombrado (exactamente) `gts_headers_mapping.csv` y debe ser colocado en el directorio definido por `WIS2BOX_HOST_DATADIR` en tu `wis2box.env`. +### Creando `gts_headers_mapping.csv` -## Proporcionando un archivo `gts_headers_mapping.csv` - -Copia el archivo `exercise-materials/gts-headers-exercises/gts_headers_mapping.csv` a tu instancia de wis2box y colócalo en el directorio definido por `WIS2BOX_HOST_DATADIR` en tu `wis2box.env`. +Para añadir encabezados GTS a tus notificaciones WIS2, se requiere un archivo CSV que mapee los encabezados GTS a los nombres de archivo entrantes. + +El archivo CSV debe llamarse (exactamente) `gts_headers_mapping.csv` y debe colocarse en el directorio definido por `WIS2BOX_HOST_DATADIR` en tu archivo `wis2box.env`. + +Copia el archivo `exercise-materials/gts-headers-exercises/gts_headers_mapping.csv` a tu instancia de wis2box y colócalo en el directorio definido por `WIS2BOX_HOST_DATADIR` en tu archivo `wis2box.env`. ```bash cp ~/exercise-materials/gts-headers-exercises/gts_headers_mapping.csv ~/wis2box-data ``` -Luego reinicia el contenedor de wis2box-management para aplicar los cambios: +### Aplicando los mapeos + +Después de crear el archivo `gts_headers_mapping.csv`, necesitas reiniciar el contenedor wis2box-management para aplicar los cambios. Puedes hacerlo ejecutando el siguiente comando en tu VM de estudiante: ```bash docker restart wis2box-management ``` -## Ingeriendo datos con encabezados GTS +### Ingerir datos con encabezados GTS -Copia el archivo `exercise-materials/gts-headers-exercises/A_SMRO01YRBK171200_C_EDZW_20240717120502.txt` al directorio definido por `WIS2BOX_HOST_DATADIR` en tu `wis2box.env`: +Copia el archivo `exercise-materials/gts-headers-exercises/A_SMRO01YRBK171200_C_EDZW_20240717120502.txt` al directorio definido por `WIS2BOX_HOST_DATADIR` en tu archivo `wis2box.env`: ```bash cp ~/exercise-materials/gts-headers-exercises/A_SMRO01YRBK171200_C_EDZW_20240717120502.txt ~/wis2box-data @@ -80,7 +91,7 @@ cd ~/wis2box python3 wis2box-ctl.py login ``` -Desde la línea de comandos de wis2box podemos ingerir el archivo de datos de muestra `A_SMRO01YRBK171200_C_EDZW_20240717120502.txt` en un conjunto de datos específico de la siguiente manera: +Desde la línea de comandos de wis2box, podemos ingerir el archivo de datos de ejemplo `A_SMRO01YRBK171200_C_EDZW_20240717120502.txt` en un conjunto de datos específico de la siguiente manera: ```bash wis2box data ingest -p /data/wis2box/A_SMRO01YRBK171200_C_EDZW_20240717120502.txt --metadata-id urn:wmo:md:not-my-centre:core.surface-based-observations.synop @@ -88,17 +99,55 @@ wis2box data ingest -p /data/wis2box/A_SMRO01YRBK171200_C_EDZW_20240717120502.tx Asegúrate de reemplazar la opción `metadata-id` con el identificador correcto para tu conjunto de datos. -Revisa el tablero de Grafana para ver si los datos fueron ingeridos correctamente. Si ves alguna ADVERTENCIA o ERROR, intenta solucionarlo y repite el comando `wis2box data ingest`. +Verifica el tablero de Grafana para ver si los datos se ingirieron correctamente. Si ves algún WARNING o ERROR, intenta solucionarlos y repite el ejercicio con el comando `wis2box data ingest`. -## Viendo los encabezados GTS en la Notificación WIS2 +### Visualizando los encabezados GTS en la Notificación WIS2 -Ve al MQTT Explorer y verifica el Mensaje de Notificación WIS2 para los datos que acabas de ingerir. +Ve a MQTT Explorer y verifica el Mensaje de Notificación WIS2 para los datos que acabas de ingerir. El Mensaje de Notificación WIS2 debería contener los encabezados GTS que proporcionaste en el archivo `gts_headers_mapping.csv`. +## Ejercicio 2: Usando el formulario FM-12 SYNOP + +Al usar el formulario FM-12 SYNOP en wis2box-webapp, puedes añadir manualmente encabezados GTS a tus notificaciones WIS2 seleccionando la opción "Add GTS headers" y proporcionando la información requerida. + +Para este ejercicio, puedes usar los datos de ejemplo a continuación o proporcionar los tuyos propios: + +Mensaje FM-12 SYNOP: + +```{copy} +AAXX 03094 +64400 42460 71004 10285 20245 30113 40133 8493/ + 333 59005 83813 81930 87363 94966 95836= +``` + +Encabezados GTS: TTAAii=`ISIH01` y CCCC=`FCBB` + +!!! note + El plugin synop2bufr en wis2box convierte mensajes FM-12 SYNOP en BUFR, por lo que el TTAAii debería comenzar con `IS`: + + - I = Datos observacionales (codificados en binario) – BUFR + - S = Superficie/nivel del mar + +### Enviar manualmente el formulario FM-12 SYNOP con encabezados GTS + +Ve al formulario FM-12 SYNOP en wis2box-webapp y completa el formulario con los datos de ejemplo anteriores o utiliza los tuyos propios. + +Asegúrate de seleccionar la opción "Add GTS headers" y proporcionar la información requerida de encabezados GTS: + +fm-12-synop-form-gts-headers.png + +Proporciona el token de autenticación requerido y envía el formulario. + +Probablemente verás un mensaje de error porque esta estación no está en tu lista de estaciones. Necesitarás añadir la estación "0-20000-0-64400" a tu lista de estaciones para que los datos se conviertan y publiquen correctamente. + +### Visualizando los encabezados GTS en la Notificación WIS2 + +Ve a MQTT Explorer y verifica el Mensaje de Notificación WIS2 para los datos que acabas de ingerir para ver si los encabezados GTS están incluidos en la notificación. + ## Conclusión !!! success "¡Felicidades!" En esta sesión práctica, aprendiste cómo: - añadir encabezados GTS a tus notificaciones WIS2 - - verificar que los encabezados GTS estén disponibles a través de tu instalación de wis2box \ No newline at end of file + - verificar que los encabezados GTS están disponibles a través de tu instalación de wis2box \ No newline at end of file diff --git a/documentation/docs/es/practical-sessions/connecting-to-wis2-over-mqtt.md b/documentation/docs/es/practical-sessions/connecting-to-wis2-over-mqtt.md index 67f588833..38c316fa8 100644 --- a/documentation/docs/es/practical-sessions/connecting-to-wis2-over-mqtt.md +++ b/documentation/docs/es/practical-sessions/connecting-to-wis2-over-mqtt.md @@ -1,8 +1,8 @@ --- -title: Conectarse a WIS2 mediante MQTT +title: Conexión a WIS2 mediante MQTT --- -# Conectarse a WIS2 mediante MQTT +# Conexión a WIS2 mediante MQTT !!! abstract "Resultados de aprendizaje" @@ -57,18 +57,18 @@ Este es un ejemplo de la estructura de un mensaje de notificación de WIS2 para "href":"https://oscar.wmo.int/surface/#/search/station/stationReportDetails/0-20000-0-76679" } ], - "generated_by":"wis2box 1.2.0" + "generated_by":"wis2box 1.3.0" } ``` -En esta sesión práctica, aprenderás cómo usar la herramienta MQTT Explorer para configurar una conexión de cliente MQTT a un WIS2 Global Broker y poder visualizar mensajes de notificación de WIS2. +En esta sesión práctica aprenderás a usar la herramienta MQTT Explorer para configurar una conexión de cliente MQTT a un WIS2 Global Broker y ser capaz de mostrar mensajes de notificación de WIS2. MQTT Explorer es una herramienta útil para explorar y revisar la estructura de los temas de un broker MQTT y revisar los datos que se están publicando. -!!! note "Sobre MQTT" +!!! note "Acerca de MQTT" MQTT Explorer proporciona una interfaz fácil de usar para conectarse a un broker MQTT y explorar los temas y la estructura de mensajes utilizados por WIS2. - En la práctica, MQTT está diseñado para la comunicación máquina a máquina, donde una aplicación o servicio se suscribe a temas y procesa mensajes programáticamente en tiempo real. + En la práctica, MQTT está diseñado para ser utilizado en comunicación máquina a máquina, donde una aplicación o servicio se suscribe a temas y procesa mensajes programáticamente en tiempo real. Para trabajar con MQTT programáticamente (por ejemplo, en Python), puedes usar bibliotecas de cliente MQTT como [paho-mqtt](https://pypi.org/project/paho-mqtt) para conectarte a un broker MQTT y procesar mensajes entrantes. Existen numerosos software de cliente y servidor MQTT, dependiendo de tus requisitos y entorno técnico. @@ -92,7 +92,7 @@ Haz clic en el botón 'ADVANCED', elimina los temas preconfigurados y agrega los mqtt-explorer-global-broker-advanced !!! note - Al configurar suscripciones MQTT, puedes usar los siguientes comodines: + Al configurar suscripciones MQTT puedes usar los siguientes comodines: - **Nivel único (+)**: un comodín de nivel único reemplaza un nivel de tema - **Nivel múltiple (#)**: un comodín de nivel múltiple reemplaza múltiples niveles de tema @@ -109,7 +109,7 @@ Ahora estás listo para comenzar a explorar los temas y la estructura de mensaje ## Ejercicio 1: Revisar la estructura de los temas de WIS2 -Usa MQTT para explorar la estructura de temas bajo los temas `origin`. +Usa MQTT para explorar la estructura de los temas bajo los temas `origin`. !!! question @@ -117,25 +117,25 @@ Usa MQTT para explorar la estructura de temas bajo los temas `origin`. ??? success "Haz clic para revelar la respuesta" - Puedes hacer clic en la ventana del lado izquierdo en MQTT Explorer para expandir la estructura de temas. + Puedes hacer clic en la ventana del lado izquierdo en MQTT Explorer para expandir la estructura de los temas. - Podemos distinguir el centro WIS que publicó los datos observando el cuarto nivel de la estructura de temas. Por ejemplo, el siguiente tema: + Podemos distinguir el centro WIS que publicó los datos observando el cuarto nivel de la estructura de los temas. Por ejemplo, el siguiente tema: `origin/a/wis2/br-inmet/data/core/weather/surface-based-observations/synop` - nos indica que los datos fueron publicados por un centro WIS con el centre-id `br-inmet`, que es el centre-id del Instituto Nacional de Meteorologia - INMET, Brasil. + nos indica que los datos fueron publicados por un centro WIS con el centre-id `br-inmet`, que es el centre-id para el Instituto Nacional de Meteorologia - INMET, Brasil. !!! question - ¿Cómo podemos distinguir entre mensajes publicados por centros WIS que alojan un gateway GTS-to-WIS2 y mensajes publicados por centros WIS que alojan un nodo WIS2? + ¿Cómo podemos distinguir entre los mensajes publicados por centros WIS que alojan un gateway GTS-to-WIS2 y los mensajes publicados por centros WIS que alojan un nodo WIS2? ??? success "Haz clic para revelar la respuesta" - Podemos distinguir los mensajes provenientes de un gateway GTS-to-WIS2 observando el centre-id en la estructura de temas. Por ejemplo, el siguiente tema: + Podemos distinguir los mensajes provenientes de un gateway GTS-to-WIS2 observando el centre-id en la estructura de los temas. Por ejemplo, el siguiente tema: `origin/a/wis2/de-dwd-gts-to-wis2/data/core/I/S/A/I/01/sbbr` - nos indica que los datos fueron publicados por el gateway GTS-to-WIS2 alojado por Deutscher Wetterdienst (DWD), Alemania. El gateway GTS-to-WIS2 es un tipo especial de publicador de datos que publica datos del Global Telecommunication System (GTS) a WIS2. La estructura de temas está compuesta por los encabezados TTAAii CCCC de los mensajes GTS. + nos indica que los datos fueron publicados por el gateway GTS-to-WIS2 alojado por Deutscher Wetterdienst (DWD), Alemania. El gateway GTS-to-WIS2 es un tipo especial de publicador de datos que publica datos del Global Telecommunication System (GTS) a WIS2. La estructura del tema está compuesta por los encabezados TTAAii CCCC para los mensajes GTS. ## Ejercicio 2: Revisar la estructura de los mensajes de WIS2 @@ -151,7 +151,7 @@ Desconéctate de MQTT Explorer y actualiza la sección 'Advanced' para cambiar l Reconéctate al Global Broker y espera a que aparezcan los mensajes. -Puedes visualizar el contenido del mensaje de WIS2 en la sección "Value" en el lado derecho. Intenta expandir la estructura de temas para ver los diferentes niveles del mensaje hasta llegar al último nivel y revisar el contenido de uno de los mensajes. +Puedes ver el contenido del mensaje de WIS2 en la sección "Value" en el lado derecho. Intenta expandir la estructura de los temas para ver los diferentes niveles del mensaje hasta llegar al último nivel y revisar el contenido de uno de los mensajes. !!! question @@ -159,9 +159,9 @@ Puedes visualizar el contenido del mensaje de WIS2 en la sección "Value" en el ??? success "Haz clic para revelar la respuesta" - La marca de tiempo en la que se publicaron los datos está contenida en la sección `properties` del mensaje con la clave `pubtime`. + La marca de tiempo en la que se publicaron los datos está contenida en la sección `properties` del mensaje con una clave llamada `pubtime`. - La marca de tiempo en la que se recopilaron los datos está contenida en la sección `properties` del mensaje con la clave `datetime`. + La marca de tiempo en la que se recopilaron los datos está contenida en la sección `properties` del mensaje con una clave llamada `datetime`. mqtt-explorer-global-broker-msg-properties @@ -179,7 +179,7 @@ Puedes visualizar el contenido del mensaje de WIS2 en la sección "Value" en el Asegúrate de que sigues conectado al Global Broker utilizando las suscripciones de temas `origin/a/wis2/+/data/core/weather/surface-based-observations/synop` y `cache/a/wis2/+/data/core/weather/surface-based-observations/synop` como se describe en el Ejercicio 2. -Intenta identificar un mensaje para el mismo centre-id publicado tanto en los temas `origin` como en los temas `cache`. +Intenta identificar un mensaje para el mismo centre-id publicado en ambos temas, `origin` y `cache`. !!! question @@ -191,9 +191,9 @@ Intenta identificar un mensaje para el mismo centre-id publicado tanto en los te Los mensajes publicados en los temas `cache` son los mensajes para los cuales los datos han sido descargados por el Global Cache. Si revisas el contenido del mensaje del tema que comienza con `cache`, verás que el enlace 'canonical' ha sido actualizado a una nueva URL. - Existen múltiples Global Caches en la red WIS2, por lo que recibirás un mensaje de cada Global Cache que haya descargado el mensaje. + Hay múltiples Global Caches en la red WIS2, por lo que recibirás un mensaje de cada Global Cache que haya descargado el mensaje. - El Global Cache solo descargará y republicará mensajes que fueron publicados en la jerarquía de temas `../data/core/...`. + El Global Cache solo descargará y republicará mensajes que hayan sido publicados en la jerarquía de temas `../data/core/...`. ## Conclusión diff --git a/documentation/docs/es/practical-sessions/initializing-wis2box.md b/documentation/docs/es/practical-sessions/initializing-wis2box.md index ad676781d..39cb66e48 100644 --- a/documentation/docs/es/practical-sessions/initializing-wis2box.md +++ b/documentation/docs/es/practical-sessions/initializing-wis2box.md @@ -16,13 +16,13 @@ title: Inicializando wis2box !!! note - Los materiales de entrenamiento actuales están basados en wis2box-release 1.2.0. + Los materiales de capacitación actuales están basados en wis2box-release 1.3.0. - Consulta [accessing-your-student-vm](./accessing-your-student-vm.md) para obtener instrucciones sobre cómo descargar e instalar el conjunto de software de wis2box si estás realizando este entrenamiento fuera de una sesión de entrenamiento local. + Consulta [accessing-your-student-vm](./accessing-your-student-vm.md) para obtener instrucciones sobre cómo descargar e instalar el conjunto de software de wis2box si estás realizando esta capacitación fuera de una sesión de entrenamiento local. ## Preparación -Inicia sesión en tu VM asignada con tu nombre de usuario y contraseña, y asegúrate de estar en el directorio `wis2box`: +Inicia sesión en tu VM designada con tu nombre de usuario y contraseña y asegúrate de estar en el directorio `wis2box`: ```bash cd ~/wis2box @@ -37,9 +37,9 @@ La configuración inicial para wis2box requiere: El script `wis2box-create-config.py` puede ser utilizado para crear la configuración inicial de tu wis2box. -Te hará una serie de preguntas para ayudar a configurar tu configuración. +Te hará una serie de preguntas para ayudarte a configurar tu configuración. -Podrás revisar y actualizar los archivos de configuración una vez que el script haya finalizado. +Podrás revisar y actualizar los archivos de configuración después de que el script haya finalizado. Ejecuta el script de la siguiente manera: @@ -84,9 +84,9 @@ Is this correct? (y/n/exit) ### Contraseñas de WEBAPP, STORAGE y BROKER -Puedes usar la opción de generación aleatoria de contraseñas cuando se te solicite para `WIS2BOX_WEBAPP_PASSWORD`, `WIS2BOX_STORAGE_PASSWORD`, `WIS2BOX_BROKER_PASSWORD` y definir las tuyas propias. +Puedes utilizar la opción de generación aleatoria de contraseñas cuando se te solicite para `WIS2BOX_WEBAPP_PASSWORD`, `WIS2BOX_STORAGE_PASSWORD`, `WIS2BOX_BROKER_PASSWORD` y definir las tuyas propias. -No te preocupes por recordar estas contraseñas, se almacenarán en el archivo `wis2box.env` en tu directorio wis2box. +No te preocupes por recordar estas contraseñas, se almacenarán en el archivo `wis2box.env` dentro de tu directorio wis2box. ### Revisar `wis2box.env` @@ -104,9 +104,9 @@ O verifica el contenido del archivo a través de WinSCP. ??? success "Haz clic para revelar la respuesta" - El valor predeterminado para WIS2BOX_BASEMAP_URL es `https://{s}.tile.openstreetmap.org/{z}/{x}/{y}.png`. + El valor predeterminado de WIS2BOX_BASEMAP_URL es `https://{s}.tile.openstreetmap.org/{z}/{x}/{y}.png`. - Esta URL se refiere al servidor de mosaicos de OpenStreetMap. Si deseas usar un proveedor de mapas diferente, puedes cambiar esta URL para apuntar a un servidor de mosaicos diferente. + Esta URL se refiere al servidor de mosaicos de OpenStreetMap. Si deseas utilizar un proveedor de mapas diferente, puedes cambiar esta URL para que apunte a otro servidor de mosaicos. !!! question @@ -114,7 +114,7 @@ O verifica el contenido del archivo a través de WinSCP. ??? success "Haz clic para revelar la respuesta" - El valor predeterminado para WIS2BOX_STORAGE_DATA_RETENTION_DAYS es de 30 días. Puedes cambiar este valor a un número diferente de días si lo deseas. + El valor predeterminado de WIS2BOX_STORAGE_DATA_RETENTION_DAYS es 30 días. Puedes cambiar este valor a otro número de días si lo deseas. El contenedor wis2box-management ejecuta un cronjob diariamente para eliminar datos más antiguos que el número de días definido por WIS2BOX_STORAGE_DATA_RETENTION_DAYS del bucket `wis2box-public` y del backend de la API: @@ -124,7 +124,7 @@ O verifica el contenido del archivo a través de WinSCP. !!! note - El archivo `wis2box.env` contiene variables de entorno que definen la configuración de tu wis2box. Para más información, consulta la [wis2box-documentation](https://docs.wis2box.wis.wmo.int/en/latest/reference/configuration.html). + El archivo `wis2box.env` contiene variables de entorno que definen la configuración de tu wis2box. Para más información consulta la [wis2box-documentation](https://docs.wis2box.wis.wmo.int/en/latest/reference/configuration.html). No edites el archivo `wis2box.env` a menos que estés seguro de los cambios que estás realizando. Cambios incorrectos pueden hacer que tu wis2box deje de funcionar. @@ -144,17 +144,17 @@ Inicia wis2box con el siguiente comando: python3 wis2box-ctl.py start ``` -Cuando ejecutes este comando por primera vez, verás la siguiente salida: +Cuando ejecutes este comando por primera vez, verás el siguiente resultado: ``` No docker-compose.images-*.yml files found, creating one -Current version=Undefined, latest version=1.2.0 +Current version=Undefined, latest version=1.3.0 Would you like to update ? (y/n/exit) ``` -Selecciona ``y`` y el script creará el archivo ``docker-compose.images-1.2.0.yml``, descargará las imágenes de Docker necesarias e iniciará los servicios. +Selecciona ``y`` y el script creará el archivo ``docker-compose.images-1.3.0.yml``, descargará las imágenes de Docker necesarias e iniciará los servicios. -Descargar las imágenes puede tomar tiempo dependiendo de la velocidad de tu conexión a internet. Este paso solo es necesario la primera vez que inicies wis2box. +La descarga de las imágenes puede tomar tiempo dependiendo de la velocidad de tu conexión a internet. Este paso solo es necesario la primera vez que inicias wis2box. Inspecciona el estado con el siguiente comando: @@ -205,23 +205,21 @@ docker ps --format "table {{.Names}} \t{{.Status}} \t{{.Image}}" Deberías ver los siguientes contenedores en ejecución: ```{bash} -NAMES STATUS IMAGE -elasticsearch docker.elastic.co/elasticsearch/elasticsearch:8.6.2 "/bin/tini -- /usr/l…" elasticsearch Hace un minuto Activo Hace un minuto (saludable) 9200/tcp, 9300/tcp -elasticsearch-exporter quay.io/prometheuscommunity/elasticsearch-exporter:latest "/bin/elasticsearch_…" elasticsearch-exporter Hace un minuto Activo Hace un minuto 7979/tcp -grafana grafana/grafana-oss:9.0.3 "/run.sh" grafana Hace un minuto Activo Hace un minuto 0.0.0.0:3000->3000/tcp -loki grafana/loki:2.4.1 "/usr/bin/loki -conf…" loki Hace un minuto Activo Hace un minuto 3100/tcp -mosquitto ghcr.io/world-meteorological-organization/wis2box-broker:1.2.0 "/docker-entrypoint.…" mosquitto Hace un minuto Activo Hace un minuto 0.0.0.0:1883->1883/tcp, 0.0.0.0:8884->8884/tcp -mqtt_metrics_collector ghcr.io/world-meteorological-organization/wis2box-mqtt-metrics-collector:1.2.0 "python3 -u mqtt_met…" mqtt_metrics_collector Hace un minuto Activo 10 segundos 8000/tcp, 0.0.0.0:8001->8001/tcp -nginx nginx:alpine "/docker-entrypoint.…" web-proxy Hace un minuto Activo 9 segundos 0.0.0.0:80->80/tcp -prometheus prom/prometheus:v2.37.0 "/bin/prometheus --c…" prometheus Hace un minuto Activo Hace un minuto 9090/tcp -wis2box-api ghcr.io/world-meteorological-organization/wis2box-api:1.2.0 "/app/docker/es-entr…" wis2box-api Hace un minuto Activo 36 segundos (saludable) -wis2box-auth ghcr.io/world-meteorological-organization/wis2box-auth:1.2.0 "/entrypoint.sh" wis2box-auth Hace un minuto Activo 10 segundos -wis2box-management ghcr.io/world-meteorological-organization/wis2box-management:1.2.0 "/home/wis2box/entry…" wis2box-management Hace un minuto Activo 12 segundos -wis2box-minio minio/minio:RELEASE.2024-08-03T04-33-23Z-cpuv1 "/usr/bin/docker-ent…" minio Hace un minuto Activo Hace un minuto (saludable) 0.0.0.0:8022->8022/tcp, 0.0.0.0:9000-9001->9000-9001/tcp -wis2box-ui ghcr.io/world-meteorological-organization/wis2box-ui:1.2.0 "/docker-entrypoint.…" wis2box-ui Hace un minuto Activo 35 segundos 0.0.0.0:9999->80/tcp -wis2box-webapp ghcr.io/world-meteorological-organization/wis2box-webapp:1.2.0 "sh /wis2box-webapp/…" wis2box-webapp Hace un minuto Activo Hace un minuto (no saludable) 4173/tcp -wis2downloader ghcr.io/wmo-im/wis2downloader:v0.3.2 "/home/wis2downloade…" wis2downloader Hace un minuto Activo Hace un minuto (saludable) - +NAMES STATUS IMAGE +nginx Up 56 seconds nginx:1.30.1-alpine +mqtt_metrics_collector Up 58 seconds ghcr.io/world-meteorological-organization/wis2box-mqtt-metrics-collector:1.3.0 +wis2box-auth Up 59 seconds ghcr.io/world-meteorological-organization/wis2box-auth:1.3.0 +wis2box-ui Up About a minute ghcr.io/world-meteorological-organization/wis2box-ui:1.3.0 +wis2box-management Up About a minute ghcr.io/world-meteorological-organization/wis2box-management:1.3.0 +wis2box-minio Up 2 minutes (healthy) ghcr.io/world-meteorological-organization/wis2box-minio:latest +wis2box-api Up About a minute (healthy) ghcr.io/world-meteorological-organization/wis2box-api:1.3.0 +elasticsearch Up 2 minutes (healthy) docker.elastic.co/elasticsearch/elasticsearch:8.6.2 +grafana Up 2 minutes grafana/grafana-oss:12.4.2 +loki Up 2 minutes grafana/loki:2.4.1 +elasticsearch-exporter Up 2 minutes quay.io/prometheuscommunity/elasticsearch-exporter:latest +prometheus Up 2 minutes prom/prometheus:v2.37.0 +mosquitto Up 2 minutes ghcr.io/world-meteorological-organization/wis2box-broker:1.3.0 +wis2box-webapp Up 2 minutes (healthy) ghcr.io/world-meteorological-organization/wis2box-webapp:1.3.0 ``` Estos contenedores son parte del conjunto de software de wis2box y proporcionan los diversos servicios necesarios para ejecutar wis2box. @@ -247,7 +245,7 @@ Los volúmenes que comienzan con `wis2box_project_` se utilizan para almacenar d ## wis2box API -El wis2box contiene una API (Interfaz de Programación de Aplicaciones) que proporciona acceso a datos y procesos para la visualización interactiva, transformación de datos y publicación. +El wis2box contiene una API (Interfaz de Programación de Aplicaciones) que proporciona acceso a datos y procesos para visualización interactiva, transformación de datos y publicación. Abra una nueva pestaña y navegue a la página `http://YOUR-HOST/oapi`. @@ -286,7 +284,7 @@ Esta es la página de inicio de la API de wis2box (ejecutándose a través del c Abra un navegador web y visite la página `http://YOUR-HOST/wis2box-webapp`. -Verá un mensaje emergente solicitando su nombre de usuario y contraseña. Use el nombre de usuario predeterminado `wis2box-user` y la contraseña `WIS2BOX_WEBAPP_PASSWORD` definida en el archivo `wis2box.env` y haga clic en "Sign in": +Verá un cuadro emergente solicitando su nombre de usuario y contraseña. Use el nombre de usuario predeterminado `wis2box-user` y la contraseña `WIS2BOX_WEBAPP_PASSWORD` definida en el archivo `wis2box.env` y haga clic en "Sign in": !!! note @@ -304,7 +302,7 @@ Esta es la aplicación web de wis2box que le permite interactuar con su wis2box: - crear y gestionar conjuntos de datos - actualizar/revisar los metadatos de sus estaciones -- cargar observaciones manuales utilizando el formulario FM-12 synop +- cargar observaciones manuales utilizando el formulario FM-12 synop - monitorear las notificaciones publicadas en su wis2box-broker Usaremos esta aplicación web en una sesión posterior. @@ -335,7 +333,7 @@ Use los siguientes detalles de conexión, asegurándose de reemplazar el valor d - **Protocolo: mqtt://** - **Host: ``** - **Puerto: 1883** -- **Usuario: wis2box** +- **Nombre de usuario: wis2box** - **Contraseña: ``** !!! note @@ -346,27 +344,28 @@ Use los siguientes detalles de conexión, asegurándose de reemplazar el valor d cat ~/wis2box/wis2box.env | grep WIS2BOX_BROKER_PASSWORD ``` - Tenga en cuenta que esta es su contraseña **interna** del broker, el Global Broker usará credenciales diferentes (de solo lectura) para suscribirse a su broker. Nunca comparta esta contraseña con nadie. + Tenga en cuenta que esta es su contraseña **interna** del broker. El Global Broker utilizará credenciales diferentes (solo lectura) para suscribirse a su broker. Nunca comparta esta contraseña con nadie. Asegúrese de hacer clic en "SAVE" para guardar los detalles de su conexión. Luego haga clic en "CONNECT" para conectarse a su **wis2box-broker**. -mqtt-explorer-wis2box-broker.png -``` +mqtt-explorer-wis2box-broker-port1883.png -Una vez conectado, verifica que las estadísticas internas de mosquitto se estén publicando en tu broker bajo el tema `$SYS`: +Una vez conectado, verá las estadísticas internas de mosquitto publicadas por su broker bajo el tema `$SYS`: mqtt-explorer-sys-topic.png -Mantén abierto MQTT Explorer, ya que lo utilizaremos para monitorear los mensajes publicados en el broker. +La misma conexión también se puede lograr utilizando MQTT sobre WebSockets en el puerto 80, utilizando los siguientes detalles de conexión: + +mqtt-explorer-wis2box-broker-websockets.png ## Conclusión !!! success "¡Felicidades!" - En esta sesión práctica, aprendiste a: + En esta sesión práctica, aprendió cómo: - ejecutar el script `wis2box-create-config.py` para crear la configuración inicial - iniciar wis2box y verificar el estado de sus componentes - acceder a wis2box-webapp y wis2box-API en un navegador - - conectarte al broker MQTT en tu VM de estudiante utilizando MQTT Explorer \ No newline at end of file + - conectarse al broker MQTT en su VM de estudiante utilizando MQTT Explorer \ No newline at end of file diff --git a/documentation/docs/fr/practical-sessions/accessing-your-student-vm.md b/documentation/docs/fr/practical-sessions/accessing-your-student-vm.md index d7a00bf03..33e186651 100644 --- a/documentation/docs/fr/practical-sessions/accessing-your-student-vm.md +++ b/documentation/docs/fr/practical-sessions/accessing-your-student-vm.md @@ -28,19 +28,19 @@ Votre VM étudiant dispose des logiciels suivants préinstallés : Si vous souhaitez suivre cette formation en dehors d'une session de formation locale, vous pouvez fournir votre propre instance en utilisant n'importe quel fournisseur de cloud, par exemple : - - GCP (Google Cloud Platform) VM instance `e2-medium` - - AWS (Amazon Web Services)  ec2-instance `t3a.medium`  - - Azure (Microsoft) Azure Virtual Machine `standard_b2s` + - GCP (Google Cloud Platform) instance VM `e2-medium` + - AWS (Amazon Web Services) instance ec2 `t3a.medium` + - Azure (Microsoft) machine virtuelle Azure `standard_b2s` Sélectionnez Ubuntu Server 22.0.4 LTS comme système d'exploitation. - Après avoir créé votre VM, assurez-vous d'avoir installé Python, Docker et Docker Compose, comme décrit dans [wis2box-software-dependencies](https://docs.wis2box.wis.wmo.int/en/latest/user/getting-started.html#software-dependencies). + Après avoir créé votre VM, assurez-vous d'avoir installé python, docker et docker compose, comme décrit dans [wis2box-software-dependencies](https://docs.wis2box.wis.wmo.int/en/latest/user/getting-started.html#software-dependencies). L'archive de la version de wis2box utilisée dans cette formation peut être téléchargée comme suit : ```bash - wget https://github.com/World-Meteorological-Organization/wis2box-release/releases/download/1.2.0/wis2box-setup-1.2.0.zip - unzip wis2box-setup-1.2.0.zip + wget https://github.com/World-Meteorological-Organization/wis2box-release/releases/download/1.3.0/wis2box-setup-1.3.0.zip + unzip wis2box-setup-1.3.0.zip ``` Vous pouvez toujours trouver la dernière archive 'wis2box-setup' à [https://github.com/World-Meteorological-Organization/wis2box/releases](https://github.com/World-Meteorological-Organization/wis2box-release/releases). @@ -56,10 +56,10 @@ Votre VM étudiant dispose des logiciels suivants préinstallés : ```bash pip3 install minio - pip3 install pywiscat==0.4.0 + pip3 install pywiscat ``` - Si vous utilisez la VM étudiant fournie lors des sessions de formation locales WIS2, les logiciels requis seront déjà installés. + Si vous utilisez la VM étudiant fournie lors des sessions de formation WIS2 locales, les logiciels requis seront déjà installés. ## Se connecter à votre VM étudiant sur le réseau de formation local @@ -67,10 +67,10 @@ Connectez votre PC au Wi-Fi local diffusé dans la salle pendant la formation WI Utilisez un client SSH pour vous connecter à votre VM étudiant en utilisant les informations suivantes : -- **Hôte : (fourni pendant la formation en présentiel)** +- **Hôte : (fourni lors de la formation en présentiel)** - **Port : 22** -- **Nom d'utilisateur : (fourni pendant la formation en présentiel)** -- **Mot de passe : (fourni pendant la formation en présentiel)** +- **Nom d'utilisateur : (fourni lors de la formation en présentiel)** +- **Mot de passe : (fourni lors de la formation en présentiel)** !!! tip Contactez un formateur si vous ne connaissez pas le nom d'hôte/nom d'utilisateur ou si vous rencontrez des problèmes de connexion. @@ -117,9 +117,9 @@ résultat : Docker Compose version v2.21.0 ``` -Pour garantir que votre utilisateur peut exécuter des commandes Docker, il a été ajouté au groupe `docker`. +Pour garantir que votre utilisateur peut exécuter des commandes Docker, votre utilisateur a été ajouté au groupe `docker`. -Pour tester que votre utilisateur peut exécuter docker hello-world, exécutez la commande suivante : +Pour tester que votre utilisateur peut exécuter le conteneur hello-world de Docker, exécutez la commande suivante : ```bash docker run hello-world ``` @@ -147,7 +147,7 @@ résultat : exercise-materials wis2box ``` -Si vous avez installé WinSCP sur votre PC local, vous pouvez l'utiliser pour vous connecter à votre VM étudiant, inspecter le contenu de votre répertoire personnel et télécharger ou envoyer des fichiers entre votre VM et votre PC local. +Si vous avez installé WinSCP sur votre PC local, vous pouvez l'utiliser pour vous connecter à votre VM étudiant, inspecter le contenu de votre répertoire personnel et télécharger ou téléverser des fichiers entre votre VM et votre PC local. WinSCP n'est pas requis pour la formation, mais il peut être utile si vous souhaitez éditer des fichiers sur votre VM en utilisant un éditeur de texte sur votre PC local. @@ -159,7 +159,7 @@ Ouvrez WinSCP et cliquez sur "New Site". Vous pouvez créer une nouvelle connexi Cliquez sur 'Save' puis sur 'Login' pour vous connecter à votre VM. -Vous devriez maintenant pouvoir voir le contenu du répertoire personnel sur votre VM étudiant et accéder à vos fichiers. +Vous devriez maintenant être en mesure de voir le contenu du répertoire personnel de votre VM étudiant et d'accéder à vos fichiers. ## Conclusion diff --git a/documentation/docs/fr/practical-sessions/adding-gts-headers-to-wis2-notifications.md b/documentation/docs/fr/practical-sessions/adding-gts-headers-to-wis2-notifications.md index 5f3d5ed77..40a632472 100644 --- a/documentation/docs/fr/practical-sessions/adding-gts-headers-to-wis2-notifications.md +++ b/documentation/docs/fr/practical-sessions/adding-gts-headers-to-wis2-notifications.md @@ -1,24 +1,25 @@ --- -title: Ajout d'en-têtes GTS aux notifications WIS2 +title: Ajout des en-têtes GTS aux notifications WIS2 --- -# Ajout d'en-têtes GTS aux notifications WIS2 +# Ajout des en-têtes GTS aux notifications WIS2 -!!! abstract "Résultats d'apprentissage" +!!! abstract "Objectifs d'apprentissage" À la fin de cette session pratique, vous serez capable de : - configurer une correspondance entre le nom de fichier et les en-têtes GTS - - ingérer des données avec un nom de fichier qui correspond aux en-têtes GTS + - intégrer des données avec un nom de fichier correspondant aux en-têtes GTS - visualiser les en-têtes GTS dans les notifications WIS2 + - utiliser le formulaire FM-12 SYNOP pour ajouter manuellement des en-têtes GTS à une notification WIS2 ## Introduction -Les membres de l'OMM souhaitant arrêter leur transmission de données sur le GTS pendant la phase de transition vers WIS2 devront ajouter des en-têtes GTS à leurs notifications WIS2. Ces en-têtes permettent au passerelle WIS2 vers GTS de transférer les données vers le réseau GTS. +Les Membres de l'OMM souhaitant arrêter la transmission de leurs données sur le GTS pendant la phase de transition vers WIS2 devront ajouter des en-têtes GTS à leurs notifications WIS2. Ces en-têtes permettent à la passerelle WIS2 vers GTS de transmettre les données au réseau GTS. -Cela permet aux membres ayant migré vers l'utilisation d'un nœud WIS2 pour la publication de données de désactiver leur système MSS et de s'assurer que leurs données sont toujours disponibles pour les membres n'ayant pas encore migré vers WIS2. +Cela permet aux Membres ayant migré vers l'utilisation d'un nœud WIS2 pour la publication des données de désactiver leur système MSS tout en garantissant que leurs données restent disponibles pour les Membres n'ayant pas encore migré vers WIS2. -La propriété GTS dans le Message de Notification WIS2 doit être ajoutée comme une propriété supplémentaire au Message de Notification WIS2. La propriété GTS est un objet JSON qui contient les en-têtes GTS nécessaires pour que les données soient transférées vers le réseau GTS. +La propriété GTS dans le Message de Notification WIS2 doit être ajoutée comme une propriété supplémentaire au Message de Notification WIS2. La propriété GTS est un objet JSON qui contient les en-têtes GTS nécessaires pour que les données soient transmises au réseau GTS. ```json { @@ -29,45 +30,55 @@ La propriété GTS dans le Message de Notification WIS2 doit être ajoutée comm } ``` -Au sein de wis2box, vous pouvez ajouter cela automatiquement aux Notifications WIS2 en fournissant un fichier supplémentaire nommé `gts_headers_mapping.csv` qui contient les informations nécessaires pour mapper les en-têtes GTS aux noms de fichiers entrants. +Dans wis2box, vous pouvez ajouter cela automatiquement aux Notifications WIS2 en fournissant un fichier supplémentaire nommé `gts_headers_mapping.csv` contenant les informations nécessaires pour associer les en-têtes GTS aux noms de fichiers entrants. -Ce fichier doit être placé dans le répertoire défini par `WIS2BOX_HOST_DATADIR` dans votre `wis2box.env` et doit avoir les colonnes suivantes : +Ce fichier doit être placé dans le répertoire défini par `WIS2BOX_HOST_DATADIR` dans votre fichier `wis2box.env` et doit contenir les colonnes suivantes : -- `string_in_filepath` : une chaîne qui fait partie du nom de fichier qui sera utilisée pour correspondre aux en-têtes GTS +- `string_in_filepath` : une chaîne faisant partie du nom de fichier qui sera utilisée pour associer les en-têtes GTS - `TTAAii` : l'en-tête TTAAii à ajouter à la notification WIS2 - `CCCC` : l'en-tête CCCC à ajouter à la notification WIS2 +À partir de wis2box-1.3.0, les éditeurs de données ont deux options pour (facultativement) ajouter des propriétés GTS à leurs notifications : + +1. Pour les fichiers téléchargés dans MinIO, préparer un fichier de correspondance nommé "gts_headers_mappings.csv" avec les propriétés requises. + +2. Pour les données saisies via le formulaire FM-12 SYNOP dans wis2box-webapp, sélectionner "Ajouter des en-têtes GTS" et fournir les informations manuellement. + ## Préparation -Assurez-vous d'avoir un accès SSH à votre VM étudiante et que votre instance wis2box est opérationnelle. +Assurez-vous d'avoir un accès SSH à votre VM étudiant et que votre instance wis2box est opérationnelle. -Assurez-vous que vous êtes connecté au broker MQTT de votre instance wis2box en utilisant MQTT Explorer. Vous pouvez utiliser les identifiants publics `everyone/everyone` pour vous connecter au broker. +Vérifiez que vous êtes connecté au broker MQTT de votre instance wis2box en utilisant MQTT Explorer. Vous pouvez utiliser les identifiants publics `everyone/everyone` pour vous connecter au broker. -Assurez-vous d'avoir un navigateur web ouvert avec le tableau de bord Grafana pour votre instance en allant à `http://YOUR-HOST:3000` +Assurez-vous d'avoir un navigateur web ouvert avec le tableau de bord Grafana de votre instance en accédant à `http://YOUR-HOST:3000`. -## Création de `gts_headers_mapping.csv` +## Exercice 1 : Utilisation d'un fichier de correspondance pour les données téléchargées dans MinIO -Pour ajouter des en-têtes GTS à vos notifications WIS2, un fichier CSV est requis qui mappe les en-têtes GTS aux noms de fichiers entrants. +Le premier exercice montre comment ajouter des en-têtes GTS pour les données téléchargées dans MinIO, en utilisant un fichier de correspondance nommé `gts_headers_mapping.csv`. -Le fichier CSV doit être nommé (exactement) `gts_headers_mapping.csv` et doit être placé dans le répertoire défini par `WIS2BOX_HOST_DATADIR` dans votre `wis2box.env`. +### Création de `gts_headers_mapping.csv` -## Fourniture d'un fichier `gts_headers_mapping.csv` - -Copiez le fichier `exercise-materials/gts-headers-exercises/gts_headers_mapping.csv` sur votre instance wis2box et placez-le dans le répertoire défini par `WIS2BOX_HOST_DATADIR` dans votre `wis2box.env`. +Pour ajouter des en-têtes GTS à vos notifications WIS2, un fichier CSV est nécessaire pour associer les en-têtes GTS aux noms de fichiers entrants. + +Le fichier CSV doit être nommé (exactement) `gts_headers_mapping.csv` et placé dans le répertoire défini par `WIS2BOX_HOST_DATADIR` dans votre fichier `wis2box.env`. + +Copiez le fichier `exercise-materials/gts-headers-exercises/gts_headers_mapping.csv` dans votre instance wis2box et placez-le dans le répertoire défini par `WIS2BOX_HOST_DATADIR` dans votre fichier `wis2box.env`. ```bash cp ~/exercise-materials/gts-headers-exercises/gts_headers_mapping.csv ~/wis2box-data ``` -Ensuite, redémarrez le conteneur wis2box-management pour appliquer les modifications : +### Application des correspondances + +Après avoir créé le fichier `gts_headers_mapping.csv`, vous devez redémarrer le conteneur wis2box-management pour appliquer les modifications. Vous pouvez le faire en exécutant la commande suivante dans votre VM étudiant : ```bash docker restart wis2box-management ``` -## Ingestion de données avec en-têtes GTS +### Intégration des données avec des en-têtes GTS -Copiez le fichier `exercise-materials/gts-headers-exercises/A_SMRO01YRBK171200_C_EDZW_20240717120502.txt` dans le répertoire défini par `WIS2BOX_HOST_DATADIR` dans votre `wis2box.env` : +Copiez le fichier `exercise-materials/gts-headers-exercises/A_SMRO01YRBK171200_C_EDZW_20240717120502.txt` dans le répertoire défini par `WIS2BOX_HOST_DATADIR` dans votre fichier `wis2box.env` : ```bash cp ~/exercise-materials/gts-headers-exercises/A_SMRO01YRBK171200_C_EDZW_20240717120502.txt ~/wis2box-data @@ -80,25 +91,63 @@ cd ~/wis2box python3 wis2box-ctl.py login ``` -Depuis la ligne de commande wis2box, nous pouvons ingérer le fichier de données d'exemple `A_SMRO01YRBK171200_C_EDZW_20240717120502.txt` dans un ensemble de données spécifique comme suit : +Depuis la ligne de commande wis2box, vous pouvez intégrer le fichier de données exemple `A_SMRO01YRBK171200_C_EDZW_20240717120502.txt` dans un ensemble de données spécifique comme suit : ```bash wis2box data ingest -p /data/wis2box/A_SMRO01YRBK171200_C_EDZW_20240717120502.txt --metadata-id urn:wmo:md:not-my-centre:core.surface-based-observations.synop ``` -Assurez-vous de remplacer l'option `metadata-id` par l'identifiant correct pour votre ensemble de données. +Assurez-vous de remplacer l'option `metadata-id` par l'identifiant correct de votre ensemble de données. + +Vérifiez le tableau de bord Grafana pour voir si les données ont été intégrées correctement. Si vous voyez des AVERTISSEMENTS ou des ERREURS, essayez de les corriger et répétez l'exercice avec la commande `wis2box data ingest`. + +### Visualisation des en-têtes GTS dans la Notification WIS2 + +Accédez à MQTT Explorer et vérifiez le Message de Notification WIS2 pour les données que vous venez d'intégrer. + +Le Message de Notification WIS2 doit contenir les en-têtes GTS que vous avez fournis dans le fichier `gts_headers_mapping.csv`. + +## Exercice 2 : Utilisation du formulaire FM-12 SYNOP + +Lors de l'utilisation du formulaire FM-12 SYNOP dans wis2box-webapp, vous pouvez ajouter manuellement des en-têtes GTS à vos notifications WIS2 en sélectionnant l'option "Ajouter des en-têtes GTS" et en fournissant les informations requises. + +Pour cet exercice, vous pouvez utiliser les données d'exemple ci-dessous ou fournir les vôtres : + +Message FM-12 SYNOP : + +```{copy} +AAXX 03094 +64400 42460 71004 10285 20245 30113 40133 8493/ + 333 59005 83813 81930 87363 94966 95836= +``` + +En-têtes GTS : TTAAii=`ISIH01` et CCCC=`FCBB` + +!!! note + Le plugin synop2bufr dans wis2box convertit les messages FM-12 SYNOP en BUFR, donc le TTAAii doit commencer par `IS` : + + - I = Données d'observation (codées en binaire) – BUFR + - S = Surface/niveau de la mer + +### Soumettre manuellement le formulaire FM-12 SYNOP avec des en-têtes GTS + +Accédez au formulaire FM-12 SYNOP dans wis2box-webapp et remplissez le formulaire avec les données d'exemple ci-dessus ou vos propres données. + +Assurez-vous de sélectionner l'option "Ajouter des en-têtes GTS" et de fournir les informations requises pour les en-têtes GTS : + +fm-12-synop-form-gts-headers.png -Vérifiez le tableau de bord Grafana pour voir si les données ont été correctement ingérées. Si vous voyez des AVERTISSEMENTS ou des ERREURS, essayez de les résoudre et répétez la commande `wis2box data ingest`. +Fournissez le jeton d'authentification requis et soumettez le formulaire. -## Visualisation des en-têtes GTS dans la Notification WIS2 +Vous verrez probablement un message d'erreur car cette station n'est pas dans votre liste de stations. Vous devrez ajouter la station "0-20000-0-64400" à votre liste de stations pour que les données soient converties et publiées avec succès. -Allez à MQTT Explorer et vérifiez le Message de Notification WIS2 pour les données que vous venez d'ingérer. +### Visualisation des en-têtes GTS dans la Notification WIS2 -Le Message de Notification WIS2 devrait contenir les en-têtes GTS que vous avez fournis dans le fichier `gts_headers_mapping.csv`. +Accédez à MQTT Explorer et vérifiez le Message de Notification WIS2 pour les données que vous venez d'intégrer afin de voir si les en-têtes GTS sont inclus dans la notification. ## Conclusion !!! success "Félicitations !" - Dans cette session pratique, vous avez appris à : + Au cours de cette session pratique, vous avez appris à : - ajouter des en-têtes GTS à vos notifications WIS2 - vérifier que les en-têtes GTS sont disponibles via votre installation wis2box \ No newline at end of file diff --git a/documentation/docs/fr/practical-sessions/connecting-to-wis2-over-mqtt.md b/documentation/docs/fr/practical-sessions/connecting-to-wis2-over-mqtt.md index f67fd609f..1978292ef 100644 --- a/documentation/docs/fr/practical-sessions/connecting-to-wis2-over-mqtt.md +++ b/documentation/docs/fr/practical-sessions/connecting-to-wis2-over-mqtt.md @@ -9,14 +9,14 @@ title: Connexion à WIS2 via MQTT À la fin de cette session pratique, vous serez capable de : - vous connecter au Global Broker de WIS2 en utilisant MQTT Explorer - - examiner la structure des topics WIS2 + - examiner la structure des sujets WIS2 - examiner la structure des messages de notification WIS2 ## Introduction -WIS2 utilise le protocole MQTT pour annoncer la disponibilité des données météorologiques, climatiques et hydrologiques. Le Global Broker de WIS2 s'abonne à tous les WIS2 Nodes du réseau et republie les messages qu'il reçoit. Le Global Cache s'abonne au Global Broker, télécharge les données contenues dans le message, puis republie le message sur le topic `cache` avec une nouvelle URL. Le Global Discovery Catalogue publie les métadonnées de découverte provenant du Broker et fournit une API de recherche. +WIS2 utilise le protocole MQTT pour annoncer la disponibilité des données météorologiques, climatiques et hydrologiques. Le Global Broker de WIS2 s'abonne à tous les WIS2 Nodes du réseau et republie les messages qu'il reçoit. Le Global Cache s'abonne au Global Broker, télécharge les données contenues dans le message, puis republie le message sur le sujet `cache` avec une nouvelle URL. Le Global Discovery Catalogue publie les métadonnées de découverte provenant du Broker et fournit une API de recherche. -Voici un exemple de structure de message de notification WIS2 pour un message reçu sur le topic `origin/a/wis2/br-inmet/data/core/weather/surface-based-observations/synop` : +Voici un exemple de structure de message de notification WIS2 pour un message reçu sur le sujet `origin/a/wis2/br-inmet/data/core/weather/surface-based-observations/synop` : ```json { @@ -57,24 +57,24 @@ Voici un exemple de structure de message de notification WIS2 pour un message re "href":"https://oscar.wmo.int/surface/#/search/station/stationReportDetails/0-20000-0-76679" } ], - "generated_by":"wis2box 1.2.0" + "generated_by":"wis2box 1.3.0" } ``` Dans cette session pratique, vous apprendrez à utiliser l'outil MQTT Explorer pour configurer une connexion client MQTT à un Global Broker WIS2 et afficher les messages de notification WIS2. -MQTT Explorer est un outil utile pour parcourir et examiner la structure des topics d'un broker MQTT donné afin de consulter les données publiées. +MQTT Explorer est un outil utile pour parcourir et examiner la structure des sujets d'un broker MQTT afin de consulter les données publiées. !!! note "À propos de MQTT" - MQTT Explorer fournit une interface conviviale pour se connecter à un broker MQTT et explorer les topics et la structure des messages utilisés par WIS2. + MQTT Explorer fournit une interface conviviale pour se connecter à un broker MQTT et explorer les sujets et la structure des messages utilisés par WIS2. - En pratique, MQTT est conçu pour la communication machine-à-machine, où une application ou un service s'abonne à des topics et traite les messages de manière programmatique en temps réel. + En pratique, MQTT est conçu pour une communication machine-à-machine, où une application ou un service s'abonne à des sujets et traite les messages de manière programmatique en temps réel. - Pour travailler avec MQTT de manière programmatique (par exemple, en Python), vous pouvez utiliser des bibliothèques client MQTT telles que [paho-mqtt](https://pypi.org/project/paho-mqtt) pour vous connecter à un broker MQTT et traiter les messages entrants. Il existe de nombreux logiciels client et serveur MQTT, en fonction de vos besoins et de votre environnement technique. + Pour travailler avec MQTT de manière programmatique (par exemple, en Python), vous pouvez utiliser des bibliothèques client MQTT comme [paho-mqtt](https://pypi.org/project/paho-mqtt) pour vous connecter à un broker MQTT et traiter les messages entrants. Il existe de nombreux logiciels client et serveur MQTT, en fonction de vos besoins et de votre environnement technique. ## Utilisation de MQTT Explorer pour se connecter au Global Broker -Pour afficher les messages publiés par un Global Broker WIS2, vous pouvez utiliser "MQTT Explorer", qui peut être téléchargé depuis le [site web de MQTT Explorer](https://mqtt-explorer.com). +Pour consulter les messages publiés par un Global Broker WIS2, vous pouvez utiliser "MQTT Explorer", téléchargeable depuis le [site web de MQTT Explorer](https://mqtt-explorer.com). Ouvrez MQTT Explorer et ajoutez une nouvelle connexion au Global Broker hébergé par MeteoFrance en utilisant les détails suivants : @@ -85,7 +85,7 @@ Ouvrez MQTT Explorer et ajoutez une nouvelle connexion au Global Broker héberg mqtt-explorer-global-broker-connection -Cliquez sur le bouton 'ADVANCED', supprimez les topics préconfigurés et ajoutez les topics suivants pour vous y abonner : +Cliquez sur le bouton 'ADVANCED', supprimez les sujets préconfigurés et ajoutez les sujets suivants pour vous y abonner : - `origin/a/wis2/#` @@ -94,10 +94,10 @@ Cliquez sur le bouton 'ADVANCED', supprimez les topics préconfigurés et ajoute !!! note Lors de la configuration des abonnements MQTT, vous pouvez utiliser les jokers suivants : - - **Single-level (+)** : un joker à un seul niveau remplace un seul niveau de topic - - **Multi-level (#)** : un joker à plusieurs niveaux remplace plusieurs niveaux de topics + - **Niveau unique (+)** : un joker de niveau unique remplace un niveau de sujet + - **Multi-niveaux (#)** : un joker multi-niveaux remplace plusieurs niveaux de sujet - Dans ce cas, `origin/a/wis2/#` s'abonnera à tous les topics sous le topic `origin/a/wis2`. + Dans ce cas, `origin/a/wis2/#` s'abonnera à tous les sujets sous le sujet `origin/a/wis2`. Cliquez sur 'BACK', puis 'SAVE' pour enregistrer vos détails de connexion et d'abonnement. Ensuite, cliquez sur 'CONNECT' : @@ -105,41 +105,41 @@ Les messages devraient commencer à apparaître dans votre session MQTT Explorer mqtt-explorer-global-broker-topics -Vous êtes maintenant prêt à explorer les topics et la structure des messages WIS2. +Vous êtes maintenant prêt à explorer les sujets et la structure des messages WIS2. -## Exercice 1 : Examiner la structure des topics WIS2 +## Exercice 1 : Examiner la structure des sujets WIS2 -Utilisez MQTT pour parcourir la structure des topics sous les topics `origin`. +Utilisez MQTT pour parcourir la structure des sujets sous les sujets `origin`. !!! question - Comment pouvons-nous distinguer le centre WIS qui a publié les données ? + Comment peut-on distinguer le centre WIS qui a publié les données ? ??? success "Cliquez pour révéler la réponse" - Vous pouvez cliquer sur la fenêtre de gauche dans MQTT Explorer pour développer la structure des topics. + Vous pouvez cliquer sur la fenêtre de gauche dans MQTT Explorer pour développer la structure des sujets. - Nous pouvons distinguer le centre WIS qui a publié les données en regardant le quatrième niveau de la structure des topics. Par exemple, le topic suivant : + Nous pouvons distinguer le centre WIS qui a publié les données en regardant le quatrième niveau de la structure des sujets. Par exemple, le sujet suivant : `origin/a/wis2/br-inmet/data/core/weather/surface-based-observations/synop` - nous indique que les données ont été publiées par un centre WIS avec l'identifiant `br-inmet`, qui correspond à l'Instituto Nacional de Meteorologia - INMET, Brésil. + nous indique que les données ont été publiées par un centre WIS avec l'identifiant `br-inmet`, qui correspond à l'identifiant du centre Instituto Nacional de Meteorologia - INMET, Brésil. !!! question - Comment pouvons-nous distinguer les messages publiés par les centres WIS hébergeant une passerelle GTS-to-WIS2 de ceux publiés par les centres WIS hébergeant un WIS2 Node ? + Comment peut-on distinguer les messages publiés par les centres WIS hébergeant une passerelle GTS-vers-WIS2 des messages publiés par les centres WIS hébergeant un WIS2 Node ? ??? success "Cliquez pour révéler la réponse" - Nous pouvons distinguer les messages provenant d'une passerelle GTS-to-WIS2 en regardant l'identifiant du centre dans la structure des topics. Par exemple, le topic suivant : + Nous pouvons distinguer les messages provenant d'une passerelle GTS-vers-WIS2 en regardant l'identifiant du centre dans la structure des sujets. Par exemple, le sujet suivant : `origin/a/wis2/de-dwd-gts-to-wis2/data/core/I/S/A/I/01/sbbr` - nous indique que les données ont été publiées par la passerelle GTS-to-WIS2 hébergée par Deutscher Wetterdienst (DWD), Allemagne. La passerelle GTS-to-WIS2 est un type spécial de producteur de données qui publie des données du Global Telecommunication System (GTS) vers WIS2. La structure des topics est composée des en-têtes TTAAii CCCC pour les messages GTS. + nous indique que les données ont été publiées par la passerelle GTS-vers-WIS2 hébergée par Deutscher Wetterdienst (DWD), Allemagne. La passerelle GTS-vers-WIS2 est un type spécial de producteur de données qui publie des données du Système Mondial de Télécommunications (GTS) vers WIS2. La structure des sujets est composée des en-têtes TTAAii CCCC des messages GTS. ## Exercice 2 : Examiner la structure des messages WIS2 -Déconnectez-vous de MQTT Explorer et mettez à jour les sections 'Advanced' pour modifier l'abonnement avec les topics suivants : +Déconnectez-vous de MQTT Explorer et mettez à jour les sections 'Advanced' pour modifier l'abonnement aux sujets suivants : * `origin/a/wis2/+/data/core/weather/surface-based-observations/synop` * `cache/a/wis2/+/data/core/weather/surface-based-observations/synop` @@ -151,11 +151,11 @@ Déconnectez-vous de MQTT Explorer et mettez à jour les sections 'Advanced' pou Reconnectez-vous au Global Broker et attendez que les messages apparaissent. -Vous pouvez consulter le contenu du message WIS2 dans la section "Value" sur le côté droit. Essayez de développer la structure des topics pour voir les différents niveaux du message jusqu'à atteindre le dernier niveau et examinez le contenu d'un des messages. +Vous pouvez consulter le contenu du message WIS2 dans la section "Value" située à droite. Essayez de développer la structure des sujets pour voir les différents niveaux du message jusqu'à atteindre le dernier niveau et examinez le contenu d'un des messages. !!! question - Comment pouvons-nous identifier l'horodatage de publication des données ? Et comment pouvons-nous identifier l'horodatage de collecte des données ? + Comment peut-on identifier l'horodatage de publication des données ? Et comment peut-on identifier l'horodatage de collecte des données ? ??? success "Cliquez pour révéler la réponse" @@ -167,7 +167,7 @@ Vous pouvez consulter le contenu du message WIS2 dans la section "Value" sur le !!! question - Comment pouvons-nous télécharger les données depuis l'URL fournie dans le message ? + Comment peut-on télécharger les données à partir de l'URL fournie dans le message ? ??? success "Cliquez pour révéler la réponse" @@ -175,25 +175,25 @@ Vous pouvez consulter le contenu du message WIS2 dans la section "Value" sur le Vous pouvez copier l'URL et la coller dans un navigateur web pour télécharger les données. -## Exercice 3 : Examiner la différence entre les topics 'origin' et 'cache' +## Exercice 3 : Examiner la différence entre les sujets 'origin' et 'cache' -Assurez-vous d'être toujours connecté au Global Broker en utilisant les abonnements aux topics `origin/a/wis2/+/data/core/weather/surface-based-observations/synop` et `cache/a/wis2/+/data/core/weather/surface-based-observations/synop` comme décrit dans l'Exercice 2. +Assurez-vous d'être toujours connecté au Global Broker en utilisant les abonnements aux sujets `origin/a/wis2/+/data/core/weather/surface-based-observations/synop` et `cache/a/wis2/+/data/core/weather/surface-based-observations/synop` comme décrit dans l'Exercice 2. -Essayez d'identifier un message pour le même identifiant de centre publié à la fois sur les topics `origin` et `cache`. +Essayez d'identifier un message pour le même centre-id publié à la fois sur les sujets `origin` et `cache`. !!! question - Quelle est la différence entre les messages publiés sur les topics `origin` et `cache` ? + Quelle est la différence entre les messages publiés sur les sujets `origin` et `cache` ? ??? success "Cliquez pour révéler la réponse" - Les messages publiés sur les topics `origin` sont les messages originaux que le Global Broker republie depuis les WIS2 Nodes du réseau. + Les messages publiés sur les sujets `origin` sont les messages originaux que le Global Broker republie à partir des WIS2 Nodes du réseau. - Les messages publiés sur les topics `cache` sont les messages pour lesquels les données ont été téléchargées par le Global Cache. Si vous vérifiez le contenu du message provenant d'un topic commençant par `cache`, vous verrez que le lien 'canonical' a été mis à jour avec une nouvelle URL. + Les messages publiés sur les sujets `cache` sont les messages pour lesquels les données ont été téléchargées par le Global Cache. Si vous consultez le contenu du message provenant du sujet commençant par `cache`, vous verrez que le lien 'canonical' a été mis à jour avec une nouvelle URL. - Il existe plusieurs Global Caches dans le réseau WIS2, vous recevrez donc un message de chaque Global Cache ayant téléchargé le message. + Il existe plusieurs Global Caches dans le réseau WIS2, donc vous recevrez un message de chaque Global Cache ayant téléchargé le message. - Le Global Cache ne télécharge et ne republie que les messages publiés dans la hiérarchie de topics `../data/core/...`. + Le Global Cache ne télécharge et ne republie que les messages publiés sur la hiérarchie de sujets `../data/core/...`. ## Conclusion @@ -201,8 +201,8 @@ Essayez d'identifier un message pour le même identifiant de centre publié à l Dans cette session pratique, vous avez appris : - comment s'abonner aux services du Global Broker WIS2 en utilisant MQTT Explorer - - la structure des topics WIS2 + - la structure des sujets WIS2 - la structure des messages de notification WIS2 - - la différence entre les données core et recommandées - - la structure des topics utilisée par la passerelle GTS-to-WIS2 - - la différence entre les messages du Global Broker publiés sur les topics `origin` et `cache` \ No newline at end of file + - la différence entre les données principales et recommandées + - la structure des sujets utilisée par la passerelle GTS-vers-WIS2 + - la différence entre les messages du Global Broker publiés sur les sujets `origin` et `cache` \ No newline at end of file diff --git a/documentation/docs/fr/practical-sessions/initializing-wis2box.md b/documentation/docs/fr/practical-sessions/initializing-wis2box.md index 8173e57b7..499388d65 100644 --- a/documentation/docs/fr/practical-sessions/initializing-wis2box.md +++ b/documentation/docs/fr/practical-sessions/initializing-wis2box.md @@ -1,8 +1,8 @@ --- -title: Initialisation de wis2box +title: Initialiser wis2box --- -# Initialisation de wis2box +# Initialiser wis2box !!! abstract "Objectifs d'apprentissage" @@ -12,23 +12,23 @@ title: Initialisation de wis2box - démarrer wis2box et vérifier l'état de ses composants - consulter le contenu de **wis2box-api** - accéder à **wis2box-webapp** - - se connecter au **wis2box-broker** local à l'aide de MQTT Explorer + - se connecter au **wis2box-broker** local en utilisant MQTT Explorer !!! note - Les supports de formation actuels sont basés sur wis2box-release 1.2.0. + Les supports de formation actuels sont basés sur wis2box-release 1.3.0. - Consultez [accessing-your-student-vm](./accessing-your-student-vm.md) pour des instructions sur la façon de télécharger et d'installer la pile logicielle wis2box si vous suivez cette formation en dehors d'une session de formation locale. + Consultez [accessing-your-student-vm](./accessing-your-student-vm.md) pour obtenir des instructions sur la manière de télécharger et d'installer la pile logicielle wis2box si vous suivez cette formation en dehors d'une session de formation locale. ## Préparation -Connectez-vous à votre VM désignée avec votre nom d'utilisateur et mot de passe, et assurez-vous d'être dans le répertoire `wis2box` : +Connectez-vous à votre VM désignée avec votre nom d'utilisateur et mot de passe et assurez-vous d'être dans le répertoire `wis2box` : ```bash cd ~/wis2box ``` -## Création de la configuration initiale +## Créer la configuration initiale La configuration initiale de wis2box nécessite : @@ -53,7 +53,7 @@ Le script vous demandera d'entrer le répertoire à utiliser pour la variable d' Notez que vous devez définir le chemin complet vers ce répertoire. -Par exemple, si votre nom d'utilisateur est `username`, le chemin complet du répertoire est `/home/username/wis2box-data` : +Par exemple, si votre nom d'utilisateur est `username`, le chemin complet vers le répertoire est `/home/username/wis2box-data` : ```{.copy} username@student-vm-username:~/wis2box$ python3 wis2box-create-config.py @@ -68,7 +68,7 @@ The directory /home/username/wis2box-data has been created. ### URL de wis2box -Ensuite, il vous sera demandé d'entrer l'URL de votre wis2box. C'est l'URL qui sera utilisée pour accéder à l'application web, à l'API et à l'interface utilisateur de wis2box. +Ensuite, il vous sera demandé d'entrer l'URL de votre wis2box. Cette URL sera utilisée pour accéder à l'application web, à l'API et à l'interface utilisateur de wis2box. Veuillez utiliser `http://` comme URL. @@ -84,11 +84,11 @@ Is this correct? (y/n/exit) ### Mots de passe WEBAPP, STORAGE et BROKER -Vous pouvez utiliser l'option de génération aléatoire de mots de passe lorsqu'il vous est demandé de définir `WIS2BOX_WEBAPP_PASSWORD`, `WIS2BOX_STORAGE_PASSWORD`, `WIS2BOX_BROKER_PASSWORD` ou définir vos propres mots de passe. +Vous pouvez utiliser l'option de génération aléatoire de mots de passe lorsque vous êtes invité à définir `WIS2BOX_WEBAPP_PASSWORD`, `WIS2BOX_STORAGE_PASSWORD`, `WIS2BOX_BROKER_PASSWORD`, ou définir vos propres mots de passe. Ne vous inquiétez pas de mémoriser ces mots de passe, ils seront stockés dans le fichier `wis2box.env` dans votre répertoire wis2box. -### Vérification du fichier `wis2box.env` +### Vérifier `wis2box.env` Une fois le script terminé, vérifiez le contenu du fichier `wis2box.env` dans votre répertoire actuel : @@ -104,7 +104,7 @@ Ou vérifiez le contenu du fichier via WinSCP. ??? success "Cliquez pour révéler la réponse" - La valeur par défaut pour WIS2BOX_BASEMAP_URL est `https://{s}.tile.openstreetmap.org/{z}/{x}/{y}.png`. + La valeur par défaut de WIS2BOX_BASEMAP_URL est `https://{s}.tile.openstreetmap.org/{z}/{x}/{y}.png`. Cette URL fait référence au serveur de tuiles OpenStreetMap. Si vous souhaitez utiliser un autre fournisseur de cartes, vous pouvez modifier cette URL pour pointer vers un autre serveur de tuiles. @@ -114,9 +114,9 @@ Ou vérifiez le contenu du fichier via WinSCP. ??? success "Cliquez pour révéler la réponse" - La valeur par défaut pour WIS2BOX_STORAGE_DATA_RETENTION_DAYS est de 30 jours. Vous pouvez modifier cette valeur pour un autre nombre de jours si vous le souhaitez. + La valeur par défaut de WIS2BOX_STORAGE_DATA_RETENTION_DAYS est de 30 jours. Vous pouvez modifier cette valeur pour un autre nombre de jours si vous le souhaitez. - Le conteneur wis2box-management exécute une tâche cron quotidiennement pour supprimer les données plus anciennes que le nombre de jours défini par WIS2BOX_STORAGE_DATA_RETENTION_DAYS du bucket `wis2box-public` et du backend API : + Le conteneur wis2box-management exécute un cronjob quotidien pour supprimer les données plus anciennes que le nombre de jours défini par WIS2BOX_STORAGE_DATA_RETENTION_DAYS du bucket `wis2box-public` et du backend API : ```{.copy} 0 0 * * * su wis2box -c "wis2box data clean --days=$WIS2BOX_STORAGE_DATA_RETENTION_DAYS" @@ -126,9 +126,9 @@ Ou vérifiez le contenu du fichier via WinSCP. Le fichier `wis2box.env` contient des variables d'environnement définissant la configuration de votre wis2box. Pour plus d'informations, consultez la [documentation wis2box](https://docs.wis2box.wis.wmo.int/en/latest/reference/configuration.html). - Ne modifiez pas le fichier `wis2box.env` sauf si vous êtes sûr des modifications que vous apportez. Des modifications incorrectes peuvent empêcher votre wis2box de fonctionner. + Ne modifiez pas le fichier `wis2box.env` sauf si vous êtes sûr des changements que vous effectuez. Des modifications incorrectes peuvent empêcher votre wis2box de fonctionner. - Ne partagez pas le contenu de votre fichier `wis2box.env` avec qui que ce soit, car il contient des informations sensibles comme des mots de passe. + Ne partagez pas le contenu de votre fichier `wis2box.env` avec quiconque, car il contient des informations sensibles telles que des mots de passe. ## Démarrer wis2box @@ -144,17 +144,17 @@ Démarrez wis2box avec la commande suivante : python3 wis2box-ctl.py start ``` -Lors de la première exécution de cette commande, vous verrez la sortie suivante : +Lors de l'exécution de cette commande pour la première fois, vous verrez la sortie suivante : ``` No docker-compose.images-*.yml files found, creating one -Current version=Undefined, latest version=1.2.0 +Current version=Undefined, latest version=1.3.0 Would you like to update ? (y/n/exit) ``` -Sélectionnez ``y`` et le script créera le fichier ``docker-compose.images-1.2.0.yml``, téléchargera les images Docker nécessaires et démarrera les services. +Sélectionnez ``y`` et le script créera le fichier ``docker-compose.images-1.3.0.yml``, téléchargera les images Docker nécessaires et démarrera les services. -Le téléchargement des images peut prendre du temps en fonction de la vitesse de votre connexion Internet. Cette étape n'est requise que lors du premier démarrage de wis2box. +Le téléchargement des images peut prendre du temps en fonction de la vitesse de votre connexion Internet. Cette étape est uniquement requise lors du premier démarrage de wis2box. Inspectez l'état avec la commande suivante : @@ -171,7 +171,7 @@ Répétez cette commande jusqu'à ce que tous les services soient opérationnels Le script Python `wis2box-ctl.py` est utilisé pour exécuter les commandes Docker Compose sous-jacentes qui contrôlent les services wis2box. - Vous n'avez pas besoin de connaître les détails des conteneurs Docker pour exécuter la pile logicielle wis2box, mais vous pouvez inspecter les fichiers `docker-compose*.yml` pour voir comment les services sont définis. Si vous souhaitez en savoir plus sur Docker, vous pouvez trouver plus d'informations dans la [documentation Docker](https://docs.docker.com/). + Vous n'avez pas besoin de connaître les détails des conteneurs Docker pour exécuter la pile logicielle wis2box, mais vous pouvez inspecter les fichiers `docker-compose*.yml` pour voir comment les services sont définis. Si vous souhaitez en savoir plus sur Docker, vous pouvez consulter la [documentation Docker](https://docs.docker.com/). Pour vous connecter au conteneur wis2box-management, utilisez la commande suivante : @@ -179,7 +179,7 @@ Pour vous connecter au conteneur wis2box-management, utilisez la commande suivan python3 wis2box-ctl.py login ``` -Notez qu'après vous être connecté, votre invite changera, indiquant que vous êtes maintenant à l'intérieur du conteneur wis2box-management : +Notez qu'après vous être connecté, votre invite de commande changera, indiquant que vous êtes maintenant à l'intérieur du conteneur wis2box-management : ```{bash} root@025381da3c40:/home/wis2box# @@ -187,7 +187,7 @@ root@025381da3c40:/home/wis2box# À l'intérieur du conteneur wis2box-management, vous pouvez exécuter diverses commandes pour gérer votre wis2box, telles que : -- `wis2box auth add-token --path processes/wis2box` : pour créer un jeton d'autorisation pour l'endpoint *processes/wis2box* +- `wis2box auth add-token --path processes/wis2box` : pour créer un jeton d'autorisation pour le point de terminaison *processes/wis2box* - `wis2box data clean --days=` : pour nettoyer les données plus anciennes qu'un certain nombre de jours du bucket *wis2box-public* Pour quitter le conteneur et revenir à votre machine hôte, utilisez la commande suivante : @@ -205,28 +205,26 @@ docker ps --format "table {{.Names}} \t{{.Status}} \t{{.Image}}" Vous devriez voir les conteneurs suivants en cours d'exécution : ```{bash} -NAMES STATUS IMAGE -elasticsearch docker.elastic.co/elasticsearch/elasticsearch:8.6.2 "/bin/tini -- /usr/l…" elasticsearch Il y a environ une minute Actif depuis environ une minute (healthy) 9200/tcp, 9300/tcp -elasticsearch-exporter quay.io/prometheuscommunity/elasticsearch-exporter:latest "/bin/elasticsearch_…" elasticsearch-exporter Il y a environ une minute Actif depuis environ une minute 7979/tcp -grafana grafana/grafana-oss:9.0.3 "/run.sh" grafana Il y a environ une minute Actif depuis environ une minute 0.0.0.0:3000->3000/tcp -loki grafana/loki:2.4.1 "/usr/bin/loki -conf…" loki Il y a environ une minute Actif depuis environ une minute 3100/tcp -mosquitto ghcr.io/world-meteorological-organization/wis2box-broker:1.2.0 "/docker-entrypoint.…" mosquitto Il y a environ une minute Actif depuis environ une minute 0.0.0.0:1883->1883/tcp, 0.0.0.0:8884->8884/tcp -mqtt_metrics_collector ghcr.io/world-meteorological-organization/wis2box-mqtt-metrics-collector:1.2.0 "python3 -u mqtt_met…" mqtt_metrics_collector Il y a environ une minute Actif depuis 10 secondes 8000/tcp, 0.0.0.0:8001->8001/tcp -nginx nginx:alpine "/docker-entrypoint.…" web-proxy Il y a environ une minute Actif depuis 9 secondes 0.0.0.0:80->80/tcp -prometheus prom/prometheus:v2.37.0 "/bin/prometheus --c…" prometheus Il y a environ une minute Actif depuis environ une minute 9090/tcp -wis2box-api ghcr.io/world-meteorological-organization/wis2box-api:1.2.0 "/app/docker/es-entr…" wis2box-api Il y a environ une minute Actif depuis 36 secondes (healthy) -wis2box-auth ghcr.io/world-meteorological-organization/wis2box-auth:1.2.0 "/entrypoint.sh" wis2box-auth Il y a environ une minute Actif depuis 10 secondes -wis2box-management ghcr.io/world-meteorological-organization/wis2box-management:1.2.0 "/home/wis2box/entry…" wis2box-management Il y a environ une minute Actif depuis 12 secondes -wis2box-minio minio/minio:RELEASE.2024-08-03T04-33-23Z-cpuv1 "/usr/bin/docker-ent…" minio Il y a environ une minute Actif depuis environ une minute (healthy) 0.0.0.0:8022->8022/tcp, 0.0.0.0:9000-9001->9000-9001/tcp -wis2box-ui ghcr.io/world-meteorological-organization/wis2box-ui:1.2.0 "/docker-entrypoint.…" wis2box-ui Il y a environ une minute Actif depuis 35 secondes 0.0.0.0:9999->80/tcp -wis2box-webapp ghcr.io/world-meteorological-organization/wis2box-webapp:1.2.0 "sh /wis2box-webapp/…" wis2box-webapp Il y a environ une minute Actif depuis environ une minute (unhealthy) 4173/tcp -wis2downloader ghcr.io/wmo-im/wis2downloader:v0.3.2 "/home/wis2downloade…" wis2downloader Il y a environ une minute Actif depuis environ une minute (healthy) - +NAMES STATUS IMAGE +nginx Up 56 seconds nginx:1.30.1-alpine +mqtt_metrics_collector Up 58 seconds ghcr.io/world-meteorological-organization/wis2box-mqtt-metrics-collector:1.3.0 +wis2box-auth Up 59 seconds ghcr.io/world-meteorological-organization/wis2box-auth:1.3.0 +wis2box-ui Up About a minute ghcr.io/world-meteorological-organization/wis2box-ui:1.3.0 +wis2box-management Up About a minute ghcr.io/world-meteorological-organization/wis2box-management:1.3.0 +wis2box-minio Up 2 minutes (healthy) ghcr.io/world-meteorological-organization/wis2box-minio:latest +wis2box-api Up About a minute (healthy) ghcr.io/world-meteorological-organization/wis2box-api:1.3.0 +elasticsearch Up 2 minutes (healthy) docker.elastic.co/elasticsearch/elasticsearch:8.6.2 +grafana Up 2 minutes grafana/grafana-oss:12.4.2 +loki Up 2 minutes grafana/loki:2.4.1 +elasticsearch-exporter Up 2 minutes quay.io/prometheuscommunity/elasticsearch-exporter:latest +prometheus Up 2 minutes prom/prometheus:v2.37.0 +mosquitto Up 2 minutes ghcr.io/world-meteorological-organization/wis2box-broker:1.3.0 +wis2box-webapp Up 2 minutes (healthy) ghcr.io/world-meteorological-organization/wis2box-webapp:1.3.0 ``` -Ces conteneurs font partie de la pile logicielle wis2box et fournissent les différents services nécessaires pour exécuter le wis2box. +Ces conteneurs font partie de la pile logicielle wis2box et fournissent les différents services nécessaires au fonctionnement de wis2box. -Exécutez la commande suivante pour voir les volumes Docker actifs sur votre machine hôte : +Exécutez la commande suivante pour voir les volumes Docker en cours d'exécution sur votre machine hôte : ```{.copy} docker volume ls @@ -280,7 +278,7 @@ Ceci est la page d'accueil de l'API wis2box (exécutée via le conteneur **wis2b Cliquez sur "Data notifications", puis cliquez sur `Browse through the items of "Data Notifications"`. - Vous noterez que la page indique "No items" car aucune notification de données n'a encore été publiée. + Vous remarquerez que la page indique "No items" car aucune notification de données n'a encore été publiée. ## wis2box webapp @@ -296,22 +294,22 @@ Vous verrez une fenêtre contextuelle demandant votre nom d'utilisateur et votre cat ~/wis2box/wis2box.env | grep WIS2BOX_WEBAPP_PASSWORD ``` -Une fois connecté, déplacez votre souris sur le menu à gauche pour voir les options disponibles dans l'application web wis2box : +Une fois connecté, déplacez votre souris vers le menu à gauche pour voir les options disponibles dans l'application web wis2box : wis2box-webapp-menu.png Ceci est l'application web wis2box qui vous permet d'interagir avec votre wis2box : - créer et gérer des ensembles de données -- mettre à jour/vérifier les métadonnées de vos stations -- télécharger des observations manuelles en utilisant le formulaire synop FM-12 +- mettre à jour/revoir les métadonnées de vos stations +- télécharger des observations manuelles en utilisant le formulaire FM-12 synop - surveiller les notifications publiées sur votre wis2box-broker Nous utiliserons cette application web dans une session ultérieure. ## wis2box-broker -Ouvrez le MQTT Explorer sur votre ordinateur et préparez une nouvelle connexion pour vous connecter à votre broker (exécuté via le conteneur **wis2box-broker**). +Ouvrez MQTT Explorer sur votre ordinateur et préparez une nouvelle connexion pour vous connecter à votre broker (exécuté via le conteneur **wis2box-broker**). Cliquez sur `+` pour ajouter une nouvelle connexion : @@ -346,27 +344,28 @@ Utilisez les détails de connexion suivants, en veillant à remplacer la valeur cat ~/wis2box/wis2box.env | grep WIS2BOX_BROKER_PASSWORD ``` - Notez que ceci est votre mot de passe **interne** pour le broker. Le Global Broker utilisera des identifiants différents (en lecture seule) pour s'abonner à votre broker. Ne partagez jamais ce mot de passe avec qui que ce soit. + Notez que ceci est votre mot de passe **interne** pour le broker. Le Global Broker utilisera des identifiants différents (en lecture seule) pour s'abonner à votre broker. Ne partagez jamais ce mot de passe avec quiconque. Assurez-vous de cliquer sur "SAVE" pour enregistrer vos détails de connexion. -Ensuite, cliquez sur "CONNECT" pour vous connecter à votre **wis2box-broker**. +Puis cliquez sur "CONNECT" pour vous connecter à votre **wis2box-broker**. -mqtt-explorer-wis2box-broker.png -``` +mqtt-explorer-wis2box-broker-port1883.png -Une fois connecté, vérifiez que les statistiques internes de mosquitto sont publiées par votre broker sous le sujet `$SYS` : +Une fois connecté, vous verrez les statistiques internes de mosquitto publiées par votre broker sous le sujet `$SYS` : mqtt-explorer-sys-topic.png -Gardez MQTT Explorer ouvert, car nous l'utiliserons pour surveiller les messages publiés sur le broker. +La même connexion peut également être établie en utilisant MQTT via WebSockets sur le port 80, avec les détails de connexion suivants : + +mqtt-explorer-wis2box-broker-websockets.png ## Conclusion !!! success "Félicitations !" - Au cours de cette session pratique, vous avez appris à : + Lors de cette session pratique, vous avez appris à : - exécuter le script `wis2box-create-config.py` pour créer la configuration initiale - - démarrer wis2box et vérifier l'état de ses composants + - démarrer wis2box et vérifier le statut de ses composants - accéder à wis2box-webapp et wis2box-API dans un navigateur - - vous connecter au broker MQTT sur votre VM étudiante en utilisant MQTT Explorer \ No newline at end of file + - vous connecter au broker MQTT sur votre VM étudiant en utilisant MQTT Explorer \ No newline at end of file diff --git a/documentation/docs/ru/practical-sessions/accessing-your-student-vm.md b/documentation/docs/ru/practical-sessions/accessing-your-student-vm.md index cab2abac9..7298d514a 100644 --- a/documentation/docs/ru/practical-sessions/accessing-your-student-vm.md +++ b/documentation/docs/ru/practical-sessions/accessing-your-student-vm.md @@ -6,17 +6,17 @@ title: Доступ к вашей учебной виртуальной маши !!! abstract "Результаты обучения" - К концу этой практической сессии вы сможете: + К концу этого практического занятия вы сможете: - - получить доступ к вашей учебной виртуальной машине через SSH и WinSCP - - проверить, что необходимое программное обеспечение для выполнения практических упражнений установлено - - убедиться, что у вас есть доступ к материалам для упражнений на вашей локальной учебной виртуальной машине + - подключаться к вашей учебной виртуальной машине через SSH и WinSCP + - проверять, что необходимое программное обеспечение для выполнения практических упражнений установлено + - проверять, что у вас есть доступ к материалам упражнений для этого обучения на вашей локальной учебной виртуальной машине ## Введение -В рамках локальных семинаров по обучению WIS2 вы можете получить доступ к вашей персональной учебной виртуальной машине в локальной учебной сети под названием "WIS2-training". +В рамках локальных семинаров WIS2 Training вы можете получить доступ к вашей персональной учебной виртуальной машине в локальной учебной сети под названием "WIS2-training". -На вашей учебной виртуальной машине предустановлено следующее программное обеспечение: +На вашей учебной виртуальной машине предварительно установлено следующее программное обеспечение: - Ubuntu 22.04 LTS [ubuntu-22.04.5-live-server-amd64.iso](https://releases.ubuntu.com/jammy/ubuntu-22.04.5-live-server-amd64.iso) - Python 3.10.12 @@ -26,7 +26,7 @@ title: Доступ к вашей учебной виртуальной маши !!! note - Если вы хотите пройти это обучение вне локальной сессии, вы можете создать собственный экземпляр, используя любого облачного провайдера, например: + Если вы хотите пройти это обучение вне локального учебного занятия, вы можете предоставить свою собственную виртуальную машину, используя любого облачного провайдера, например: - GCP (Google Cloud Platform) VM instance `e2-medium` - AWS (Amazon Web Services) ec2-instance `t3a.medium` @@ -36,16 +36,16 @@ title: Доступ к вашей учебной виртуальной маши После создания виртуальной машины убедитесь, что вы установили python, docker и docker compose, как описано в [wis2box-software-dependencies](https://docs.wis2box.wis.wmo.int/en/latest/user/getting-started.html#software-dependencies). - Архив релиза wis2box, используемый в этом обучении, можно скачать следующим образом: + Архив релиза wis2box, используемый в этом обучении, можно загрузить следующим образом: ```bash - wget https://github.com/World-Meteorological-Organization/wis2box-release/releases/download/1.2.0/wis2box-setup-1.2.0.zip - unzip wis2box-setup-1.2.0.zip + wget https://github.com/World-Meteorological-Organization/wis2box-release/releases/download/1.3.0/wis2box-setup-1.3.0.zip + unzip wis2box-setup-1.3.0.zip ``` Вы всегда можете найти последний архив 'wis2box-setup' по адресу [https://github.com/World-Meteorological-Organization/wis2box/releases](https://github.com/World-Meteorological-Organization/wis2box-release/releases). - Материалы для упражнений, используемые в этом обучении, можно скачать следующим образом: + Материалы упражнений, используемые в этом обучении, можно загрузить следующим образом: ```bash wget https://training.wis2box.wis.wmo.int/exercise-materials.zip @@ -56,14 +56,14 @@ title: Доступ к вашей учебной виртуальной маши ```bash pip3 install minio - pip3 install pywiscat==0.4.0 + pip3 install pywiscat ``` - Если вы используете учебную виртуальную машину, предоставленную во время локальных сессий обучения WIS2, необходимое программное обеспечение уже будет установлено. + Если вы используете учебную виртуальную машину, предоставленную во время локальных занятий WIS2, необходимое программное обеспечение уже будет установлено. ## Подключение к вашей учебной виртуальной машине в локальной учебной сети -Подключите ваш ПК к локальной Wi-Fi сети, транслируемой в помещении во время обучения WIS2, согласно инструкциям, предоставленным тренером. +Подключите ваш компьютер к локальной Wi-Fi сети, транслируемой в помещении во время обучения WIS2, согласно инструкциям, предоставленным тренером. Используйте SSH-клиент для подключения к вашей учебной виртуальной машине, используя следующие данные: @@ -88,7 +88,7 @@ passwd: password updated successfully ## Проверка версий программного обеспечения -Для работы с wis2box на учебной виртуальной машине должны быть предустановлены Python, Docker и Docker Compose. +Для работы с wis2box на учебной виртуальной машине должны быть предварительно установлены Python, Docker и Docker Compose. Проверьте версию Python: ```bash @@ -117,14 +117,14 @@ docker compose version Docker Compose version v2.21.0 ``` -Чтобы ваш пользователь мог выполнять команды Docker, он был добавлен в группу `docker`. +Чтобы убедиться, что ваш пользователь может выполнять команды Docker, он был добавлен в группу `docker`. -Для проверки, что ваш пользователь может запускать Docker, выполните следующую команду: +Для проверки выполните команду docker hello-world: ```bash docker run hello-world ``` -Эта команда загрузит образ hello-world и запустит контейнер, который выведет сообщение. +Эта команда должна загрузить образ hello-world и запустить контейнер, который выведет сообщение. Убедитесь, что в выводе отображается следующее: @@ -135,9 +135,9 @@ This message shows that your installation appears to be working correctly. ... ``` -## Ознакомление с материалами для упражнений +## Проверка материалов упражнений -Ознакомьтесь с содержимым вашего домашнего каталога; это материалы, используемые в рамках обучения и практических занятий. +Проверьте содержимое вашего домашнего каталога; это материалы, используемые в рамках обучения и практических занятий. ```bash ls ~/ @@ -147,9 +147,9 @@ ls ~/ exercise-materials wis2box ``` -Если на вашем локальном ПК установлен WinSCP, вы можете использовать его для подключения к вашей учебной виртуальной машине, чтобы просмотреть содержимое вашего домашнего каталога, а также загружать или выгружать файлы между вашей виртуальной машиной и локальным ПК. +Если на вашем локальном компьютере установлен WinSCP, вы можете использовать его для подключения к вашей учебной виртуальной машине, чтобы проверить содержимое домашнего каталога, а также загружать или выгружать файлы между вашей виртуальной машиной и локальным компьютером. -WinSCP не обязателен для обучения, но может быть полезен, если вы хотите редактировать файлы на вашей виртуальной машине с помощью текстового редактора на вашем локальном ПК. +WinSCP не требуется для обучения, но может быть полезен, если вы хотите редактировать файлы на виртуальной машине, используя текстовый редактор на вашем локальном компьютере. Вот как можно подключиться к вашей учебной виртуальной машине с помощью WinSCP: @@ -159,13 +159,13 @@ WinSCP не обязателен для обучения, но может быт Нажмите 'Save', а затем 'Login', чтобы подключиться к вашей виртуальной машине. -Теперь вы должны увидеть содержимое домашнего каталога на вашей учебной виртуальной машине и получить доступ к вашим файлам. +Теперь вы должны увидеть содержимое домашнего каталога вашей учебной виртуальной машины и получить доступ к вашим файлам. ## Заключение !!! success "Поздравляем!" - В ходе этой практической сессии вы научились: + В рамках этого практического занятия вы научились: - - получать доступ к вашей учебной виртуальной машине через SSH и WinSCP + - подключаться к вашей учебной виртуальной машине через SSH и WinSCP - проверять, что необходимое программное обеспечение для выполнения практических упражнений установлено - - проверять, что у вас есть доступ к материалам для упражнений на вашей локальной учебной виртуальной машине \ No newline at end of file + - проверять, что у вас есть доступ к материалам упражнений для этого обучения на вашей локальной учебной виртуальной машине \ No newline at end of file diff --git a/documentation/docs/ru/practical-sessions/adding-gts-headers-to-wis2-notifications.md b/documentation/docs/ru/practical-sessions/adding-gts-headers-to-wis2-notifications.md index 07536d6b2..6d67354cc 100644 --- a/documentation/docs/ru/practical-sessions/adding-gts-headers-to-wis2-notifications.md +++ b/documentation/docs/ru/practical-sessions/adding-gts-headers-to-wis2-notifications.md @@ -4,21 +4,22 @@ title: Добавление заголовков GTS в уведомления W # Добавление заголовков GTS в уведомления WIS2 -!!! abstract "Учебные результаты" +!!! abstract "Результаты обучения" - К концу этой практической сессии вы сможете: + По завершении практического занятия вы сможете: - - настроить соответствие между именем файла и заголовками GTS - - загрузить данные с именем файла, соответствующим заголовкам GTS - - просмотреть заголовки GTS в уведомлениях WIS2 + - настроить сопоставление между именем файла и заголовками GTS + - загружать данные с именем файла, соответствующим заголовкам GTS + - просматривать заголовки GTS в уведомлениях WIS2 + - использовать форму FM-12 SYNOP для ручного добавления заголовков GTS в уведомление WIS2 ## Введение -Члены ВМО, желающие прекратить передачу данных по GTS в переходный период к WIS2, должны добавить заголовки GTS в свои уведомления WIS2. Эти заголовки позволяют шлюзу WIS2 к GTS пересылать данные в сеть GTS. +Члены ВМО, желающие прекратить передачу данных через GTS в переходный период к WIS2, должны добавить заголовки GTS в свои уведомления WIS2. Эти заголовки позволяют шлюзу WIS2-GTS перенаправлять данные в сеть GTS. -Это позволяет членам, перешедшим на использование узла WIS2 для публикации данных, отключить свою систему MSS и гарантировать, что их данные все еще доступны членам, которые еще не перешли на WIS2. +Это позволяет членам, которые перешли на использование узла WIS2 для публикации данных, отключить свою систему MSS и гарантировать, что их данные остаются доступными для членов, которые еще не перешли на WIS2. -Свойство GTS в сообщении уведомления WIS2 должно быть добавлено как дополнительное свойство к сообщению уведомления WIS2. Свойство GTS представляет собой объект JSON, который содержит необходимые заголовки GTS для пересылки данных в сеть GTS. +Свойство GTS в уведомлении WIS2 должно быть добавлено как дополнительное свойство в сообщение уведомления WIS2. Свойство GTS представляет собой объект JSON, содержащий заголовки GTS, необходимые для передачи данных в сеть GTS. ```json { @@ -29,45 +30,55 @@ title: Добавление заголовков GTS в уведомления W } ``` -В рамках wis2box вы можете автоматически добавить это в уведомления WIS2, предоставив дополнительный файл с именем `gts_headers_mapping.csv`, который содержит необходимую информацию для сопоставления заголовков GTS с входящими именами файлов. +В рамках wis2box это можно добавить в уведомления WIS2 автоматически, предоставив дополнительный файл с именем `gts_headers_mapping.csv`, содержащий необходимую информацию для сопоставления заголовков GTS с входящими именами файлов. -Этот файл должен быть размещен в каталоге, определенном `WIS2BOX_HOST_DATADIR` в вашем `wis2box.env`, и должен иметь следующие столбцы: +Этот файл должен быть размещен в каталоге, определенном переменной `WIS2BOX_HOST_DATADIR` в вашем файле `wis2box.env`, и должен содержать следующие столбцы: -- `string_in_filepath`: строка, которая является частью имени файла, которая будет использоваться для сопоставления с заголовками GTS -- `TTAAii`: заголовок TTAAii, который должен быть добавлен в уведомление WIS2 -- `CCCC`: заголовок CCCC, который должен быть добавлен в уведомление WIS2 +- `string_in_filepath`: строка, являющаяся частью имени файла, которая будет использоваться для сопоставления заголовков GTS +- `TTAAii`: заголовок TTAAii, который будет добавлен в уведомление WIS2 +- `CCCC`: заголовок CCCC, который будет добавлен в уведомление WIS2 + +Начиная с версии wis2box-1.3.0, у издателей данных есть два варианта (необязательного) добавления свойств GTS в свои уведомления: + +1. Для файлов, загружаемых в MinIO, подготовьте файл сопоставления `gts_headers_mappings.csv` с необходимыми свойствами. + +2. Для ввода данных с использованием формы FM-12 SYNOP в wis2box-webapp выберите опцию «Add GTS headers» и введите данные вручную. ## Подготовка -Убедитесь, что у вас есть доступ по SSH к вашей учебной виртуальной машине и что ваш экземпляр wis2box работает. +Убедитесь, что у вас есть доступ по SSH к вашей виртуальной машине студента и что ваш экземпляр wis2box запущен. -Убедитесь, что вы подключены к брокеру MQTT вашего экземпляра wis2box с использованием MQTT Explorer. Вы можете использовать общедоступные учетные данные `everyone/everyone` для подключения к брокеру. +Убедитесь, что вы подключены к брокеру MQTT вашего экземпляра wis2box с помощью MQTT Explorer. Вы можете использовать публичные учетные данные `everyone/everyone` для подключения к брокеру. -Убедитесь, что у вас открыт веб-браузер с дашбордом Grafana для вашего экземпляра, перейдя по адресу `http://YOUR-HOST:3000` +Убедитесь, что у вас открыт веб-браузер с панелью мониторинга Grafana для вашего экземпляра, перейдя по адресу `http://YOUR-HOST:3000`. -## создание `gts_headers_mapping.csv` +## Упражнение 1: Использование файла сопоставления для данных, загружаемых в MinIO + +Первое упражнение продемонстрирует, как добавить заголовки GTS для данных, загружаемых в MinIO, используя файл сопоставления с именем `gts_headers_mapping.csv`. + +### создание файла `gts_headers_mapping.csv` Для добавления заголовков GTS в уведомления WIS2 требуется CSV-файл, который сопоставляет заголовки GTS с входящими именами файлов. -CSV-файл должен быть назван (точно) `gts_headers_mapping.csv` и должен быть размещен в каталоге, определенном `WIS2BOX_HOST_DATADIR` в вашем `wis2box.env`. +CSV-файл должен быть назван (точно) `gts_headers_mapping.csv` и размещен в каталоге, определенном переменной `WIS2BOX_HOST_DATADIR` в вашем файле `wis2box.env`. -## Предоставление файла `gts_headers_mapping.csv` - -Скопируйте файл `exercise-materials/gts-headers-exercises/gts_headers_mapping.csv` в ваш экземпляр wis2box и разместите его в каталоге, определенном `WIS2BOX_HOST_DATADIR` в вашем `wis2box.env`. +Скопируйте файл `exercise-materials/gts-headers-exercises/gts_headers_mapping.csv` в ваш экземпляр wis2box и разместите его в каталоге, определенном переменной `WIS2BOX_HOST_DATADIR` в вашем файле `wis2box.env`. ```bash cp ~/exercise-materials/gts-headers-exercises/gts_headers_mapping.csv ~/wis2box-data ``` -Затем перезапустите контейнер wis2box-management, чтобы применить изменения: +### Применение сопоставлений + +После создания файла `gts_headers_mapping.csv` необходимо перезапустить контейнер wis2box-management, чтобы применить изменения. Вы можете сделать это, выполнив следующую команду на вашей виртуальной машине студента: ```bash docker restart wis2box-management ``` -## Загрузка данных с заголовками GTS +### Загрузка данных с заголовками GTS -Скопируйте файл `exercise-materials/gts-headers-exercises/A_SMRO01YRBK171200_C_EDZW_20240717120502.txt` в каталог, определенный `WIS2BOX_HOST_DATADIR` в вашем `wis2box.env`: +Скопируйте файл `exercise-materials/gts-headers-exercises/A_SMRO01YRBK171200_C_EDZW_20240717120502.txt` в каталог, определенный переменной `WIS2BOX_HOST_DATADIR` в вашем файле `wis2box.env`: ```bash cp ~/exercise-materials/gts-headers-exercises/A_SMRO01YRBK171200_C_EDZW_20240717120502.txt ~/wis2box-data @@ -86,19 +97,57 @@ python3 wis2box-ctl.py login wis2box data ingest -p /data/wis2box/A_SMRO01YRBK171200_C_EDZW_20240717120502.txt --metadata-id urn:wmo:md:not-my-centre:core.surface-based-observations.synop ``` -Убедитесь, что вы заменили параметр `metadata-id` на правильный идентификатор для вашего набора данных. +Обязательно замените параметр `metadata-id` на правильный идентификатор для вашего набора данных. -Проверьте дашборд Grafana, чтобы увидеть, были ли данные загружены правильно. Если вы видите какие-либо ПРЕДУПРЕЖДЕНИЯ или ОШИБКИ, попробуйте их исправить и повторите команду `wis2box data ingest`. +Проверьте панель мониторинга Grafana, чтобы убедиться, что данные были загружены корректно. Если вы видите предупреждения или ошибки, попробуйте их исправить и повторите команду `wis2box data ingest`. -## Просмотр заголовков GTS в уведомлении WIS2 +### Просмотр заголовков GTS в уведомлении WIS2 Перейдите в MQTT Explorer и проверьте сообщение уведомления WIS2 для данных, которые вы только что загрузили. Сообщение уведомления WIS2 должно содержать заголовки GTS, которые вы указали в файле `gts_headers_mapping.csv`. +## Упражнение 2: Использование формы FM-12 SYNOP + +При использовании формы FM-12 SYNOP в wis2box-webapp вы можете вручную добавить заголовки GTS в свои уведомления WIS2, выбрав опцию «Add GTS headers» и указав необходимую информацию. + +Для этого упражнения вы можете использовать приведенные ниже примерные данные или предоставить свои собственные: + +Сообщение FM-12 SYNOP: + +```{copy} +AAXX 03094 +64400 42460 71004 10285 20245 30113 40133 8493/ + 333 59005 83813 81930 87363 94966 95836= +``` + +Заголовки GTS: TTAAii=`ISIH01` и CCCC=`FCBB` + +!!! note + Плагин synop2bufr в wis2box преобразует сообщения FM-12 SYNOP в BUFR, поэтому TTAAii должен начинаться с `IS`: + + - I = Наблюдательные данные (в двоичном коде) – BUFR + - S = Поверхностные/уровень моря + +### Ручная отправка формы FM-12 SYNOP с заголовками GTS + +Перейдите к форме FM-12 SYNOP в wis2box-webapp и заполните форму, используя приведенные выше примерные данные или свои собственные. + +Обязательно выберите опцию «Add GTS headers» и укажите необходимую информацию о заголовках GTS: + +fm-12-synop-form-gts-headers.png + +Укажите необходимый токен аутентификации и отправьте форму. + +Вероятно, вы увидите сообщение об ошибке, так как эта станция отсутствует в вашем списке станций. Вам нужно будет добавить станцию "0-20000-0-64400" в ваш список станций, чтобы данные были успешно преобразованы и опубликованы. + +### Просмотр заголовков GTS в уведомлении WIS2 + +Перейдите в MQTT Explorer и проверьте сообщение уведомления WIS2 для данных, которые вы только что загрузили, чтобы убедиться, что заголовки GTS включены в уведомление. + ## Заключение !!! success "Поздравляем!" - В ходе этой практической сессии вы научились: - - добавлять заголовки GTS в уведомления WIS2 + В ходе этого практического занятия вы научились: + - добавлять заголовки GTS в свои уведомления WIS2 - проверять, что заголовки GTS доступны через вашу установку wis2box \ No newline at end of file diff --git a/documentation/docs/ru/practical-sessions/connecting-to-wis2-over-mqtt.md b/documentation/docs/ru/practical-sessions/connecting-to-wis2-over-mqtt.md index 05cb7416d..18b4e6531 100644 --- a/documentation/docs/ru/practical-sessions/connecting-to-wis2-over-mqtt.md +++ b/documentation/docs/ru/practical-sessions/connecting-to-wis2-over-mqtt.md @@ -6,17 +6,17 @@ title: Подключение к WIS2 через MQTT !!! abstract "Результаты обучения" - К концу этого практического занятия вы сможете: + К концу практического занятия вы сможете: - - подключаться к WIS2 Global Broker с использованием MQTT Explorer - - изучать структуру тем WIS2 - - анализировать структуру уведомлений WIS2 + - подключиться к WIS2 Global Broker с помощью MQTT Explorer + - изучить структуру тем WIS2 + - изучить структуру уведомлений WIS2 ## Введение -WIS2 использует протокол MQTT для уведомления о доступности данных о погоде, климате и водных ресурсах. WIS2 Global Broker подписывается на все WIS2 Nodes в сети и перепубликовывает полученные сообщения. Global Cache подписывается на Global Broker, загружает данные из сообщения и затем перепубликовывает сообщение в теме `cache` с новым URL. Global Discovery Catalogue публикует метаданные для поиска из Broker и предоставляет API для поиска. +WIS2 использует протокол MQTT для объявления доступности данных о погоде, климате и водных ресурсах. WIS2 Global Broker подписывается на все WIS2 Nodes в сети и перепубликует полученные сообщения. Global Cache подписывается на Global Broker, загружает данные из сообщения и затем перепубликует сообщение в теме `cache` с новым URL. Global Discovery Catalogue публикует метаданные для поиска из брокера и предоставляет API для поиска. -Пример структуры уведомления WIS2 для сообщения, полученного по теме `origin/a/wis2/br-inmet/data/core/weather/surface-based-observations/synop`: +Пример структуры уведомления WIS2 для сообщения, полученного в теме `origin/a/wis2/br-inmet/data/core/weather/surface-based-observations/synop`: ```json { @@ -57,24 +57,24 @@ WIS2 использует протокол MQTT для уведомления о "href":"https://oscar.wmo.int/surface/#/search/station/stationReportDetails/0-20000-0-76679" } ], - "generated_by":"wis2box 1.2.0" + "generated_by":"wis2box 1.3.0" } ``` В этом практическом занятии вы научитесь использовать инструмент MQTT Explorer для настройки подключения клиента MQTT к WIS2 Global Broker и отображения уведомлений WIS2. -MQTT Explorer — это полезный инструмент для просмотра и анализа структуры тем для заданного брокера MQTT, а также для анализа публикуемых данных. +MQTT Explorer — полезный инструмент для просмотра и изучения структуры тем для заданного брокера MQTT, а также для анализа публикуемых данных. !!! note "О MQTT" MQTT Explorer предоставляет удобный интерфейс для подключения к брокеру MQTT и изучения тем и структуры сообщений, используемых в WIS2. - На практике MQTT предназначен для машинного взаимодействия, где приложение или сервис подписывается на темы и обрабатывает сообщения программно в реальном времени. + На практике MQTT предназначен для машинного взаимодействия, где приложение или сервис подписывается на темы и обрабатывает сообщения программно в режиме реального времени. - Для работы с MQTT программно (например, на Python) вы можете использовать библиотеки клиента MQTT, такие как [paho-mqtt](https://pypi.org/project/paho-mqtt), чтобы подключаться к брокеру MQTT и обрабатывать входящие сообщения. Существует множество программных решений для клиентов и серверов MQTT, в зависимости от ваших требований и технической среды. + Для работы с MQTT программно (например, на Python) можно использовать клиентские библиотеки MQTT, такие как [paho-mqtt](https://pypi.org/project/paho-mqtt), чтобы подключиться к брокеру MQTT и обрабатывать входящие сообщения. Существует множество клиентских и серверных программ MQTT, в зависимости от ваших требований и технической среды. ## Использование MQTT Explorer для подключения к Global Broker -Чтобы просматривать сообщения, публикуемые WIS2 Global Broker, вы можете использовать "MQTT Explorer", который можно скачать с [веб-сайта MQTT Explorer](https://mqtt-explorer.com). +Чтобы просмотреть сообщения, публикуемые WIS2 Global Broker, вы можете использовать "MQTT Explorer", который можно скачать с [веб-сайта MQTT Explorer](https://mqtt-explorer.com). Откройте MQTT Explorer и добавьте новое подключение к Global Broker, размещенному MeteoFrance, используя следующие данные: @@ -92,22 +92,22 @@ MQTT Explorer — это полезный инструмент для просм mqtt-explorer-global-broker-advanced !!! note - При настройке подписок MQTT вы можете использовать следующие подстановочные знаки: + При настройке подписок MQTT можно использовать следующие подстановочные знаки: - - **Одноуровневый (+)**: подстановочный знак для одного уровня темы - - **Многоуровневый (#)**: подстановочный знак для нескольких уровней темы + - **Одноуровневый (+)**: подстановочный знак заменяет один уровень темы + - **Многоуровневый (#)**: подстановочный знак заменяет несколько уровней темы В данном случае `origin/a/wis2/#` подпишется на все темы под `origin/a/wis2`. Нажмите 'BACK', затем 'SAVE', чтобы сохранить данные подключения и подписки. Затем нажмите 'CONNECT': -Сообщения должны начать появляться в вашей сессии MQTT Explorer следующим образом: +Сообщения должны начать появляться в вашей сессии MQTT Explorer, как показано ниже: mqtt-explorer-global-broker-topics -Теперь вы готовы начать изучение тем и структуры сообщений WIS2. +Теперь вы готовы начать изучение тем WIS2 и структуры сообщений. -## Упражнение 1: Анализ структуры тем WIS2 +## Упражнение 1: Изучение структуры тем WIS2 Используйте MQTT для просмотра структуры тем под темами `origin`. @@ -117,13 +117,13 @@ MQTT Explorer — это полезный инструмент для просм ??? success "Нажмите, чтобы увидеть ответ" - Вы можете нажать на окно слева в MQTT Explorer, чтобы развернуть структуру тем. + Вы можете нажать на левую панель в MQTT Explorer, чтобы развернуть структуру тем. Мы можем определить WIS-центр, который опубликовал данные, посмотрев на четвертый уровень структуры тем. Например, следующая тема: `origin/a/wis2/br-inmet/data/core/weather/surface-based-observations/synop` - говорит нам, что данные были опубликованы WIS-центром с идентификатором `br-inmet`, который соответствует Instituto Nacional de Meteorologia - INMET, Бразилия. + говорит нам, что данные были опубликованы WIS-центром с идентификатором центра `br-inmet`, который соответствует Instituto Nacional de Meteorologia - INMET, Бразилия. !!! question @@ -135,9 +135,9 @@ MQTT Explorer — это полезный инструмент для просм `origin/a/wis2/de-dwd-gts-to-wis2/data/core/I/S/A/I/01/sbbr` - говорит нам, что данные были опубликованы шлюзом GTS-to-WIS2, размещенным Deutscher Wetterdienst (DWD), Германия. Шлюз GTS-to-WIS2 — это специальный тип издателя данных, который публикует данные из Global Telecommunication System (GTS) в WIS2. Структура темы состоит из заголовков TTAAii CCCC для сообщений GTS. + говорит нам, что данные были опубликованы шлюзом GTS-to-WIS2, размещенным Deutscher Wetterdienst (DWD), Германия. Шлюз GTS-to-WIS2 — это особый тип издателя данных, который публикует данные из Global Telecommunication System (GTS) в WIS2. Структура тем состоит из заголовков TTAAii CCCC для сообщений GTS. -## Упражнение 2: Анализ структуры сообщений WIS2 +## Упражнение 2: Изучение структуры сообщений WIS2 Отключитесь от MQTT Explorer и обновите раздел 'Advanced', чтобы изменить подписку на следующие темы: @@ -149,37 +149,37 @@ MQTT Explorer — это полезный инструмент для просм !!! note Подстановочный знак `+` используется для подписки на все WIS-центры. -Подключитесь снова к Global Broker и дождитесь появления сообщений. +Переподключитесь к Global Broker и дождитесь появления сообщений. -Вы можете просмотреть содержимое сообщения WIS2 в разделе "Value" справа. Попробуйте развернуть структуру тем, чтобы увидеть различные уровни сообщения, пока не дойдете до последнего уровня, и изучите содержимое одного из сообщений. +Вы можете просмотреть содержимое сообщения WIS2 в разделе "Value" справа. Попробуйте развернуть структуру тем, чтобы увидеть различные уровни сообщения, пока не достигнете последнего уровня, и изучите содержимое одного из сообщений. !!! question - Как можно определить временную метку, когда данные были опубликованы? И как можно определить временную метку, когда данные были собраны? + Как можно определить временную метку публикации данных? И как можно определить временную метку сбора данных? ??? success "Нажмите, чтобы увидеть ответ" - Временная метка, когда данные были опубликованы, содержится в разделе `properties` сообщения с ключом `pubtime`. + Временная метка публикации данных содержится в разделе `properties` сообщения с ключом `pubtime`. - Временная метка, когда данные были собраны, содержится в разделе `properties` сообщения с ключом `datetime`. + Временная метка сбора данных содержится в разделе `properties` сообщения с ключом `datetime`. mqtt-explorer-global-broker-msg-properties !!! question - Как можно скачать данные по URL, указанному в сообщении? + Как можно загрузить данные по URL, указанному в сообщении? ??? success "Нажмите, чтобы увидеть ответ" URL содержится в разделе `links` с `rel="canonical"` и определяется ключом `href`. - Вы можете скопировать URL и вставить его в веб-браузер, чтобы скачать данные. + Вы можете скопировать URL и вставить его в веб-браузер, чтобы загрузить данные. -## Упражнение 3: Анализ различий между темами 'origin' и 'cache' +## Упражнение 3: Изучение различий между темами 'origin' и 'cache' Убедитесь, что вы все еще подключены к Global Broker, используя подписки на темы `origin/a/wis2/+/data/core/weather/surface-based-observations/synop` и `cache/a/wis2/+/data/core/weather/surface-based-observations/synop`, как описано в Упражнении 2. -Попробуйте найти сообщение для одного и того же идентификатора центра, опубликованное как в темах `origin`, так и в темах `cache`. +Попробуйте найти сообщение для одного и того же идентификатора центра, опубликованное как в теме `origin`, так и в теме `cache`. !!! question @@ -187,22 +187,22 @@ MQTT Explorer — это полезный инструмент для просм ??? success "Нажмите, чтобы увидеть ответ" - Сообщения, опубликованные в темах `origin`, — это оригинальные сообщения, которые Global Broker перепубликовывает из WIS2 Nodes в сети. + Сообщения, опубликованные в темах `origin`, — это оригинальные сообщения, которые Global Broker перепубликует от WIS2 Nodes в сети. - Сообщения, опубликованные в темах `cache`, — это сообщения для данных, которые были загружены Global Cache. Если вы проверите содержимое сообщения из темы, начинающейся с `cache`, вы увидите, что ссылка 'canonical' была обновлена на новый URL. + Сообщения, опубликованные в темах `cache`, — это сообщения, для которых данные были загружены Global Cache. Если вы проверите содержимое сообщения из темы, начинающейся с `cache`, вы увидите, что ссылка 'canonical' была обновлена на новый URL. В сети WIS2 существует несколько Global Cache, поэтому вы получите одно сообщение от каждого Global Cache, который загрузил сообщение. - Global Cache загружает и перепубликовывает только сообщения, которые были опубликованы в иерархии тем `../data/core/...`. + Global Cache будет загружать и перепубликовывать только сообщения, которые были опубликованы в иерархии тем `../data/core/...`. ## Заключение !!! success "Поздравляем!" В этом практическом занятии вы узнали: - - как подписываться на сервисы WIS2 Global Broker с использованием MQTT Explorer + - как подписаться на сервисы WIS2 Global Broker с помощью MQTT Explorer - структуру тем WIS2 - структуру уведомлений WIS2 - - различия между основными и рекомендованными данными + - различия между основными и рекомендуемыми данными - структуру тем, используемую шлюзом GTS-to-WIS2 - различия между сообщениями Global Broker, опубликованными в темах `origin` и `cache` \ No newline at end of file diff --git a/documentation/docs/ru/practical-sessions/initializing-wis2box.md b/documentation/docs/ru/practical-sessions/initializing-wis2box.md index f828a56bb..1878e18d2 100644 --- a/documentation/docs/ru/practical-sessions/initializing-wis2box.md +++ b/documentation/docs/ru/practical-sessions/initializing-wis2box.md @@ -6,23 +6,23 @@ title: Инициализация wis2box !!! abstract "Результаты обучения" - К концу этой практической сессии вы сможете: + К концу этого практического занятия вы сможете: - запустить скрипт `wis2box-create-config.py` для создания начальной конфигурации - запустить wis2box и проверить статус его компонентов - просмотреть содержимое **wis2box-api** - получить доступ к **wis2box-webapp** - - подключиться к локальному **wis2box-broker** с использованием MQTT Explorer + - подключиться к локальному **wis2box-broker** с помощью MQTT Explorer !!! note - Текущие учебные материалы основаны на версии wis2box-release 1.2.0. + Текущие учебные материалы основаны на версии wis2box-release 1.3.0. - См. [accessing-your-student-vm](./accessing-your-student-vm.md) для инструкций по загрузке и установке программного стека wis2box, если вы проходите это обучение вне локальной учебной сессии. + См. [accessing-your-student-vm](./accessing-your-student-vm.md) для инструкций по загрузке и установке программного обеспечения wis2box, если вы проходите обучение вне локальной учебной сессии. ## Подготовка -Войдите в свою выделенную виртуальную машину (VM) с использованием имени пользователя и пароля и убедитесь, что вы находитесь в директории `wis2box`: +Войдите в свою виртуальную машину (VM) с использованием имени пользователя и пароля и убедитесь, что вы находитесь в каталоге `wis2box`: ```bash cd ~/wis2box @@ -33,7 +33,7 @@ cd ~/wis2box Для начальной конфигурации wis2box требуется: - файл окружения `wis2box.env`, содержащий параметры конфигурации -- директория на хост-машине для совместного использования между хост-машиной и контейнерами wis2box, определяемая переменной окружения `WIS2BOX_HOST_DATADIR` +- каталог на хост-машине, который будет использоваться совместно между хост-машиной и контейнерами wis2box, определяемый переменной окружения `WIS2BOX_HOST_DATADIR` Скрипт `wis2box-create-config.py` может быть использован для создания начальной конфигурации вашего wis2box. @@ -47,13 +47,13 @@ cd ~/wis2box python3 wis2box-create-config.py ``` -### Директория wis2box-host-data +### Каталог wis2box-host-data -Скрипт попросит вас указать директорию, которая будет использоваться для переменной окружения `WIS2BOX_HOST_DATADIR`. +Скрипт попросит вас указать каталог, который будет использоваться для переменной окружения `WIS2BOX_HOST_DATADIR`. -Обратите внимание, что необходимо указать полный путь к этой директории. +Обратите внимание, что необходимо указать полный путь к этому каталогу. -Например, если ваше имя пользователя — `username`, полный путь к директории будет `/home/username/wis2box-data`: +Например, если ваше имя пользователя — `username`, полный путь к каталогу будет `/home/username/wis2box-data`: ```{.copy} username@student-vm-username:~/wis2box$ python3 wis2box-create-config.py @@ -66,9 +66,9 @@ y The directory /home/username/wis2box-data has been created. ``` -### URL для wis2box +### URL wis2box -Далее вам будет предложено ввести URL для вашего wis2box. Это URL, который будет использоваться для доступа к веб-приложению, API и пользовательскому интерфейсу wis2box. +Далее вас попросят указать URL для вашего wis2box. Это URL, который будет использоваться для доступа к веб-приложению, API и пользовательскому интерфейсу wis2box. Используйте `http://` в качестве URL. @@ -82,15 +82,15 @@ The URL of the wis2box will be set to: Is this correct? (y/n/exit) ``` -### Пароли для WEBAPP, STORAGE и BROKER +### Пароли WEBAPP, STORAGE и BROKER -Вы можете использовать опцию генерации случайных паролей, когда вас попросят указать `WIS2BOX_WEBAPP_PASSWORD`, `WIS2BOX_STORAGE_PASSWORD`, `WIS2BOX_BROKER_PASSWORD`, или задать свои собственные. +Вы можете использовать опцию случайной генерации паролей, когда вас попросят указать `WIS2BOX_WEBAPP_PASSWORD`, `WIS2BOX_STORAGE_PASSWORD`, `WIS2BOX_BROKER_PASSWORD`, или задать свои собственные. -Не беспокойтесь о запоминании этих паролей, они будут сохранены в файле `wis2box.env` в вашей директории wis2box. +Не беспокойтесь о запоминании этих паролей, они будут сохранены в файле `wis2box.env` в вашем каталоге wis2box. -### Проверка файла `wis2box.env` +### Проверка `wis2box.env` -После завершения работы скрипта проверьте содержимое файла `wis2box.env` в вашей текущей директории: +После завершения работы скрипта проверьте содержимое файла `wis2box.env` в текущем каталоге: ```bash cat ~/wis2box/wis2box.env @@ -106,7 +106,7 @@ cat ~/wis2box/wis2box.env Значение по умолчанию для WIS2BOX_BASEMAP_URL — `https://{s}.tile.openstreetmap.org/{z}/{x}/{y}.png`. - Этот URL ссылается на сервер тайлов OpenStreetMap. Если вы хотите использовать другого поставщика карт, вы можете изменить этот URL, чтобы он указывал на другой сервер тайлов. + Этот URL относится к серверу тайлов OpenStreetMap. Если вы хотите использовать другого поставщика карт, вы можете изменить этот URL, указав другой сервер тайлов. !!! question @@ -116,7 +116,7 @@ cat ~/wis2box/wis2box.env Значение по умолчанию для WIS2BOX_STORAGE_DATA_RETENTION_DAYS — 30 дней. Вы можете изменить это значение на другое количество дней, если хотите. - Контейнер wis2box-management выполняет ежедневную задачу cron для удаления данных, старше указанного количества дней, из корзины `wis2box-public` и API-бэкенда: + Контейнер wis2box-management ежедневно выполняет cron-задачу для удаления данных, старше указанного количества дней, из корзины `wis2box-public` и API-бэкенда: ```{.copy} 0 0 * * * su wis2box -c "wis2box data clean --days=$WIS2BOX_STORAGE_DATA_RETENTION_DAYS" @@ -126,13 +126,13 @@ cat ~/wis2box/wis2box.env Файл `wis2box.env` содержит переменные окружения, определяющие конфигурацию вашего wis2box. Для получения дополнительной информации обратитесь к [wis2box-documentation](https://docs.wis2box.wis.wmo.int/en/latest/reference/configuration.html). - Не редактируйте файл `wis2box.env`, если вы не уверены в вносимых изменениях. Неправильные изменения могут привести к прекращению работы вашего wis2box. + Не редактируйте файл `wis2box.env`, если вы не уверены в изменениях, которые собираетесь внести. Неправильные изменения могут привести к прекращению работы wis2box. - Не делитесь содержимым вашего файла `wis2box.env` с кем-либо, так как он содержит конфиденциальную информацию, такую как пароли. + Не делитесь содержимым файла `wis2box.env` с кем-либо, так как он содержит конфиденциальную информацию, такую как пароли. ## Запуск wis2box -Убедитесь, что вы находитесь в директории, содержащей файлы определения программного стека wis2box: +Убедитесь, что вы находитесь в каталоге, содержащем файлы определения программного стека wis2box: ```{.copy} cd ~/wis2box @@ -148,11 +148,11 @@ python3 wis2box-ctl.py start ``` No docker-compose.images-*.yml files found, creating one -Current version=Undefined, latest version=1.2.0 +Current version=Undefined, latest version=1.3.0 Would you like to update ? (y/n/exit) ``` -Выберите ``y``, и скрипт создаст файл ``docker-compose.images-1.2.0.yml``, загрузит необходимые образы Docker и запустит сервисы. +Выберите ``y``, и скрипт создаст файл ``docker-compose.images-1.3.0.yml``, загрузит необходимые Docker-образы и запустит сервисы. Загрузка образов может занять некоторое время в зависимости от скорости вашего интернет-соединения. Этот шаг требуется только при первом запуске wis2box. @@ -167,9 +167,9 @@ python3 wis2box-ctl.py status !!! note "wis2box и Docker" wis2box работает как набор контейнеров Docker, управляемых с помощью docker-compose. - Сервисы определены в различных файлах `docker-compose*.yml`, которые можно найти в директории `~/wis2box/`. + Сервисы определены в различных файлах `docker-compose*.yml`, которые можно найти в каталоге `~/wis2box/`. - Python-скрипт `wis2box-ctl.py` используется для выполнения базовых команд Docker Compose, управляющих сервисами wis2box. + Python-скрипт `wis2box-ctl.py` используется для выполнения команд Docker Compose, управляющих сервисами wis2box. Вам не нужно знать детали контейнеров Docker для работы с программным стеком wis2box, но вы можете изучить файлы `docker-compose*.yml`, чтобы увидеть, как определены сервисы. Если вы хотите узнать больше о Docker, вы можете найти дополнительную информацию в [документации Docker](https://docs.docker.com/). @@ -179,7 +179,7 @@ python3 wis2box-ctl.py status python3 wis2box-ctl.py login ``` -Обратите внимание, что после входа ваш приглашение изменится, указывая, что вы находитесь внутри контейнера wis2box-management: +Обратите внимание, что после входа ваш приглашение изменится, указывая, что вы теперь находитесь внутри контейнера wis2box-management: ```{bash} root@025381da3c40:/home/wis2box# @@ -196,37 +196,35 @@ root@025381da3c40:/home/wis2box# exit ``` -Выполните следующую команду, чтобы увидеть контейнеры Docker, работающие на вашей хост-машине: +Запустите следующую команду, чтобы увидеть запущенные контейнеры Docker на вашей хост-машине: ```{.copy} docker ps --format "table {{.Names}} \t{{.Status}} \t{{.Image}}" ``` -Вы должны увидеть следующие работающие контейнеры: +Вы должны увидеть следующие запущенные контейнеры: ```{bash} -NAMES STATUS IMAGE -elasticsearch docker.elastic.co/elasticsearch/elasticsearch:8.6.2 "/bin/tini -- /usr/l…" elasticsearch About a minute ago Up About a minute (healthy) 9200/tcp, 9300/tcp -elasticsearch-exporter quay.io/prometheuscommunity/elasticsearch-exporter:latest "/bin/elasticsearch_…" elasticsearch-exporter About a minute ago Up About a minute 7979/tcp -grafana grafana/grafana-oss:9.0.3 "/run.sh" grafana About a minute ago Up About a minute 0.0.0.0:3000->3000/tcp -loki grafana/loki:2.4.1 "/usr/bin/loki -conf…" loki About a minute ago Up About a minute 3100/tcp -mosquitto ghcr.io/world-meteorological-organization/wis2box-broker:1.2.0 "/docker-entrypoint.…" mosquitto About a minute ago Up About a minute 0.0.0.0:1883->1883/tcp, 0.0.0.0:8884->8884/tcp -mqtt_metrics_collector ghcr.io/world-meteorological-organization/wis2box-mqtt-metrics-collector:1.2.0 "python3 -u mqtt_met…" mqtt_metrics_collector About a minute ago Up 10 seconds 8000/tcp, 0.0.0.0:8001->8001/tcp -nginx nginx:alpine "/docker-entrypoint.…" web-proxy About a minute ago Up 9 seconds 0.0.0.0:80->80/tcp -prometheus prom/prometheus:v2.37.0 "/bin/prometheus --c…" prometheus About a minute ago Up About a minute 9090/tcp -wis2box-api ghcr.io/world-meteorological-organization/wis2box-api:1.2.0 "/app/docker/es-entr…" wis2box-api About a minute ago Up 36 seconds (healthy) -wis2box-auth ghcr.io/world-meteorological-organization/wis2box-auth:1.2.0 "/entrypoint.sh" wis2box-auth About a minute ago Up 10 seconds -wis2box-management ghcr.io/world-meteorological-organization/wis2box-management:1.2.0 "/home/wis2box/entry…" wis2box-management About a minute ago Up 12 seconds -wis2box-minio minio/minio:RELEASE.2024-08-03T04-33-23Z-cpuv1 "/usr/bin/docker-ent…" minio About a minute ago Up About a minute (healthy) 0.0.0.0:8022->8022/tcp, 0.0.0.0:9000-9001->9000-9001/tcp -wis2box-ui ghcr.io/world-meteorological-organization/wis2box-ui:1.2.0 "/docker-entrypoint.…" wis2box-ui About a minute ago Up 35 seconds 0.0.0.0:9999->80/tcp -wis2box-webapp ghcr.io/world-meteorological-organization/wis2box-webapp:1.2.0 "sh /wis2box-webapp/…" wis2box-webapp About a minute ago Up About a minute (unhealthy) 4173/tcp -wis2downloader ghcr.io/wmo-im/wis2downloader:v0.3.2 "/home/wis2downloade…" wis2downloader About a minute ago Up About a minute (healthy) - +NAMES STATUS IMAGE +nginx Up 56 seconds nginx:1.30.1-alpine +mqtt_metrics_collector Up 58 seconds ghcr.io/world-meteorological-organization/wis2box-mqtt-metrics-collector:1.3.0 +wis2box-auth Up 59 seconds ghcr.io/world-meteorological-organization/wis2box-auth:1.3.0 +wis2box-ui Up About a minute ghcr.io/world-meteorological-organization/wis2box-ui:1.3.0 +wis2box-management Up About a minute ghcr.io/world-meteorological-organization/wis2box-management:1.3.0 +wis2box-minio Up 2 minutes (healthy) ghcr.io/world-meteorological-organization/wis2box-minio:latest +wis2box-api Up About a minute (healthy) ghcr.io/world-meteorological-organization/wis2box-api:1.3.0 +elasticsearch Up 2 minutes (healthy) docker.elastic.co/elasticsearch/elasticsearch:8.6.2 +grafana Up 2 minutes grafana/grafana-oss:12.4.2 +loki Up 2 minutes grafana/loki:2.4.1 +elasticsearch-exporter Up 2 minutes quay.io/prometheuscommunity/elasticsearch-exporter:latest +prometheus Up 2 minutes prom/prometheus:v2.37.0 +mosquitto Up 2 minutes ghcr.io/world-meteorological-organization/wis2box-broker:1.3.0 +wis2box-webapp Up 2 minutes (healthy) ghcr.io/world-meteorological-organization/wis2box-webapp:1.3.0 ``` Эти контейнеры являются частью программного стека wis2box и предоставляют различные сервисы, необходимые для работы wis2box. -Выполните следующую команду, чтобы увидеть тома Docker, запущенные на вашем хосте: +Выполните следующую команду, чтобы увидеть тома Docker, работающие на вашем хосте: ```{.copy} docker volume ls @@ -243,17 +241,17 @@ docker volume ls А также некоторые анонимные тома, используемые различными контейнерами. -Тома, начинающиеся с `wis2box_project_`, используются для хранения постоянных данных для различных сервисов программного стека wis2box. +Тома, начинающиеся с `wis2box_project_`, используются для хранения постоянных данных для различных сервисов в программном стеке wis2box. ## wis2box API -wis2box включает API (интерфейс прикладного программирования), который предоставляет доступ к данным и процессы для интерактивной визуализации, преобразования данных и их публикации. +Wis2box содержит API (интерфейс прикладного программирования), который предоставляет доступ к данным и процессы для интерактивной визуализации, преобразования данных и их публикации. Откройте новую вкладку и перейдите на страницу `http://YOUR-HOST/oapi`. wis2box-api.png -Это главная страница API wis2box (запущенного через контейнер **wis2box-api**). +Это главная страница API wis2box (работает через контейнер **wis2box-api**). !!! question @@ -290,28 +288,28 @@ wis2box включает API (интерфейс прикладного прог !!! note - Проверьте ваш файл wis2box.env, чтобы узнать значение переменной WIS2BOX_WEBAPP_PASSWORD. Вы можете использовать следующую команду, чтобы проверить значение этой переменной окружения: + Проверьте ваш файл wis2box.env для значения переменной WIS2BOX_WEBAPP_PASSWORD. Вы можете использовать следующую команду, чтобы проверить значение этой переменной окружения: ```{.copy} cat ~/wis2box/wis2box.env | grep WIS2BOX_WEBAPP_PASSWORD ``` -После входа в систему переместите курсор мыши на меню слева, чтобы увидеть доступные опции в веб-приложении wis2box: +После входа в систему наведите курсор на меню слева, чтобы увидеть доступные опции в веб-приложении wis2box: wis2box-webapp-menu.png -Это веб-приложение wis2box, которое позволяет вам взаимодействовать с вашей установкой wis2box: +Это веб-приложение wis2box, которое позволяет вам взаимодействовать с вашим wis2box: - создавать и управлять наборами данных - обновлять/просматривать метаданные станций - загружать ручные наблюдения с использованием формы FM-12 synop -- отслеживать уведомления, опубликованные в вашем wis2box-broker +- отслеживать уведомления, опубликованные на вашем wis2box-broker -Мы будем использовать это веб-приложение в следующей сессии. +Мы будем использовать это веб-приложение в следующем занятии. ## wis2box-broker -Откройте MQTT Explorer на вашем компьютере и подготовьте новое подключение для подключения к вашему брокеру (запущенному через контейнер **wis2box-broker**). +Откройте MQTT Explorer на вашем компьютере и подготовьте новое подключение для подключения к вашему брокеру (работает через контейнер **wis2box-broker**). Нажмите `+`, чтобы добавить новое подключение: @@ -326,21 +324,21 @@ wis2box включает API (интерфейс прикладного прог !!! note - Тема `#` является универсальной подпиской, которая подписывается на все темы, опубликованные в брокере. + Тема `#` является подпиской с подстановочным знаком, которая подписывается на все темы, опубликованные на брокере. - Сообщения, опубликованные в теме `$SYS`, являются системными сообщениями, публикуемыми самим сервисом mosquitto. + Сообщения, опубликованные в теме `$SYS`, являются системными сообщениями, опубликованными самим сервисом mosquitto. Используйте следующие данные для подключения, убедившись, что вы заменили значение `` на имя вашего хоста, а `` на значение из вашего файла `wis2box.env`: -- **Протокол: mqtt://** -- **Хост: ``** -- **Порт: 1883** -- **Имя пользователя: wis2box** -- **Пароль: ``** +- **Protocol: mqtt://** +- **Host: ``** +- **Port: 1883** +- **Username: wis2box** +- **Password: ``** !!! note - Вы можете проверить ваш файл wis2box.env, чтобы узнать значение переменной WIS2BOX_BROKER_PASSWORD. Вы можете использовать следующую команду, чтобы проверить значение этой переменной окружения: + Вы можете проверить ваш файл wis2box.env для значения переменной WIS2BOX_BROKER_PASSWORD. Вы можете использовать следующую команду, чтобы проверить значение этой переменной окружения: ```{.copy} cat ~/wis2box/wis2box.env | grep WIS2BOX_BROKER_PASSWORD @@ -352,20 +350,23 @@ wis2box включает API (интерфейс прикладного прог Затем нажмите "CONNECT", чтобы подключиться к вашему **wis2box-broker**. -mqtt-explorer-wis2box-broker.png +mqtt-explorer-wis2box-broker-port1883.png -После подключения проверьте, что внутренние статистические данные mosquitto публикуются вашим брокером в теме `$SYS`: +После подключения вы увидите внутреннюю статистику mosquitto, опубликованную вашим брокером в теме `$SYS`: mqtt-explorer-sys-topic.png -Оставьте MQTT Explorer открытым, так как мы будем использовать его для мониторинга сообщений, публикуемых на брокере. +То же самое подключение также может быть выполнено с использованием MQTT через WebSockets на порту 80, используя следующие данные подключения: + +mqtt-explorer-wis2box-broker-websockets.png ## Заключение !!! success "Поздравляем!" - В ходе этой практической сессии вы узнали, как: + В этом практическом занятии вы узнали, как: - запустить скрипт `wis2box-create-config.py` для создания начальной конфигурации - запустить wis2box и проверить статус его компонентов - - получить доступ к wis2box-webapp и wis2box-API в браузере - - подключиться к MQTT брокеру на вашей учебной виртуальной машине с использованием MQTT Explorer \ No newline at end of file + - получить доступ к wis2box-webapp и wis2box-API через браузер + - подключиться к MQTT брокеру на вашей виртуальной машине с помощью MQTT Explorer +``` \ No newline at end of file diff --git a/documentation/docs/zh/practical-sessions/accessing-your-student-vm.md b/documentation/docs/zh/practical-sessions/accessing-your-student-vm.md index 62da676e9..52e7fc40f 100644 --- a/documentation/docs/zh/practical-sessions/accessing-your-student-vm.md +++ b/documentation/docs/zh/practical-sessions/accessing-your-student-vm.md @@ -6,11 +6,11 @@ title: 访问你的学生虚拟机 !!! abstract "学习目标" - 在本次实践课程结束时,你将能够: + 在本次实践课程结束后,你将能够: - 通过 SSH 和 WinSCP 访问你的学生虚拟机 - 验证实践所需的软件是否已安装 - - 验证你是否可以在本地学生虚拟机上访问本次培训的练习材料 + - 验证你是否可以在本地学生虚拟机上访问培训的练习材料 ## 简介 @@ -22,11 +22,11 @@ title: 访问你的学生虚拟机 - Python 3.10.12 - Docker 24.0.6 - Docker Compose 2.21.0 -- 文本编辑器:vim、nano +- 文本编辑器:vim, nano !!! note - 如果你希望在本地培训课程之外运行本次培训,可以使用任何云服务提供商提供的实例,例如: + 如果你希望在本地培训课程之外运行此培训,可以使用任何云服务提供商提供的实例,例如: - GCP (Google Cloud Platform) VM 实例 `e2-medium` - AWS (Amazon Web Services) ec2 实例 `t3a.medium` @@ -34,16 +34,16 @@ title: 访问你的学生虚拟机 选择 Ubuntu Server 22.0.4 LTS 作为操作系统。 - 创建虚拟机后,请确保已安装 python、docker 和 docker compose,如 [wis2box-software-dependencies](https://docs.wis2box.wis.wmo.int/en/latest/user/getting-started.html#software-dependencies) 中所述。 + 创建虚拟机后,请确保已安装 python、docker 和 docker compose,具体安装步骤请参考 [wis2box-software-dependencies](https://docs.wis2box.wis.wmo.int/en/latest/user/getting-started.html#software-dependencies)。 本次培训使用的 wis2box 发行版可以通过以下方式下载: ```bash - wget https://github.com/World-Meteorological-Organization/wis2box-release/releases/download/1.2.0/wis2box-setup-1.2.0.zip - unzip wis2box-setup-1.2.0.zip + wget https://github.com/World-Meteorological-Organization/wis2box-release/releases/download/1.3.0/wis2box-setup-1.3.0.zip + unzip wis2box-setup-1.3.0.zip ``` - 你可以随时在 [https://github.com/World-Meteorological-Organization/wis2box/releases](https://github.com/World-Meteorological-Organization/wis2box-release/releases) 找到最新的 'wis2box-setup' 归档文件。 + 你可以随时在 [https://github.com/World-Meteorological-Organization/wis2box/releases](https://github.com/World-Meteorological-Organization/wis2box-release/releases) 找到最新的 'wis2box-setup' 发行版。 本次培训使用的练习材料可以通过以下方式下载: @@ -56,26 +56,26 @@ title: 访问你的学生虚拟机 ```bash pip3 install minio - pip3 install pywiscat==0.4.0 + pip3 install pywiscat ``` 如果你使用的是本地 WIS2 培训课程中提供的学生虚拟机,所需的软件已经预先安装。 ## 在本地培训网络上连接到你的学生虚拟机 -根据培训师提供的说明,将你的电脑连接到培训期间房间内广播的本地 Wi-Fi。 +将你的电脑连接到 WIS2 培训期间房间内广播的本地 Wi-Fi,具体操作请参考培训师提供的说明。 使用 SSH 客户端连接到你的学生虚拟机,连接信息如下: -- **主机名:(由现场培训提供)** -- **端口:22** -- **用户名:(由现场培训提供)** -- **密码:(由现场培训提供)** +- **主机名: (由现场培训提供)** +- **端口: 22** +- **用户名: (由现场培训提供)** +- **密码: (由现场培训提供)** !!! tip - 如果你不确定主机名或用户名,或者连接有问题,请联系培训师。 + 如果你不确定主机名或用户名,或者连接时遇到问题,请联系培训师。 -连接后,请更改密码以确保其他人无法访问你的虚拟机: +连接后,请更改你的密码以确保其他人无法访问你的虚拟机: ```bash limper@student-vm:~$ passwd @@ -88,7 +88,7 @@ passwd: password updated successfully ## 验证软件版本 -为了运行 wis2box,学生虚拟机应预安装 Python、Docker 和 Docker Compose。 +为了能够运行 wis2box,学生虚拟机应预先安装 Python、Docker 和 Docker Compose。 检查 Python 版本: ```bash @@ -117,9 +117,9 @@ docker compose version Docker Compose version v2.21.0 ``` -为了确保你的用户可以运行 Docker 命令,用户已被添加到 `docker` 组。 +为了确保你的用户可以运行 Docker 命令,你的用户已被添加到 `docker` 组中。 -测试用户是否可以运行 Docker hello-world,执行以下命令: +测试你的用户是否可以运行 Docker 的 hello-world 命令,执行以下命令: ```bash docker run hello-world ``` @@ -137,7 +137,7 @@ This message shows that your installation appears to be working correctly. ## 检查练习材料 -检查你的主目录内容;这些是培训和实践课程中使用的材料。 +检查你的主目录内容,这些是培训和实践课程中使用的材料。 ```bash ls ~/ @@ -147,13 +147,13 @@ ls ~/ exercise-materials wis2box ``` -如果你的本地电脑安装了 WinSCP,可以使用它连接到学生虚拟机,检查主目录内容,并在虚拟机和本地电脑之间上传或下载文件。 +如果你的本地电脑安装了 WinSCP,可以使用它连接到你的学生虚拟机,检查主目录内容,并在虚拟机和本地电脑之间上传或下载文件。 虽然 WinSCP 不是培训的必需工具,但如果你希望使用本地电脑上的文本编辑器编辑虚拟机上的文件,它会非常有用。 -以下是如何使用 WinSCP 连接到学生虚拟机: +以下是使用 WinSCP 连接到学生虚拟机的方法: -打开 WinSCP 并点击 "New Site"。你可以创建一个新的 SCP 连接,设置如下: +打开 WinSCP 并点击 "New Site"。你可以创建一个新的 SCP 连接,具体设置如下: winscp-student-vm-scp.png @@ -168,4 +168,4 @@ exercise-materials wis2box - 通过 SSH 和 WinSCP 访问你的学生虚拟机 - 验证实践所需的软件是否已安装 - - 验证你是否可以在本地学生虚拟机上访问本次培训的练习材料 \ No newline at end of file + - 验证你是否可以在本地学生虚拟机上访问培训的练习材料 \ No newline at end of file diff --git a/documentation/docs/zh/practical-sessions/adding-gts-headers-to-wis2-notifications.md b/documentation/docs/zh/practical-sessions/adding-gts-headers-to-wis2-notifications.md index 47599809b..83efc98ee 100644 --- a/documentation/docs/zh/practical-sessions/adding-gts-headers-to-wis2-notifications.md +++ b/documentation/docs/zh/practical-sessions/adding-gts-headers-to-wis2-notifications.md @@ -1,24 +1,25 @@ --- -title: 为 WIS2 通知添加 GTS 头信息 +title: 将 GTS 头添加到 WIS2 通知 --- -# 为 WIS2 通知添加 GTS 头信息 +# 将 GTS 头添加到 WIS2 通知 !!! abstract "学习目标" - 完成本实践课程后,您将能够: + 在本次实践课程结束时,您将能够: - - 配置文件名和 GTS 头信息之间的映射 - - 使用与 GTS 头信息匹配的文件名摄入数据 - - 在 WIS2 通知中查看 GTS 头信息 + - 配置文件名与 GTS 头之间的映射 + - 使用与 GTS 头匹配的文件名摄取数据 + - 在 WIS2 通知中查看 GTS 头 + - 使用 FM-12 SYNOP 表单手动将 GTS 头添加到 WIS2 通知 ## 简介 -在向 WIS2 过渡阶段,希望停止 GTS 数据传输的 WMO 成员需要在其 WIS2 通知中添加 GTS 头信息。这些头信息使 WIS2 到 GTS 网关能够将数据转发到 GTS 网络。 +在向 WIS2 过渡阶段,计划停止通过 GTS 传输数据的 WMO 成员需要将 GTS 头添加到其 WIS2 通知中。这些头信息使 WIS2 到 GTS 网关能够将数据转发到 GTS 网络。 -这使得已迁移到使用 WIS2 节点进行数据发布的成员可以禁用其 MSS 系统,同时确保其数据仍然可供尚未迁移到 WIS2 的成员使用。 +这允许已经迁移到使用 WIS2 节点发布数据的成员关闭其 MSS 系统,同时确保其数据仍然可供尚未迁移到 WIS2 的成员使用。 -GTS 属性需要作为附加属性添加到 WIS2 通知消息中。GTS 属性是一个 JSON 对象,其中包含将数据转发到 GTS 网络所需的 GTS 头信息。 +需要将 GTS 属性作为附加属性添加到 WIS2 通知消息中。GTS 属性是一个 JSON 对象,包含将数据转发到 GTS 网络所需的 GTS 头信息。 ```json { @@ -29,45 +30,55 @@ GTS 属性需要作为附加属性添加到 WIS2 通知消息中。GTS 属性是 } ``` -在 wis2box 中,您可以通过提供一个名为 `gts_headers_mapping.csv` 的附加文件来自动将其添加到 WIS2 通知中,该文件包含将 GTS 头信息映射到传入文件名所需的信息。 +在 wis2box 中,您可以通过提供一个名为 `gts_headers_mapping.csv` 的附加文件,将这些信息自动添加到 WIS2 通知中。该文件包含将 GTS 头映射到传入文件名所需的信息。 -该文件应放置在 `wis2box.env` 中由 `WIS2BOX_HOST_DATADIR` 定义的目录中,并应包含以下列: +此文件应放置在 `wis2box.env` 文件中由 `WIS2BOX_HOST_DATADIR` 定义的目录中,并应包含以下列: -- `string_in_filepath`:文件名中用于匹配 GTS 头信息的字符串部分 -- `TTAAii`:要添加到 WIS2 通知的 TTAAii 头信息 -- `CCCC`:要添加到 WIS2 通知的 CCCC 头信息 +- `string_in_filepath`:文件名中的字符串,用于匹配 GTS 头 +- `TTAAii`:要添加到 WIS2 通知的 TTAAii 头 +- `CCCC`:要添加到 WIS2 通知的 CCCC 头 + +从 wis2box-1.3.0 开始,数据发布者有两种选择(可选)将 GTS 属性添加到其通知中: + +1. 对于上传到 MinIO 的文件,准备包含所需属性的映射文件 “gts_headers_mappings.csv”。 + +2. 对于在 wis2box-webapp 中使用 FM-12 SYNOP 表单输入的数据,选择 “Add GTS headers” 并手动输入所需信息。 ## 准备工作 -确保您可以通过 SSH 访问您的学员虚拟机,并且您的 wis2box 实例正在运行。 +确保您拥有对学生虚拟机的 SSH 访问权限,并且您的 wis2box 实例正在运行。 -确保您使用 MQTT Explorer 连接到 wis2box 实例的 MQTT 代理。您可以使用公共凭据 `everyone/everyone` 连接到代理。 +确保您已使用 MQTT Explorer 连接到您的 wis2box 实例的 MQTT broker。您可以使用公共凭证 `everyone/everyone` 连接到 broker。 -确保您已打开网络浏览器,通过访问 `http://YOUR-HOST:3000` 查看实例的 Grafana 仪表板。 +确保您已打开一个浏览器,并通过访问 `http://YOUR-HOST:3000` 查看实例的 Grafana 仪表板。 -## 创建 `gts_headers_mapping.csv` +## 练习 1:为上传到 MinIO 的数据使用映射文件 -要向 WIS2 通知添加 GTS 头信息,需要一个将 GTS 头信息映射到传入文件名的 CSV 文件。 +第一个练习将演示如何使用名为 `gts_headers_mapping.csv` 的映射文件为上传到 MinIO 的数据添加 GTS 头。 -该 CSV 文件应准确命名为 `gts_headers_mapping.csv`,并应放置在 `wis2box.env` 中由 `WIS2BOX_HOST_DATADIR` 定义的目录中。 +### 创建 `gts_headers_mapping.csv` -## 提供 `gts_headers_mapping.csv` 文件 - -将文件 `exercise-materials/gts-headers-exercises/gts_headers_mapping.csv` 复制到您的 wis2box 实例,并将其放置在 `wis2box.env` 中由 `WIS2BOX_HOST_DATADIR` 定义的目录中。 +要将 GTS 头添加到您的 WIS2 通知中,需要一个 CSV 文件将 GTS 头映射到传入的文件名。 + +CSV 文件必须命名为(完全一致)`gts_headers_mapping.csv`,并放置在 `wis2box.env` 文件中由 `WIS2BOX_HOST_DATADIR` 定义的目录中。 + +将文件 `exercise-materials/gts-headers-exercises/gts_headers_mapping.csv` 复制到您的 wis2box 实例,并放置在 `wis2box.env` 文件中由 `WIS2BOX_HOST_DATADIR` 定义的目录中。 ```bash cp ~/exercise-materials/gts-headers-exercises/gts_headers_mapping.csv ~/wis2box-data ``` -然后重启 wis2box-management 容器以应用更改: +### 应用映射 + +创建 `gts_headers_mapping.csv` 文件后,您需要重新启动 wis2box-management 容器以应用更改。可以通过在学生虚拟机中运行以下命令来完成: ```bash docker restart wis2box-management ``` -## 摄入带有 GTS 头信息的数据 +### 使用 GTS 头摄取数据 -将文件 `exercise-materials/gts-headers-exercises/A_SMRO01YRBK171200_C_EDZW_20240717120502.txt` 复制到 `wis2box.env` 中由 `WIS2BOX_HOST_DATADIR` 定义的目录: +将文件 `exercise-materials/gts-headers-exercises/A_SMRO01YRBK171200_C_EDZW_20240717120502.txt` 复制到 `wis2box.env` 文件中由 `WIS2BOX_HOST_DATADIR` 定义的目录中: ```bash cp ~/exercise-materials/gts-headers-exercises/A_SMRO01YRBK171200_C_EDZW_20240717120502.txt ~/wis2box-data @@ -80,25 +91,63 @@ cd ~/wis2box python3 wis2box-ctl.py login ``` -从 wis2box 命令行,我们可以按如下方式将示例数据文件 `A_SMRO01YRBK171200_C_EDZW_20240717120502.txt` 摄入到特定数据集: +从 wis2box 命令行中,我们可以将示例数据文件 `A_SMRO01YRBK171200_C_EDZW_20240717120502.txt` 摄取到特定数据集,如下所示: ```bash wis2box data ingest -p /data/wis2box/A_SMRO01YRBK171200_C_EDZW_20240717120502.txt --metadata-id urn:wmo:md:not-my-centre:core.surface-based-observations.synop ``` -确保使用正确的数据集标识符替换 `metadata-id` 选项。 +请确保使用正确的数据集标识符替换 `metadata-id` 选项。 + +检查 Grafana 仪表板以确认数据是否正确摄取。如果看到任何警告或错误,请尝试修复并重复使用 `wis2box data ingest` 命令的练习。 + +### 在 WIS2 通知中查看 GTS 头 + +打开 MQTT Explorer,检查刚刚摄取的数据的 WIS2 通知消息。 + +WIS2 通知消息应包含您在 `gts_headers_mapping.csv` 文件中提供的 GTS 头。 + +## 练习 2:使用 FM-12 SYNOP 表单 + +在 wis2box-webapp 中使用 FM-12 SYNOP 表单时,可以通过选择 “Add GTS headers” 选项并提供所需信息,手动将 GTS 头添加到您的 WIS2 通知中。 + +对于此练习,您可以使用以下示例数据或提供自己的数据: + +FM-12 SYNOP 消息: + +```{copy} +AAXX 03094 +64400 42460 71004 10285 20245 30113 40133 8493/ + 333 59005 83813 81930 87363 94966 95836= +``` + +GTS 头:TTAAii=`ISIH01` 和 CCCC=`FCBB` + +!!! note + wis2box 中的 synop2bufr-plugin 会将 FM-12 SYNOP 消息转换为 BUFR,因此 TTAAii 应以 `IS` 开头: + + - I = 观测数据(二进制编码)– BUFR + - S = 地面/海平面 + +### 手动提交带有 GTS 头的 FM-12 SYNOP 表单 + +进入 wis2box-webapp 的 FM-12 SYNOP 表单,并使用上述示例数据或您自己的数据填写表单。 + +确保选择 “Add GTS headers” 选项,并提供所需的 GTS 头信息: + +fm-12-synop-form-gts-headers.png -检查 Grafana 仪表板,查看数据是否正确摄入。如果看到任何警告或错误,请尝试修复它们并重复执行 `wis2box data ingest` 命令。 +提供所需的身份验证令牌并提交表单。 -## 在 WIS2 通知中查看 GTS 头信息 +您可能会看到一条错误消息,因为该站点未在您的站点列表中。您需要将站点 "0-20000-0-64400" 添加到您的站点列表,以便数据能够成功转换和发布。 -转到 MQTT Explorer 并检查您刚刚摄入的数据的 WIS2 通知消息。 +### 在 WIS2 通知中查看 GTS 头 -WIS2 通知消息应包含您在 `gts_headers_mapping.csv` 文件中提供的 GTS 头信息。 +打开 MQTT Explorer,检查刚刚摄取的数据的 WIS2 通知消息,以查看通知中是否包含 GTS 头。 ## 结论 !!! success "恭喜!" - 在本实践课程中,您学会了如何: - - 向 WIS2 通知添加 GTS 头信息 - - 验证 GTS 头信息是否通过您的 wis2box 安装可用 \ No newline at end of file + 在本次实践课程中,您学习了如何: + - 将 GTS 头添加到您的 WIS2 通知中 + - 验证 GTS 头通过您的 wis2box 安装是否可用 \ No newline at end of file diff --git a/documentation/docs/zh/practical-sessions/connecting-to-wis2-over-mqtt.md b/documentation/docs/zh/practical-sessions/connecting-to-wis2-over-mqtt.md index 7205dfe4e..7503dbc5d 100644 --- a/documentation/docs/zh/practical-sessions/connecting-to-wis2-over-mqtt.md +++ b/documentation/docs/zh/practical-sessions/connecting-to-wis2-over-mqtt.md @@ -9,14 +9,14 @@ title: 使用 MQTT 连接到 WIS2 在本次实践课程结束时,您将能够: - 使用 MQTT Explorer 连接到 WIS2 Global Broker - - 查看 WIS2 的主题结构 + - 查看 WIS2 主题结构 - 查看 WIS2 通知消息结构 ## 简介 -WIS2 使用 MQTT 协议来宣传天气/气候/水文数据的可用性。WIS2 Global Broker 订阅网络中所有 WIS2 Node,并重新发布它接收到的消息。Global Cache 订阅 Global Broker,下载消息中的数据,然后在 `cache` 主题上重新发布消息,并附上新的 URL。Global Discovery Catalogue 从 Broker 发布发现元数据,并提供搜索 API。 +WIS2 使用 MQTT 协议来发布天气/气候/水数据的可用性。WIS2 Global Broker 订阅网络中的所有 WIS2 Nodes,并重新发布其接收到的消息。Global Cache 订阅 Global Broker,下载消息中的数据,然后在 `cache` 主题上重新发布消息,并附带一个新的 URL。Global Discovery Catalogue 从 Broker 发布发现元数据,并提供搜索 API。 -以下是一个 WIS2 通知消息结构的示例,该消息接收自主题 `origin/a/wis2/br-inmet/data/core/weather/surface-based-observations/synop`: +以下是一个 WIS2 通知消息结构的示例,消息接收到的主题为 `origin/a/wis2/br-inmet/data/core/weather/surface-based-observations/synop`: ```json { @@ -57,26 +57,26 @@ WIS2 使用 MQTT 协议来宣传天气/气候/水文数据的可用性。WIS2 Gl "href":"https://oscar.wmo.int/surface/#/search/station/stationReportDetails/0-20000-0-76679" } ], - "generated_by":"wis2box 1.2.0" + "generated_by":"wis2box 1.3.0" } ``` 在本次实践课程中,您将学习如何使用 MQTT Explorer 工具设置 MQTT 客户端连接到 WIS2 Global Broker,并能够显示 WIS2 通知消息。 -MQTT Explorer 是一个浏览和查看特定 MQTT Broker 主题结构的有用工具,用于查看正在发布的数据。 +MQTT Explorer 是一个浏览和查看指定 MQTT Broker 的主题结构以及发布数据的有用工具。 !!! note "关于 MQTT" MQTT Explorer 提供了一个用户友好的界面,用于连接到 MQTT Broker 并探索 WIS2 使用的主题和消息结构。 - 实际上,MQTT 旨在用于机器对机器的通信,其中应用程序或服务订阅主题并以编程方式实时处理消息。 + 实际上,MQTT 旨在用于机器与机器之间的通信,其中应用程序或服务订阅主题并实时以编程方式处理消息。 - 如果需要以编程方式使用 MQTT(例如在 Python 中),您可以使用 MQTT 客户端库,例如 [paho-mqtt](https://pypi.org/project/paho-mqtt),连接到 MQTT Broker 并处理传入的消息。根据您的需求和技术环境,有许多 MQTT 客户端和服务器软件可供选择。 + 要以编程方式使用 MQTT(例如在 Python 中),您可以使用 MQTT 客户端库,例如 [paho-mqtt](https://pypi.org/project/paho-mqtt),连接到 MQTT Broker 并处理接收到的消息。根据您的需求和技术环境,存在许多 MQTT 客户端和服务器软件。 ## 使用 MQTT Explorer 连接到 Global Broker -要查看 WIS2 Global Broker 发布的消息,您可以使用 "MQTT Explorer",可以从 [MQTT Explorer 网站](https://mqtt-explorer.com) 下载。 +要查看 WIS2 Global Broker 发布的消息,您可以使用 "MQTT Explorer",它可以从 [MQTT Explorer 网站](https://mqtt-explorer.com) 下载。 -打开 MQTT Explorer,并使用以下详细信息添加一个新的连接到由 MeteoFrance 托管的 Global Broker: +打开 MQTT Explorer 并添加一个新的连接到由 MeteoFrance 托管的 Global Broker,使用以下详细信息: - host: globalbroker.meteo.fr - port: 8883 @@ -85,7 +85,7 @@ MQTT Explorer 是一个浏览和查看特定 MQTT Broker 主题结构的有用 mqtt-explorer-global-broker-connection -点击 'ADVANCED' 按钮,移除预配置的主题,并添加以下订阅主题: +点击 'ADVANCED' 按钮,移除预配置的主题,并添加以下主题进行订阅: - `origin/a/wis2/#` @@ -99,13 +99,13 @@ MQTT Explorer 是一个浏览和查看特定 MQTT Broker 主题结构的有用 在此情况下,`origin/a/wis2/#` 将订阅 `origin/a/wis2` 主题下的所有主题。 -点击 'BACK',然后点击 'SAVE' 保存您的连接和订阅详细信息。接着点击 'CONNECT': +点击 'BACK',然后点击 'SAVE' 保存您的连接和订阅详细信息。然后点击 'CONNECT': -消息应开始出现在您的 MQTT Explorer 会话中,如下所示: +消息应该开始出现在您的 MQTT Explorer 会话中,如下所示: mqtt-explorer-global-broker-topics -现在,您已准备好开始探索 WIS2 的主题和消息结构。 +您现在可以开始探索 WIS2 的主题和消息结构。 ## 练习 1:查看 WIS2 主题结构 @@ -117,17 +117,17 @@ MQTT Explorer 是一个浏览和查看特定 MQTT Broker 主题结构的有用 ??? success "点击查看答案" - 您可以点击 MQTT Explorer 左侧窗口,展开主题结构。 + 您可以点击 MQTT Explorer 左侧窗口以展开主题结构。 我们可以通过查看主题结构的第四层来区分发布数据的 WIS 中心。例如,以下主题: `origin/a/wis2/br-inmet/data/core/weather/surface-based-observations/synop` - 告诉我们数据是由 WIS 中心 `br-inmet` 发布的,这是巴西 Instituto Nacional de Meteorologia - INMET 的中心 ID。 + 告诉我们数据是由中心 ID 为 `br-inmet` 的 WIS 中心发布的,该中心 ID 对应巴西的 Instituto Nacional de Meteorologia - INMET。 !!! question - 我们如何区分由托管 GTS-to-WIS2 网关的 WIS 中心发布的消息和由托管 WIS2 Node 的 WIS 中心发布的消息? + 我们如何区分由托管 GTS-to-WIS2 网关的 WIS 中心发布的消息与托管 WIS2 节点的 WIS 中心发布的消息? ??? success "点击查看答案" @@ -135,11 +135,11 @@ MQTT Explorer 是一个浏览和查看特定 MQTT Broker 主题结构的有用 `origin/a/wis2/de-dwd-gts-to-wis2/data/core/I/S/A/I/01/sbbr` - 告诉我们数据是由德国 Deutscher Wetterdienst (DWD) 托管的 GTS-to-WIS2 网关发布的。GTS-to-WIS2 网关是一种特殊类型的数据发布者,它将来自全球电信系统 (GTS) 的数据发布到 WIS2。主题结构由 GTS 消息的 TTAAii CCCC 头组成。 + 告诉我们数据是由德国 Deutscher Wetterdienst (DWD) 托管的 GTS-to-WIS2 网关发布的。GTS-to-WIS2 网关是一种特殊类型的数据发布者,它将来自全球电信系统 (GTS) 的数据发布到 WIS2。主题结构由 GTS 消息的 TTAAii CCCC 标头组成。 ## 练习 2:查看 WIS2 消息结构 -断开 MQTT Explorer 的连接,并更新 'Advanced' 部分,将订阅更改为以下内容: +断开 MQTT Explorer 的连接,并更新 'Advanced' 部分以更改订阅为以下内容: * `origin/a/wis2/+/data/core/weather/surface-based-observations/synop` * `cache/a/wis2/+/data/core/weather/surface-based-observations/synop` @@ -151,7 +151,7 @@ MQTT Explorer 是一个浏览和查看特定 MQTT Broker 主题结构的有用 重新连接到 Global Broker 并等待消息出现。 -您可以在右侧的 "Value" 部分查看 WIS2 消息的内容。尝试展开主题结构,查看消息的不同层级,直到到达最后一层,并查看其中一条消息的内容。 +您可以在右侧的 "Value" 部分查看 WIS2 消息的内容。尝试展开主题结构以查看消息的不同层级,直到到达最后一层并查看其中一条消息的内容。 !!! question @@ -171,15 +171,15 @@ MQTT Explorer 是一个浏览和查看特定 MQTT Broker 主题结构的有用 ??? success "点击查看答案" - URL 包含在 `links` 部分,`rel="canonical"`,由 `href` 键定义。 + URL 包含在 `links` 部分,`rel="canonical"` 并由 `href` 键定义。 - 您可以复制该 URL 并将其粘贴到浏览器中下载数据。 + 您可以复制该 URL 并将其粘贴到网络浏览器中以下载数据。 -## 练习 3:查看 'origin' 和 'cache' 主题的区别 +## 练习 3:查看 'origin' 和 'cache' 主题之间的区别 确保您仍然使用 `origin/a/wis2/+/data/core/weather/surface-based-observations/synop` 和 `cache/a/wis2/+/data/core/weather/surface-based-observations/synop` 主题订阅连接到 Global Broker,如练习 2 中所述。 -尝试识别在 `origin` 和 `cache` 主题上由相同中心 ID 发布的消息。 +尝试识别一个由相同中心 ID 发布的消息,该消息同时出现在 `origin` 和 `cache` 主题中。 !!! question @@ -187,11 +187,11 @@ MQTT Explorer 是一个浏览和查看特定 MQTT Broker 主题结构的有用 ??? success "点击查看答案" - 发布在 `origin` 主题上的消息是 Global Broker 从网络中的 WIS2 Node 重新发布的原始消息。 + 发布在 `origin` 主题上的消息是 Global Broker 从网络中的 WIS2 Nodes 重新发布的原始消息。 - 发布在 `cache` 主题上的消息是 Global Cache 下载数据后重新发布的消息。如果您检查以 `cache` 开头的主题中的消息内容,您会发现 'canonical' 链接已更新为一个新的 URL。 + 发布在 `cache` 主题上的消息是 Global Cache 下载数据后的消息。如果您检查从以 `cache` 开头的主题发布的消息内容,您会发现 'canonical' 链接已更新为一个新的 URL。 - WIS2 网络中有多个 Global Cache,因此您将收到每个下载该消息的 Global Cache 发布的一条消息。 + WIS2 网络中有多个 Global Cache,因此您将收到来自每个下载该消息的 Global Cache 的一条消息。 Global Cache 仅下载并重新发布发布在 `../data/core/...` 主题层级上的消息。 @@ -201,8 +201,8 @@ MQTT Explorer 是一个浏览和查看特定 MQTT Broker 主题结构的有用 在本次实践课程中,您学习了: - 如何使用 MQTT Explorer 订阅 WIS2 Global Broker 服务 - - WIS2 的主题结构 - - WIS2 的通知消息结构 - - 核心数据和推荐数据的区别 + - WIS2 主题结构 + - WIS2 通知消息结构 + - 核心数据和推荐数据之间的区别 - GTS-to-WIS2 网关使用的主题结构 - - 发布在 `origin` 和 `cache` 主题上的 Global Broker 消息的区别 \ No newline at end of file + - 发布在 `origin` 和 `cache` 主题上的 Global Broker 消息之间的区别 \ No newline at end of file diff --git a/documentation/docs/zh/practical-sessions/initializing-wis2box.md b/documentation/docs/zh/practical-sessions/initializing-wis2box.md index f5d9f46f5..3af5058a5 100644 --- a/documentation/docs/zh/practical-sessions/initializing-wis2box.md +++ b/documentation/docs/zh/practical-sessions/initializing-wis2box.md @@ -6,23 +6,23 @@ title: 初始化 wis2box !!! abstract "学习目标" - 在本次实践课程结束时,您将能够: + 完成本次实践课程后,您将能够: - 运行 `wis2box-create-config.py` 脚本以创建初始配置 - - 启动 wis2box 并检查其组件的状态 + - 启动 wis2box 并检查其组件状态 - 查看 **wis2box-api** 的内容 - 访问 **wis2box-webapp** - 使用 MQTT Explorer 连接到本地 **wis2box-broker** !!! note - 当前的培训材料基于 wis2box-release 1.2.0。 + 当前培训材料基于 wis2box-release 1.3.0。 - 如果您在本地培训课程之外运行本次培训,请参阅 [accessing-your-student-vm](./accessing-your-student-vm.md) 以获取有关如何下载和安装 wis2box 软件栈的说明。 + 如果您在本地培训课程之外运行此培训,请参阅 [accessing-your-student-vm](./accessing-your-student-vm.md) 了解如何下载和安装 wis2box 软件栈的说明。 ## 准备工作 -使用您的用户名和密码登录到指定的虚拟机(VM),并确保您位于 `wis2box` 目录中: +使用您的用户名和密码登录到指定的虚拟机,并确保您位于 `wis2box` 目录中: ```bash cd ~/wis2box @@ -30,18 +30,18 @@ cd ~/wis2box ## 创建初始配置 -创建 wis2box 的初始配置需要以下内容: +创建 wis2box 的初始配置需要: - 一个包含配置参数的环境文件 `wis2box.env` -- 主机与 wis2box 容器之间共享的目录,该目录由环境变量 `WIS2BOX_HOST_DATADIR` 定义 +- 主机上的一个目录,用于在主机和 wis2box 容器之间共享,由环境变量 `WIS2BOX_HOST_DATADIR` 定义 -可以使用 `wis2box-create-config.py` 脚本来创建 wis2box 的初始配置。 +可以使用 `wis2box-create-config.py` 脚本来创建您的 wis2box 的初始配置。 -脚本会向您提出一系列问题以帮助设置配置。 +脚本会询问您一系列问题以帮助设置配置。 脚本完成后,您可以查看并更新配置文件。 -按以下方式运行脚本: +运行脚本: ```bash python3 wis2box-create-config.py @@ -51,7 +51,7 @@ python3 wis2box-create-config.py 脚本会要求您输入用于 `WIS2BOX_HOST_DATADIR` 环境变量的目录。 -请注意,您需要定义此目录的完整路径。 +请注意,您需要定义该目录的完整路径。 例如,如果您的用户名是 `username`,目录的完整路径为 `/home/username/wis2box-data`: @@ -68,7 +68,7 @@ The directory /home/username/wis2box-data has been created. ### wis2box URL -接下来,您将被要求输入 wis2box 的 URL。此 URL 将用于访问 wis2box 的 Web 应用程序、API 和用户界面。 +接下来,您将被要求输入您的 wis2box 的 URL。此 URL 将用于访问 wis2box 的 Web 应用程序、API 和 UI。 请使用 `http://` 作为 URL。 @@ -86,11 +86,11 @@ Is this correct? (y/n/exit) 当提示输入 `WIS2BOX_WEBAPP_PASSWORD`、`WIS2BOX_STORAGE_PASSWORD` 和 `WIS2BOX_BROKER_PASSWORD` 时,您可以选择随机生成密码或自行定义。 -无需担心记住这些密码,它们将存储在 `wis2box.env` 文件中,位于您的 wis2box 目录中。 +无需担心记住这些密码,它们将存储在您 wis2box 目录中的 `wis2box.env` 文件中。 ### 检查 `wis2box.env` -脚本完成后,检查当前目录中 `wis2box.env` 文件的内容: +脚本完成后,检查当前目录中的 `wis2box.env` 文件内容: ```bash cat ~/wis2box/wis2box.env @@ -106,7 +106,7 @@ cat ~/wis2box/wis2box.env WIS2BOX_BASEMAP_URL 的默认值是 `https://{s}.tile.openstreetmap.org/{z}/{x}/{y}.png`。 - 此 URL 指向 OpenStreetMap 瓦片服务器。如果您想使用其他地图提供商,可以将此 URL 更改为指向其他瓦片服务器。 + 此 URL 指向 OpenStreetMap 瓦片服务器。如果您希望使用其他地图提供商,可以将此 URL 更改为指向其他瓦片服务器。 !!! question @@ -116,7 +116,7 @@ cat ~/wis2box/wis2box.env WIS2BOX_STORAGE_DATA_RETENTION_DAYS 的默认值是 30 天。如果需要,您可以将此值更改为其他天数。 - wis2box-management 容器会每天运行一个 cronjob,从 `wis2box-public` 存储桶和 API 后端中删除超过 WIS2BOX_STORAGE_DATA_RETENTION_DAYS 定义天数的数据: + wis2box-management 容器每天运行一个 cronjob,删除 `wis2box-public` 存储桶和 API 后端中超过 WIS2BOX_STORAGE_DATA_RETENTION_DAYS 定义天数的数据: ```{.copy} 0 0 * * * su wis2box -c "wis2box data clean --days=$WIS2BOX_STORAGE_DATA_RETENTION_DAYS" @@ -124,11 +124,11 @@ cat ~/wis2box/wis2box.env !!! note - `wis2box.env` 文件包含定义 wis2box 配置的环境变量。有关更多信息,请参阅 [wis2box-documentation](https://docs.wis2box.wis.wmo.int/en/latest/reference/configuration.html)。 + `wis2box.env` 文件包含定义 wis2box 配置的环境变量。有关更多信息,请参考 [wis2box-documentation](https://docs.wis2box.wis.wmo.int/en/latest/reference/configuration.html)。 - 除非您确定所做更改,否则不要编辑 `wis2box.env` 文件。不正确的更改可能导致 wis2box 无法正常工作。 + 除非您确定所做的更改,否则不要编辑 `wis2box.env` 文件。不正确的更改可能导致您的 wis2box 无法正常工作。 - 请勿与任何人分享 `wis2box.env` 文件的内容,因为其中包含密码等敏感信息。 + 请勿与任何人共享您的 `wis2box.env` 文件内容,因为其中包含敏感信息,例如密码。 ## 启动 wis2box @@ -148,11 +148,11 @@ python3 wis2box-ctl.py start ``` No docker-compose.images-*.yml files found, creating one -Current version=Undefined, latest version=1.2.0 +Current version=Undefined, latest version=1.3.0 Would you like to update ? (y/n/exit) ``` -选择 ``y``,脚本将创建文件 ``docker-compose.images-1.2.0.yml``,下载所需的 Docker 镜像并启动服务。 +选择 ``y``,脚本将创建文件 ``docker-compose.images-1.3.0.yml``,下载所需的 Docker 镜像并启动服务。 根据您的网络连接速度,下载镜像可能需要一些时间。此步骤仅在首次启动 wis2box 时需要。 @@ -169,9 +169,9 @@ python3 wis2box-ctl.py status 服务定义在 `~/wis2box/` 目录中的各种 `docker-compose*.yml` 文件中。 - Python 脚本 `wis2box-ctl.py` 用于运行底层的 Docker Compose 命令以控制 wis2box 服务。 + Python 脚本 `wis2box-ctl.py` 用于运行底层 Docker Compose 命令以控制 wis2box 服务。 - 您无需了解 Docker 容器的详细信息即可运行 wis2box 软件栈,但您可以检查 `docker-compose*.yml` 文件以查看服务的定义。如果您有兴趣了解更多关于 Docker 的信息,可以参考 [Docker 文档](https://docs.docker.com/)。 + 您无需了解 Docker 容器的详细信息即可运行 wis2box 软件栈,但可以查看 `docker-compose*.yml` 文件以了解服务的定义。如果您对 Docker 感兴趣,可以在 [Docker 文档](https://docs.docker.com/) 中找到更多信息。 要登录到 wis2box-management 容器,请使用以下命令: @@ -179,7 +179,7 @@ python3 wis2box-ctl.py status python3 wis2box-ctl.py login ``` -注意,登录后,您的提示符将发生变化,表明您现在位于 wis2box-management 容器内: +注意,登录后您的提示符会发生变化,表明您现在位于 wis2box-management 容器内: ```{bash} root@025381da3c40:/home/wis2box# @@ -188,7 +188,7 @@ root@025381da3c40:/home/wis2box# 在 wis2box-management 容器内,您可以运行各种命令来管理您的 wis2box,例如: - `wis2box auth add-token --path processes/wis2box`:为 *processes/wis2box* 端点创建授权令牌 -- `wis2box data clean --days=`:从 *wis2box-public* 存储桶中清理超过指定天数的数据 +- `wis2box data clean --days=`:清理 *wis2box-public* 存储桶中超过指定天数的数据 要退出容器并返回主机,请使用以下命令: @@ -196,37 +196,35 @@ root@025381da3c40:/home/wis2box# exit ``` -运行以下命令以查看主机上运行的 Docker 容器: +运行以下命令查看主机上运行的 Docker 容器: ```{.copy} docker ps --format "table {{.Names}} \t{{.Status}} \t{{.Image}}" ``` -您应该会看到以下容器正在运行: +您应该看到以下容器正在运行: ```{bash} -NAMES STATUS IMAGE -elasticsearch docker.elastic.co/elasticsearch/elasticsearch:8.6.2 "/bin/tini -- /usr/l…" elasticsearch 大约一分钟前 运行中大约一分钟 (健康) 9200/tcp, 9300/tcp -elasticsearch-exporter quay.io/prometheuscommunity/elasticsearch-exporter:latest "/bin/elasticsearch_…" elasticsearch-exporter 大约一分钟前 运行中大约一分钟 7979/tcp -grafana grafana/grafana-oss:9.0.3 "/run.sh" grafana 大约一分钟前 运行中大约一分钟 0.0.0.0:3000->3000/tcp -loki grafana/loki:2.4.1 "/usr/bin/loki -conf…" loki 大约一分钟前 运行中大约一分钟 3100/tcp -mosquitto ghcr.io/world-meteorological-organization/wis2box-broker:1.2.0 "/docker-entrypoint.…" mosquitto 大约一分钟前 运行中大约一分钟 0.0.0.0:1883->1883/tcp, 0.0.0.0:8884->8884/tcp -mqtt_metrics_collector ghcr.io/world-meteorological-organization/wis2box-mqtt-metrics-collector:1.2.0 "python3 -u mqtt_met…" mqtt_metrics_collector 大约一分钟前 运行中10秒 8000/tcp, 0.0.0.0:8001->8001/tcp -nginx nginx:alpine "/docker-entrypoint.…" web-proxy 大约一分钟前 运行中9秒 0.0.0.0:80->80/tcp -prometheus prom/prometheus:v2.37.0 "/bin/prometheus --c…" prometheus 大约一分钟前 运行中大约一分钟 9090/tcp -wis2box-api ghcr.io/world-meteorological-organization/wis2box-api:1.2.0 "/app/docker/es-entr…" wis2box-api 大约一分钟前 运行中36秒 (健康) -wis2box-auth ghcr.io/world-meteorological-organization/wis2box-auth:1.2.0 "/entrypoint.sh" wis2box-auth 大约一分钟前 运行中10秒 -wis2box-management ghcr.io/world-meteorological-organization/wis2box-management:1.2.0 "/home/wis2box/entry…" wis2box-management 大约一分钟前 运行中12秒 -wis2box-minio minio/minio:RELEASE.2024-08-03T04-33-23Z-cpuv1 "/usr/bin/docker-ent…" minio 大约一分钟前 运行中大约一分钟 (健康) 0.0.0.0:8022->8022/tcp, 0.0.0.0:9000-9001->9000-9001/tcp -wis2box-ui ghcr.io/world-meteorological-organization/wis2box-ui:1.2.0 "/docker-entrypoint.…" wis2box-ui 大约一分钟前 运行中35秒 0.0.0.0:9999->80/tcp -wis2box-webapp ghcr.io/world-meteorological-organization/wis2box-webapp:1.2.0 "sh /wis2box-webapp/…" wis2box-webapp 大约一分钟前 运行中大约一分钟 (不健康) 4173/tcp -wis2downloader ghcr.io/wmo-im/wis2downloader:v0.3.2 "/home/wis2downloade…" wis2downloader 大约一分钟前 运行中大约一分钟 (健康) - +NAMES STATUS IMAGE +nginx Up 56 seconds nginx:1.30.1-alpine +mqtt_metrics_collector Up 58 seconds ghcr.io/world-meteorological-organization/wis2box-mqtt-metrics-collector:1.3.0 +wis2box-auth Up 59 seconds ghcr.io/world-meteorological-organization/wis2box-auth:1.3.0 +wis2box-ui Up About a minute ghcr.io/world-meteorological-organization/wis2box-ui:1.3.0 +wis2box-management Up About a minute ghcr.io/world-meteorological-organization/wis2box-management:1.3.0 +wis2box-minio Up 2 minutes (healthy) ghcr.io/world-meteorological-organization/wis2box-minio:latest +wis2box-api Up About a minute (healthy) ghcr.io/world-meteorological-organization/wis2box-api:1.3.0 +elasticsearch Up 2 minutes (healthy) docker.elastic.co/elasticsearch/elasticsearch:8.6.2 +grafana Up 2 minutes grafana/grafana-oss:12.4.2 +loki Up 2 minutes grafana/loki:2.4.1 +elasticsearch-exporter Up 2 minutes quay.io/prometheuscommunity/elasticsearch-exporter:latest +prometheus Up 2 minutes prom/prometheus:v2.37.0 +mosquitto Up 2 minutes ghcr.io/world-meteorological-organization/wis2box-broker:1.3.0 +wis2box-webapp Up 2 minutes (healthy) ghcr.io/world-meteorological-organization/wis2box-webapp:1.3.0 ``` 这些容器是 wis2box 软件栈的一部分,提供运行 wis2box 所需的各种服务。 -运行以下命令查看主机上运行的 Docker 卷: +运行以下命令以查看主机机器上运行的 Docker 卷: ```{.copy} docker volume ls @@ -241,19 +239,19 @@ docker volume ls - wis2box_project_loki-data - wis2box_project_mosquitto-config -以及一些由不同容器使用的匿名卷。 +以及一些由各种容器使用的匿名卷。 -以 `wis2box_project_` 开头的卷用于存储 wis2box 软件栈中各种服务的持久化数据。 +以 `wis2box_project_` 开头的卷用于存储 wis2box 软件栈中各种服务的持久数据。 ## wis2box API wis2box 包含一个 API(应用程序编程接口),提供数据访问和处理功能,用于交互式可视化、数据转换和发布。 -打开一个新标签页,导航到页面 `http://YOUR-HOST/oapi`。 +打开一个新标签页并导航到页面 `http://YOUR-HOST/oapi`。 wis2box-api.png -这是 wis2box API 的登录页面(通过 **wis2box-api** 容器运行)。 +这是 wis2box API 的主页(通过 **wis2box-api** 容器运行)。 !!! question @@ -261,32 +259,32 @@ wis2box 包含一个 API(应用程序编程接口),提供数据访问和 ??? success "点击查看答案" - 要查看 API 当前可用的集合,请点击 `View the collections in this service`: + 要查看通过 API 当前可用的集合,请点击 `View the collections in this service`: wis2box-api-collections.png - 当前可用的集合包括: + 当前可用的集合如下: - - Stations - - Data notifications - - Discovery metadata + - 站点 + - 数据通知 + - 发现元数据 !!! question - 已发布了多少条数据通知? + 已发布了多少数据通知? ??? success "点击查看答案" - 点击 "Data notifications",然后点击 `Browse through the items of "Data Notifications"`。 + 点击 "Data notifications",然后点击 `Browse through the items of "Data Notifications"`。 您会注意到页面显示 "No items",因为尚未发布任何数据通知。 ## wis2box webapp -打开一个浏览器,访问页面 `http://YOUR-HOST/wis2box-webapp`。 +打开一个网页浏览器并访问页面 `http://YOUR-HOST/wis2box-webapp`。 -您将看到一个弹出窗口,要求输入用户名和密码。使用默认用户名 `wis2box-user` 和在 `wis2box.env` 文件中定义的 `WIS2BOX_WEBAPP_PASSWORD`,然后点击 "Sign in": +您会看到一个弹窗要求输入用户名和密码。使用默认用户名 `wis2box-user` 和在 `wis2box.env` 文件中定义的 `WIS2BOX_WEBAPP_PASSWORD`,然后点击 "Sign in": !!! note @@ -296,14 +294,14 @@ wis2box 包含一个 API(应用程序编程接口),提供数据访问和 cat ~/wis2box/wis2box.env | grep WIS2BOX_WEBAPP_PASSWORD ``` -登录后,将鼠标移动到左侧菜单以查看 wis2box Web 应用程序中可用的选项: +登录后,将鼠标移到左侧菜单以查看 wis2box Web 应用程序中可用的选项: wis2box-webapp-menu.png -这是 wis2box Web 应用程序,您可以通过它与您的 wis2box 交互: +这是 wis2box Web 应用程序,用于与您的 wis2box 进行交互: - 创建和管理数据集 -- 更新/查看您的站点元数据 +- 更新/审查您的站点元数据 - 使用 FM-12 synop 表单上传手动观测数据 - 监控在您的 wis2box-broker 上发布的通知 @@ -317,7 +315,7 @@ wis2box 包含一个 API(应用程序编程接口),提供数据访问和 mqtt-explorer-new-connection.png -您可以点击 'ADVANCED' 按钮,并验证您已订阅以下主题: +您可以点击 'ADVANCED' 按钮并验证您已订阅以下主题: - `#` - `$SYS/#` @@ -326,17 +324,17 @@ wis2box 包含一个 API(应用程序编程接口),提供数据访问和 !!! note - `#` 主题是一个通配符订阅,将订阅 broker 上发布的所有主题。 + `#` 主题是一个通配符订阅,它将订阅 broker 上发布的所有主题。 发布在 `$SYS` 主题下的消息是由 mosquitto 服务本身发布的系统消息。 -使用以下连接详细信息,确保将 `` 的值替换为您的主机名,将 `` 的值替换为您的 `wis2box.env` 文件中的值: +使用以下连接详细信息,确保将 `` 的值替换为您的主机名,并将 `` 的值替换为您的 `wis2box.env` 文件中的值: -- **Protocol: mqtt://** -- **Host: ``** -- **Port: 1883** -- **Username: wis2box** -- **Password: ``** +- **协议:mqtt://** +- **主机:``** +- **端口:1883** +- **用户名:wis2box** +- **密码:``** !!! note @@ -352,20 +350,22 @@ wis2box 包含一个 API(应用程序编程接口),提供数据访问和 然后点击 "CONNECT" 连接到您的 **wis2box-broker**。 -mqtt-explorer-wis2box-broker.png +mqtt-explorer-wis2box-broker-port1883.png -一旦连接成功,验证您的代理是否在 `$SYS` 主题下发布了内部 mosquitto 统计信息: +连接后,您将看到您的 broker 在 `$SYS` 主题下发布的内部 mosquitto 统计信息: mqtt-explorer-sys-topic.png -保持 MQTT Explorer 打开状态,因为我们将使用它来监控代理上发布的消息。 +同样的连接也可以通过 WebSockets 使用 MQTT 在端口 80 上实现,连接详细信息如下: + +mqtt-explorer-wis2box-broker-websockets.png -## 结论 +## 总结 !!! success "恭喜!" - 在本次实践课程中,您学会了: + 在本次实践课程中,您学习了如何: - 运行 `wis2box-create-config.py` 脚本以创建初始配置 - - 启动 wis2box 并检查其组件的状态 + - 启动 wis2box 并检查其组件状态 - 在浏览器中访问 wis2box-webapp 和 wis2box-API - - 使用 MQTT Explorer 连接到学生虚拟机上的 MQTT 代理 \ No newline at end of file + - 使用 MQTT Explorer 连接到学生虚拟机上的 MQTT broker \ No newline at end of file From 0833f852493212dc0d9b34315c91bf319f4ab56f Mon Sep 17 00:00:00 2001 From: Tom Kralidis Date: Wed, 3 Jun 2026 10:44:18 -0400 Subject: [PATCH 3/4] Update adding-gts-headers-to-wis2-notifications.md --- .../adding-gts-headers-to-wis2-notifications.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/documentation/docs/en/practical-sessions/adding-gts-headers-to-wis2-notifications.md b/documentation/docs/en/practical-sessions/adding-gts-headers-to-wis2-notifications.md index 9e8125e4a..9406ad861 100644 --- a/documentation/docs/en/practical-sessions/adding-gts-headers-to-wis2-notifications.md +++ b/documentation/docs/en/practical-sessions/adding-gts-headers-to-wis2-notifications.md @@ -40,9 +40,9 @@ This file should be placed in the directory defined by `WIS2BOX_HOST_DATADIR` in As of wis2box-1.3.0, data publishers have two options to (optionally) add GTS properties to their notifications: -1. For files uploaded into MinIO, prepare mapping-file “gts_headers_mappings.csv” with required properties. +1. For files uploaded into MinIO, prepare mapping-file `gts_headers_mappings.csv` with required properties. -2. For data input using FM-12 SYNOP form in wis2box-webapp, select “Add GTS headers” and provide manually input +2. For data input using FM-12 SYNOP form in wis2box-webapp, select `Add GTS headers` and provide manually input ## Preparation From 0ab728140937abbed65457b5ae9e7dfc63a50e1a Mon Sep 17 00:00:00 2001 From: github-actions Date: Wed, 3 Jun 2026 14:54:23 +0000 Subject: [PATCH 4/4] Auto-translated docs --- .../accessing-your-student-vm.md | 28 +++--- ...dding-gts-headers-to-wis2-notifications.md | 20 ++-- .../connecting-to-wis2-over-mqtt.md | 92 +++++++++---------- .../initializing-wis2box.md | 90 +++++++++--------- .../accessing-your-student-vm.md | 40 ++++---- ...dding-gts-headers-to-wis2-notifications.md | 34 +++---- .../connecting-to-wis2-over-mqtt.md | 46 +++++----- .../initializing-wis2box.md | 44 ++++----- .../accessing-your-student-vm.md | 16 ++-- ...dding-gts-headers-to-wis2-notifications.md | 44 ++++----- .../connecting-to-wis2-over-mqtt.md | 82 ++++++++--------- .../initializing-wis2box.md | 36 ++++---- .../accessing-your-student-vm.md | 50 +++++----- ...dding-gts-headers-to-wis2-notifications.md | 66 ++++++------- .../connecting-to-wis2-over-mqtt.md | 44 ++++----- .../initializing-wis2box.md | 87 +++++++++--------- .../accessing-your-student-vm.md | 48 +++++----- ...dding-gts-headers-to-wis2-notifications.md | 90 +++++++++--------- .../connecting-to-wis2-over-mqtt.md | 44 ++++----- .../initializing-wis2box.md | 64 ++++++------- 20 files changed, 532 insertions(+), 533 deletions(-) diff --git a/documentation/docs/ar/practical-sessions/accessing-your-student-vm.md b/documentation/docs/ar/practical-sessions/accessing-your-student-vm.md index f4654c0ed..6bcb2fec5 100644 --- a/documentation/docs/ar/practical-sessions/accessing-your-student-vm.md +++ b/documentation/docs/ar/practical-sessions/accessing-your-student-vm.md @@ -10,7 +10,7 @@ title: الوصول إلى جهاز الطالب الافتراضي - الوصول إلى جهاز الطالب الافتراضي الخاص بك عبر SSH وWinSCP - التحقق من تثبيت البرامج المطلوبة للتمارين العملية - - التحقق من أنك تمتلك مواد التمارين لهذا التدريب على جهاز الطالب الافتراضي الخاص بك + - التحقق من أن لديك الوصول إلى مواد التمارين لهذا التدريب على جهاز الطالب الافتراضي الخاص بك ## المقدمة @@ -26,7 +26,7 @@ title: الوصول إلى جهاز الطالب الافتراضي !!! note - إذا كنت ترغب في تنفيذ هذا التدريب خارج جلسة تدريب محلية، يمكنك توفير جهاز افتراضي خاص بك باستخدام أي مزود خدمة سحابية، على سبيل المثال: + إذا كنت ترغب في إجراء هذا التدريب خارج جلسة تدريب محلية، يمكنك توفير جهاز افتراضي خاص بك باستخدام أي مزود خدمة سحابية، على سبيل المثال: - GCP (Google Cloud Platform) VM instance `e2-medium` - AWS (Amazon Web Services) ec2-instance `t3a.medium` @@ -34,7 +34,7 @@ title: الوصول إلى جهاز الطالب الافتراضي اختر Ubuntu Server 22.0.4 LTS كنظام تشغيل. - بعد إنشاء الجهاز الافتراضي، تأكد من تثبيت python وdocker وdocker compose، كما هو موضح في [wis2box-software-dependencies](https://docs.wis2box.wis.wmo.int/en/latest/user/getting-started.html#software-dependencies). + بعد إنشاء الجهاز الافتراضي الخاص بك، تأكد من تثبيت python وdocker وdocker compose، كما هو موضح في [wis2box-software-dependencies](https://docs.wis2box.wis.wmo.int/en/latest/user/getting-started.html#software-dependencies). يمكن تنزيل أرشيف الإصدار الخاص بـwis2box المستخدم في هذا التدريب كما يلي: @@ -59,11 +59,11 @@ title: الوصول إلى جهاز الطالب الافتراضي pip3 install pywiscat ``` - إذا كنت تستخدم جهاز الطالب الافتراضي المقدم خلال جلسات التدريب المحلية لـWIS2، فسيكون البرنامج المطلوب مثبتًا بالفعل. + إذا كنت تستخدم جهاز الطالب الافتراضي المقدم خلال جلسات التدريب المحلية لـWIS2، فسيتم تثبيت البرامج المطلوبة مسبقًا. ## الاتصال بجهاز الطالب الافتراضي الخاص بك على الشبكة التدريبية المحلية -قم بتوصيل جهاز الكمبيوتر الخاص بك بشبكة Wi-Fi المحلية التي يتم بثها في القاعة أثناء تدريب WIS2 وفقًا للتعليمات المقدمة من المدرب. +قم بتوصيل جهاز الكمبيوتر الخاص بك بشبكة Wi-Fi المحلية التي يتم بثها في الغرفة أثناء تدريب WIS2 وفقًا للتعليمات المقدمة من المدرب. استخدم عميل SSH للاتصال بجهاز الطالب الافتراضي الخاص بك باستخدام المعلومات التالية: @@ -73,7 +73,7 @@ title: الوصول إلى جهاز الطالب الافتراضي - **كلمة المرور: (يتم توفيرها أثناء التدريب الشخصي)** !!! tip - تواصل مع المدرب إذا كنت غير متأكد من اسم المضيف/اسم المستخدم أو واجهت مشاكل في الاتصال. + تواصل مع المدرب إذا كنت غير متأكد من اسم المضيف/اسم المستخدم أو واجهت مشكلات في الاتصال. بمجرد الاتصال، يرجى تغيير كلمة المرور الخاصة بك لضمان عدم تمكن الآخرين من الوصول إلى جهازك الافتراضي: @@ -94,7 +94,7 @@ passwd: password updated successfully ```bash python3 --version ``` -الناتج: +النتيجة: ```console Python 3.10.12 ``` @@ -103,7 +103,7 @@ Python 3.10.12 ```bash docker --version ``` -الناتج: +النتيجة: ```console Docker version 24.0.6, build ed223bc ``` @@ -112,14 +112,14 @@ Docker version 24.0.6, build ed223bc ```bash docker compose version ``` -الناتج: +النتيجة: ```console Docker Compose version v2.21.0 ``` -لضمان أن المستخدم الخاص بك يمكنه تشغيل أوامر Docker، تم إضافة المستخدم الخاص بك إلى مجموعة `docker`. +لضمان أن المستخدم الخاص بك يمكنه تشغيل أوامر Docker، تمت إضافته إلى مجموعة `docker`. -لاختبار أن المستخدم الخاص بك يمكنه تشغيل docker hello-world، قم بتنفيذ الأمر التالي: +لاختبار أن المستخدم الخاص بك يمكنه تشغيل docker hello-world، قم بتشغيل الأمر التالي: ```bash docker run hello-world ``` @@ -142,7 +142,7 @@ This message shows that your installation appears to be working correctly. ```bash ls ~/ ``` -الناتج: +النتيجة: ```console exercise-materials wis2box ``` @@ -159,7 +159,7 @@ WinSCP ليس مطلوبًا للتدريب، ولكنه يمكن أن يكون انقر على 'Save' ثم 'Login' للاتصال بجهازك الافتراضي. -يجب أن تكون الآن قادرًا على رؤية محتويات دليل المنزل على جهاز الطالب الافتراضي الخاص بك والوصول إلى ملفاتك. +يجب أن تكون الآن قادرًا على رؤية محتوى دليل المنزل على جهاز الطالب الافتراضي الخاص بك والوصول إلى ملفاتك. ## الخاتمة @@ -168,4 +168,4 @@ WinSCP ليس مطلوبًا للتدريب، ولكنه يمكن أن يكون - الوصول إلى جهاز الطالب الافتراضي الخاص بك عبر SSH وWinSCP - التحقق من تثبيت البرامج المطلوبة للتمارين العملية - - التحقق من أنك تمتلك مواد التمارين لهذا التدريب على جهاز الطالب الافتراضي الخاص بك \ No newline at end of file + - التحقق من أن لديك الوصول إلى مواد التمارين لهذا التدريب على جهاز الطالب الافتراضي الخاص بك \ No newline at end of file diff --git a/documentation/docs/ar/practical-sessions/adding-gts-headers-to-wis2-notifications.md b/documentation/docs/ar/practical-sessions/adding-gts-headers-to-wis2-notifications.md index 16e664ae0..7778a4d7e 100644 --- a/documentation/docs/ar/practical-sessions/adding-gts-headers-to-wis2-notifications.md +++ b/documentation/docs/ar/practical-sessions/adding-gts-headers-to-wis2-notifications.md @@ -38,9 +38,9 @@ title: إضافة رؤوس GTS إلى إشعارات WIS2 - `TTAAii`: الرأس TTAAii الذي سيتم إضافته إلى إشعار WIS2 - `CCCC`: الرأس CCCC الذي سيتم إضافته إلى إشعار WIS2 -اعتبارًا من الإصدار `wis2box-1.3.0`، لدى ناشري البيانات خياران (اختياريان) لإضافة خصائص GTS إلى إشعاراتهم: +اعتبارًا من الإصدار `wis2box-1.3.0`، لدى ناشري البيانات خياران (اختياريًا) لإضافة خصائص GTS إلى إشعاراتهم: -1. بالنسبة للملفات التي يتم تحميلها إلى MinIO، قم بإعداد ملف الخريطة "gts_headers_mapping.csv" مع الخصائص المطلوبة. +1. بالنسبة للملفات التي يتم تحميلها إلى MinIO، قم بإعداد ملف الخريطة `gts_headers_mappings.csv` مع الخصائص المطلوبة. 2. بالنسبة لإدخال البيانات باستخدام نموذج FM-12 SYNOP في `wis2box-webapp`، اختر "إضافة رؤوس GTS" وقم بإدخال المعلومات يدويًا. @@ -50,17 +50,17 @@ title: إضافة رؤوس GTS إلى إشعارات WIS2 تأكد من أنك متصل بوسيط MQTT الخاص بمثيل `wis2box` الخاص بك باستخدام `MQTT Explorer`. يمكنك استخدام بيانات الاعتماد العامة `everyone/everyone` للاتصال بالوسيط. -تأكد من أن لديك متصفح ويب مفتوح مع لوحة تحكم Grafana لمثيلك عن طريق الذهاب إلى `http://YOUR-HOST:3000`. +تأكد من أن لديك متصفح ويب مفتوح مع لوحة تحكم Grafana لمثيلك من خلال الانتقال إلى `http://YOUR-HOST:3000`. ## التمرين 1: استخدام ملف خريطة للبيانات المحملة إلى MinIO -سيُظهر التمرين الأول كيفية إضافة رؤوس GTS للبيانات التي يتم تحميلها إلى MinIO باستخدام ملف خريطة باسم `gts_headers_mapping.csv`. +سيعرض التمرين الأول كيفية إضافة رؤوس GTS للبيانات التي يتم تحميلها إلى MinIO باستخدام ملف خريطة باسم `gts_headers_mapping.csv`. ### إنشاء `gts_headers_mapping.csv` لإضافة رؤوس GTS إلى إشعارات WIS2 الخاصة بك، يلزم وجود ملف CSV يربط رؤوس GTS بأسماء الملفات الواردة. -يجب تسمية ملف CSV (بالضبط) `gts_headers_mapping.csv` ويجب وضعه في الدليل المحدد بواسطة `WIS2BOX_HOST_DATADIR` في ملف `wis2box.env`. +يجب أن يكون اسم ملف CSV (بالضبط) `gts_headers_mapping.csv` ويجب وضعه في الدليل المحدد بواسطة `WIS2BOX_HOST_DATADIR` في ملف `wis2box.env`. انسخ الملف `exercise-materials/gts-headers-exercises/gts_headers_mapping.csv` إلى مثيل `wis2box` الخاص بك وضعه في الدليل المحدد بواسطة `WIS2BOX_HOST_DATADIR` في ملف `wis2box.env`. @@ -99,7 +99,7 @@ wis2box data ingest -p /data/wis2box/A_SMRO01YRBK171200_C_EDZW_20240717120502.tx تأكد من استبدال خيار `metadata-id` بالمعرف الصحيح لمجموعة البيانات الخاصة بك. -تحقق من لوحة تحكم Grafana لمعرفة ما إذا تم إدخال البيانات بشكل صحيح. إذا رأيت أي تحذيرات أو أخطاء، حاول إصلاحها وأعد تنفيذ الأمر `wis2box data ingest`. +تحقق من لوحة تحكم Grafana لمعرفة ما إذا تم إدخال البيانات بشكل صحيح. إذا رأيت أي تحذيرات أو أخطاء، حاول إصلاحها وكرر التمرين باستخدام الأمر `wis2box data ingest`. ### عرض رؤوس GTS في إشعار WIS2 @@ -126,8 +126,8 @@ AAXX 03094 !!! note يقوم المكون الإضافي `synop2bufr-plugin` في `wis2box` بتحويل رسائل FM-12 SYNOP إلى BUFR، لذا يجب أن يبدأ TTAAii بـ `IS`: - - I = بيانات الرصد (مشفر ثنائيًا) – BUFR - - S = سطح/مستوى البحر + - I = بيانات الرصد (مشفرة ثنائيًا) – BUFR + - S = السطح/مستوى سطح البحر ### إرسال نموذج FM-12 SYNOP يدويًا مع رؤوس GTS @@ -139,11 +139,11 @@ AAXX 03094 قدم رمز المصادقة المطلوب وأرسل النموذج. -من المحتمل أن ترى رسالة خطأ لأن هذه المحطة ليست في قائمة المحطات الخاصة بك. ستحتاج إلى إضافة المحطة "0-20000-0-64400" إلى قائمة المحطات الخاصة بك لكي يتم تحويل البيانات ونشرها بنجاح. +من المحتمل أن ترى رسالة خطأ لأن هذه المحطة ليست في قائمة المحطات الخاصة بك. ستحتاج إلى إضافة المحطة "0-20000-0-64400" إلى قائمة المحطات الخاصة بك حتى يتم تحويل البيانات ونشرها بنجاح. ### عرض رؤوس GTS في إشعار WIS2 -انتقل إلى `MQTT Explorer` وتحقق من رسالة إشعار WIS2 للبيانات التي قمت بإدخالها للتأكد من تضمين رؤوس GTS في الإشعار. +انتقل إلى `MQTT Explorer` وتحقق من رسالة إشعار WIS2 للبيانات التي قمت بإدخالها للتو لمعرفة ما إذا كانت رؤوس GTS مدرجة في الإشعار. ## الخاتمة diff --git a/documentation/docs/ar/practical-sessions/connecting-to-wis2-over-mqtt.md b/documentation/docs/ar/practical-sessions/connecting-to-wis2-over-mqtt.md index 9edabc2e8..dd5be7e10 100644 --- a/documentation/docs/ar/practical-sessions/connecting-to-wis2-over-mqtt.md +++ b/documentation/docs/ar/practical-sessions/connecting-to-wis2-over-mqtt.md @@ -9,14 +9,14 @@ title: الاتصال بـ WIS2 عبر MQTT بنهاية هذه الجلسة العملية، ستكون قادرًا على: - الاتصال بـ WIS2 Global Broker باستخدام MQTT Explorer - - مراجعة بنية المواضيع في WIS2 - - مراجعة بنية رسائل الإشعارات في WIS2 + - مراجعة هيكل المواضيع في WIS2 + - مراجعة هيكل رسائل الإشعارات في WIS2 ## المقدمة -يستخدم WIS2 بروتوكول MQTT للإعلان عن توفر بيانات الطقس/المناخ/المياه. يقوم WIS2 Global Broker بالاشتراك في جميع WIS2 Nodes في الشبكة ويعيد نشر الرسائل التي يتلقاها. يقوم Global Cache بالاشتراك في Global Broker، وتنزيل البيانات الموجودة في الرسالة، ثم يعيد نشر الرسالة على موضوع `cache` مع عنوان URL جديد. ينشر Global Discovery Catalogue بيانات الاكتشاف الوصفية من Broker ويوفر واجهة برمجة تطبيقات للبحث. +يستخدم WIS2 بروتوكول MQTT للإعلان عن توفر بيانات الطقس/المناخ/المياه. يقوم WIS2 Global Broker بالاشتراك في جميع WIS2 Nodes في الشبكة ويعيد نشر الرسائل التي يتلقاها. يقوم Global Cache بالاشتراك في Global Broker، وتنزيل البيانات الموجودة في الرسالة، ثم يعيد نشر الرسالة في موضوع `cache` مع عنوان URL جديد. ينشر Global Discovery Catalogue بيانات وصفية للاكتشاف من Broker ويوفر واجهة برمجة تطبيقات للبحث. -هذا مثال على بنية رسالة إشعار WIS2 لرسالة تم استلامها على الموضوع `origin/a/wis2/br-inmet/data/core/weather/surface-based-observations/synop`: +فيما يلي مثال على هيكل رسالة إشعار WIS2 لرسالة تم استلامها على الموضوع `origin/a/wis2/br-inmet/data/core/weather/surface-based-observations/synop`: ```json { @@ -61,22 +61,22 @@ title: الاتصال بـ WIS2 عبر MQTT } ``` -في هذه الجلسة العملية، ستتعلم كيفية استخدام أداة MQTT Explorer لإعداد اتصال عميل MQTT بـ WIS2 Global Broker وعرض رسائل إشعارات WIS2. +في هذه الجلسة العملية، ستتعلم كيفية استخدام أداة MQTT Explorer لإعداد اتصال عميل MQTT مع WIS2 Global Broker وعرض رسائل إشعارات WIS2. -MQTT Explorer هي أداة مفيدة لتصفح ومراجعة بنية المواضيع لأي MQTT broker لمراجعة البيانات التي يتم نشرها. +يُعد MQTT Explorer أداة مفيدة لتصفح ومراجعة هيكل المواضيع لأي MQTT broker لمراجعة البيانات المنشورة. !!! note "حول MQTT" - يوفر MQTT Explorer واجهة سهلة الاستخدام للاتصال بـ MQTT broker واستكشاف المواضيع وبنية الرسائل المستخدمة في WIS2. + يوفر MQTT Explorer واجهة سهلة الاستخدام للاتصال بـ MQTT broker واستكشاف المواضيع وهيكل الرسائل المستخدمة بواسطة WIS2. - في الممارسة العملية، يتم استخدام MQTT للتواصل بين الآلات، حيث يشترك تطبيق أو خدمة في المواضيع ويعالج الرسائل برمجيًا في الوقت الفعلي. + في الممارسة العملية، يُقصد باستخدام MQTT للتواصل بين الآلات، حيث يشترك تطبيق أو خدمة في المواضيع ويعالج الرسائل برمجيًا في الوقت الفعلي. - للعمل مع MQTT برمجيًا (على سبيل المثال، باستخدام Python)، يمكنك استخدام مكتبات عملاء MQTT مثل [paho-mqtt](https://pypi.org/project/paho-mqtt) للاتصال بـ MQTT broker ومعالجة الرسائل الواردة. هناك العديد من برامج عملاء وخوادم MQTT، حسب متطلباتك وبيئتك التقنية. + للعمل مع MQTT برمجيًا (على سبيل المثال، باستخدام Python)، يمكنك استخدام مكتبات عملاء MQTT مثل [paho-mqtt](https://pypi.org/project/paho-mqtt) للاتصال بـ MQTT broker ومعالجة الرسائل الواردة. توجد العديد من برامج عملاء وخوادم MQTT، حسب متطلباتك وبيئتك التقنية. ## استخدام MQTT Explorer للاتصال بـ Global Broker -لعرض الرسائل التي ينشرها WIS2 Global Broker، يمكنك استخدام "MQTT Explorer"، والذي يمكن تنزيله من [موقع MQTT Explorer](https://mqtt-explorer.com). +لعرض الرسائل المنشورة بواسطة WIS2 Global Broker، يمكنك استخدام "MQTT Explorer" الذي يمكن تنزيله من [موقع MQTT Explorer](https://mqtt-explorer.com). -افتح MQTT Explorer وأضف اتصالًا جديدًا بـ Global Broker المستضاف من قبل MeteoFrance باستخدام التفاصيل التالية: +افتح MQTT Explorer وأضف اتصالًا جديدًا بـ Global Broker المستضاف بواسطة MeteoFrance باستخدام التفاصيل التالية: - المضيف: globalbroker.meteo.fr - المنفذ: 8883 @@ -85,61 +85,61 @@ MQTT Explorer هي أداة مفيدة لتصفح ومراجعة بنية الم mqtt-explorer-global-broker-connection -انقر على زر 'ADVANCED'، قم بإزالة المواضيع المهيأة مسبقًا وأضف المواضيع التالية للاشتراك فيها: +انقر على زر 'ADVANCED'، وقم بإزالة المواضيع المُعدة مسبقًا وأضف المواضيع التالية للاشتراك فيها: - `origin/a/wis2/#` mqtt-explorer-global-broker-advanced !!! note - عند إعداد اشتراكات MQTT، يمكنك استخدام الرموز التالية: + عند إعداد اشتراكات MQTT، يمكنك استخدام الرموز العامة التالية: - - **مستوى واحد (+)**: رمز استبدال لمستوى واحد من المواضيع - - **مستويات متعددة (#)**: رمز استبدال لمستويات متعددة من المواضيع + - **مستوى واحد (+)**: الرمز العام لمستوى واحد يستبدل مستوى واحدًا من الموضوع + - **متعدد المستويات (#)**: الرمز العام متعدد المستويات يستبدل مستويات متعددة من الموضوع - في هذه الحالة، `origin/a/wis2/#` ستشترك في جميع المواضيع تحت موضوع `origin/a/wis2`. + في هذه الحالة، سيشترك `origin/a/wis2/#` في جميع المواضيع تحت موضوع `origin/a/wis2`. انقر على 'BACK'، ثم 'SAVE' لحفظ تفاصيل الاتصال والاشتراك. ثم انقر على 'CONNECT': -يجب أن تبدأ الرسائل بالظهور في جلسة MQTT Explorer كما يلي: +يجب أن تبدأ الرسائل في الظهور في جلسة MQTT Explorer الخاصة بك كما يلي: mqtt-explorer-global-broker-topics -أنت الآن جاهز لبدء استكشاف مواضيع WIS2 وبنية الرسائل. +أنت الآن جاهز لبدء استكشاف مواضيع WIS2 وهيكل الرسائل. -## التمرين 1: مراجعة بنية المواضيع في WIS2 +## التمرين 1: مراجعة هيكل المواضيع في WIS2 -استخدم MQTT لتصفح بنية المواضيع تحت مواضيع `origin`. +استخدم MQTT لتصفح هيكل المواضيع تحت مواضيع `origin`. !!! question - كيف يمكننا تمييز مركز WIS الذي نشر البيانات؟ + كيف يمكننا التمييز بين مركز WIS الذي نشر البيانات؟ -??? success "انقر لعرض الإجابة" +??? success "انقر للكشف عن الإجابة" - يمكنك النقر على نافذة الجانب الأيسر في MQTT Explorer لتوسيع بنية المواضيع. + يمكنك النقر على نافذة الجانب الأيسر في MQTT Explorer لتوسيع هيكل المواضيع. - يمكننا تمييز مركز WIS الذي نشر البيانات من خلال النظر إلى المستوى الرابع من بنية المواضيع. على سبيل المثال، الموضوع التالي: + يمكننا التمييز بين مركز WIS الذي نشر البيانات من خلال النظر إلى المستوى الرابع من هيكل الموضوع. على سبيل المثال، الموضوع التالي: `origin/a/wis2/br-inmet/data/core/weather/surface-based-observations/synop` - يخبرنا أن البيانات تم نشرها من مركز WIS مع المعرف `br-inmet`، وهو المعرف الخاص بـ Instituto Nacional de Meteorologia - INMET، البرازيل. + يخبرنا أن البيانات تم نشرها بواسطة مركز WIS مع المعرف `br-inmet`، وهو المعرف الخاص بـ Instituto Nacional de Meteorologia - INMET، البرازيل. !!! question - كيف يمكننا التمييز بين الرسائل المنشورة من مراكز WIS التي تستضيف بوابة GTS-to-WIS2 والرسائل المنشورة من مراكز WIS التي تستضيف WIS2 Node؟ + كيف يمكننا التمييز بين الرسائل المنشورة بواسطة مراكز WIS التي تستضيف بوابة GTS-to-WIS2 والرسائل المنشورة بواسطة مراكز WIS التي تستضيف WIS2 Node؟ -??? success "انقر لعرض الإجابة" +??? success "انقر للكشف عن الإجابة" - يمكننا التمييز بين الرسائل القادمة من بوابة GTS-to-WIS2 من خلال النظر إلى معرف المركز في بنية المواضيع. على سبيل المثال، الموضوع التالي: + يمكننا التمييز بين الرسائل القادمة من بوابة GTS-to-WIS2 من خلال النظر إلى معرف المركز في هيكل الموضوع. على سبيل المثال، الموضوع التالي: `origin/a/wis2/de-dwd-gts-to-wis2/data/core/I/S/A/I/01/sbbr` - يخبرنا أن البيانات تم نشرها من بوابة GTS-to-WIS2 المستضافة من قبل Deutscher Wetterdienst (DWD)، ألمانيا. بوابة GTS-to-WIS2 هي نوع خاص من ناشري البيانات الذين ينشرون البيانات من نظام الاتصالات العالمي (GTS) إلى WIS2. تتكون بنية المواضيع من رؤوس TTAAii CCCC لرسائل GTS. + يخبرنا أن البيانات تم نشرها بواسطة بوابة GTS-to-WIS2 المستضافة بواسطة Deutscher Wetterdienst (DWD)، ألمانيا. بوابة GTS-to-WIS2 هي نوع خاص من ناشري البيانات الذين ينشرون البيانات من نظام الاتصالات العالمي (GTS) إلى WIS2. يتكون هيكل الموضوع من رؤوس TTAAii CCCC لرسائل GTS. -## التمرين 2: مراجعة بنية رسائل WIS2 +## التمرين 2: مراجعة هيكل الرسائل في WIS2 -افصل الاتصال من MQTT Explorer وقم بتحديث قسم 'Advanced' لتغيير الاشتراك إلى ما يلي: +افصل الاتصال بـ MQTT Explorer وقم بتحديث قسم 'Advanced' لتغيير الاشتراك إلى ما يلي: * `origin/a/wis2/+/data/core/weather/surface-based-observations/synop` * `cache/a/wis2/+/data/core/weather/surface-based-observations/synop` @@ -147,21 +147,21 @@ MQTT Explorer هي أداة مفيدة لتصفح ومراجعة بنية الم mqtt-explorer-global-broker-topics-exercise2 !!! note - يتم استخدام الرمز `+` للاشتراك في جميع مراكز WIS. + يتم استخدام الرمز العام `+` للاشتراك في جميع مراكز WIS. -أعد الاتصال بـ Global Broker وانتظر حتى تظهر الرسائل. +أعد الاتصال بـ Global Broker وانتظر ظهور الرسائل. -يمكنك عرض محتوى رسالة WIS2 في قسم "Value" على الجانب الأيمن. حاول توسيع بنية المواضيع لرؤية المستويات المختلفة للرسالة حتى تصل إلى المستوى الأخير ومراجعة محتوى إحدى الرسائل. +يمكنك عرض محتوى رسالة WIS2 في قسم "Value" على الجانب الأيمن. حاول توسيع هيكل الموضوع لرؤية المستويات المختلفة للرسالة حتى تصل إلى المستوى الأخير وراجع محتوى الرسالة لإحدى الرسائل. !!! question كيف يمكننا تحديد الطابع الزمني الذي تم فيه نشر البيانات؟ وكيف يمكننا تحديد الطابع الزمني الذي تم فيه جمع البيانات؟ -??? success "انقر لعرض الإجابة" +??? success "انقر للكشف عن الإجابة" - الطابع الزمني الذي تم فيه نشر البيانات موجود في قسم `properties` من الرسالة بمفتاح `pubtime`. + الطابع الزمني الذي تم فيه نشر البيانات موجود في قسم `properties` من الرسالة مع مفتاح `pubtime`. - الطابع الزمني الذي تم فيه جمع البيانات موجود في قسم `properties` من الرسالة بمفتاح `datetime`. + الطابع الزمني الذي تم فيه جمع البيانات موجود في قسم `properties` من الرسالة مع مفتاح `datetime`. mqtt-explorer-global-broker-msg-properties @@ -169,23 +169,23 @@ MQTT Explorer هي أداة مفيدة لتصفح ومراجعة بنية الم كيف يمكننا تنزيل البيانات من عنوان URL المقدم في الرسالة؟ -??? success "انقر لعرض الإجابة" +??? success "انقر للكشف عن الإجابة" عنوان URL موجود في قسم `links` مع `rel="canonical"` ومحدد بواسطة المفتاح `href`. - يمكنك نسخ عنوان URL ولصقه في متصفح الويب لتنزيل البيانات. + يمكنك نسخ عنوان URL ولصقه في متصفح ويب لتنزيل البيانات. ## التمرين 3: مراجعة الفرق بين مواضيع 'origin' و 'cache' تأكد من أنك لا تزال متصلًا بـ Global Broker باستخدام اشتراكات المواضيع `origin/a/wis2/+/data/core/weather/surface-based-observations/synop` و `cache/a/wis2/+/data/core/weather/surface-based-observations/synop` كما هو موضح في التمرين 2. -حاول تحديد رسالة لنفس معرف المركز تم نشرها على كل من مواضيع `origin` و `cache`. +حاول تحديد رسالة لنفس معرف المركز المنشورة على كل من مواضيع `origin` و `cache`. !!! question ما الفرق بين الرسائل المنشورة على مواضيع `origin` و `cache`؟ -??? success "انقر لعرض الإجابة" +??? success "انقر للكشف عن الإجابة" الرسائل المنشورة على مواضيع `origin` هي الرسائل الأصلية التي يعيد Global Broker نشرها من WIS2 Nodes في الشبكة. @@ -193,7 +193,7 @@ MQTT Explorer هي أداة مفيدة لتصفح ومراجعة بنية الم هناك العديد من Global Caches في شبكة WIS2، لذلك ستتلقى رسالة واحدة من كل Global Cache قامت بتنزيل الرسالة. - يقوم Global Cache فقط بتنزيل وإعادة نشر الرسائل التي تم نشرها على التسلسل الهرمي للمواضيع `../data/core/...`. + يقوم Global Cache فقط بتنزيل وإعادة نشر الرسائل التي تم نشرها على التسلسل الهرمي للموضوع `../data/core/...`. ## الخاتمة @@ -201,8 +201,8 @@ MQTT Explorer هي أداة مفيدة لتصفح ومراجعة بنية الم في هذه الجلسة العملية، تعلمت: - كيفية الاشتراك في خدمات WIS2 Global Broker باستخدام MQTT Explorer - - بنية المواضيع في WIS2 - - بنية رسائل الإشعارات في WIS2 + - هيكل المواضيع في WIS2 + - هيكل رسائل الإشعارات في WIS2 - الفرق بين البيانات الأساسية والموصى بها - - بنية المواضيع المستخدمة بواسطة بوابة GTS-to-WIS2 - - الفرق بين الرسائل المنشورة على مواضيع `origin` و `cache` في Global Broker \ No newline at end of file + - هيكل المواضيع المستخدم بواسطة بوابة GTS-to-WIS2 + - الفرق بين رسائل Global Broker المنشورة على مواضيع `origin` و `cache` \ No newline at end of file diff --git a/documentation/docs/ar/practical-sessions/initializing-wis2box.md b/documentation/docs/ar/practical-sessions/initializing-wis2box.md index 9aaa4ee00..9b968638c 100644 --- a/documentation/docs/ar/practical-sessions/initializing-wis2box.md +++ b/documentation/docs/ar/practical-sessions/initializing-wis2box.md @@ -8,7 +8,7 @@ title: تهيئة wis2box بنهاية هذه الجلسة العملية، ستكون قادرًا على: - - تشغيل سكريبت `wis2box-create-config.py` لإنشاء التهيئة الأولية + - تشغيل سكربت `wis2box-create-config.py` لإنشاء الإعدادات الأولية - بدء تشغيل wis2box والتحقق من حالة مكوناته - عرض محتويات **wis2box-api** - الوصول إلى **wis2box-webapp** @@ -16,32 +16,32 @@ title: تهيئة wis2box !!! note - تستند المواد التدريبية الحالية إلى الإصدار 1.3.0 من wis2box. + تعتمد المواد التدريبية الحالية على الإصدار wis2box-release 1.3.0. راجع [accessing-your-student-vm](./accessing-your-student-vm.md) للحصول على تعليمات حول كيفية تنزيل وتثبيت حزمة برامج wis2box إذا كنت تقوم بإجراء هذا التدريب خارج جلسة تدريب محلية. ## التحضير -قم بتسجيل الدخول إلى الجهاز الافتراضي المخصص لك باستخدام اسم المستخدم وكلمة المرور الخاصة بك وتأكد من أنك في دليل `wis2box`: +قم بتسجيل الدخول إلى الجهاز الافتراضي المخصص لك باستخدام اسم المستخدم وكلمة المرور الخاصة بك، وتأكد من أنك في دليل `wis2box`: ```bash cd ~/wis2box ``` -## إنشاء التهيئة الأولية +## إنشاء الإعدادات الأولية -تتطلب التهيئة الأولية لـ wis2box ما يلي: +تتطلب الإعدادات الأولية لـ wis2box ما يلي: -- ملف بيئة `wis2box.env` يحتوي على معلمات التهيئة -- دليل على الجهاز المضيف للمشاركة بين الجهاز المضيف وحاويات wis2box المحددة بواسطة متغير البيئة `WIS2BOX_HOST_DATADIR` +- ملف بيئة `wis2box.env` يحتوي على معلمات التكوين +- دليل على الجهاز المضيف لمشاركته بين الجهاز المضيف وحاويات wis2box، يتم تعريفه بواسطة متغير البيئة `WIS2BOX_HOST_DATADIR` -يمكن استخدام سكريبت `wis2box-create-config.py` لإنشاء التهيئة الأولية لـ wis2box. +يمكن استخدام سكربت `wis2box-create-config.py` لإنشاء الإعدادات الأولية لـ wis2box. -سيطرح عليك مجموعة من الأسئلة للمساعدة في إعداد التهيئة. +سيطلب منك مجموعة من الأسئلة للمساعدة في إعداد التكوين. -ستتمكن من مراجعة وتحديث ملفات التهيئة بعد انتهاء السكريبت. +ستتمكن من مراجعة وتحديث ملفات التكوين بعد انتهاء السكربت. -قم بتشغيل السكريبت كما يلي: +قم بتشغيل السكربت كما يلي: ```bash python3 wis2box-create-config.py @@ -49,7 +49,7 @@ python3 wis2box-create-config.py ### دليل wis2box-host-data -سيطلب منك السكريبت إدخال الدليل الذي سيتم استخدامه لمتغير البيئة `WIS2BOX_HOST_DATADIR`. +سيطلب منك السكربت إدخال الدليل الذي سيتم استخدامه لمتغير البيئة `WIS2BOX_HOST_DATADIR`. لاحظ أنه يجب عليك تحديد المسار الكامل لهذا الدليل. @@ -68,7 +68,7 @@ The directory /home/username/wis2box-data has been created. ### عنوان URL الخاص بـ wis2box -بعد ذلك، سيُطلب منك إدخال عنوان URL الخاص بـ wis2box. هذا هو العنوان الذي سيتم استخدامه للوصول إلى تطبيق الويب، وواجهة API، وواجهة المستخدم الخاصة بـ wis2box. +بعد ذلك، سيُطلب منك إدخال عنوان URL الخاص بـ wis2box. هذا هو عنوان URL الذي سيتم استخدامه للوصول إلى تطبيق الويب، وواجهة API، وواجهة المستخدم الخاصة بـ wis2box. يرجى استخدام `http://` كعنوان URL. @@ -82,41 +82,41 @@ The URL of the wis2box will be set to: Is this correct? (y/n/exit) ``` -### كلمات مرور WEBAPP وSTORAGE وBROKER +### كلمات المرور لـ WEBAPP، STORAGE و BROKER -يمكنك استخدام خيار إنشاء كلمات مرور عشوائية عند المطالبة بـ `WIS2BOX_WEBAPP_PASSWORD`، `WIS2BOX_STORAGE_PASSWORD`، و`WIS2BOX_BROKER_PASSWORD` أو تعريف كلمات المرور الخاصة بك. +يمكنك استخدام خيار إنشاء كلمات مرور عشوائية عند المطالبة بـ `WIS2BOX_WEBAPP_PASSWORD`، `WIS2BOX_STORAGE_PASSWORD`، و `WIS2BOX_BROKER_PASSWORD` أو تحديد كلمات المرور الخاصة بك. -لا تقلق بشأن تذكر هذه الكلمات، حيث سيتم تخزينها في ملف `wis2box.env` في دليل wis2box الخاص بك. +لا تقلق بشأن تذكر هذه الكلمات، حيث سيتم تخزينها في ملف `wis2box.env` داخل دليل wis2box الخاص بك. ### مراجعة ملف `wis2box.env` -بمجرد اكتمال السكريبت، تحقق من محتويات ملف `wis2box.env` في الدليل الحالي: +بمجرد اكتمال السكربت، تحقق من محتويات ملف `wis2box.env` في الدليل الحالي: ```bash cat ~/wis2box/wis2box.env ``` -أو تحقق من محتوى الملف عبر WinSCP. +أو تحقق من محتويات الملف عبر WinSCP. !!! question ما هي قيمة WISBOX_BASEMAP_URL في ملف wis2box.env؟ -??? success "انقر للكشف عن الإجابة" +??? success "اضغط للكشف عن الإجابة" القيمة الافتراضية لـ WIS2BOX_BASEMAP_URL هي `https://{s}.tile.openstreetmap.org/{z}/{x}/{y}.png`. - يشير هذا العنوان إلى خادم تجزئة OpenStreetMap. إذا كنت ترغب في استخدام مزود خرائط مختلف، يمكنك تغيير هذا العنوان للإشارة إلى خادم تجزئة آخر. + يشير هذا العنوان إلى خادم OpenStreetMap. إذا كنت ترغب في استخدام مزود خرائط مختلف، يمكنك تغيير هذا العنوان للإشارة إلى خادم خرائط آخر. !!! question ما هي قيمة متغير البيئة WIS2BOX_STORAGE_DATA_RETENTION_DAYS في ملف wis2box.env؟ -??? success "انقر للكشف عن الإجابة" +??? success "اضغط للكشف عن الإجابة" - القيمة الافتراضية لـ WIS2BOX_STORAGE_DATA_RETENTION_DAYS هي 30 يومًا. يمكنك تغيير هذه القيمة إلى عدد أيام مختلف إذا أردت. + القيمة الافتراضية لـ WIS2BOX_STORAGE_DATA_RETENTION_DAYS هي 30 يومًا. يمكنك تغيير هذه القيمة إلى عدد مختلف من الأيام إذا أردت. - يقوم حاوية wis2box-management بتشغيل مهمة مجدولة يوميًا لإزالة البيانات الأقدم من عدد الأيام المحدد بواسطة WIS2BOX_STORAGE_DATA_RETENTION_DAYS من دلو `wis2box-public` والواجهة الخلفية لـ API: + يقوم حاوية wis2box-management بتشغيل مهمة مجدولة يوميًا لإزالة البيانات الأقدم من عدد الأيام المحدد بواسطة WIS2BOX_STORAGE_DATA_RETENTION_DAYS من حاوية `wis2box-public` والواجهة الخلفية لـ API: ```{.copy} 0 0 * * * su wis2box -c "wis2box data clean --days=$WIS2BOX_STORAGE_DATA_RETENTION_DAYS" @@ -124,7 +124,7 @@ cat ~/wis2box/wis2box.env !!! note - يحتوي ملف `wis2box.env` على متغيرات البيئة التي تحدد تهيئة wis2box. لمزيد من المعلومات، راجع [wis2box-documentation](https://docs.wis2box.wis.wmo.int/en/latest/reference/configuration.html). + يحتوي ملف `wis2box.env` على متغيرات البيئة التي تحدد إعدادات wis2box. لمزيد من المعلومات، راجع [wis2box-documentation](https://docs.wis2box.wis.wmo.int/en/latest/reference/configuration.html). لا تقم بتحرير ملف `wis2box.env` إلا إذا كنت متأكدًا من التغييرات التي تقوم بها. قد تؤدي التغييرات غير الصحيحة إلى توقف wis2box عن العمل. @@ -152,9 +152,9 @@ Current version=Undefined, latest version=1.3.0 Would you like to update ? (y/n/exit) ``` -اختر ``y`` وسيقوم السكريبت بإنشاء الملف ``docker-compose.images-1.3.0.yml``، وتنزيل صور Docker المطلوبة، وبدء الخدمات. +اختر ``y`` وسيقوم السكربت بإنشاء الملف ``docker-compose.images-1.3.0.yml``، وتنزيل صور Docker المطلوبة وبدء الخدمات. -قد يستغرق تنزيل الصور بعض الوقت بناءً على سرعة اتصالك بالإنترنت. هذه الخطوة مطلوبة فقط في المرة الأولى التي تبدأ فيها wis2box. +قد يستغرق تنزيل الصور بعض الوقت حسب سرعة اتصالك بالإنترنت. هذه الخطوة مطلوبة فقط في المرة الأولى التي تبدأ فيها تشغيل wis2box. تحقق من الحالة باستخدام الأمر التالي: @@ -164,14 +164,14 @@ python3 wis2box-ctl.py status كرر هذا الأمر حتى تكون جميع الخدمات قيد التشغيل. -!!! note "wis2box وDocker" - يعمل wis2box كمجموعة من حاويات Docker التي يتم إدارتها بواسطة docker-compose. +!!! note "wis2box و Docker" + يعمل wis2box كمجموعة من حاويات Docker التي تتم إدارتها بواسطة docker-compose. - يتم تعريف الخدمات في ملفات `docker-compose*.yml` المختلفة التي يمكن العثور عليها في دليل `~/wis2box/`. + يتم تعريف الخدمات في ملفات `docker-compose*.yml` المختلفة الموجودة في دليل `~/wis2box/`. - يتم استخدام سكريبت Python `wis2box-ctl.py` لتشغيل أوامر Docker Compose الأساسية التي تتحكم في خدمات wis2box. + يتم استخدام سكربت Python `wis2box-ctl.py` لتشغيل أوامر Docker Compose الأساسية التي تتحكم في خدمات wis2box. - لا تحتاج إلى معرفة تفاصيل حاويات Docker لتشغيل حزمة برامج wis2box، ولكن يمكنك الاطلاع على ملفات `docker-compose*.yml` لمعرفة كيفية تعريف الخدمات. إذا كنت مهتمًا بمعرفة المزيد عن Docker، يمكنك العثور على المزيد من المعلومات في [وثائق Docker](https://docs.docker.com/). + لا تحتاج إلى معرفة تفاصيل حاويات Docker لتشغيل حزمة برامج wis2box، ولكن يمكنك فحص ملفات `docker-compose*.yml` لمعرفة كيفية تعريف الخدمات. إذا كنت مهتمًا بمعرفة المزيد عن Docker، يمكنك العثور على مزيد من المعلومات في [وثائق Docker](https://docs.docker.com/). لتسجيل الدخول إلى حاوية wis2box-management، استخدم الأمر التالي: @@ -179,7 +179,7 @@ python3 wis2box-ctl.py status python3 wis2box-ctl.py login ``` -لاحظ أنه بعد تسجيل الدخول، سيتغير الموجه، مما يشير إلى أنك الآن داخل حاوية wis2box-management: +لاحظ أنه بعد تسجيل الدخول، سيتغير الموجه الخاص بك، مما يشير إلى أنك الآن داخل حاوية wis2box-management: ```{bash} root@025381da3c40:/home/wis2box# @@ -188,7 +188,7 @@ root@025381da3c40:/home/wis2box# داخل حاوية wis2box-management، يمكنك تشغيل أوامر مختلفة لإدارة wis2box الخاص بك، مثل: - `wis2box auth add-token --path processes/wis2box` : لإنشاء رمز تفويض لنقطة النهاية *processes/wis2box* -- `wis2box data clean --days=` : لتنظيف البيانات الأقدم من عدد معين من الأيام من دلو *wis2box-public* +- `wis2box data clean --days=` : لتنظيف البيانات الأقدم من عدد معين من الأيام من حاوية *wis2box-public* للخروج من الحاوية والعودة إلى جهازك المضيف، استخدم الأمر التالي: @@ -222,9 +222,9 @@ mosquitto Up 2 minutes ghcr.io/world-meteorolo wis2box-webapp Up 2 minutes (healthy) ghcr.io/world-meteorological-organization/wis2box-webapp:1.3.0 ``` -هذه الحاويات هي جزء من حزمة برامج `wis2box` وتوفر الخدمات المختلفة المطلوبة لتشغيل `wis2box`. +تُعد هذه الحاويات جزءًا من مجموعة برامج `wis2box` وتوفر الخدمات المختلفة المطلوبة لتشغيل `wis2box`. -قم بتشغيل الأمر التالي لرؤية وحدات التخزين الخاصة بـ Docker التي تعمل على جهازك المضيف: +قم بتشغيل الأمر التالي لعرض وحدات التخزين الخاصة بـ Docker التي تعمل على جهازك: ```{.copy} docker volume ls @@ -239,9 +239,9 @@ docker volume ls - wis2box_project_loki-data - wis2box_project_mosquitto-config -بالإضافة إلى بعض وحدات التخزين المجهولة التي تستخدمها الحاويات المختلفة. +بالإضافة إلى بعض وحدات التخزين المجهولة التي تُستخدم بواسطة الحاويات المختلفة. -وحدات التخزين التي تبدأ بـ `wis2box_project_` تُستخدم لتخزين البيانات الدائمة للخدمات المختلفة في حزمة برامج `wis2box`. +تُستخدم وحدات التخزين التي تبدأ بـ `wis2box_project_` لتخزين البيانات الدائمة للخدمات المختلفة في مجموعة برامج `wis2box`. ## واجهة برمجة التطبيقات (API) الخاصة بـ wis2box @@ -269,6 +269,7 @@ docker volume ls - إشعارات البيانات - بيانات الاكتشاف الوصفية + !!! question كم عدد إشعارات البيانات التي تم نشرها؟ @@ -283,7 +284,7 @@ docker volume ls افتح متصفح الويب وانتقل إلى الصفحة `http://YOUR-HOST/wis2box-webapp`. -ستظهر نافذة منبثقة تطلب اسم المستخدم وكلمة المرور. استخدم اسم المستخدم الافتراضي `wis2box-user` وكلمة المرور `WIS2BOX_WEBAPP_PASSWORD` المحددة في ملف `wis2box.env` ثم اضغط على "Sign in": +ستظهر نافذة منبثقة تطلب اسم المستخدم وكلمة المرور الخاصة بك. استخدم اسم المستخدم الافتراضي `wis2box-user` وكلمة المرور `WIS2BOX_WEBAPP_PASSWORD` المحددة في ملف `wis2box.env` واضغط على "Sign in": !!! note @@ -293,7 +294,7 @@ docker volume ls cat ~/wis2box/wis2box.env | grep WIS2BOX_WEBAPP_PASSWORD ``` -بمجرد تسجيل الدخول، حرك مؤشر الفأرة إلى القائمة الموجودة على اليسار لرؤية الخيارات المتاحة في تطبيق الويب الخاص بـ `wis2box`: +بمجرد تسجيل الدخول، حرك مؤشر الماوس إلى القائمة الموجودة على اليسار لرؤية الخيارات المتاحة في تطبيق الويب الخاص بـ `wis2box`: wis2box-webapp-menu.png @@ -343,7 +344,7 @@ docker volume ls cat ~/wis2box/wis2box.env | grep WIS2BOX_BROKER_PASSWORD ``` - لاحظ أن هذه هي كلمة مرور الوسيط **الداخلية** الخاصة بك، وسيستخدم الوسيط العالمي بيانات اعتماد مختلفة (للقراءة فقط) للاشتراك في الوسيط الخاص بك. لا تشارك هذه الكلمة مع أي شخص. + لاحظ أن هذه هي كلمة المرور **الداخلية** الخاصة بالوسيط، وسيستخدم الوسيط العالمي بيانات اعتماد مختلفة (للقراءة فقط) للاشتراك في الوسيط الخاص بك. لا تشارك هذه الكلمة مع أي شخص. تأكد من الضغط على "SAVE" لحفظ تفاصيل الاتصال الخاصة بك. @@ -351,11 +352,11 @@ docker volume ls mqtt-explorer-wis2box-broker-port1883.png -بمجرد الاتصال، سترى إحصائيات mosquitto الداخلية التي يتم نشرها بواسطة الوسيط الخاص بك تحت الموضوع `$SYS`: +بمجرد الاتصال، ستشاهد إحصائيات mosquitto الداخلية التي يتم نشرها بواسطة الوسيط الخاص بك تحت الموضوع `$SYS`: mqtt-explorer-sys-topic.png -يمكن تحقيق نفس الاتصال أيضًا باستخدام MQTT عبر WebSockets على المنفذ 80، باستخدام تفاصيل الاتصال التالية: +يمكن تحقيق نفس الاتصال باستخدام MQTT عبر WebSockets على المنفذ 80، باستخدام تفاصيل الاتصال التالية: mqtt-explorer-wis2box-broker-websockets.png @@ -364,8 +365,7 @@ docker volume ls !!! success "تهانينا!" في هذه الجلسة العملية، تعلمت كيفية: - - تشغيل سكربت `wis2box-create-config.py` لإنشاء التكوين الأولي + - تشغيل سكربت `wis2box-create-config.py` لإنشاء الإعداد الأولي - تشغيل `wis2box` والتحقق من حالة مكوناته - الوصول إلى `wis2box-webapp` و `wis2box-API` عبر المتصفح - - الاتصال بوسيط MQTT على جهازك الافتراضي باستخدام `MQTT Explorer` -``` \ No newline at end of file + - الاتصال بوسيط MQTT على جهاز الطالب الخاص بك باستخدام `MQTT Explorer` \ No newline at end of file diff --git a/documentation/docs/es/practical-sessions/accessing-your-student-vm.md b/documentation/docs/es/practical-sessions/accessing-your-student-vm.md index 164d085f2..dc5469e07 100644 --- a/documentation/docs/es/practical-sessions/accessing-your-student-vm.md +++ b/documentation/docs/es/practical-sessions/accessing-your-student-vm.md @@ -1,22 +1,22 @@ --- -title: Accediendo a tu VM estudiantil +title: Accediendo a tu VM de estudiante --- -# Accediendo a tu VM estudiantil +# Accediendo a tu VM de estudiante !!! abstract "Resultados de aprendizaje" Al final de esta sesión práctica, serás capaz de: - - acceder a tu VM estudiantil mediante SSH y WinSCP + - acceder a tu VM de estudiante mediante SSH y WinSCP - verificar que el software requerido para los ejercicios prácticos está instalado - - verificar que tienes acceso a los materiales de los ejercicios para este entrenamiento en tu VM estudiantil local + - verificar que tienes acceso a los materiales de los ejercicios para este entrenamiento en tu VM de estudiante local ## Introducción -Como parte de los talleres de entrenamiento de WIS2 realizados localmente, puedes acceder a tu VM estudiantil personal en la red de entrenamiento local llamada "WIS2-training". +Como parte de los talleres de entrenamiento de WIS2 realizados localmente, puedes acceder a tu VM de estudiante personal en la red de entrenamiento local llamada "WIS2-training". -Tu VM estudiantil tiene el siguiente software preinstalado: +Tu VM de estudiante tiene el siguiente software preinstalado: - Ubuntu 22.04 LTS [ubuntu-22.04.5-live-server-amd64.iso](https://releases.ubuntu.com/jammy/ubuntu-22.04.5-live-server-amd64.iso) - Python 3.10.12 @@ -45,7 +45,7 @@ Tu VM estudiantil tiene el siguiente software preinstalado: Siempre puedes encontrar el archivo más reciente de 'wis2box-setup' en [https://github.com/World-Meteorological-Organization/wis2box/releases](https://github.com/World-Meteorological-Organization/wis2box-release/releases). - Los materiales de ejercicios utilizados en este entrenamiento pueden descargarse de la siguiente manera: + Los materiales de los ejercicios utilizados en este entrenamiento pueden descargarse de la siguiente manera: ```bash wget https://training.wis2box.wis.wmo.int/exercise-materials.zip @@ -59,13 +59,13 @@ Tu VM estudiantil tiene el siguiente software preinstalado: pip3 install pywiscat ``` - Si estás utilizando la VM estudiantil proporcionada durante las sesiones locales de entrenamiento de WIS2, el software requerido ya estará instalado. + Si estás utilizando la VM de estudiante proporcionada durante las sesiones locales de entrenamiento de WIS2, el software requerido ya estará instalado. -## Conéctate a tu VM estudiantil en la red de entrenamiento local +## Conéctate a tu VM de estudiante en la red de entrenamiento local Conecta tu PC a la red Wi-Fi local transmitida en la sala durante el entrenamiento de WIS2 según las instrucciones proporcionadas por el instructor. -Utiliza un cliente SSH para conectarte a tu VM estudiantil utilizando lo siguiente: +Utiliza un cliente SSH para conectarte a tu VM de estudiante utilizando lo siguiente: - **Host: (proporcionado durante el entrenamiento presencial)** - **Port: 22** @@ -73,9 +73,9 @@ Utiliza un cliente SSH para conectarte a tu VM estudiantil utilizando lo siguien - **Password: (proporcionado durante el entrenamiento presencial)** !!! tip - Contacta a un instructor si no estás seguro del nombre del host/nombre de usuario o tienes problemas para conectarte. + Contacta a un instructor si no estás seguro del nombre del host/usuario o tienes problemas para conectarte. -Una vez conectado, cambia tu contraseña para asegurarte de que otros no puedan acceder a tu VM: +Una vez conectado, por favor cambia tu contraseña para asegurarte de que otros no puedan acceder a tu VM: ```bash limper@student-vm:~$ passwd @@ -88,7 +88,7 @@ passwd: password updated successfully ## Verifica las versiones del software -Para poder ejecutar wis2box, la VM estudiantil debe tener Python, Docker y Docker Compose preinstalados. +Para poder ejecutar wis2box, la VM de estudiante debe tener Python, Docker y Docker Compose preinstalados. Verifica la versión de Python: ```bash @@ -117,7 +117,7 @@ devuelve: Docker Compose version v2.21.0 ``` -Para asegurarte de que tu usuario puede ejecutar comandos de Docker, tu usuario ha sido añadido al grupo `docker`. +Para asegurarte de que tu usuario puede ejecutar comandos de Docker, tu usuario ha sido añadido al grupo `docker`. Para probar que tu usuario puede ejecutar docker hello-world, ejecuta el siguiente comando: ```bash @@ -147,11 +147,11 @@ devuelve: exercise-materials wis2box ``` -Si tienes WinSCP instalado en tu PC local, puedes usarlo para conectarte a tu VM estudiantil e inspeccionar el contenido de tu directorio home y descargar o subir archivos entre tu VM y tu PC local. +Si tienes WinSCP instalado en tu PC local, puedes usarlo para conectarte a tu VM de estudiante e inspeccionar el contenido de tu directorio home y descargar o subir archivos entre tu VM y tu PC local. -WinSCP no es requerido para el entrenamiento, pero puede ser útil si deseas editar archivos en tu VM utilizando un editor de texto en tu PC local. +WinSCP no es necesario para el entrenamiento, pero puede ser útil si deseas editar archivos en tu VM utilizando un editor de texto en tu PC local. -Aquí está cómo puedes conectarte a tu VM estudiantil utilizando WinSCP: +Aquí está cómo puedes conectarte a tu VM de estudiante utilizando WinSCP: Abre WinSCP y haz clic en "New Site". Puedes crear una nueva conexión SCP a tu VM de la siguiente manera: @@ -159,13 +159,13 @@ Abre WinSCP y haz clic en "New Site". Puedes crear una nueva conexión SCP a tu Haz clic en 'Save' y luego en 'Login' para conectarte a tu VM. -Ahora deberías poder ver el contenido del directorio home en tu VM estudiantil y acceder a tus archivos. +Ahora deberías poder ver el contenido del directorio home en tu VM de estudiante y acceder a tus archivos. ## Conclusión !!! success "¡Felicidades!" En esta sesión práctica, aprendiste a: - - acceder a tu VM estudiantil mediante SSH y WinSCP + - acceder a tu VM de estudiante mediante SSH y WinSCP - verificar que el software requerido para los ejercicios prácticos está instalado - - verificar que tienes acceso a los materiales de los ejercicios para este entrenamiento en tu VM estudiantil local \ No newline at end of file + - verificar que tienes acceso a los materiales de los ejercicios para este entrenamiento en tu VM de estudiante local \ No newline at end of file diff --git a/documentation/docs/es/practical-sessions/adding-gts-headers-to-wis2-notifications.md b/documentation/docs/es/practical-sessions/adding-gts-headers-to-wis2-notifications.md index b6f38621c..139297cd6 100644 --- a/documentation/docs/es/practical-sessions/adding-gts-headers-to-wis2-notifications.md +++ b/documentation/docs/es/practical-sessions/adding-gts-headers-to-wis2-notifications.md @@ -11,13 +11,13 @@ title: Añadiendo encabezados GTS a las notificaciones WIS2 - configurar un mapeo entre nombres de archivo y encabezados GTS - ingerir datos con un nombre de archivo que coincida con los encabezados GTS - visualizar los encabezados GTS en las notificaciones WIS2 - - utilizar el formulario FM-12 SYNOP para añadir manualmente encabezados GTS a una notificación WIS2 + - usar el formulario FM-12 SYNOP para añadir manualmente encabezados GTS a una notificación WIS2 ## Introducción Los Miembros de la OMM que deseen detener la transmisión de sus datos en GTS durante la fase de transición a WIS2 necesitarán añadir encabezados GTS a sus notificaciones WIS2. Estos encabezados permiten que el gateway de WIS2 a GTS reenvíe los datos a la red GTS. -Esto permite que los Miembros que hayan migrado a usar un nodo WIS2 para la publicación de datos desactiven su sistema MSS y aseguren que sus datos aún estén disponibles para los Miembros que no hayan migrado a WIS2. +Esto permite a los Miembros que han migrado a usar un nodo WIS2 para la publicación de datos deshabilitar su sistema MSS y garantizar que sus datos sigan estando disponibles para los Miembros que aún no han migrado a WIS2. La propiedad GTS en el Mensaje de Notificación WIS2 debe añadirse como una propiedad adicional al Mensaje de Notificación WIS2. La propiedad GTS es un objeto JSON que contiene los encabezados GTS necesarios para que los datos sean reenviados a la red GTS. @@ -40,23 +40,23 @@ Este archivo debe colocarse en el directorio definido por `WIS2BOX_HOST_DATADIR` A partir de wis2box-1.3.0, los publicadores de datos tienen dos opciones para (opcionalmente) añadir propiedades GTS a sus notificaciones: -1. Para archivos cargados en MinIO, preparar el archivo de mapeo “gts_headers_mappings.csv” con las propiedades requeridas. +1. Para archivos subidos a MinIO, preparar el archivo de mapeo `gts_headers_mappings.csv` con las propiedades requeridas. -2. Para entrada de datos utilizando el formulario FM-12 SYNOP en wis2box-webapp, seleccionar “Add GTS headers” y proporcionar la información manualmente. +2. Para entrada de datos usando el formulario FM-12 SYNOP en wis2box-webapp, seleccionar `Add GTS headers` y proporcionar la información manualmente. ## Preparación Asegúrate de tener acceso SSH a tu VM de estudiante y que tu instancia de wis2box esté funcionando. -Verifica que estás conectado al broker MQTT de tu instancia de wis2box utilizando MQTT Explorer. Puedes usar las credenciales públicas `everyone/everyone` para conectarte al broker. +Asegúrate de estar conectado al broker MQTT de tu instancia de wis2box usando MQTT Explorer. Puedes usar las credenciales públicas `everyone/everyone` para conectarte al broker. Asegúrate de tener un navegador web abierto con el tablero de Grafana para tu instancia accediendo a `http://YOUR-HOST:3000`. -## Ejercicio 1: Usando un archivo de mapeo para datos cargados en MinIO +## Ejercicio 1: Usar un archivo de mapeo para datos subidos a MinIO -El primer ejercicio demostrará cómo añadir encabezados GTS para datos que se cargan en MinIO, utilizando un archivo de mapeo llamado `gts_headers_mapping.csv`. +El primer ejercicio demostrará cómo añadir encabezados GTS para datos que se suben a MinIO, usando un archivo de mapeo llamado `gts_headers_mapping.csv`. -### Creando `gts_headers_mapping.csv` +### Crear `gts_headers_mapping.csv` Para añadir encabezados GTS a tus notificaciones WIS2, se requiere un archivo CSV que mapee los encabezados GTS a los nombres de archivo entrantes. @@ -68,7 +68,7 @@ Copia el archivo `exercise-materials/gts-headers-exercises/gts_headers_mapping.c cp ~/exercise-materials/gts-headers-exercises/gts_headers_mapping.csv ~/wis2box-data ``` -### Aplicando los mapeos +### Aplicar los mapeos Después de crear el archivo `gts_headers_mapping.csv`, necesitas reiniciar el contenedor wis2box-management para aplicar los cambios. Puedes hacerlo ejecutando el siguiente comando en tu VM de estudiante: @@ -99,17 +99,17 @@ wis2box data ingest -p /data/wis2box/A_SMRO01YRBK171200_C_EDZW_20240717120502.tx Asegúrate de reemplazar la opción `metadata-id` con el identificador correcto para tu conjunto de datos. -Verifica el tablero de Grafana para ver si los datos se ingirieron correctamente. Si ves algún WARNING o ERROR, intenta solucionarlos y repite el ejercicio con el comando `wis2box data ingest`. +Revisa el tablero de Grafana para verificar si los datos fueron ingeridos correctamente. Si ves algún WARNING o ERROR, intenta solucionarlos y repite el ejercicio con el comando `wis2box data ingest`. -### Visualizando los encabezados GTS en la Notificación WIS2 +### Visualizar los encabezados GTS en la Notificación WIS2 Ve a MQTT Explorer y verifica el Mensaje de Notificación WIS2 para los datos que acabas de ingerir. El Mensaje de Notificación WIS2 debería contener los encabezados GTS que proporcionaste en el archivo `gts_headers_mapping.csv`. -## Ejercicio 2: Usando el formulario FM-12 SYNOP +## Ejercicio 2: Usar el formulario FM-12 SYNOP -Al usar el formulario FM-12 SYNOP en wis2box-webapp, puedes añadir manualmente encabezados GTS a tus notificaciones WIS2 seleccionando la opción "Add GTS headers" y proporcionando la información requerida. +Cuando uses el formulario FM-12 SYNOP en wis2box-webapp, puedes añadir manualmente encabezados GTS a tus notificaciones WIS2 seleccionando la opción "Add GTS headers" y proporcionando la información requerida. Para este ejercicio, puedes usar los datos de ejemplo a continuación o proporcionar los tuyos propios: @@ -131,17 +131,17 @@ Encabezados GTS: TTAAii=`ISIH01` y CCCC=`FCBB` ### Enviar manualmente el formulario FM-12 SYNOP con encabezados GTS -Ve al formulario FM-12 SYNOP en wis2box-webapp y completa el formulario con los datos de ejemplo anteriores o utiliza los tuyos propios. +Ve al formulario FM-12 SYNOP en wis2box-webapp y completa el formulario con los datos de ejemplo anteriores o usa los tuyos propios. -Asegúrate de seleccionar la opción "Add GTS headers" y proporcionar la información requerida de encabezados GTS: +Asegúrate de seleccionar la opción "Add GTS headers" y proporcionar la información requerida de los encabezados GTS: fm-12-synop-form-gts-headers.png Proporciona el token de autenticación requerido y envía el formulario. -Probablemente verás un mensaje de error porque esta estación no está en tu lista de estaciones. Necesitarás añadir la estación "0-20000-0-64400" a tu lista de estaciones para que los datos se conviertan y publiquen correctamente. +Es probable que veas un mensaje de error porque esta estación no está en tu lista de estaciones. Necesitarás añadir la estación "0-20000-0-64400" a tu lista de estaciones para que los datos se conviertan y publiquen correctamente. -### Visualizando los encabezados GTS en la Notificación WIS2 +### Visualizar los encabezados GTS en la Notificación WIS2 Ve a MQTT Explorer y verifica el Mensaje de Notificación WIS2 para los datos que acabas de ingerir para ver si los encabezados GTS están incluidos en la notificación. diff --git a/documentation/docs/es/practical-sessions/connecting-to-wis2-over-mqtt.md b/documentation/docs/es/practical-sessions/connecting-to-wis2-over-mqtt.md index 38c316fa8..a724bb484 100644 --- a/documentation/docs/es/practical-sessions/connecting-to-wis2-over-mqtt.md +++ b/documentation/docs/es/practical-sessions/connecting-to-wis2-over-mqtt.md @@ -1,8 +1,8 @@ --- -title: Conexión a WIS2 mediante MQTT +title: Conectarse a WIS2 mediante MQTT --- -# Conexión a WIS2 mediante MQTT +# Conectarse a WIS2 mediante MQTT !!! abstract "Resultados de aprendizaje" @@ -63,14 +63,14 @@ Este es un ejemplo de la estructura de un mensaje de notificación de WIS2 para En esta sesión práctica aprenderás a usar la herramienta MQTT Explorer para configurar una conexión de cliente MQTT a un WIS2 Global Broker y ser capaz de mostrar mensajes de notificación de WIS2. -MQTT Explorer es una herramienta útil para explorar y revisar la estructura de los temas de un broker MQTT y revisar los datos que se están publicando. +MQTT Explorer es una herramienta útil para explorar y revisar la estructura de temas de un broker MQTT y analizar los datos publicados. -!!! note "Acerca de MQTT" +!!! note "Sobre MQTT" MQTT Explorer proporciona una interfaz fácil de usar para conectarse a un broker MQTT y explorar los temas y la estructura de mensajes utilizados por WIS2. - En la práctica, MQTT está diseñado para ser utilizado en comunicación máquina a máquina, donde una aplicación o servicio se suscribe a temas y procesa mensajes programáticamente en tiempo real. + En la práctica, MQTT está diseñado para ser utilizado en comunicación máquina a máquina, donde una aplicación o servicio se suscribe a temas y procesa mensajes de manera programática en tiempo real. - Para trabajar con MQTT programáticamente (por ejemplo, en Python), puedes usar bibliotecas de cliente MQTT como [paho-mqtt](https://pypi.org/project/paho-mqtt) para conectarte a un broker MQTT y procesar mensajes entrantes. Existen numerosos software de cliente y servidor MQTT, dependiendo de tus requisitos y entorno técnico. + Para trabajar con MQTT de manera programática (por ejemplo, en Python), puedes usar bibliotecas de cliente MQTT como [paho-mqtt](https://pypi.org/project/paho-mqtt) para conectarte a un broker MQTT y procesar mensajes entrantes. Existen numerosos software de cliente y servidor MQTT, dependiendo de tus requisitos y entorno técnico. ## Usar MQTT Explorer para conectarse al Global Broker @@ -107,9 +107,9 @@ Los mensajes deberían comenzar a aparecer en tu sesión de MQTT Explorer como s Ahora estás listo para comenzar a explorar los temas y la estructura de mensajes de WIS2. -## Ejercicio 1: Revisar la estructura de los temas de WIS2 +## Ejercicio 1: Revisar la estructura de temas de WIS2 -Usa MQTT para explorar la estructura de los temas bajo los temas `origin`. +Usa MQTT para explorar la estructura de temas bajo los temas `origin`. !!! question @@ -117,9 +117,9 @@ Usa MQTT para explorar la estructura de los temas bajo los temas `origin`. ??? success "Haz clic para revelar la respuesta" - Puedes hacer clic en la ventana del lado izquierdo en MQTT Explorer para expandir la estructura de los temas. + Puedes hacer clic en la ventana del lado izquierdo en MQTT Explorer para expandir la estructura de temas. - Podemos distinguir el centro WIS que publicó los datos observando el cuarto nivel de la estructura de los temas. Por ejemplo, el siguiente tema: + Podemos distinguir el centro WIS que publicó los datos observando el cuarto nivel de la estructura de temas. Por ejemplo, el siguiente tema: `origin/a/wis2/br-inmet/data/core/weather/surface-based-observations/synop` @@ -131,15 +131,15 @@ Usa MQTT para explorar la estructura de los temas bajo los temas `origin`. ??? success "Haz clic para revelar la respuesta" - Podemos distinguir los mensajes provenientes de un gateway GTS-to-WIS2 observando el centre-id en la estructura de los temas. Por ejemplo, el siguiente tema: + Podemos distinguir los mensajes provenientes de un gateway GTS-to-WIS2 observando el centre-id en la estructura de temas. Por ejemplo, el siguiente tema: `origin/a/wis2/de-dwd-gts-to-wis2/data/core/I/S/A/I/01/sbbr` - nos indica que los datos fueron publicados por el gateway GTS-to-WIS2 alojado por Deutscher Wetterdienst (DWD), Alemania. El gateway GTS-to-WIS2 es un tipo especial de publicador de datos que publica datos del Global Telecommunication System (GTS) a WIS2. La estructura del tema está compuesta por los encabezados TTAAii CCCC para los mensajes GTS. + nos indica que los datos fueron publicados por el gateway GTS-to-WIS2 alojado por Deutscher Wetterdienst (DWD), Alemania. El gateway GTS-to-WIS2 es un tipo especial de publicador de datos que publica datos del Global Telecommunication System (GTS) a WIS2. La estructura de temas está compuesta por los encabezados TTAAii CCCC para los mensajes GTS. -## Ejercicio 2: Revisar la estructura de los mensajes de WIS2 +## Ejercicio 2: Revisar la estructura de mensajes de WIS2 -Desconéctate de MQTT Explorer y actualiza la sección 'Advanced' para cambiar la suscripción a lo siguiente: +Desconéctate de MQTT Explorer y actualiza las secciones 'Advanced' para cambiar la suscripción a lo siguiente: * `origin/a/wis2/+/data/core/weather/surface-based-observations/synop` * `cache/a/wis2/+/data/core/weather/surface-based-observations/synop` @@ -149,9 +149,9 @@ Desconéctate de MQTT Explorer y actualiza la sección 'Advanced' para cambiar l !!! note El comodín `+` se utiliza para suscribirse a todos los centros WIS. -Reconéctate al Global Broker y espera a que aparezcan los mensajes. +Reconéctate al Global Broker y espera a que aparezcan mensajes. -Puedes ver el contenido del mensaje de WIS2 en la sección "Value" en el lado derecho. Intenta expandir la estructura de los temas para ver los diferentes niveles del mensaje hasta llegar al último nivel y revisar el contenido de uno de los mensajes. +Puedes ver el contenido del mensaje de WIS2 en la sección "Value" en el lado derecho. Intenta expandir la estructura de temas para ver los diferentes niveles del mensaje hasta llegar al último nivel y revisar el contenido de uno de los mensajes. !!! question @@ -159,9 +159,9 @@ Puedes ver el contenido del mensaje de WIS2 en la sección "Value" en el lado de ??? success "Haz clic para revelar la respuesta" - La marca de tiempo en la que se publicaron los datos está contenida en la sección `properties` del mensaje con una clave llamada `pubtime`. + La marca de tiempo en la que se publicaron los datos está contenida en la sección `properties` del mensaje con la clave `pubtime`. - La marca de tiempo en la que se recopilaron los datos está contenida en la sección `properties` del mensaje con una clave llamada `datetime`. + La marca de tiempo en la que se recopilaron los datos está contenida en la sección `properties` del mensaje con la clave `datetime`. mqtt-explorer-global-broker-msg-properties @@ -179,7 +179,7 @@ Puedes ver el contenido del mensaje de WIS2 en la sección "Value" en el lado de Asegúrate de que sigues conectado al Global Broker utilizando las suscripciones de temas `origin/a/wis2/+/data/core/weather/surface-based-observations/synop` y `cache/a/wis2/+/data/core/weather/surface-based-observations/synop` como se describe en el Ejercicio 2. -Intenta identificar un mensaje para el mismo centre-id publicado en ambos temas, `origin` y `cache`. +Intenta identificar un mensaje para el mismo centre-id publicado en ambos temas `origin` y `cache`. !!! question @@ -189,9 +189,9 @@ Intenta identificar un mensaje para el mismo centre-id publicado en ambos temas, Los mensajes publicados en los temas `origin` son los mensajes originales que el Global Broker republica desde los WIS2 Nodes en la red. - Los mensajes publicados en los temas `cache` son los mensajes para los cuales los datos han sido descargados por el Global Cache. Si revisas el contenido del mensaje del tema que comienza con `cache`, verás que el enlace 'canonical' ha sido actualizado a una nueva URL. + Los mensajes publicados en los temas `cache` son los mensajes cuyos datos han sido descargados por el Global Cache. Si revisas el contenido del mensaje del tema que comienza con `cache`, verás que el enlace 'canonical' ha sido actualizado a una nueva URL. - Hay múltiples Global Caches en la red WIS2, por lo que recibirás un mensaje de cada Global Cache que haya descargado el mensaje. + Existen múltiples Global Caches en la red WIS2, por lo que recibirás un mensaje de cada Global Cache que haya descargado el mensaje. El Global Cache solo descargará y republicará mensajes que hayan sido publicados en la jerarquía de temas `../data/core/...`. @@ -201,8 +201,8 @@ Intenta identificar un mensaje para el mismo centre-id publicado en ambos temas, En esta sesión práctica, aprendiste: - cómo suscribirte a los servicios del WIS2 Global Broker utilizando MQTT Explorer - - la estructura de los temas de WIS2 - - la estructura de los mensajes de notificación de WIS2 + - la estructura de temas de WIS2 + - la estructura de mensajes de notificación de WIS2 - la diferencia entre datos core y recomendados - la estructura de temas utilizada por el gateway GTS-to-WIS2 - la diferencia entre los mensajes del Global Broker publicados en los temas `origin` y `cache` \ No newline at end of file diff --git a/documentation/docs/es/practical-sessions/initializing-wis2box.md b/documentation/docs/es/practical-sessions/initializing-wis2box.md index 39cb66e48..0272c1f01 100644 --- a/documentation/docs/es/practical-sessions/initializing-wis2box.md +++ b/documentation/docs/es/practical-sessions/initializing-wis2box.md @@ -22,7 +22,7 @@ title: Inicializando wis2box ## Preparación -Inicia sesión en tu VM designada con tu nombre de usuario y contraseña y asegúrate de estar en el directorio `wis2box`: +Inicia sesión en tu VM asignada con tu nombre de usuario y contraseña, y asegúrate de estar en el directorio `wis2box`: ```bash cd ~/wis2box @@ -37,7 +37,7 @@ La configuración inicial para wis2box requiere: El script `wis2box-create-config.py` puede ser utilizado para crear la configuración inicial de tu wis2box. -Te hará una serie de preguntas para ayudarte a configurar tu configuración. +Te hará una serie de preguntas para ayudar a configurar tu configuración. Podrás revisar y actualizar los archivos de configuración después de que el script haya finalizado. @@ -84,9 +84,9 @@ Is this correct? (y/n/exit) ### Contraseñas de WEBAPP, STORAGE y BROKER -Puedes utilizar la opción de generación aleatoria de contraseñas cuando se te solicite para `WIS2BOX_WEBAPP_PASSWORD`, `WIS2BOX_STORAGE_PASSWORD`, `WIS2BOX_BROKER_PASSWORD` y definir las tuyas propias. +Puedes usar la opción de generación aleatoria de contraseñas cuando se te solicite para `WIS2BOX_WEBAPP_PASSWORD`, `WIS2BOX_STORAGE_PASSWORD`, `WIS2BOX_BROKER_PASSWORD` o definir las tuyas propias. -No te preocupes por recordar estas contraseñas, se almacenarán en el archivo `wis2box.env` dentro de tu directorio wis2box. +No te preocupes por recordar estas contraseñas, estarán almacenadas en el archivo `wis2box.env` en tu directorio wis2box. ### Revisar `wis2box.env` @@ -96,7 +96,7 @@ Una vez que el script haya finalizado, verifica el contenido del archivo `wis2bo cat ~/wis2box/wis2box.env ``` -O verifica el contenido del archivo a través de WinSCP. +O verifica el contenido del archivo mediante WinSCP. !!! question @@ -104,9 +104,9 @@ O verifica el contenido del archivo a través de WinSCP. ??? success "Haz clic para revelar la respuesta" - El valor predeterminado de WIS2BOX_BASEMAP_URL es `https://{s}.tile.openstreetmap.org/{z}/{x}/{y}.png`. + El valor predeterminado para WIS2BOX_BASEMAP_URL es `https://{s}.tile.openstreetmap.org/{z}/{x}/{y}.png`. - Esta URL se refiere al servidor de mosaicos de OpenStreetMap. Si deseas utilizar un proveedor de mapas diferente, puedes cambiar esta URL para que apunte a otro servidor de mosaicos. + Esta URL se refiere al servidor de tiles de OpenStreetMap. Si deseas usar un proveedor de mapas diferente, puedes cambiar esta URL para que apunte a otro servidor de tiles. !!! question @@ -114,7 +114,7 @@ O verifica el contenido del archivo a través de WinSCP. ??? success "Haz clic para revelar la respuesta" - El valor predeterminado de WIS2BOX_STORAGE_DATA_RETENTION_DAYS es 30 días. Puedes cambiar este valor a otro número de días si lo deseas. + El valor predeterminado para WIS2BOX_STORAGE_DATA_RETENTION_DAYS es 30 días. Puedes cambiar este valor a otro número de días si lo deseas. El contenedor wis2box-management ejecuta un cronjob diariamente para eliminar datos más antiguos que el número de días definido por WIS2BOX_STORAGE_DATA_RETENTION_DAYS del bucket `wis2box-public` y del backend de la API: @@ -124,7 +124,7 @@ O verifica el contenido del archivo a través de WinSCP. !!! note - El archivo `wis2box.env` contiene variables de entorno que definen la configuración de tu wis2box. Para más información consulta la [wis2box-documentation](https://docs.wis2box.wis.wmo.int/en/latest/reference/configuration.html). + El archivo `wis2box.env` contiene variables de entorno que definen la configuración de tu wis2box. Para más información, consulta la [wis2box-documentation](https://docs.wis2box.wis.wmo.int/en/latest/reference/configuration.html). No edites el archivo `wis2box.env` a menos que estés seguro de los cambios que estás realizando. Cambios incorrectos pueden hacer que tu wis2box deje de funcionar. @@ -144,7 +144,7 @@ Inicia wis2box con el siguiente comando: python3 wis2box-ctl.py start ``` -Cuando ejecutes este comando por primera vez, verás el siguiente resultado: +Cuando ejecutes este comando por primera vez, verás la siguiente salida: ``` No docker-compose.images-*.yml files found, creating one @@ -152,9 +152,9 @@ Current version=Undefined, latest version=1.3.0 Would you like to update ? (y/n/exit) ``` -Selecciona ``y`` y el script creará el archivo ``docker-compose.images-1.3.0.yml``, descargará las imágenes de Docker necesarias e iniciará los servicios. +Selecciona ``y`` y el script creará el archivo ``docker-compose.images-1.3.0.yml``, descargará las imágenes de Docker necesarias y comenzará los servicios. -La descarga de las imágenes puede tomar tiempo dependiendo de la velocidad de tu conexión a internet. Este paso solo es necesario la primera vez que inicias wis2box. +La descarga de las imágenes puede tomar tiempo dependiendo de la velocidad de tu conexión a internet. Este paso solo es necesario la primera vez que inicies wis2box. Inspecciona el estado con el siguiente comando: @@ -190,7 +190,7 @@ Dentro del contenedor wis2box-management puedes ejecutar varios comandos para ge - `wis2box auth add-token --path processes/wis2box` : para crear un token de autorización para el endpoint *processes/wis2box* - `wis2box data clean --days=` : para limpiar datos más antiguos que un cierto número de días del bucket *wis2box-public* -Para salir del contenedor y regresar a tu máquina anfitriona, utiliza el siguiente comando: +Para salir del contenedor y volver a tu máquina anfitriona, utiliza el siguiente comando: ```{.copy} exit @@ -284,7 +284,7 @@ Esta es la página de inicio de la API de wis2box (ejecutándose a través del c Abra un navegador web y visite la página `http://YOUR-HOST/wis2box-webapp`. -Verá un cuadro emergente solicitando su nombre de usuario y contraseña. Use el nombre de usuario predeterminado `wis2box-user` y la contraseña `WIS2BOX_WEBAPP_PASSWORD` definida en el archivo `wis2box.env` y haga clic en "Sign in": +Verá un mensaje emergente solicitando su nombre de usuario y contraseña. Use el nombre de usuario predeterminado `wis2box-user` y la contraseña `WIS2BOX_WEBAPP_PASSWORD` definida en el archivo `wis2box.env` y haga clic en "Sign in": !!! note @@ -328,13 +328,13 @@ Puede hacer clic en el botón 'ADVANCED' y verificar que tiene suscripciones a l Los mensajes publicados bajo el tema `$SYS` son mensajes del sistema publicados por el servicio mosquitto. -Use los siguientes detalles de conexión, asegurándose de reemplazar el valor de `` con su nombre de host y `` con el valor de su archivo `wis2box.env`: +Utilice los siguientes detalles de conexión, asegurándose de reemplazar el valor de `` con su nombre de host y `` con el valor de su archivo `wis2box.env`: -- **Protocolo: mqtt://** +- **Protocol: mqtt://** - **Host: ``** -- **Puerto: 1883** -- **Nombre de usuario: wis2box** -- **Contraseña: ``** +- **Port: 1883** +- **Username: wis2box** +- **Password: ``** !!! note @@ -344,15 +344,15 @@ Use los siguientes detalles de conexión, asegurándose de reemplazar el valor d cat ~/wis2box/wis2box.env | grep WIS2BOX_BROKER_PASSWORD ``` - Tenga en cuenta que esta es su contraseña **interna** del broker. El Global Broker utilizará credenciales diferentes (solo lectura) para suscribirse a su broker. Nunca comparta esta contraseña con nadie. + Tenga en cuenta que esta es su contraseña **interna** del broker. El Global Broker utilizará credenciales diferentes (de solo lectura) para suscribirse a su broker. Nunca comparta esta contraseña con nadie. -Asegúrese de hacer clic en "SAVE" para guardar los detalles de su conexión. +Asegúrese de hacer clic en "SAVE" para almacenar los detalles de su conexión. Luego haga clic en "CONNECT" para conectarse a su **wis2box-broker**. mqtt-explorer-wis2box-broker-port1883.png -Una vez conectado, verá las estadísticas internas de mosquitto publicadas por su broker bajo el tema `$SYS`: +Una vez conectado, verá las estadísticas internas de mosquitto que se publican en su broker bajo el tema `$SYS`: mqtt-explorer-sys-topic.png diff --git a/documentation/docs/fr/practical-sessions/accessing-your-student-vm.md b/documentation/docs/fr/practical-sessions/accessing-your-student-vm.md index 33e186651..4ad0dac3f 100644 --- a/documentation/docs/fr/practical-sessions/accessing-your-student-vm.md +++ b/documentation/docs/fr/practical-sessions/accessing-your-student-vm.md @@ -34,7 +34,7 @@ Votre VM étudiant dispose des logiciels suivants préinstallés : Sélectionnez Ubuntu Server 22.0.4 LTS comme système d'exploitation. - Après avoir créé votre VM, assurez-vous d'avoir installé python, docker et docker compose, comme décrit dans [wis2box-software-dependencies](https://docs.wis2box.wis.wmo.int/en/latest/user/getting-started.html#software-dependencies). + Après avoir créé votre VM, assurez-vous d'avoir installé Python, Docker et Docker Compose, comme décrit sur [wis2box-software-dependencies](https://docs.wis2box.wis.wmo.int/en/latest/user/getting-started.html#software-dependencies). L'archive de la version de wis2box utilisée dans cette formation peut être téléchargée comme suit : @@ -43,7 +43,7 @@ Votre VM étudiant dispose des logiciels suivants préinstallés : unzip wis2box-setup-1.3.0.zip ``` - Vous pouvez toujours trouver la dernière archive 'wis2box-setup' à [https://github.com/World-Meteorological-Organization/wis2box/releases](https://github.com/World-Meteorological-Organization/wis2box-release/releases). + Vous pouvez toujours trouver la dernière archive 'wis2box-setup' sur [https://github.com/World-Meteorological-Organization/wis2box/releases](https://github.com/World-Meteorological-Organization/wis2box-release/releases). Les supports d'exercice utilisés dans cette formation peuvent être téléchargés comme suit : @@ -67,10 +67,10 @@ Connectez votre PC au Wi-Fi local diffusé dans la salle pendant la formation WI Utilisez un client SSH pour vous connecter à votre VM étudiant en utilisant les informations suivantes : -- **Hôte : (fourni lors de la formation en présentiel)** +- **Hôte : (fourni pendant la formation en présentiel)** - **Port : 22** -- **Nom d'utilisateur : (fourni lors de la formation en présentiel)** -- **Mot de passe : (fourni lors de la formation en présentiel)** +- **Nom d'utilisateur : (fourni pendant la formation en présentiel)** +- **Mot de passe : (fourni pendant la formation en présentiel)** !!! tip Contactez un formateur si vous ne connaissez pas le nom d'hôte/nom d'utilisateur ou si vous rencontrez des problèmes de connexion. @@ -117,9 +117,9 @@ résultat : Docker Compose version v2.21.0 ``` -Pour garantir que votre utilisateur peut exécuter des commandes Docker, votre utilisateur a été ajouté au groupe `docker`. +Pour garantir que votre utilisateur peut exécuter des commandes Docker, il a été ajouté au groupe `docker`. -Pour tester que votre utilisateur peut exécuter le conteneur hello-world de Docker, exécutez la commande suivante : +Pour tester que votre utilisateur peut exécuter le conteneur hello-world, exécutez la commande suivante : ```bash docker run hello-world ``` @@ -159,7 +159,7 @@ Ouvrez WinSCP et cliquez sur "New Site". Vous pouvez créer une nouvelle connexi Cliquez sur 'Save' puis sur 'Login' pour vous connecter à votre VM. -Vous devriez maintenant être en mesure de voir le contenu du répertoire personnel de votre VM étudiant et d'accéder à vos fichiers. +Vous devriez maintenant être en mesure de voir le contenu du répertoire personnel sur votre VM étudiant et d'accéder à vos fichiers. ## Conclusion diff --git a/documentation/docs/fr/practical-sessions/adding-gts-headers-to-wis2-notifications.md b/documentation/docs/fr/practical-sessions/adding-gts-headers-to-wis2-notifications.md index 40a632472..9c65e64d1 100644 --- a/documentation/docs/fr/practical-sessions/adding-gts-headers-to-wis2-notifications.md +++ b/documentation/docs/fr/practical-sessions/adding-gts-headers-to-wis2-notifications.md @@ -8,8 +8,8 @@ title: Ajout des en-têtes GTS aux notifications WIS2 À la fin de cette session pratique, vous serez capable de : - - configurer une correspondance entre le nom de fichier et les en-têtes GTS - - intégrer des données avec un nom de fichier correspondant aux en-têtes GTS + - configurer un mappage entre le nom de fichier et les en-têtes GTS + - ingérer des données avec un nom de fichier correspondant aux en-têtes GTS - visualiser les en-têtes GTS dans les notifications WIS2 - utiliser le formulaire FM-12 SYNOP pour ajouter manuellement des en-têtes GTS à une notification WIS2 @@ -17,9 +17,9 @@ title: Ajout des en-têtes GTS aux notifications WIS2 Les Membres de l'OMM souhaitant arrêter la transmission de leurs données sur le GTS pendant la phase de transition vers WIS2 devront ajouter des en-têtes GTS à leurs notifications WIS2. Ces en-têtes permettent à la passerelle WIS2 vers GTS de transmettre les données au réseau GTS. -Cela permet aux Membres ayant migré vers l'utilisation d'un nœud WIS2 pour la publication des données de désactiver leur système MSS tout en garantissant que leurs données restent disponibles pour les Membres n'ayant pas encore migré vers WIS2. +Cela permet aux Membres ayant migré vers l'utilisation d'un nœud WIS2 pour la publication des données de désactiver leur système MSS tout en garantissant que leurs données restent disponibles pour les Membres qui n'ont pas encore migré vers WIS2. -La propriété GTS dans le Message de Notification WIS2 doit être ajoutée comme une propriété supplémentaire au Message de Notification WIS2. La propriété GTS est un objet JSON qui contient les en-têtes GTS nécessaires pour que les données soient transmises au réseau GTS. +La propriété GTS dans le Message de Notification WIS2 doit être ajoutée comme une propriété supplémentaire au Message de Notification WIS2. La propriété GTS est un objet JSON contenant les en-têtes GTS nécessaires pour que les données soient transmises au réseau GTS. ```json { @@ -30,19 +30,19 @@ La propriété GTS dans le Message de Notification WIS2 doit être ajoutée comm } ``` -Dans wis2box, vous pouvez ajouter cela automatiquement aux Notifications WIS2 en fournissant un fichier supplémentaire nommé `gts_headers_mapping.csv` contenant les informations nécessaires pour associer les en-têtes GTS aux noms de fichiers entrants. +Dans wis2box, vous pouvez ajouter cela automatiquement aux Notifications WIS2 en fournissant un fichier supplémentaire nommé `gts_headers_mapping.csv` contenant les informations nécessaires pour mapper les en-têtes GTS aux noms de fichiers entrants. Ce fichier doit être placé dans le répertoire défini par `WIS2BOX_HOST_DATADIR` dans votre fichier `wis2box.env` et doit contenir les colonnes suivantes : -- `string_in_filepath` : une chaîne faisant partie du nom de fichier qui sera utilisée pour associer les en-têtes GTS +- `string_in_filepath` : une chaîne faisant partie du nom de fichier qui sera utilisée pour correspondre aux en-têtes GTS - `TTAAii` : l'en-tête TTAAii à ajouter à la notification WIS2 - `CCCC` : l'en-tête CCCC à ajouter à la notification WIS2 -À partir de wis2box-1.3.0, les éditeurs de données ont deux options pour (facultativement) ajouter des propriétés GTS à leurs notifications : +Depuis wis2box-1.3.0, les éditeurs de données ont deux options pour (éventuellement) ajouter des propriétés GTS à leurs notifications : -1. Pour les fichiers téléchargés dans MinIO, préparer un fichier de correspondance nommé "gts_headers_mappings.csv" avec les propriétés requises. +1. Pour les fichiers téléchargés dans MinIO, préparer un fichier de mappage `gts_headers_mappings.csv` avec les propriétés requises. -2. Pour les données saisies via le formulaire FM-12 SYNOP dans wis2box-webapp, sélectionner "Ajouter des en-têtes GTS" et fournir les informations manuellement. +2. Pour les données saisies via le formulaire FM-12 SYNOP dans wis2box-webapp, sélectionner `Add GTS headers` et fournir les informations manuellement. ## Préparation @@ -52,13 +52,13 @@ Vérifiez que vous êtes connecté au broker MQTT de votre instance wis2box en u Assurez-vous d'avoir un navigateur web ouvert avec le tableau de bord Grafana de votre instance en accédant à `http://YOUR-HOST:3000`. -## Exercice 1 : Utilisation d'un fichier de correspondance pour les données téléchargées dans MinIO +## Exercice 1 : Utilisation d'un fichier de mappage pour les données téléchargées dans MinIO -Le premier exercice montre comment ajouter des en-têtes GTS pour les données téléchargées dans MinIO, en utilisant un fichier de correspondance nommé `gts_headers_mapping.csv`. +Le premier exercice montre comment ajouter des en-têtes GTS pour les données téléchargées dans MinIO, en utilisant un fichier de mappage nommé `gts_headers_mapping.csv`. ### Création de `gts_headers_mapping.csv` -Pour ajouter des en-têtes GTS à vos notifications WIS2, un fichier CSV est nécessaire pour associer les en-têtes GTS aux noms de fichiers entrants. +Pour ajouter des en-têtes GTS à vos notifications WIS2, un fichier CSV est requis pour mapper les en-têtes GTS aux noms de fichiers entrants. Le fichier CSV doit être nommé (exactement) `gts_headers_mapping.csv` et placé dans le répertoire défini par `WIS2BOX_HOST_DATADIR` dans votre fichier `wis2box.env`. @@ -68,15 +68,15 @@ Copiez le fichier `exercise-materials/gts-headers-exercises/gts_headers_mapping. cp ~/exercise-materials/gts-headers-exercises/gts_headers_mapping.csv ~/wis2box-data ``` -### Application des correspondances - +### Application des mappages + Après avoir créé le fichier `gts_headers_mapping.csv`, vous devez redémarrer le conteneur wis2box-management pour appliquer les modifications. Vous pouvez le faire en exécutant la commande suivante dans votre VM étudiant : ```bash docker restart wis2box-management ``` -### Intégration des données avec des en-têtes GTS +### Ingestion des données avec des en-têtes GTS Copiez le fichier `exercise-materials/gts-headers-exercises/A_SMRO01YRBK171200_C_EDZW_20240717120502.txt` dans le répertoire défini par `WIS2BOX_HOST_DATADIR` dans votre fichier `wis2box.env` : @@ -91,25 +91,25 @@ cd ~/wis2box python3 wis2box-ctl.py login ``` -Depuis la ligne de commande wis2box, vous pouvez intégrer le fichier de données exemple `A_SMRO01YRBK171200_C_EDZW_20240717120502.txt` dans un ensemble de données spécifique comme suit : +Depuis la ligne de commande wis2box, vous pouvez ingérer le fichier de données exemple `A_SMRO01YRBK171200_C_EDZW_20240717120502.txt` dans un ensemble de données spécifique comme suit : ```bash wis2box data ingest -p /data/wis2box/A_SMRO01YRBK171200_C_EDZW_20240717120502.txt --metadata-id urn:wmo:md:not-my-centre:core.surface-based-observations.synop ``` -Assurez-vous de remplacer l'option `metadata-id` par l'identifiant correct de votre ensemble de données. +Assurez-vous de remplacer l'option `metadata-id` par l'identifiant correct pour votre ensemble de données. -Vérifiez le tableau de bord Grafana pour voir si les données ont été intégrées correctement. Si vous voyez des AVERTISSEMENTS ou des ERREURS, essayez de les corriger et répétez l'exercice avec la commande `wis2box data ingest`. +Vérifiez le tableau de bord Grafana pour voir si les données ont été correctement ingérées. Si vous voyez des AVERTISSEMENTS ou des ERREURS, essayez de les corriger et répétez l'exercice avec la commande `wis2box data ingest`. ### Visualisation des en-têtes GTS dans la Notification WIS2 -Accédez à MQTT Explorer et vérifiez le Message de Notification WIS2 pour les données que vous venez d'intégrer. +Accédez à MQTT Explorer et vérifiez le Message de Notification WIS2 pour les données que vous venez d'ingérer. Le Message de Notification WIS2 doit contenir les en-têtes GTS que vous avez fournis dans le fichier `gts_headers_mapping.csv`. ## Exercice 2 : Utilisation du formulaire FM-12 SYNOP -Lors de l'utilisation du formulaire FM-12 SYNOP dans wis2box-webapp, vous pouvez ajouter manuellement des en-têtes GTS à vos notifications WIS2 en sélectionnant l'option "Ajouter des en-têtes GTS" et en fournissant les informations requises. +Lors de l'utilisation du formulaire FM-12 SYNOP dans wis2box-webapp, vous pouvez ajouter manuellement des en-têtes GTS à vos notifications WIS2 en sélectionnant l'option "Add GTS headers" et en fournissant les informations requises. Pour cet exercice, vous pouvez utiliser les données d'exemple ci-dessous ou fournir les vôtres : @@ -133,7 +133,7 @@ En-têtes GTS : TTAAii=`ISIH01` et CCCC=`FCBB` Accédez au formulaire FM-12 SYNOP dans wis2box-webapp et remplissez le formulaire avec les données d'exemple ci-dessus ou vos propres données. -Assurez-vous de sélectionner l'option "Ajouter des en-têtes GTS" et de fournir les informations requises pour les en-têtes GTS : +Assurez-vous de sélectionner l'option "Add GTS headers" et de fournir les informations requises pour les en-têtes GTS : fm-12-synop-form-gts-headers.png @@ -143,7 +143,7 @@ Vous verrez probablement un message d'erreur car cette station n'est pas dans vo ### Visualisation des en-têtes GTS dans la Notification WIS2 -Accédez à MQTT Explorer et vérifiez le Message de Notification WIS2 pour les données que vous venez d'intégrer afin de voir si les en-têtes GTS sont inclus dans la notification. +Accédez à MQTT Explorer et vérifiez le Message de Notification WIS2 pour les données que vous venez d'ingérer afin de voir si les en-têtes GTS sont inclus dans la notification. ## Conclusion diff --git a/documentation/docs/fr/practical-sessions/connecting-to-wis2-over-mqtt.md b/documentation/docs/fr/practical-sessions/connecting-to-wis2-over-mqtt.md index 1978292ef..37693a4e5 100644 --- a/documentation/docs/fr/practical-sessions/connecting-to-wis2-over-mqtt.md +++ b/documentation/docs/fr/practical-sessions/connecting-to-wis2-over-mqtt.md @@ -9,14 +9,14 @@ title: Connexion à WIS2 via MQTT À la fin de cette session pratique, vous serez capable de : - vous connecter au Global Broker de WIS2 en utilisant MQTT Explorer - - examiner la structure des sujets WIS2 + - examiner la structure des topics WIS2 - examiner la structure des messages de notification WIS2 ## Introduction -WIS2 utilise le protocole MQTT pour annoncer la disponibilité des données météorologiques, climatiques et hydrologiques. Le Global Broker de WIS2 s'abonne à tous les WIS2 Nodes du réseau et republie les messages qu'il reçoit. Le Global Cache s'abonne au Global Broker, télécharge les données contenues dans le message, puis republie le message sur le sujet `cache` avec une nouvelle URL. Le Global Discovery Catalogue publie les métadonnées de découverte provenant du Broker et fournit une API de recherche. +WIS2 utilise le protocole MQTT pour annoncer la disponibilité des données météorologiques/climatiques/hydrologiques. Le Global Broker de WIS2 s'abonne à tous les WIS2 Nodes du réseau et republie les messages qu'il reçoit. Le Global Cache s'abonne au Global Broker, télécharge les données contenues dans le message, puis republie le message sur le topic `cache` avec une nouvelle URL. Le Global Discovery Catalogue publie les métadonnées de découverte provenant du Broker et fournit une API de recherche. -Voici un exemple de structure de message de notification WIS2 pour un message reçu sur le sujet `origin/a/wis2/br-inmet/data/core/weather/surface-based-observations/synop` : +Voici un exemple de structure de message de notification WIS2 pour un message reçu sur le topic `origin/a/wis2/br-inmet/data/core/weather/surface-based-observations/synop` : ```json { @@ -63,18 +63,18 @@ Voici un exemple de structure de message de notification WIS2 pour un message re Dans cette session pratique, vous apprendrez à utiliser l'outil MQTT Explorer pour configurer une connexion client MQTT à un Global Broker WIS2 et afficher les messages de notification WIS2. -MQTT Explorer est un outil utile pour parcourir et examiner la structure des sujets d'un broker MQTT afin de consulter les données publiées. +MQTT Explorer est un outil utile pour parcourir et examiner la structure des topics d'un broker MQTT donné afin de consulter les données publiées. !!! note "À propos de MQTT" - MQTT Explorer fournit une interface conviviale pour se connecter à un broker MQTT et explorer les sujets et la structure des messages utilisés par WIS2. + MQTT Explorer fournit une interface conviviale pour se connecter à un broker MQTT et explorer les topics et la structure des messages utilisés par WIS2. - En pratique, MQTT est conçu pour une communication machine-à-machine, où une application ou un service s'abonne à des sujets et traite les messages de manière programmatique en temps réel. + En pratique, MQTT est conçu pour une communication machine-à-machine, où une application ou un service s'abonne à des topics et traite les messages de manière programmatique en temps réel. - Pour travailler avec MQTT de manière programmatique (par exemple, en Python), vous pouvez utiliser des bibliothèques client MQTT comme [paho-mqtt](https://pypi.org/project/paho-mqtt) pour vous connecter à un broker MQTT et traiter les messages entrants. Il existe de nombreux logiciels client et serveur MQTT, en fonction de vos besoins et de votre environnement technique. + Pour travailler avec MQTT de manière programmatique (par exemple, en Python), vous pouvez utiliser des bibliothèques client MQTT telles que [paho-mqtt](https://pypi.org/project/paho-mqtt) pour vous connecter à un broker MQTT et traiter les messages entrants. Il existe de nombreux logiciels client et serveur MQTT, selon vos besoins et votre environnement technique. ## Utilisation de MQTT Explorer pour se connecter au Global Broker -Pour consulter les messages publiés par un Global Broker WIS2, vous pouvez utiliser "MQTT Explorer", téléchargeable depuis le [site web de MQTT Explorer](https://mqtt-explorer.com). +Pour visualiser les messages publiés par un Global Broker WIS2, vous pouvez utiliser "MQTT Explorer", téléchargeable depuis le [site web de MQTT Explorer](https://mqtt-explorer.com). Ouvrez MQTT Explorer et ajoutez une nouvelle connexion au Global Broker hébergé par MeteoFrance en utilisant les détails suivants : @@ -85,7 +85,7 @@ Ouvrez MQTT Explorer et ajoutez une nouvelle connexion au Global Broker héberg mqtt-explorer-global-broker-connection -Cliquez sur le bouton 'ADVANCED', supprimez les sujets préconfigurés et ajoutez les sujets suivants pour vous y abonner : +Cliquez sur le bouton 'ADVANCED', supprimez les topics préconfigurés et ajoutez les topics suivants pour vous y abonner : - `origin/a/wis2/#` @@ -94,52 +94,52 @@ Cliquez sur le bouton 'ADVANCED', supprimez les sujets préconfigurés et ajoute !!! note Lors de la configuration des abonnements MQTT, vous pouvez utiliser les jokers suivants : - - **Niveau unique (+)** : un joker de niveau unique remplace un niveau de sujet - - **Multi-niveaux (#)** : un joker multi-niveaux remplace plusieurs niveaux de sujet + - **Niveau unique (+)** : un joker de niveau unique remplace un niveau de topic + - **Multi-niveaux (#)** : un joker multi-niveaux remplace plusieurs niveaux de topics - Dans ce cas, `origin/a/wis2/#` s'abonnera à tous les sujets sous le sujet `origin/a/wis2`. + Dans ce cas, `origin/a/wis2/#` s'abonnera à tous les topics sous le topic `origin/a/wis2`. -Cliquez sur 'BACK', puis 'SAVE' pour enregistrer vos détails de connexion et d'abonnement. Ensuite, cliquez sur 'CONNECT' : +Cliquez sur 'BACK', puis 'SAVE' pour enregistrer les détails de votre connexion et abonnement. Ensuite, cliquez sur 'CONNECT' : Les messages devraient commencer à apparaître dans votre session MQTT Explorer comme suit : mqtt-explorer-global-broker-topics -Vous êtes maintenant prêt à explorer les sujets et la structure des messages WIS2. +Vous êtes maintenant prêt à explorer les topics et la structure des messages WIS2. -## Exercice 1 : Examiner la structure des sujets WIS2 +## Exercice 1 : Examiner la structure des topics WIS2 -Utilisez MQTT pour parcourir la structure des sujets sous les sujets `origin`. +Utilisez MQTT pour parcourir la structure des topics sous les topics `origin`. !!! question - Comment peut-on distinguer le centre WIS qui a publié les données ? + Comment pouvons-nous distinguer le centre WIS qui a publié les données ? ??? success "Cliquez pour révéler la réponse" - Vous pouvez cliquer sur la fenêtre de gauche dans MQTT Explorer pour développer la structure des sujets. + Vous pouvez cliquer sur la fenêtre de gauche dans MQTT Explorer pour développer la structure des topics. - Nous pouvons distinguer le centre WIS qui a publié les données en regardant le quatrième niveau de la structure des sujets. Par exemple, le sujet suivant : + Nous pouvons distinguer le centre WIS qui a publié les données en regardant le quatrième niveau de la structure des topics. Par exemple, le topic suivant : `origin/a/wis2/br-inmet/data/core/weather/surface-based-observations/synop` - nous indique que les données ont été publiées par un centre WIS avec l'identifiant `br-inmet`, qui correspond à l'identifiant du centre Instituto Nacional de Meteorologia - INMET, Brésil. + nous indique que les données ont été publiées par un centre WIS avec l'identifiant `br-inmet`, qui correspond à l'identifiant du centre pour l'Instituto Nacional de Meteorologia - INMET, Brésil. !!! question - Comment peut-on distinguer les messages publiés par les centres WIS hébergeant une passerelle GTS-vers-WIS2 des messages publiés par les centres WIS hébergeant un WIS2 Node ? + Comment pouvons-nous distinguer les messages publiés par les centres WIS hébergeant une passerelle GTS-vers-WIS2 et ceux publiés par les centres WIS hébergeant un WIS2 Node ? ??? success "Cliquez pour révéler la réponse" - Nous pouvons distinguer les messages provenant d'une passerelle GTS-vers-WIS2 en regardant l'identifiant du centre dans la structure des sujets. Par exemple, le sujet suivant : + Nous pouvons distinguer les messages provenant d'une passerelle GTS-vers-WIS2 en regardant l'identifiant du centre dans la structure des topics. Par exemple, le topic suivant : `origin/a/wis2/de-dwd-gts-to-wis2/data/core/I/S/A/I/01/sbbr` - nous indique que les données ont été publiées par la passerelle GTS-vers-WIS2 hébergée par Deutscher Wetterdienst (DWD), Allemagne. La passerelle GTS-vers-WIS2 est un type spécial de producteur de données qui publie des données du Système Mondial de Télécommunications (GTS) vers WIS2. La structure des sujets est composée des en-têtes TTAAii CCCC des messages GTS. + nous indique que les données ont été publiées par la passerelle GTS-vers-WIS2 hébergée par Deutscher Wetterdienst (DWD), Allemagne. La passerelle GTS-vers-WIS2 est un type spécial de producteur de données qui publie des données du Global Telecommunication System (GTS) vers WIS2. La structure des topics est composée des en-têtes TTAAii CCCC des messages GTS. ## Exercice 2 : Examiner la structure des messages WIS2 -Déconnectez-vous de MQTT Explorer et mettez à jour les sections 'Advanced' pour modifier l'abonnement aux sujets suivants : +Déconnectez-vous de MQTT Explorer et mettez à jour les sections 'Advanced' pour changer l'abonnement aux topics suivants : * `origin/a/wis2/+/data/core/weather/surface-based-observations/synop` * `cache/a/wis2/+/data/core/weather/surface-based-observations/synop` @@ -149,25 +149,25 @@ Déconnectez-vous de MQTT Explorer et mettez à jour les sections 'Advanced' pou !!! note Le joker `+` est utilisé pour s'abonner à tous les centres WIS. -Reconnectez-vous au Global Broker et attendez que les messages apparaissent. +Reconnectez-vous au Global Broker et attendez que les messages apparaissent. -Vous pouvez consulter le contenu du message WIS2 dans la section "Value" située à droite. Essayez de développer la structure des sujets pour voir les différents niveaux du message jusqu'à atteindre le dernier niveau et examinez le contenu d'un des messages. +Vous pouvez consulter le contenu du message WIS2 dans la section "Value" située à droite. Essayez de développer la structure des topics pour voir les différents niveaux du message jusqu'à atteindre le dernier niveau et examinez le contenu d'un des messages. !!! question - Comment peut-on identifier l'horodatage de publication des données ? Et comment peut-on identifier l'horodatage de collecte des données ? + Comment pouvons-nous identifier l'horodatage auquel les données ont été publiées ? Et comment pouvons-nous identifier l'horodatage auquel les données ont été collectées ? ??? success "Cliquez pour révéler la réponse" - L'horodatage de publication des données est contenu dans la section `properties` du message avec une clé `pubtime`. + L'horodatage auquel les données ont été publiées est contenu dans la section `properties` du message avec une clé `pubtime`. - L'horodatage de collecte des données est contenu dans la section `properties` du message avec une clé `datetime`. + L'horodatage auquel les données ont été collectées est contenu dans la section `properties` du message avec une clé `datetime`. mqtt-explorer-global-broker-msg-properties !!! question - Comment peut-on télécharger les données à partir de l'URL fournie dans le message ? + Comment pouvons-nous télécharger les données à partir de l'URL fournie dans le message ? ??? success "Cliquez pour révéler la réponse" @@ -175,25 +175,25 @@ Vous pouvez consulter le contenu du message WIS2 dans la section "Value" située Vous pouvez copier l'URL et la coller dans un navigateur web pour télécharger les données. -## Exercice 3 : Examiner la différence entre les sujets 'origin' et 'cache' +## Exercice 3 : Examiner la différence entre les topics 'origin' et 'cache' -Assurez-vous d'être toujours connecté au Global Broker en utilisant les abonnements aux sujets `origin/a/wis2/+/data/core/weather/surface-based-observations/synop` et `cache/a/wis2/+/data/core/weather/surface-based-observations/synop` comme décrit dans l'Exercice 2. +Assurez-vous d'être toujours connecté au Global Broker en utilisant les abonnements aux topics `origin/a/wis2/+/data/core/weather/surface-based-observations/synop` et `cache/a/wis2/+/data/core/weather/surface-based-observations/synop` comme décrit dans l'Exercice 2. -Essayez d'identifier un message pour le même centre-id publié à la fois sur les sujets `origin` et `cache`. +Essayez d'identifier un message pour le même identifiant de centre publié à la fois sur les topics `origin` et `cache`. !!! question - Quelle est la différence entre les messages publiés sur les sujets `origin` et `cache` ? + Quelle est la différence entre les messages publiés sur les topics `origin` et `cache` ? ??? success "Cliquez pour révéler la réponse" - Les messages publiés sur les sujets `origin` sont les messages originaux que le Global Broker republie à partir des WIS2 Nodes du réseau. + Les messages publiés sur les topics `origin` sont les messages originaux que le Global Broker republie à partir des WIS2 Nodes du réseau. - Les messages publiés sur les sujets `cache` sont les messages pour lesquels les données ont été téléchargées par le Global Cache. Si vous consultez le contenu du message provenant du sujet commençant par `cache`, vous verrez que le lien 'canonical' a été mis à jour avec une nouvelle URL. + Les messages publiés sur les topics `cache` sont les messages pour lesquels les données ont été téléchargées par le Global Cache. Si vous consultez le contenu du message provenant du topic commençant par `cache`, vous verrez que le lien 'canonical' a été mis à jour avec une nouvelle URL. Il existe plusieurs Global Caches dans le réseau WIS2, donc vous recevrez un message de chaque Global Cache ayant téléchargé le message. - Le Global Cache ne télécharge et ne republie que les messages publiés sur la hiérarchie de sujets `../data/core/...`. + Le Global Cache ne télécharge et ne republie que les messages publiés sur la hiérarchie de topics `../data/core/...`. ## Conclusion @@ -201,8 +201,8 @@ Essayez d'identifier un message pour le même centre-id publié à la fois sur l Dans cette session pratique, vous avez appris : - comment s'abonner aux services du Global Broker WIS2 en utilisant MQTT Explorer - - la structure des sujets WIS2 + - la structure des topics WIS2 - la structure des messages de notification WIS2 - - la différence entre les données principales et recommandées - - la structure des sujets utilisée par la passerelle GTS-vers-WIS2 - - la différence entre les messages du Global Broker publiés sur les sujets `origin` et `cache` \ No newline at end of file + - la différence entre les données core et recommandées + - la structure des topics utilisée par la passerelle GTS-vers-WIS2 + - la différence entre les messages du Global Broker publiés sur les topics `origin` et `cache` \ No newline at end of file diff --git a/documentation/docs/fr/practical-sessions/initializing-wis2box.md b/documentation/docs/fr/practical-sessions/initializing-wis2box.md index 499388d65..5e0958202 100644 --- a/documentation/docs/fr/practical-sessions/initializing-wis2box.md +++ b/documentation/docs/fr/practical-sessions/initializing-wis2box.md @@ -12,23 +12,23 @@ title: Initialiser wis2box - démarrer wis2box et vérifier l'état de ses composants - consulter le contenu de **wis2box-api** - accéder à **wis2box-webapp** - - se connecter au **wis2box-broker** local en utilisant MQTT Explorer + - vous connecter au **wis2box-broker** local en utilisant MQTT Explorer !!! note - Les supports de formation actuels sont basés sur wis2box-release 1.3.0. + Les supports de formation actuels sont basés sur la version wis2box-release 1.3.0. - Consultez [accessing-your-student-vm](./accessing-your-student-vm.md) pour obtenir des instructions sur la manière de télécharger et d'installer la pile logicielle wis2box si vous suivez cette formation en dehors d'une session de formation locale. + Consultez [accessing-your-student-vm](./accessing-your-student-vm.md) pour des instructions sur la manière de télécharger et d'installer la pile logicielle wis2box si vous suivez cette formation en dehors d'une session de formation locale. ## Préparation -Connectez-vous à votre VM désignée avec votre nom d'utilisateur et mot de passe et assurez-vous d'être dans le répertoire `wis2box` : +Connectez-vous à votre VM désignée avec votre nom d'utilisateur et mot de passe, et assurez-vous d'être dans le répertoire `wis2box` : ```bash cd ~/wis2box ``` -## Créer la configuration initiale +## Création de la configuration initiale La configuration initiale de wis2box nécessite : @@ -39,7 +39,7 @@ Le script `wis2box-create-config.py` peut être utilisé pour créer la configur Il vous posera une série de questions pour vous aider à configurer votre environnement. -Vous pourrez examiner et mettre à jour les fichiers de configuration une fois le script terminé. +Vous pourrez examiner et mettre à jour les fichiers de configuration une fois que le script sera terminé. Exécutez le script comme suit : @@ -49,7 +49,7 @@ python3 wis2box-create-config.py ### Répertoire wis2box-host-data -Le script vous demandera d'entrer le répertoire à utiliser pour la variable d'environnement `WIS2BOX_HOST_DATADIR`. +Le script vous demandera de saisir le répertoire à utiliser pour la variable d'environnement `WIS2BOX_HOST_DATADIR`. Notez que vous devez définir le chemin complet vers ce répertoire. @@ -68,7 +68,7 @@ The directory /home/username/wis2box-data has been created. ### URL de wis2box -Ensuite, il vous sera demandé d'entrer l'URL de votre wis2box. Cette URL sera utilisée pour accéder à l'application web, à l'API et à l'interface utilisateur de wis2box. +Ensuite, vous serez invité à saisir l'URL de votre wis2box. Cette URL sera utilisée pour accéder à l'application web, à l'API et à l'interface utilisateur de wis2box. Veuillez utiliser `http://` comme URL. @@ -88,7 +88,7 @@ Vous pouvez utiliser l'option de génération aléatoire de mots de passe lorsqu Ne vous inquiétez pas de mémoriser ces mots de passe, ils seront stockés dans le fichier `wis2box.env` dans votre répertoire wis2box. -### Vérifier `wis2box.env` +### Vérification de `wis2box.env` Une fois le script terminé, vérifiez le contenu du fichier `wis2box.env` dans votre répertoire actuel : @@ -116,7 +116,7 @@ Ou vérifiez le contenu du fichier via WinSCP. La valeur par défaut de WIS2BOX_STORAGE_DATA_RETENTION_DAYS est de 30 jours. Vous pouvez modifier cette valeur pour un autre nombre de jours si vous le souhaitez. - Le conteneur wis2box-management exécute un cronjob quotidien pour supprimer les données plus anciennes que le nombre de jours défini par WIS2BOX_STORAGE_DATA_RETENTION_DAYS du bucket `wis2box-public` et du backend API : + Le conteneur wis2box-management exécute une tâche cron quotidiennement pour supprimer les données plus anciennes que le nombre de jours défini par WIS2BOX_STORAGE_DATA_RETENTION_DAYS du bucket `wis2box-public` et du backend API : ```{.copy} 0 0 * * * su wis2box -c "wis2box data clean --days=$WIS2BOX_STORAGE_DATA_RETENTION_DAYS" @@ -126,7 +126,7 @@ Ou vérifiez le contenu du fichier via WinSCP. Le fichier `wis2box.env` contient des variables d'environnement définissant la configuration de votre wis2box. Pour plus d'informations, consultez la [documentation wis2box](https://docs.wis2box.wis.wmo.int/en/latest/reference/configuration.html). - Ne modifiez pas le fichier `wis2box.env` sauf si vous êtes sûr des changements que vous effectuez. Des modifications incorrectes peuvent empêcher votre wis2box de fonctionner. + Ne modifiez pas le fichier `wis2box.env` sauf si vous êtes sûr des modifications que vous apportez. Des modifications incorrectes peuvent empêcher votre wis2box de fonctionner. Ne partagez pas le contenu de votre fichier `wis2box.env` avec quiconque, car il contient des informations sensibles telles que des mots de passe. @@ -245,7 +245,7 @@ Les volumes commençant par `wis2box_project_` sont utilisés pour stocker des d ## wis2box API -Le wis2box contient une API (Interface de Programmation d'Applications) qui fournit un accès aux données et des processus pour la visualisation interactive, la transformation des données et leur publication. +Le wis2box contient une API (Interface de Programmation d'Application) qui fournit un accès aux données et des processus pour la visualisation interactive, la transformation des données et leur publication. Ouvrez un nouvel onglet et accédez à la page `http://YOUR-HOST/oapi`. @@ -344,9 +344,9 @@ Utilisez les détails de connexion suivants, en veillant à remplacer la valeur cat ~/wis2box/wis2box.env | grep WIS2BOX_BROKER_PASSWORD ``` - Notez que ceci est votre mot de passe **interne** pour le broker. Le Global Broker utilisera des identifiants différents (en lecture seule) pour s'abonner à votre broker. Ne partagez jamais ce mot de passe avec quiconque. + Notez que ceci est votre mot de passe **interne** pour le broker. Le Global Broker utilisera des identifiants différents (en lecture seule) pour s'abonner à votre broker. Ne partagez jamais ce mot de passe avec qui que ce soit. -Assurez-vous de cliquer sur "SAVE" pour enregistrer vos détails de connexion. +Assurez-vous de cliquer sur "SAVE" pour enregistrer les détails de votre connexion. Puis cliquez sur "CONNECT" pour vous connecter à votre **wis2box-broker**. @@ -356,16 +356,16 @@ Une fois connecté, vous verrez les statistiques internes de mosquitto publiées mqtt-explorer-sys-topic.png -La même connexion peut également être établie en utilisant MQTT via WebSockets sur le port 80, avec les détails de connexion suivants : +La même connexion peut également être réalisée en utilisant MQTT via WebSockets sur le port 80, avec les détails de connexion suivants : mqtt-explorer-wis2box-broker-websockets.png ## Conclusion !!! success "Félicitations !" - Lors de cette session pratique, vous avez appris à : + Dans cette session pratique, vous avez appris à : - exécuter le script `wis2box-create-config.py` pour créer la configuration initiale - - démarrer wis2box et vérifier le statut de ses composants + - démarrer wis2box et vérifier l'état de ses composants - accéder à wis2box-webapp et wis2box-API dans un navigateur - - vous connecter au broker MQTT sur votre VM étudiant en utilisant MQTT Explorer \ No newline at end of file + - vous connecter au broker MQTT sur votre VM étudiante en utilisant MQTT Explorer \ No newline at end of file diff --git a/documentation/docs/ru/practical-sessions/accessing-your-student-vm.md b/documentation/docs/ru/practical-sessions/accessing-your-student-vm.md index 7298d514a..4c65e28a0 100644 --- a/documentation/docs/ru/practical-sessions/accessing-your-student-vm.md +++ b/documentation/docs/ru/practical-sessions/accessing-your-student-vm.md @@ -1,20 +1,20 @@ --- -title: Доступ к вашей учебной виртуальной машине +title: Доступ к вашей учебной виртуальной машине (VM) --- -# Доступ к вашей учебной виртуальной машине +# Доступ к вашей учебной виртуальной машине (VM) !!! abstract "Результаты обучения" - К концу этого практического занятия вы сможете: + По окончании данного практического занятия вы сможете: - - подключаться к вашей учебной виртуальной машине через SSH и WinSCP - - проверять, что необходимое программное обеспечение для выполнения практических упражнений установлено - - проверять, что у вас есть доступ к материалам упражнений для этого обучения на вашей локальной учебной виртуальной машине + - подключаться к своей учебной виртуальной машине через SSH и WinSCP + - проверять наличие установленного необходимого программного обеспечения для выполнения практических упражнений + - проверять доступ к материалам упражнений для данного обучения на вашей локальной учебной виртуальной машине ## Введение -В рамках локальных семинаров WIS2 Training вы можете получить доступ к вашей персональной учебной виртуальной машине в локальной учебной сети под названием "WIS2-training". +В рамках локальных семинаров по обучению WIS2 вы можете получить доступ к своей персональной учебной виртуальной машине в локальной учебной сети под названием "WIS2-training". На вашей учебной виртуальной машине предварительно установлено следующее программное обеспечение: @@ -26,7 +26,7 @@ title: Доступ к вашей учебной виртуальной маши !!! note - Если вы хотите пройти это обучение вне локального учебного занятия, вы можете предоставить свою собственную виртуальную машину, используя любого облачного провайдера, например: + Если вы хотите пройти это обучение вне локальной учебной сессии, вы можете использовать собственный экземпляр, предоставленный любым облачным провайдером, например: - GCP (Google Cloud Platform) VM instance `e2-medium` - AWS (Amazon Web Services) ec2-instance `t3a.medium` @@ -36,7 +36,7 @@ title: Доступ к вашей учебной виртуальной маши После создания виртуальной машины убедитесь, что вы установили python, docker и docker compose, как описано в [wis2box-software-dependencies](https://docs.wis2box.wis.wmo.int/en/latest/user/getting-started.html#software-dependencies). - Архив релиза wis2box, используемый в этом обучении, можно загрузить следующим образом: + Архив релиза wis2box, используемый в этом обучении, можно скачать следующим образом: ```bash wget https://github.com/World-Meteorological-Organization/wis2box-release/releases/download/1.3.0/wis2box-setup-1.3.0.zip @@ -45,7 +45,7 @@ title: Доступ к вашей учебной виртуальной маши Вы всегда можете найти последний архив 'wis2box-setup' по адресу [https://github.com/World-Meteorological-Organization/wis2box/releases](https://github.com/World-Meteorological-Organization/wis2box-release/releases). - Материалы упражнений, используемые в этом обучении, можно загрузить следующим образом: + Материалы упражнений, используемые в этом обучении, можно скачать следующим образом: ```bash wget https://training.wis2box.wis.wmo.int/exercise-materials.zip @@ -59,21 +59,21 @@ title: Доступ к вашей учебной виртуальной маши pip3 install pywiscat ``` - Если вы используете учебную виртуальную машину, предоставленную во время локальных занятий WIS2, необходимое программное обеспечение уже будет установлено. + Если вы используете учебную виртуальную машину, предоставленную во время локальных учебных сессий WIS2, необходимое программное обеспечение уже будет установлено. ## Подключение к вашей учебной виртуальной машине в локальной учебной сети -Подключите ваш компьютер к локальной Wi-Fi сети, транслируемой в помещении во время обучения WIS2, согласно инструкциям, предоставленным тренером. +Подключите ваш ПК к локальной Wi-Fi сети, раздаваемой в помещении во время обучения WIS2, согласно инструкциям, предоставленным тренером. Используйте SSH-клиент для подключения к вашей учебной виртуальной машине, используя следующие данные: -- **Хост: (предоставляется во время очного обучения)** -- **Порт: 22** -- **Имя пользователя: (предоставляется во время очного обучения)** -- **Пароль: (предоставляется во время очного обучения)** +- **Host: (предоставляется во время очного обучения)** +- **Port: 22** +- **Username: (предоставляется во время очного обучения)** +- **Password: (предоставляется во время очного обучения)** !!! tip - Обратитесь к тренеру, если вы не уверены в имени хоста/пользователя или у вас возникли проблемы с подключением. + Обратитесь к тренеру, если вы не уверены в имени хоста/имени пользователя или у вас возникли проблемы с подключением. После подключения измените ваш пароль, чтобы другие не могли получить доступ к вашей виртуальной машине: @@ -117,9 +117,9 @@ docker compose version Docker Compose version v2.21.0 ``` -Чтобы убедиться, что ваш пользователь может выполнять команды Docker, он был добавлен в группу `docker`. +Чтобы ваш пользователь мог выполнять команды Docker, он был добавлен в группу `docker`. -Для проверки выполните команду docker hello-world: +Для проверки возможности выполнения команд Docker выполните следующую команду: ```bash docker run hello-world ``` @@ -147,9 +147,9 @@ ls ~/ exercise-materials wis2box ``` -Если на вашем локальном компьютере установлен WinSCP, вы можете использовать его для подключения к вашей учебной виртуальной машине, чтобы проверить содержимое домашнего каталога, а также загружать или выгружать файлы между вашей виртуальной машиной и локальным компьютером. +Если на вашем локальном ПК установлен WinSCP, вы можете использовать его для подключения к вашей учебной виртуальной машине, проверки содержимого домашнего каталога, а также загрузки или выгрузки файлов между вашей виртуальной машиной и локальным ПК. -WinSCP не требуется для обучения, но может быть полезен, если вы хотите редактировать файлы на виртуальной машине, используя текстовый редактор на вашем локальном компьютере. +WinSCP не является обязательным для обучения, но может быть полезным, если вы хотите редактировать файлы на виртуальной машине с помощью текстового редактора на вашем локальном ПК. Вот как можно подключиться к вашей учебной виртуальной машине с помощью WinSCP: @@ -159,13 +159,13 @@ WinSCP не требуется для обучения, но может быть Нажмите 'Save', а затем 'Login', чтобы подключиться к вашей виртуальной машине. -Теперь вы должны увидеть содержимое домашнего каталога вашей учебной виртуальной машины и получить доступ к вашим файлам. +Теперь вы должны увидеть содержимое домашнего каталога на вашей учебной виртуальной машине и получить доступ к вашим файлам. ## Заключение !!! success "Поздравляем!" - В рамках этого практического занятия вы научились: + В рамках данного практического занятия вы научились: - подключаться к вашей учебной виртуальной машине через SSH и WinSCP - - проверять, что необходимое программное обеспечение для выполнения практических упражнений установлено - - проверять, что у вас есть доступ к материалам упражнений для этого обучения на вашей локальной учебной виртуальной машине \ No newline at end of file + - проверять наличие установленного необходимого программного обеспечения для выполнения практических упражнений + - проверять доступ к материалам упражнений для данного обучения на вашей локальной учебной виртуальной машине \ No newline at end of file diff --git a/documentation/docs/ru/practical-sessions/adding-gts-headers-to-wis2-notifications.md b/documentation/docs/ru/practical-sessions/adding-gts-headers-to-wis2-notifications.md index 6d67354cc..1e17bb0a9 100644 --- a/documentation/docs/ru/practical-sessions/adding-gts-headers-to-wis2-notifications.md +++ b/documentation/docs/ru/practical-sessions/adding-gts-headers-to-wis2-notifications.md @@ -1,25 +1,25 @@ --- -title: Добавление заголовков GTS в уведомления WIS2 +title: Добавление заголовков GTS к уведомлениям WIS2 --- -# Добавление заголовков GTS в уведомления WIS2 +# Добавление заголовков GTS к уведомлениям WIS2 !!! abstract "Результаты обучения" - По завершении практического занятия вы сможете: + К концу практического занятия вы сможете: - настроить сопоставление между именем файла и заголовками GTS - загружать данные с именем файла, соответствующим заголовкам GTS - просматривать заголовки GTS в уведомлениях WIS2 - - использовать форму FM-12 SYNOP для ручного добавления заголовков GTS в уведомление WIS2 + - использовать форму FM-12 SYNOP для ручного добавления заголовков GTS к уведомлению WIS2 ## Введение -Члены ВМО, желающие прекратить передачу данных через GTS в переходный период к WIS2, должны добавить заголовки GTS в свои уведомления WIS2. Эти заголовки позволяют шлюзу WIS2-GTS перенаправлять данные в сеть GTS. +Члены ВМО, желающие прекратить передачу своих данных через GTS в переходный период к WIS2, должны добавить заголовки GTS к своим уведомлениям WIS2. Эти заголовки позволяют шлюзу WIS2 к GTS перенаправлять данные в сеть GTS. Это позволяет членам, которые перешли на использование узла WIS2 для публикации данных, отключить свою систему MSS и гарантировать, что их данные остаются доступными для членов, которые еще не перешли на WIS2. -Свойство GTS в уведомлении WIS2 должно быть добавлено как дополнительное свойство в сообщение уведомления WIS2. Свойство GTS представляет собой объект JSON, содержащий заголовки GTS, необходимые для передачи данных в сеть GTS. +Свойство GTS в уведомлении WIS2 должно быть добавлено как дополнительное свойство к сообщению уведомления WIS2. Свойство GTS — это объект JSON, содержащий заголовки GTS, необходимые для передачи данных в сеть GTS. ```json { @@ -30,39 +30,39 @@ title: Добавление заголовков GTS в уведомления W } ``` -В рамках wis2box это можно добавить в уведомления WIS2 автоматически, предоставив дополнительный файл с именем `gts_headers_mapping.csv`, содержащий необходимую информацию для сопоставления заголовков GTS с входящими именами файлов. +В рамках wis2box вы можете автоматически добавлять это к уведомлениям WIS2, предоставив дополнительный файл с именем `gts_headers_mapping.csv`, который содержит необходимую информацию для сопоставления заголовков GTS с входящими именами файлов. -Этот файл должен быть размещен в каталоге, определенном переменной `WIS2BOX_HOST_DATADIR` в вашем файле `wis2box.env`, и должен содержать следующие столбцы: +Этот файл должен быть размещен в каталоге, определенном переменной `WIS2BOX_HOST_DATADIR` в вашем `wis2box.env`, и должен содержать следующие столбцы: -- `string_in_filepath`: строка, являющаяся частью имени файла, которая будет использоваться для сопоставления заголовков GTS -- `TTAAii`: заголовок TTAAii, который будет добавлен в уведомление WIS2 -- `CCCC`: заголовок CCCC, который будет добавлен в уведомление WIS2 +- `string_in_filepath`: строка, которая является частью имени файла и будет использоваться для сопоставления заголовков GTS +- `TTAAii`: заголовок TTAAii, который будет добавлен к уведомлению WIS2 +- `CCCC`: заголовок CCCC, который будет добавлен к уведомлению WIS2 -Начиная с версии wis2box-1.3.0, у издателей данных есть два варианта (необязательного) добавления свойств GTS в свои уведомления: +Начиная с версии wis2box-1.3.0, издатели данных имеют два варианта (опционально) добавления свойств GTS к своим уведомлениям: 1. Для файлов, загружаемых в MinIO, подготовьте файл сопоставления `gts_headers_mappings.csv` с необходимыми свойствами. -2. Для ввода данных с использованием формы FM-12 SYNOP в wis2box-webapp выберите опцию «Add GTS headers» и введите данные вручную. +2. Для ввода данных с использованием формы FM-12 SYNOP в wis2box-webapp выберите опцию `Add GTS headers` и введите данные вручную. ## Подготовка -Убедитесь, что у вас есть доступ по SSH к вашей виртуальной машине студента и что ваш экземпляр wis2box запущен. +Убедитесь, что у вас есть доступ по SSH к вашей виртуальной машине студента и что ваш экземпляр wis2box запущен и работает. -Убедитесь, что вы подключены к брокеру MQTT вашего экземпляра wis2box с помощью MQTT Explorer. Вы можете использовать публичные учетные данные `everyone/everyone` для подключения к брокеру. +Убедитесь, что вы подключены к MQTT брокеру вашего экземпляра wis2box с использованием MQTT Explorer. Вы можете использовать публичные учетные данные `everyone/everyone` для подключения к брокеру. -Убедитесь, что у вас открыт веб-браузер с панелью мониторинга Grafana для вашего экземпляра, перейдя по адресу `http://YOUR-HOST:3000`. +Убедитесь, что у вас открыт веб-браузер с панелью управления Grafana для вашего экземпляра, перейдя по адресу `http://YOUR-HOST:3000`. ## Упражнение 1: Использование файла сопоставления для данных, загружаемых в MinIO -Первое упражнение продемонстрирует, как добавить заголовки GTS для данных, загружаемых в MinIO, используя файл сопоставления с именем `gts_headers_mapping.csv`. +Первое упражнение продемонстрирует, как добавлять заголовки GTS для данных, загружаемых в MinIO, с использованием файла сопоставления с именем `gts_headers_mapping.csv`. -### создание файла `gts_headers_mapping.csv` +### создание `gts_headers_mapping.csv` -Для добавления заголовков GTS в уведомления WIS2 требуется CSV-файл, который сопоставляет заголовки GTS с входящими именами файлов. +Для добавления заголовков GTS к уведомлениям WIS2 требуется CSV-файл, который сопоставляет заголовки GTS с входящими именами файлов. -CSV-файл должен быть назван (точно) `gts_headers_mapping.csv` и размещен в каталоге, определенном переменной `WIS2BOX_HOST_DATADIR` в вашем файле `wis2box.env`. +CSV-файл должен быть назван (точно) `gts_headers_mapping.csv` и размещен в каталоге, определенном переменной `WIS2BOX_HOST_DATADIR` в вашем `wis2box.env`. -Скопируйте файл `exercise-materials/gts-headers-exercises/gts_headers_mapping.csv` в ваш экземпляр wis2box и разместите его в каталоге, определенном переменной `WIS2BOX_HOST_DATADIR` в вашем файле `wis2box.env`. +Скопируйте файл `exercise-materials/gts-headers-exercises/gts_headers_mapping.csv` в ваш экземпляр wis2box и поместите его в каталог, определенный переменной `WIS2BOX_HOST_DATADIR` в вашем `wis2box.env`. ```bash cp ~/exercise-materials/gts-headers-exercises/gts_headers_mapping.csv ~/wis2box-data @@ -70,7 +70,7 @@ cp ~/exercise-materials/gts-headers-exercises/gts_headers_mapping.csv ~/wis2box- ### Применение сопоставлений -После создания файла `gts_headers_mapping.csv` необходимо перезапустить контейнер wis2box-management, чтобы применить изменения. Вы можете сделать это, выполнив следующую команду на вашей виртуальной машине студента: +После создания файла `gts_headers_mapping.csv` необходимо перезапустить контейнер wis2box-management, чтобы применить изменения. Вы можете сделать это, выполнив следующую команду в вашей виртуальной машине студента: ```bash docker restart wis2box-management @@ -78,7 +78,7 @@ docker restart wis2box-management ### Загрузка данных с заголовками GTS -Скопируйте файл `exercise-materials/gts-headers-exercises/A_SMRO01YRBK171200_C_EDZW_20240717120502.txt` в каталог, определенный переменной `WIS2BOX_HOST_DATADIR` в вашем файле `wis2box.env`: +Скопируйте файл `exercise-materials/gts-headers-exercises/A_SMRO01YRBK171200_C_EDZW_20240717120502.txt` в каталог, определенный переменной `WIS2BOX_HOST_DATADIR` в вашем `wis2box.env`: ```bash cp ~/exercise-materials/gts-headers-exercises/A_SMRO01YRBK171200_C_EDZW_20240717120502.txt ~/wis2box-data @@ -91,7 +91,7 @@ cd ~/wis2box python3 wis2box-ctl.py login ``` -Из командной строки wis2box мы можем загрузить образец файла данных `A_SMRO01YRBK171200_C_EDZW_20240717120502.txt` в определенный набор данных следующим образом: +Из командной строки wis2box мы можем загрузить пример файла данных `A_SMRO01YRBK171200_C_EDZW_20240717120502.txt` в определенный набор данных следующим образом: ```bash wis2box data ingest -p /data/wis2box/A_SMRO01YRBK171200_C_EDZW_20240717120502.txt --metadata-id urn:wmo:md:not-my-centre:core.surface-based-observations.synop @@ -99,7 +99,7 @@ wis2box data ingest -p /data/wis2box/A_SMRO01YRBK171200_C_EDZW_20240717120502.tx Обязательно замените параметр `metadata-id` на правильный идентификатор для вашего набора данных. -Проверьте панель мониторинга Grafana, чтобы убедиться, что данные были загружены корректно. Если вы видите предупреждения или ошибки, попробуйте их исправить и повторите команду `wis2box data ingest`. +Проверьте панель управления Grafana, чтобы убедиться, что данные были загружены корректно. Если вы видите какие-либо ПРЕДУПРЕЖДЕНИЯ или ОШИБКИ, попробуйте их исправить и повторите команду `wis2box data ingest`. ### Просмотр заголовков GTS в уведомлении WIS2 @@ -109,7 +109,7 @@ wis2box data ingest -p /data/wis2box/A_SMRO01YRBK171200_C_EDZW_20240717120502.tx ## Упражнение 2: Использование формы FM-12 SYNOP -При использовании формы FM-12 SYNOP в wis2box-webapp вы можете вручную добавить заголовки GTS в свои уведомления WIS2, выбрав опцию «Add GTS headers» и указав необходимую информацию. +При использовании формы FM-12 SYNOP в wis2box-webapp вы можете вручную добавлять заголовки GTS к своим уведомлениям WIS2, выбрав опцию "Add GTS headers" и предоставив необходимую информацию. Для этого упражнения вы можете использовать приведенные ниже примерные данные или предоставить свои собственные: @@ -126,18 +126,18 @@ AAXX 03094 !!! note Плагин synop2bufr в wis2box преобразует сообщения FM-12 SYNOP в BUFR, поэтому TTAAii должен начинаться с `IS`: - - I = Наблюдательные данные (в двоичном коде) – BUFR - - S = Поверхностные/уровень моря + - I = Наблюдательные данные (в бинарном коде) – BUFR + - S = Поверхностные/на уровне моря ### Ручная отправка формы FM-12 SYNOP с заголовками GTS -Перейдите к форме FM-12 SYNOP в wis2box-webapp и заполните форму, используя приведенные выше примерные данные или свои собственные. +Перейдите к форме FM-12 SYNOP в wis2box-webapp и заполните форму с приведенными выше примерными данными или используйте свои собственные. -Обязательно выберите опцию «Add GTS headers» и укажите необходимую информацию о заголовках GTS: +Обязательно выберите опцию "Add GTS headers" и предоставьте необходимую информацию о заголовках GTS: fm-12-synop-form-gts-headers.png -Укажите необходимый токен аутентификации и отправьте форму. +Предоставьте необходимый токен аутентификации и отправьте форму. Вероятно, вы увидите сообщение об ошибке, так как эта станция отсутствует в вашем списке станций. Вам нужно будет добавить станцию "0-20000-0-64400" в ваш список станций, чтобы данные были успешно преобразованы и опубликованы. @@ -148,6 +148,6 @@ AAXX 03094 ## Заключение !!! success "Поздравляем!" - В ходе этого практического занятия вы научились: - - добавлять заголовки GTS в свои уведомления WIS2 + В этом практическом занятии вы научились: + - добавлять заголовки GTS к уведомлениям WIS2 - проверять, что заголовки GTS доступны через вашу установку wis2box \ No newline at end of file diff --git a/documentation/docs/ru/practical-sessions/connecting-to-wis2-over-mqtt.md b/documentation/docs/ru/practical-sessions/connecting-to-wis2-over-mqtt.md index 18b4e6531..bbf6efc69 100644 --- a/documentation/docs/ru/practical-sessions/connecting-to-wis2-over-mqtt.md +++ b/documentation/docs/ru/practical-sessions/connecting-to-wis2-over-mqtt.md @@ -14,9 +14,9 @@ title: Подключение к WIS2 через MQTT ## Введение -WIS2 использует протокол MQTT для объявления доступности данных о погоде, климате и водных ресурсах. WIS2 Global Broker подписывается на все WIS2 Nodes в сети и перепубликует полученные сообщения. Global Cache подписывается на Global Broker, загружает данные из сообщения и затем перепубликует сообщение в теме `cache` с новым URL. Global Discovery Catalogue публикует метаданные для поиска из брокера и предоставляет API для поиска. +WIS2 использует протокол MQTT для уведомления о доступности данных о погоде, климате и водных ресурсах. WIS2 Global Broker подписывается на все WIS2 Nodes в сети и перепубликовывает полученные сообщения. Global Cache подписывается на Global Broker, загружает данные из сообщения и затем перепубликовывает сообщение в теме `cache` с новым URL. Global Discovery Catalogue публикует метаданные для поиска из Broker и предоставляет API для поиска. -Пример структуры уведомления WIS2 для сообщения, полученного в теме `origin/a/wis2/br-inmet/data/core/weather/surface-based-observations/synop`: +Пример структуры уведомления WIS2 для сообщения, полученного по теме `origin/a/wis2/br-inmet/data/core/weather/surface-based-observations/synop`: ```json { @@ -61,14 +61,14 @@ WIS2 использует протокол MQTT для объявления до } ``` -В этом практическом занятии вы научитесь использовать инструмент MQTT Explorer для настройки подключения клиента MQTT к WIS2 Global Broker и отображения уведомлений WIS2. +В этом практическом занятии вы научитесь использовать инструмент MQTT Explorer для настройки клиентского подключения MQTT к WIS2 Global Broker и сможете отображать уведомления WIS2. -MQTT Explorer — полезный инструмент для просмотра и изучения структуры тем для заданного брокера MQTT, а также для анализа публикуемых данных. +MQTT Explorer — полезный инструмент для просмотра и анализа структуры тем для заданного брокера MQTT, а также для анализа публикуемых данных. !!! note "О MQTT" MQTT Explorer предоставляет удобный интерфейс для подключения к брокеру MQTT и изучения тем и структуры сообщений, используемых в WIS2. - На практике MQTT предназначен для машинного взаимодействия, где приложение или сервис подписывается на темы и обрабатывает сообщения программно в режиме реального времени. + На практике MQTT предназначен для машинного взаимодействия, где приложение или сервис подписывается на темы и обрабатывает сообщения программно в реальном времени. Для работы с MQTT программно (например, на Python) можно использовать клиентские библиотеки MQTT, такие как [paho-mqtt](https://pypi.org/project/paho-mqtt), чтобы подключиться к брокеру MQTT и обрабатывать входящие сообщения. Существует множество клиентских и серверных программ MQTT, в зависимости от ваших требований и технической среды. @@ -94,14 +94,14 @@ MQTT Explorer — полезный инструмент для просмотр !!! note При настройке подписок MQTT можно использовать следующие подстановочные знаки: - - **Одноуровневый (+)**: подстановочный знак заменяет один уровень темы - - **Многоуровневый (#)**: подстановочный знак заменяет несколько уровней темы + - **Одноуровневый (+)**: одноуровневый подстановочный знак заменяет один уровень темы + - **Многоуровневый (#)**: многоуровневый подстановочный знак заменяет несколько уровней темы - В данном случае `origin/a/wis2/#` подпишется на все темы под `origin/a/wis2`. + В данном случае `origin/a/wis2/#` будет подписываться на все темы под `origin/a/wis2`. Нажмите 'BACK', затем 'SAVE', чтобы сохранить данные подключения и подписки. Затем нажмите 'CONNECT': -Сообщения должны начать появляться в вашей сессии MQTT Explorer, как показано ниже: +Сообщения должны начать появляться в вашем сеансе MQTT Explorer следующим образом: mqtt-explorer-global-broker-topics @@ -117,9 +117,9 @@ MQTT Explorer — полезный инструмент для просмотр ??? success "Нажмите, чтобы увидеть ответ" - Вы можете нажать на левую панель в MQTT Explorer, чтобы развернуть структуру тем. + Вы можете нажать на окно слева в MQTT Explorer, чтобы развернуть структуру тем. - Мы можем определить WIS-центр, который опубликовал данные, посмотрев на четвертый уровень структуры тем. Например, следующая тема: + Мы можем определить WIS-центр, который опубликовал данные, посмотрев на четвертый уровень структуры темы. Например, следующая тема: `origin/a/wis2/br-inmet/data/core/weather/surface-based-observations/synop` @@ -127,15 +127,15 @@ MQTT Explorer — полезный инструмент для просмотр !!! question - Как можно отличить сообщения, опубликованные WIS-центрами, которые размещают шлюз GTS-to-WIS2, от сообщений, опубликованных WIS-центрами, которые размещают WIS2 Node? + Как можно отличить сообщения, опубликованные WIS-центрами, которые размещают шлюз GTS-to-WIS2, от сообщений, опубликованных WIS-центрами, которые размещают узел WIS2? ??? success "Нажмите, чтобы увидеть ответ" - Мы можем отличить сообщения, поступающие от шлюза GTS-to-WIS2, посмотрев на идентификатор центра в структуре тем. Например, следующая тема: + Мы можем отличить сообщения, поступающие от шлюза GTS-to-WIS2, посмотрев на идентификатор центра в структуре темы. Например, следующая тема: `origin/a/wis2/de-dwd-gts-to-wis2/data/core/I/S/A/I/01/sbbr` - говорит нам, что данные были опубликованы шлюзом GTS-to-WIS2, размещенным Deutscher Wetterdienst (DWD), Германия. Шлюз GTS-to-WIS2 — это особый тип издателя данных, который публикует данные из Global Telecommunication System (GTS) в WIS2. Структура тем состоит из заголовков TTAAii CCCC для сообщений GTS. + говорит нам, что данные были опубликованы шлюзом GTS-to-WIS2, размещенным Deutscher Wetterdienst (DWD), Германия. Шлюз GTS-to-WIS2 — это особый тип издателя данных, который публикует данные из Global Telecommunication System (GTS) в WIS2. Структура темы состоит из заголовков TTAAii CCCC для сообщений GTS. ## Упражнение 2: Изучение структуры сообщений WIS2 @@ -149,25 +149,25 @@ MQTT Explorer — полезный инструмент для просмотр !!! note Подстановочный знак `+` используется для подписки на все WIS-центры. -Переподключитесь к Global Broker и дождитесь появления сообщений. +Подключитесь снова к Global Broker и дождитесь появления сообщений. -Вы можете просмотреть содержимое сообщения WIS2 в разделе "Value" справа. Попробуйте развернуть структуру тем, чтобы увидеть различные уровни сообщения, пока не достигнете последнего уровня, и изучите содержимое одного из сообщений. +Вы можете просмотреть содержимое сообщения WIS2 в разделе "Value" справа. Попробуйте развернуть структуру темы, чтобы увидеть различные уровни сообщения, пока не достигнете последнего уровня, и изучите содержимое одного из сообщений. !!! question - Как можно определить временную метку публикации данных? И как можно определить временную метку сбора данных? + Как можно определить временную метку, когда данные были опубликованы? И как можно определить временную метку, когда данные были собраны? ??? success "Нажмите, чтобы увидеть ответ" - Временная метка публикации данных содержится в разделе `properties` сообщения с ключом `pubtime`. + Временная метка, когда данные были опубликованы, содержится в разделе `properties` сообщения с ключом `pubtime`. - Временная метка сбора данных содержится в разделе `properties` сообщения с ключом `datetime`. + Временная метка, когда данные были собраны, содержится в разделе `properties` сообщения с ключом `datetime`. mqtt-explorer-global-broker-msg-properties !!! question - Как можно загрузить данные по URL, указанному в сообщении? + Как можно загрузить данные из URL, указанного в сообщении? ??? success "Нажмите, чтобы увидеть ответ" @@ -187,7 +187,7 @@ MQTT Explorer — полезный инструмент для просмотр ??? success "Нажмите, чтобы увидеть ответ" - Сообщения, опубликованные в темах `origin`, — это оригинальные сообщения, которые Global Broker перепубликует от WIS2 Nodes в сети. + Сообщения, опубликованные в темах `origin`, — это оригинальные сообщения, которые Global Broker перепубликовывает из WIS2 Nodes в сети. Сообщения, опубликованные в темах `cache`, — это сообщения, для которых данные были загружены Global Cache. Если вы проверите содержимое сообщения из темы, начинающейся с `cache`, вы увидите, что ссылка 'canonical' была обновлена на новый URL. @@ -200,7 +200,7 @@ MQTT Explorer — полезный инструмент для просмотр !!! success "Поздравляем!" В этом практическом занятии вы узнали: - - как подписаться на сервисы WIS2 Global Broker с помощью MQTT Explorer + - как подписываться на сервисы WIS2 Global Broker с помощью MQTT Explorer - структуру тем WIS2 - структуру уведомлений WIS2 - различия между основными и рекомендуемыми данными diff --git a/documentation/docs/ru/practical-sessions/initializing-wis2box.md b/documentation/docs/ru/practical-sessions/initializing-wis2box.md index 1878e18d2..46cdeed7d 100644 --- a/documentation/docs/ru/practical-sessions/initializing-wis2box.md +++ b/documentation/docs/ru/practical-sessions/initializing-wis2box.md @@ -16,13 +16,13 @@ title: Инициализация wis2box !!! note - Текущие учебные материалы основаны на версии wis2box-release 1.3.0. + Текущие учебные материалы основаны на версии wis2box-release 1.3.0. - См. [accessing-your-student-vm](./accessing-your-student-vm.md) для инструкций по загрузке и установке программного обеспечения wis2box, если вы проходите обучение вне локальной учебной сессии. + См. [accessing-your-student-vm](./accessing-your-student-vm.md) для инструкций по загрузке и установке программного стека wis2box, если вы проходите обучение вне локальной учебной сессии. ## Подготовка -Войдите в свою виртуальную машину (VM) с использованием имени пользователя и пароля и убедитесь, что вы находитесь в каталоге `wis2box`: +Войдите в вашу виртуальную машину (VM) с вашим именем пользователя и паролем и убедитесь, что вы находитесь в директории `wis2box`: ```bash cd ~/wis2box @@ -33,11 +33,11 @@ cd ~/wis2box Для начальной конфигурации wis2box требуется: - файл окружения `wis2box.env`, содержащий параметры конфигурации -- каталог на хост-машине, который будет использоваться совместно между хост-машиной и контейнерами wis2box, определяемый переменной окружения `WIS2BOX_HOST_DATADIR` +- директория на хост-машине для совместного использования между хост-машиной и контейнерами wis2box, определяемая переменной окружения `WIS2BOX_HOST_DATADIR` -Скрипт `wis2box-create-config.py` может быть использован для создания начальной конфигурации вашего wis2box. +Скрипт `wis2box-create-config.py` может быть использован для создания начальной конфигурации вашего wis2box. -Он задаст вам ряд вопросов для настройки конфигурации. +Он задаст вам ряд вопросов, чтобы помочь настроить конфигурацию. После завершения работы скрипта вы сможете просмотреть и обновить файлы конфигурации. @@ -47,13 +47,13 @@ cd ~/wis2box python3 wis2box-create-config.py ``` -### Каталог wis2box-host-data +### Директория wis2box-host-data -Скрипт попросит вас указать каталог, который будет использоваться для переменной окружения `WIS2BOX_HOST_DATADIR`. +Скрипт попросит вас указать директорию, которая будет использоваться для переменной окружения `WIS2BOX_HOST_DATADIR`. -Обратите внимание, что необходимо указать полный путь к этому каталогу. +Обратите внимание, что необходимо указать полный путь к этой директории. -Например, если ваше имя пользователя — `username`, полный путь к каталогу будет `/home/username/wis2box-data`: +Например, если ваше имя пользователя — `username`, полный путь к директории будет `/home/username/wis2box-data`: ```{.copy} username@student-vm-username:~/wis2box$ python3 wis2box-create-config.py @@ -68,9 +68,9 @@ The directory /home/username/wis2box-data has been created. ### URL wis2box -Далее вас попросят указать URL для вашего wis2box. Это URL, который будет использоваться для доступа к веб-приложению, API и пользовательскому интерфейсу wis2box. +Далее вам будет предложено указать URL для вашего wis2box. Этот URL будет использоваться для доступа к веб-приложению, API и пользовательскому интерфейсу wis2box. -Используйте `http://` в качестве URL. +Пожалуйста, используйте `http://` в качестве URL. ```{.copy} Please enter the URL of the wis2box: @@ -84,13 +84,13 @@ Is this correct? (y/n/exit) ### Пароли WEBAPP, STORAGE и BROKER -Вы можете использовать опцию случайной генерации паролей, когда вас попросят указать `WIS2BOX_WEBAPP_PASSWORD`, `WIS2BOX_STORAGE_PASSWORD`, `WIS2BOX_BROKER_PASSWORD`, или задать свои собственные. +Вы можете использовать опцию случайной генерации паролей, когда будет предложено указать `WIS2BOX_WEBAPP_PASSWORD`, `WIS2BOX_STORAGE_PASSWORD`, `WIS2BOX_BROKER_PASSWORD`, или задать свои собственные. -Не беспокойтесь о запоминании этих паролей, они будут сохранены в файле `wis2box.env` в вашем каталоге wis2box. +Не беспокойтесь о запоминании этих паролей, они будут сохранены в файле `wis2box.env` в вашей директории wis2box. -### Проверка `wis2box.env` +### Просмотр `wis2box.env` -После завершения работы скрипта проверьте содержимое файла `wis2box.env` в текущем каталоге: +После завершения работы скрипта проверьте содержимое файла `wis2box.env` в вашей текущей директории: ```bash cat ~/wis2box/wis2box.env @@ -106,7 +106,7 @@ cat ~/wis2box/wis2box.env Значение по умолчанию для WIS2BOX_BASEMAP_URL — `https://{s}.tile.openstreetmap.org/{z}/{x}/{y}.png`. - Этот URL относится к серверу тайлов OpenStreetMap. Если вы хотите использовать другого поставщика карт, вы можете изменить этот URL, указав другой сервер тайлов. + Этот URL относится к серверу тайлов OpenStreetMap. Если вы хотите использовать другого поставщика карт, вы можете изменить этот URL, чтобы указать другой сервер тайлов. !!! question @@ -116,7 +116,7 @@ cat ~/wis2box/wis2box.env Значение по умолчанию для WIS2BOX_STORAGE_DATA_RETENTION_DAYS — 30 дней. Вы можете изменить это значение на другое количество дней, если хотите. - Контейнер wis2box-management ежедневно выполняет cron-задачу для удаления данных, старше указанного количества дней, из корзины `wis2box-public` и API-бэкенда: + Контейнер wis2box-management выполняет ежедневное задание cron для удаления данных, старше указанного количества дней, из корзины `wis2box-public` и бэкенда API: ```{.copy} 0 0 * * * su wis2box -c "wis2box data clean --days=$WIS2BOX_STORAGE_DATA_RETENTION_DAYS" @@ -126,13 +126,13 @@ cat ~/wis2box/wis2box.env Файл `wis2box.env` содержит переменные окружения, определяющие конфигурацию вашего wis2box. Для получения дополнительной информации обратитесь к [wis2box-documentation](https://docs.wis2box.wis.wmo.int/en/latest/reference/configuration.html). - Не редактируйте файл `wis2box.env`, если вы не уверены в изменениях, которые собираетесь внести. Неправильные изменения могут привести к прекращению работы wis2box. + Не редактируйте файл `wis2box.env`, если вы не уверены в изменениях, которые вносите. Неправильные изменения могут привести к тому, что ваш wis2box перестанет работать. - Не делитесь содержимым файла `wis2box.env` с кем-либо, так как он содержит конфиденциальную информацию, такую как пароли. + Не делитесь содержимым вашего файла `wis2box.env` с кем-либо, так как он содержит конфиденциальную информацию, такую как пароли. ## Запуск wis2box -Убедитесь, что вы находитесь в каталоге, содержащем файлы определения программного стека wis2box: +Убедитесь, что вы находитесь в директории, содержащей файлы определения программного стека wis2box: ```{.copy} cd ~/wis2box @@ -152,7 +152,7 @@ Current version=Undefined, latest version=1.3.0 Would you like to update ? (y/n/exit) ``` -Выберите ``y``, и скрипт создаст файл ``docker-compose.images-1.3.0.yml``, загрузит необходимые Docker-образы и запустит сервисы. +Выберите ``y``, и скрипт создаст файл ``docker-compose.images-1.3.0.yml``, загрузит необходимые образы Docker и запустит сервисы. Загрузка образов может занять некоторое время в зависимости от скорости вашего интернет-соединения. Этот шаг требуется только при первом запуске wis2box. @@ -167,11 +167,11 @@ python3 wis2box-ctl.py status !!! note "wis2box и Docker" wis2box работает как набор контейнеров Docker, управляемых с помощью docker-compose. - Сервисы определены в различных файлах `docker-compose*.yml`, которые можно найти в каталоге `~/wis2box/`. + Сервисы определены в различных файлах `docker-compose*.yml`, которые можно найти в директории `~/wis2box/`. - Python-скрипт `wis2box-ctl.py` используется для выполнения команд Docker Compose, управляющих сервисами wis2box. + Python-скрипт `wis2box-ctl.py` используется для выполнения базовых команд Docker Compose, которые управляют сервисами wis2box. - Вам не нужно знать детали контейнеров Docker для работы с программным стеком wis2box, но вы можете изучить файлы `docker-compose*.yml`, чтобы увидеть, как определены сервисы. Если вы хотите узнать больше о Docker, вы можете найти дополнительную информацию в [документации Docker](https://docs.docker.com/). + Вам не нужно знать детали контейнеров Docker для запуска программного стека wis2box, но вы можете изучить файлы `docker-compose*.yml`, чтобы увидеть, как определены сервисы. Если вы хотите узнать больше о Docker, вы можете найти дополнительную информацию в [документации Docker](https://docs.docker.com/). Чтобы войти в контейнер wis2box-management, используйте следующую команду: @@ -179,7 +179,7 @@ python3 wis2box-ctl.py status python3 wis2box-ctl.py login ``` -Обратите внимание, что после входа ваш приглашение изменится, указывая, что вы теперь находитесь внутри контейнера wis2box-management: +Обратите внимание, что после входа ваш приглашение изменится, указывая на то, что вы теперь находитесь внутри контейнера wis2box-management: ```{bash} root@025381da3c40:/home/wis2box# @@ -188,7 +188,7 @@ root@025381da3c40:/home/wis2box# Внутри контейнера wis2box-management вы можете выполнять различные команды для управления вашим wis2box, такие как: - `wis2box auth add-token --path processes/wis2box` : для создания токена авторизации для конечной точки *processes/wis2box* -- `wis2box data clean --days=` : для очистки данных, старше определенного количества дней, из корзины *wis2box-public* +- `wis2box data clean --days=` : для очистки данных старше определенного количества дней из корзины *wis2box-public* Чтобы выйти из контейнера и вернуться на хост-машину, используйте следующую команду: @@ -196,13 +196,13 @@ root@025381da3c40:/home/wis2box# exit ``` -Запустите следующую команду, чтобы увидеть запущенные контейнеры Docker на вашей хост-машине: +Запустите следующую команду, чтобы увидеть контейнеры Docker, работающие на вашей хост-машине: ```{.copy} docker ps --format "table {{.Names}} \t{{.Status}} \t{{.Image}}" ``` -Вы должны увидеть следующие запущенные контейнеры: +Вы должны увидеть следующие контейнеры, работающие: ```{bash} NAMES STATUS IMAGE @@ -241,17 +241,17 @@ docker volume ls А также некоторые анонимные тома, используемые различными контейнерами. -Тома, начинающиеся с `wis2box_project_`, используются для хранения постоянных данных для различных сервисов в программном стеке wis2box. +Тома, начинающиеся с `wis2box_project_`, используются для хранения постоянных данных для различных сервисов программного стека wis2box. ## wis2box API -Wis2box содержит API (интерфейс прикладного программирования), который предоставляет доступ к данным и процессы для интерактивной визуализации, преобразования данных и их публикации. +wis2box содержит API (интерфейс прикладного программирования), который предоставляет доступ к данным и процессы для интерактивной визуализации, преобразования данных и их публикации. Откройте новую вкладку и перейдите на страницу `http://YOUR-HOST/oapi`. wis2box-api.png -Это главная страница API wis2box (работает через контейнер **wis2box-api**). +Это главная страница API wis2box (запущенного через контейнер **wis2box-api**). !!! question @@ -276,9 +276,9 @@ Wis2box содержит API (интерфейс прикладного прог ??? success "Нажмите, чтобы увидеть ответ" - Нажмите на "Data notifications", затем нажмите на `Browse through the items of "Data Notifications"`. + Нажмите на "Data notifications", затем нажмите `Browse through the items of "Data Notifications"`. - Вы увидите, что на странице указано "No items", так как уведомления о данных еще не были опубликованы. + Вы увидите, что на странице написано "No items", так как уведомления о данных еще не были опубликованы. ## wis2box webapp @@ -288,13 +288,13 @@ Wis2box содержит API (интерфейс прикладного прог !!! note - Проверьте ваш файл wis2box.env для значения переменной WIS2BOX_WEBAPP_PASSWORD. Вы можете использовать следующую команду, чтобы проверить значение этой переменной окружения: + Проверьте ваш файл wis2box.env, чтобы узнать значение переменной WIS2BOX_WEBAPP_PASSWORD. Вы можете использовать следующую команду, чтобы проверить значение этой переменной окружения: ```{.copy} cat ~/wis2box/wis2box.env | grep WIS2BOX_WEBAPP_PASSWORD ``` -После входа в систему наведите курсор на меню слева, чтобы увидеть доступные опции в веб-приложении wis2box: +После входа в систему наведите курсор на меню слева, чтобы увидеть доступные опции веб-приложения wis2box: wis2box-webapp-menu.png @@ -309,7 +309,7 @@ Wis2box содержит API (интерфейс прикладного прог ## wis2box-broker -Откройте MQTT Explorer на вашем компьютере и подготовьте новое подключение для подключения к вашему брокеру (работает через контейнер **wis2box-broker**). +Откройте MQTT Explorer на вашем компьютере и подготовьте новое подключение для подключения к вашему брокеру (запущенному через контейнер **wis2box-broker**). Нажмите `+`, чтобы добавить новое подключение: @@ -324,11 +324,11 @@ Wis2box содержит API (интерфейс прикладного прог !!! note - Тема `#` является подпиской с подстановочным знаком, которая подписывается на все темы, опубликованные на брокере. + Тема `#` — это подписка с подстановочным знаком, которая подписывается на все темы, опубликованные на брокере. - Сообщения, опубликованные в теме `$SYS`, являются системными сообщениями, опубликованными самим сервисом mosquitto. + Сообщения, опубликованные в теме `$SYS`, — это системные сообщения, публикуемые самим сервисом mosquitto. -Используйте следующие данные для подключения, убедившись, что вы заменили значение `` на имя вашего хоста, а `` на значение из вашего файла `wis2box.env`: +Используйте следующие данные для подключения, убедившись, что вы заменили значение `` на имя вашего хоста, а `` — на значение из вашего файла `wis2box.env`: - **Protocol: mqtt://** - **Host: ``** @@ -338,7 +338,7 @@ Wis2box содержит API (интерфейс прикладного прог !!! note - Вы можете проверить ваш файл wis2box.env для значения переменной WIS2BOX_BROKER_PASSWORD. Вы можете использовать следующую команду, чтобы проверить значение этой переменной окружения: + Вы можете проверить ваш файл wis2box.env, чтобы узнать значение переменной WIS2BOX_BROKER_PASSWORD. Вы можете использовать следующую команду, чтобы проверить значение этой переменной окружения: ```{.copy} cat ~/wis2box/wis2box.env | grep WIS2BOX_BROKER_PASSWORD @@ -352,7 +352,7 @@ Wis2box содержит API (интерфейс прикладного прог mqtt-explorer-wis2box-broker-port1883.png -После подключения вы увидите внутреннюю статистику mosquitto, опубликованную вашим брокером в теме `$SYS`: +После подключения вы увидите внутреннюю статистику mosquitto, публикуемую вашим брокером в теме `$SYS`: mqtt-explorer-sys-topic.png @@ -368,5 +368,4 @@ Wis2box содержит API (интерфейс прикладного прог - запустить скрипт `wis2box-create-config.py` для создания начальной конфигурации - запустить wis2box и проверить статус его компонентов - получить доступ к wis2box-webapp и wis2box-API через браузер - - подключиться к MQTT брокеру на вашей виртуальной машине с помощью MQTT Explorer -``` \ No newline at end of file + - подключиться к MQTT-брокеру на вашей виртуальной машине с помощью MQTT Explorer \ No newline at end of file diff --git a/documentation/docs/zh/practical-sessions/accessing-your-student-vm.md b/documentation/docs/zh/practical-sessions/accessing-your-student-vm.md index 52e7fc40f..95cda34cc 100644 --- a/documentation/docs/zh/practical-sessions/accessing-your-student-vm.md +++ b/documentation/docs/zh/practical-sessions/accessing-your-student-vm.md @@ -6,15 +6,15 @@ title: 访问你的学生虚拟机 !!! abstract "学习目标" - 在本次实践课程结束后,你将能够: + 在本次实践课程结束时,你将能够: - 通过 SSH 和 WinSCP 访问你的学生虚拟机 - - 验证实践所需的软件是否已安装 - - 验证你是否可以在本地学生虚拟机上访问培训的练习材料 + - 验证实践练习所需的软件是否已安装 + - 验证你是否能够在本地学生虚拟机上访问本次培训的练习材料 ## 简介 -作为本地运行的 WIS2 培训工作坊的一部分,你可以通过名为 "WIS2-training" 的本地培训网络访问你的个人学生虚拟机。 +在本地运行的 WIS2 培训工作坊中,你可以通过名为 "WIS2-training" 的本地培训网络访问你的个人学生虚拟机。 你的学生虚拟机已预安装以下软件: @@ -26,26 +26,26 @@ title: 访问你的学生虚拟机 !!! note - 如果你希望在本地培训课程之外运行此培训,可以使用任何云服务提供商提供的实例,例如: + 如果你希望在本地培训课程之外运行本次培训,可以使用任何云服务提供商提供的实例,例如: - GCP (Google Cloud Platform) VM 实例 `e2-medium` - - AWS (Amazon Web Services) ec2 实例 `t3a.medium` + - AWS (Amazon Web Services)  ec2 实例 `t3a.medium`  - Azure (Microsoft) Azure 虚拟机 `standard_b2s` 选择 Ubuntu Server 22.0.4 LTS 作为操作系统。 创建虚拟机后,请确保已安装 python、docker 和 docker compose,具体安装步骤请参考 [wis2box-software-dependencies](https://docs.wis2box.wis.wmo.int/en/latest/user/getting-started.html#software-dependencies)。 - 本次培训使用的 wis2box 发行版可以通过以下方式下载: + 本次培训使用的 wis2box 发布归档文件可通过以下方式下载: ```bash wget https://github.com/World-Meteorological-Organization/wis2box-release/releases/download/1.3.0/wis2box-setup-1.3.0.zip unzip wis2box-setup-1.3.0.zip ``` - 你可以随时在 [https://github.com/World-Meteorological-Organization/wis2box/releases](https://github.com/World-Meteorological-Organization/wis2box-release/releases) 找到最新的 'wis2box-setup' 发行版。 + 你可以随时在 [https://github.com/World-Meteorological-Organization/wis2box/releases](https://github.com/World-Meteorological-Organization/wis2box-release/releases) 找到最新的 'wis2box-setup' 归档文件。 - 本次培训使用的练习材料可以通过以下方式下载: + 本次培训使用的练习材料可通过以下方式下载: ```bash wget https://training.wis2box.wis.wmo.int/exercise-materials.zip @@ -63,14 +63,14 @@ title: 访问你的学生虚拟机 ## 在本地培训网络上连接到你的学生虚拟机 -将你的电脑连接到 WIS2 培训期间房间内广播的本地 Wi-Fi,具体操作请参考培训师提供的说明。 +按照培训师提供的说明,将你的电脑连接到培训期间房间内广播的本地 Wi-Fi。 使用 SSH 客户端连接到你的学生虚拟机,连接信息如下: -- **主机名: (由现场培训提供)** +- **主机名:(培训期间提供)** - **端口: 22** -- **用户名: (由现场培训提供)** -- **密码: (由现场培训提供)** +- **用户名:(培训期间提供)** +- **密码:(培训期间提供)** !!! tip 如果你不确定主机名或用户名,或者连接时遇到问题,请联系培训师。 @@ -88,7 +88,7 @@ passwd: password updated successfully ## 验证软件版本 -为了能够运行 wis2box,学生虚拟机应预先安装 Python、Docker 和 Docker Compose。 +为了能够运行 wis2box,学生虚拟机应预安装 Python、Docker 和 Docker Compose。 检查 Python 版本: ```bash @@ -117,16 +117,16 @@ docker compose version Docker Compose version v2.21.0 ``` -为了确保你的用户可以运行 Docker 命令,你的用户已被添加到 `docker` 组中。 +为了确保你的用户能够运行 Docker 命令,用户已被添加到 `docker` 组。 -测试你的用户是否可以运行 Docker 的 hello-world 命令,执行以下命令: +测试用户是否能够运行 docker hello-world,执行以下命令: ```bash docker run hello-world ``` -此命令会拉取 hello-world 镜像并运行一个容器,打印一条消息。 +此命令将拉取 hello-world 镜像并运行一个容器,打印一条消息。 -检查输出中是否包含以下内容: +检查输出中是否显示以下内容: ```console ... @@ -149,23 +149,23 @@ exercise-materials wis2box 如果你的本地电脑安装了 WinSCP,可以使用它连接到你的学生虚拟机,检查主目录内容,并在虚拟机和本地电脑之间上传或下载文件。 -虽然 WinSCP 不是培训的必需工具,但如果你希望使用本地电脑上的文本编辑器编辑虚拟机上的文件,它会非常有用。 +WinSCP 不是培训的必需工具,但如果你希望使用本地电脑上的文本编辑器编辑虚拟机上的文件,它会非常有用。 以下是使用 WinSCP 连接到学生虚拟机的方法: -打开 WinSCP 并点击 "New Site"。你可以创建一个新的 SCP 连接,具体设置如下: +打开 WinSCP,点击 "New Site"。你可以创建一个新的 SCP 连接,具体设置如下: winscp-student-vm-scp.png 点击 'Save' 然后点击 'Login' 连接到你的虚拟机。 -现在你应该可以看到学生虚拟机主目录的内容,并访问你的文件。 +现在你应该能够看到学生虚拟机主目录的内容并访问你的文件。 -## 总结 +## 结论 !!! success "恭喜!" 在本次实践课程中,你学会了: - 通过 SSH 和 WinSCP 访问你的学生虚拟机 - - 验证实践所需的软件是否已安装 - - 验证你是否可以在本地学生虚拟机上访问培训的练习材料 \ No newline at end of file + - 验证实践练习所需的软件是否已安装 + - 验证你是否能够在本地学生虚拟机上访问本次培训的练习材料 \ No newline at end of file diff --git a/documentation/docs/zh/practical-sessions/adding-gts-headers-to-wis2-notifications.md b/documentation/docs/zh/practical-sessions/adding-gts-headers-to-wis2-notifications.md index 83efc98ee..480995b8b 100644 --- a/documentation/docs/zh/practical-sessions/adding-gts-headers-to-wis2-notifications.md +++ b/documentation/docs/zh/practical-sessions/adding-gts-headers-to-wis2-notifications.md @@ -1,25 +1,25 @@ --- -title: 将 GTS 头添加到 WIS2 通知 +title: 将 GTS 标头添加到 WIS2 通知 --- -# 将 GTS 头添加到 WIS2 通知 +# 将 GTS 标头添加到 WIS2 通知 !!! abstract "学习目标" 在本次实践课程结束时,您将能够: - - 配置文件名与 GTS 头之间的映射 - - 使用与 GTS 头匹配的文件名摄取数据 - - 在 WIS2 通知中查看 GTS 头 - - 使用 FM-12 SYNOP 表单手动将 GTS 头添加到 WIS2 通知 + - 配置文件名与 GTS 标头之间的映射 + - 通过匹配 GTS 标头的文件名来摄取数据 + - 在 WIS2 通知中查看 GTS 标头 + - 使用 FM-12 SYNOP 表单手动将 GTS 标头添加到 WIS2 通知中 -## 简介 +## 介绍 -在向 WIS2 过渡阶段,计划停止通过 GTS 传输数据的 WMO 成员需要将 GTS 头添加到其 WIS2 通知中。这些头信息使 WIS2 到 GTS 网关能够将数据转发到 GTS 网络。 +在向 WIS2 过渡阶段,计划停止通过 GTS 传输数据的 WMO 成员需要将 GTS 标头添加到其 WIS2 通知中。这些标头使 WIS2 到 GTS 网关能够将数据转发到 GTS 网络。 -这允许已经迁移到使用 WIS2 节点发布数据的成员关闭其 MSS 系统,同时确保其数据仍然可供尚未迁移到 WIS2 的成员使用。 +这使得已经迁移到使用 WIS2 节点发布数据的成员能够停用其 MSS 系统,同时确保其数据仍可供尚未迁移到 WIS2 的成员使用。 -需要将 GTS 属性作为附加属性添加到 WIS2 通知消息中。GTS 属性是一个 JSON 对象,包含将数据转发到 GTS 网络所需的 GTS 头信息。 +需要将 GTS 属性作为附加属性添加到 WIS2 通知消息中。GTS 属性是一个 JSON 对象,其中包含将数据转发到 GTS 网络所需的 GTS 标头。 ```json { @@ -30,39 +30,39 @@ title: 将 GTS 头添加到 WIS2 通知 } ``` -在 wis2box 中,您可以通过提供一个名为 `gts_headers_mapping.csv` 的附加文件,将这些信息自动添加到 WIS2 通知中。该文件包含将 GTS 头映射到传入文件名所需的信息。 +在 wis2box 中,您可以通过提供一个名为 `gts_headers_mapping.csv` 的附加文件来自动将此内容添加到 WIS2 通知中,该文件包含将 GTS 标头映射到传入文件名所需的信息。 -此文件应放置在 `wis2box.env` 文件中由 `WIS2BOX_HOST_DATADIR` 定义的目录中,并应包含以下列: +此文件应放置在您的 `wis2box.env` 中由 `WIS2BOX_HOST_DATADIR` 定义的目录中,并应包含以下列: -- `string_in_filepath`:文件名中的字符串,用于匹配 GTS 头 -- `TTAAii`:要添加到 WIS2 通知的 TTAAii 头 -- `CCCC`:要添加到 WIS2 通知的 CCCC 头 +- `string_in_filepath`:文件名中的字符串,用于匹配 GTS 标头 +- `TTAAii`:要添加到 WIS2 通知中的 TTAAii 标头 +- `CCCC`:要添加到 WIS2 通知中的 CCCC 标头 从 wis2box-1.3.0 开始,数据发布者有两种选择(可选)将 GTS 属性添加到其通知中: -1. 对于上传到 MinIO 的文件,准备包含所需属性的映射文件 “gts_headers_mappings.csv”。 +1. 对于上传到 MinIO 的文件,准备映射文件 `gts_headers_mappings.csv` 并包含所需属性。 -2. 对于在 wis2box-webapp 中使用 FM-12 SYNOP 表单输入的数据,选择 “Add GTS headers” 并手动输入所需信息。 +2. 对于在 wis2box-webapp 中使用 FM-12 SYNOP 表单输入的数据,选择 `Add GTS headers` 并手动输入所需信息。 ## 准备工作 -确保您拥有对学生虚拟机的 SSH 访问权限,并且您的 wis2box 实例正在运行。 +确保您可以通过 SSH 访问您的学生虚拟机,并且您的 wis2box 实例已启动并运行。 确保您已使用 MQTT Explorer 连接到您的 wis2box 实例的 MQTT broker。您可以使用公共凭证 `everyone/everyone` 连接到 broker。 -确保您已打开一个浏览器,并通过访问 `http://YOUR-HOST:3000` 查看实例的 Grafana 仪表板。 +确保您已打开一个网页浏览器,并通过访问 `http://YOUR-HOST:3000` 查看您的实例的 Grafana 仪表板。 ## 练习 1:为上传到 MinIO 的数据使用映射文件 -第一个练习将演示如何使用名为 `gts_headers_mapping.csv` 的映射文件为上传到 MinIO 的数据添加 GTS 头。 +第一个练习将演示如何使用名为 `gts_headers_mapping.csv` 的映射文件为上传到 MinIO 的数据添加 GTS 标头。 ### 创建 `gts_headers_mapping.csv` -要将 GTS 头添加到您的 WIS2 通知中,需要一个 CSV 文件将 GTS 头映射到传入的文件名。 +要将 GTS 标头添加到您的 WIS2 通知中,需要一个 CSV 文件将 GTS 标头映射到传入文件名。 -CSV 文件必须命名为(完全一致)`gts_headers_mapping.csv`,并放置在 `wis2box.env` 文件中由 `WIS2BOX_HOST_DATADIR` 定义的目录中。 +CSV 文件的名称必须为(完全一致)`gts_headers_mapping.csv`,并且应放置在您的 `wis2box.env` 中由 `WIS2BOX_HOST_DATADIR` 定义的目录中。 -将文件 `exercise-materials/gts-headers-exercises/gts_headers_mapping.csv` 复制到您的 wis2box 实例,并放置在 `wis2box.env` 文件中由 `WIS2BOX_HOST_DATADIR` 定义的目录中。 +将文件 `exercise-materials/gts-headers-exercises/gts_headers_mapping.csv` 复制到您的 wis2box 实例,并放置在您的 `wis2box.env` 中由 `WIS2BOX_HOST_DATADIR` 定义的目录中。 ```bash cp ~/exercise-materials/gts-headers-exercises/gts_headers_mapping.csv ~/wis2box-data @@ -70,15 +70,15 @@ cp ~/exercise-materials/gts-headers-exercises/gts_headers_mapping.csv ~/wis2box- ### 应用映射 -创建 `gts_headers_mapping.csv` 文件后,您需要重新启动 wis2box-management 容器以应用更改。可以通过在学生虚拟机中运行以下命令来完成: +创建 `gts_headers_mapping.csv` 文件后,您需要重新启动 wis2box-management 容器以应用更改。您可以通过在学生虚拟机中运行以下命令来完成此操作: ```bash docker restart wis2box-management ``` -### 使用 GTS 头摄取数据 +### 使用 GTS 标头摄取数据 -将文件 `exercise-materials/gts-headers-exercises/A_SMRO01YRBK171200_C_EDZW_20240717120502.txt` 复制到 `wis2box.env` 文件中由 `WIS2BOX_HOST_DATADIR` 定义的目录中: +将文件 `exercise-materials/gts-headers-exercises/A_SMRO01YRBK171200_C_EDZW_20240717120502.txt` 复制到您的 `wis2box.env` 中由 `WIS2BOX_HOST_DATADIR` 定义的目录中: ```bash cp ~/exercise-materials/gts-headers-exercises/A_SMRO01YRBK171200_C_EDZW_20240717120502.txt ~/wis2box-data @@ -91,27 +91,27 @@ cd ~/wis2box python3 wis2box-ctl.py login ``` -从 wis2box 命令行中,我们可以将示例数据文件 `A_SMRO01YRBK171200_C_EDZW_20240717120502.txt` 摄取到特定数据集,如下所示: +在 wis2box 命令行中,我们可以将示例数据文件 `A_SMRO01YRBK171200_C_EDZW_20240717120502.txt` 摄取到特定数据集,如下所示: ```bash wis2box data ingest -p /data/wis2box/A_SMRO01YRBK171200_C_EDZW_20240717120502.txt --metadata-id urn:wmo:md:not-my-centre:core.surface-based-observations.synop ``` -请确保使用正确的数据集标识符替换 `metadata-id` 选项。 +确保将 `metadata-id` 选项替换为您的数据集的正确标识符。 -检查 Grafana 仪表板以确认数据是否正确摄取。如果看到任何警告或错误,请尝试修复并重复使用 `wis2box data ingest` 命令的练习。 +检查 Grafana 仪表板以查看数据是否正确摄取。如果看到任何警告或错误,请尝试修复并重复执行 `wis2box data ingest` 命令。 -### 在 WIS2 通知中查看 GTS 头 +### 在 WIS2 通知中查看 GTS 标头 -打开 MQTT Explorer,检查刚刚摄取的数据的 WIS2 通知消息。 +打开 MQTT Explorer,检查您刚刚摄取的数据的 WIS2 通知消息。 -WIS2 通知消息应包含您在 `gts_headers_mapping.csv` 文件中提供的 GTS 头。 +WIS2 通知消息应包含您在 `gts_headers_mapping.csv` 文件中提供的 GTS 标头。 ## 练习 2:使用 FM-12 SYNOP 表单 -在 wis2box-webapp 中使用 FM-12 SYNOP 表单时,可以通过选择 “Add GTS headers” 选项并提供所需信息,手动将 GTS 头添加到您的 WIS2 通知中。 +在 wis2box-webapp 中使用 FM-12 SYNOP 表单时,您可以通过选择 "Add GTS headers" 选项并提供所需信息,手动将 GTS 标头添加到您的 WIS2 通知中。 -对于此练习,您可以使用以下示例数据或提供自己的数据: +对于此练习,您可以使用以下示例数据或提供您自己的数据: FM-12 SYNOP 消息: @@ -121,33 +121,33 @@ AAXX 03094 333 59005 83813 81930 87363 94966 95836= ``` -GTS 头:TTAAii=`ISIH01` 和 CCCC=`FCBB` +GTS 标头:TTAAii=`ISIH01` 和 CCCC=`FCBB` !!! note wis2box 中的 synop2bufr-plugin 会将 FM-12 SYNOP 消息转换为 BUFR,因此 TTAAii 应以 `IS` 开头: - - I = 观测数据(二进制编码)– BUFR + - I = 观测数据(以二进制编码)– BUFR - S = 地面/海平面 -### 手动提交带有 GTS 头的 FM-12 SYNOP 表单 +### 手动提交带有 GTS 标头的 FM-12 SYNOP 表单 -进入 wis2box-webapp 的 FM-12 SYNOP 表单,并使用上述示例数据或您自己的数据填写表单。 +进入 wis2box-webapp 中的 FM-12 SYNOP 表单,并使用上述示例数据或您自己的数据填写表单。 -确保选择 “Add GTS headers” 选项,并提供所需的 GTS 头信息: +确保选择 "Add GTS headers" 选项并提供所需的 GTS 标头信息: fm-12-synop-form-gts-headers.png 提供所需的身份验证令牌并提交表单。 -您可能会看到一条错误消息,因为该站点未在您的站点列表中。您需要将站点 "0-20000-0-64400" 添加到您的站点列表,以便数据能够成功转换和发布。 +您可能会看到一条错误消息,因为该站点未在您的站点列表中。您需要将站点 "0-20000-0-64400" 添加到您的站点列表中,以便数据能够成功转换并发布。 -### 在 WIS2 通知中查看 GTS 头 +### 在 WIS2 通知中查看 GTS 标头 -打开 MQTT Explorer,检查刚刚摄取的数据的 WIS2 通知消息,以查看通知中是否包含 GTS 头。 +打开 MQTT Explorer,检查您刚刚摄取的数据的 WIS2 通知消息,以查看通知中是否包含 GTS 标头。 ## 结论 !!! success "恭喜!" - 在本次实践课程中,您学习了如何: - - 将 GTS 头添加到您的 WIS2 通知中 - - 验证 GTS 头通过您的 wis2box 安装是否可用 \ No newline at end of file + 在本次实践课程中,您学习了: + - 如何将 GTS 标头添加到您的 WIS2 通知中 + - 验证 GTS 标头是否通过您的 wis2box 安装成功提供 \ No newline at end of file diff --git a/documentation/docs/zh/practical-sessions/connecting-to-wis2-over-mqtt.md b/documentation/docs/zh/practical-sessions/connecting-to-wis2-over-mqtt.md index 7503dbc5d..dbf65651b 100644 --- a/documentation/docs/zh/practical-sessions/connecting-to-wis2-over-mqtt.md +++ b/documentation/docs/zh/practical-sessions/connecting-to-wis2-over-mqtt.md @@ -14,9 +14,9 @@ title: 使用 MQTT 连接到 WIS2 ## 简介 -WIS2 使用 MQTT 协议来发布天气/气候/水数据的可用性。WIS2 Global Broker 订阅网络中的所有 WIS2 Nodes,并重新发布其接收到的消息。Global Cache 订阅 Global Broker,下载消息中的数据,然后在 `cache` 主题上重新发布消息,并附带一个新的 URL。Global Discovery Catalogue 从 Broker 发布发现元数据,并提供搜索 API。 +WIS2 使用 MQTT 协议来宣传天气/气候/水文数据的可用性。WIS2 Global Broker 订阅网络中的所有 WIS2 Nodes,并重新发布其接收到的消息。Global Cache 订阅 Global Broker,下载消息中的数据,然后在 `cache` 主题上重新发布消息,并附上新的 URL。Global Discovery Catalogue 从 Broker 发布发现元数据,并提供搜索 API。 -以下是一个 WIS2 通知消息结构的示例,消息接收到的主题为 `origin/a/wis2/br-inmet/data/core/weather/surface-based-observations/synop`: +以下是从主题 `origin/a/wis2/br-inmet/data/core/weather/surface-based-observations/synop` 接收到的 WIS2 通知消息结构示例: ```json { @@ -63,7 +63,7 @@ WIS2 使用 MQTT 协议来发布天气/气候/水数据的可用性。WIS2 Globa 在本次实践课程中,您将学习如何使用 MQTT Explorer 工具设置 MQTT 客户端连接到 WIS2 Global Broker,并能够显示 WIS2 通知消息。 -MQTT Explorer 是一个浏览和查看指定 MQTT Broker 的主题结构以及发布数据的有用工具。 +MQTT Explorer 是一个有用的工具,可以浏览和查看给定 MQTT Broker 的主题结构,以审查正在发布的数据。 !!! note "关于 MQTT" MQTT Explorer 提供了一个用户友好的界面,用于连接到 MQTT Broker 并探索 WIS2 使用的主题和消息结构。 @@ -74,7 +74,7 @@ MQTT Explorer 是一个浏览和查看指定 MQTT Broker 的主题结构以及 ## 使用 MQTT Explorer 连接到 Global Broker -要查看 WIS2 Global Broker 发布的消息,您可以使用 "MQTT Explorer",它可以从 [MQTT Explorer 网站](https://mqtt-explorer.com) 下载。 +要查看 WIS2 Global Broker 发布的消息,可以使用 "MQTT Explorer",可从 [MQTT Explorer 网站](https://mqtt-explorer.com) 下载。 打开 MQTT Explorer 并添加一个新的连接到由 MeteoFrance 托管的 Global Broker,使用以下详细信息: @@ -85,14 +85,14 @@ MQTT Explorer 是一个浏览和查看指定 MQTT Broker 的主题结构以及 mqtt-explorer-global-broker-connection -点击 'ADVANCED' 按钮,移除预配置的主题,并添加以下主题进行订阅: +点击 'ADVANCED' 按钮,移除预配置的主题,并添加以下订阅主题: - `origin/a/wis2/#` mqtt-explorer-global-broker-advanced !!! note - 设置 MQTT 订阅时,您可以使用以下通配符: + 设置 MQTT 订阅时可以使用以下通配符: - **单层通配符 (+)**:单层通配符替代一个主题层级 - **多层通配符 (#)**:多层通配符替代多个主题层级 @@ -101,7 +101,7 @@ MQTT Explorer 是一个浏览和查看指定 MQTT Broker 的主题结构以及 点击 'BACK',然后点击 'SAVE' 保存您的连接和订阅详细信息。然后点击 'CONNECT': -消息应该开始出现在您的 MQTT Explorer 会话中,如下所示: +消息应开始出现在您的 MQTT Explorer 会话中,如下所示: mqtt-explorer-global-broker-topics @@ -123,11 +123,11 @@ MQTT Explorer 是一个浏览和查看指定 MQTT Broker 的主题结构以及 `origin/a/wis2/br-inmet/data/core/weather/surface-based-observations/synop` - 告诉我们数据是由中心 ID 为 `br-inmet` 的 WIS 中心发布的,该中心 ID 对应巴西的 Instituto Nacional de Meteorologia - INMET。 + 告诉我们数据是由中心 ID 为 `br-inmet` 的 WIS 中心发布的,该中心 ID 对应巴西国家气象研究所(Instituto Nacional de Meteorologia - INMET)。 !!! question - 我们如何区分由托管 GTS-to-WIS2 网关的 WIS 中心发布的消息与托管 WIS2 节点的 WIS 中心发布的消息? + 我们如何区分由托管 GTS-to-WIS2 网关的 WIS 中心发布的消息和由托管 WIS2 Node 的 WIS 中心发布的消息? ??? success "点击查看答案" @@ -135,7 +135,7 @@ MQTT Explorer 是一个浏览和查看指定 MQTT Broker 的主题结构以及 `origin/a/wis2/de-dwd-gts-to-wis2/data/core/I/S/A/I/01/sbbr` - 告诉我们数据是由德国 Deutscher Wetterdienst (DWD) 托管的 GTS-to-WIS2 网关发布的。GTS-to-WIS2 网关是一种特殊类型的数据发布者,它将来自全球电信系统 (GTS) 的数据发布到 WIS2。主题结构由 GTS 消息的 TTAAii CCCC 标头组成。 + 告诉我们数据是由德国气象局(Deutscher Wetterdienst,DWD)托管的 GTS-to-WIS2 网关发布的。GTS-to-WIS2 网关是一种特殊类型的数据发布者,它将全球电信系统(GTS)中的数据发布到 WIS2。主题结构由 GTS 消息的 TTAAii CCCC 头组成。 ## 练习 2:查看 WIS2 消息结构 @@ -151,7 +151,7 @@ MQTT Explorer 是一个浏览和查看指定 MQTT Broker 的主题结构以及 重新连接到 Global Broker 并等待消息出现。 -您可以在右侧的 "Value" 部分查看 WIS2 消息的内容。尝试展开主题结构以查看消息的不同层级,直到到达最后一层并查看其中一条消息的内容。 +您可以在右侧的 "Value" 部分查看 WIS2 消息的内容。尝试展开主题结构以查看消息的不同层级,直到到达最后一层,并查看其中一条消息的内容。 !!! question @@ -171,27 +171,27 @@ MQTT Explorer 是一个浏览和查看指定 MQTT Broker 的主题结构以及 ??? success "点击查看答案" - URL 包含在 `links` 部分,`rel="canonical"` 并由 `href` 键定义。 + URL 包含在 `links` 部分,`rel="canonical"`,由 `href` 键定义。 - 您可以复制该 URL 并将其粘贴到网络浏览器中以下载数据。 + 您可以复制 URL 并将其粘贴到网页浏览器中下载数据。 -## 练习 3:查看 'origin' 和 'cache' 主题之间的区别 +## 练习 3:查看 'origin' 和 'cache' 主题的区别 -确保您仍然使用 `origin/a/wis2/+/data/core/weather/surface-based-observations/synop` 和 `cache/a/wis2/+/data/core/weather/surface-based-observations/synop` 主题订阅连接到 Global Broker,如练习 2 中所述。 +确保您仍然使用 `origin/a/wis2/+/data/core/weather/surface-based-observations/synop` 和 `cache/a/wis2/+/data/core/weather/surface-based-observations/synop` 订阅主题连接到 Global Broker,如练习 2 中所述。 -尝试识别一个由相同中心 ID 发布的消息,该消息同时出现在 `origin` 和 `cache` 主题中。 +尝试识别在 `origin` 和 `cache` 主题上发布的具有相同中心 ID 的消息。 !!! question - 发布在 `origin` 和 `cache` 主题上的消息有什么区别? + 在 `origin` 和 `cache` 主题上发布的消息有什么区别? ??? success "点击查看答案" - 发布在 `origin` 主题上的消息是 Global Broker 从网络中的 WIS2 Nodes 重新发布的原始消息。 + 在 `origin` 主题上发布的消息是 Global Broker 从网络中的 WIS2 Nodes 重新发布的原始消息。 - 发布在 `cache` 主题上的消息是 Global Cache 下载数据后的消息。如果您检查从以 `cache` 开头的主题发布的消息内容,您会发现 'canonical' 链接已更新为一个新的 URL。 + 在 `cache` 主题上发布的消息是 Global Cache 下载数据后重新发布的消息。如果您检查从以 `cache` 开头的主题发布的消息内容,您会发现 'canonical' 链接已更新为新的 URL。 - WIS2 网络中有多个 Global Cache,因此您将收到来自每个下载该消息的 Global Cache 的一条消息。 + WIS2 网络中有多个 Global Cache,因此您将收到每个下载了消息的 Global Cache 发布的一条消息。 Global Cache 仅下载并重新发布发布在 `../data/core/...` 主题层级上的消息。 @@ -203,6 +203,6 @@ MQTT Explorer 是一个浏览和查看指定 MQTT Broker 的主题结构以及 - 如何使用 MQTT Explorer 订阅 WIS2 Global Broker 服务 - WIS2 主题结构 - WIS2 通知消息结构 - - 核心数据和推荐数据之间的区别 + - 核心数据和推荐数据的区别 - GTS-to-WIS2 网关使用的主题结构 - - 发布在 `origin` 和 `cache` 主题上的 Global Broker 消息之间的区别 \ No newline at end of file + - 在 `origin` 和 `cache` 主题上发布的 Global Broker 消息的区别 \ No newline at end of file diff --git a/documentation/docs/zh/practical-sessions/initializing-wis2box.md b/documentation/docs/zh/practical-sessions/initializing-wis2box.md index 3af5058a5..0d6c06ec0 100644 --- a/documentation/docs/zh/practical-sessions/initializing-wis2box.md +++ b/documentation/docs/zh/practical-sessions/initializing-wis2box.md @@ -22,7 +22,7 @@ title: 初始化 wis2box ## 准备工作 -使用您的用户名和密码登录到指定的虚拟机,并确保您位于 `wis2box` 目录中: +使用您的用户名和密码登录指定的虚拟机,并确保您处于 `wis2box` 目录中: ```bash cd ~/wis2box @@ -37,11 +37,11 @@ cd ~/wis2box 可以使用 `wis2box-create-config.py` 脚本来创建您的 wis2box 的初始配置。 -脚本会询问您一系列问题以帮助设置配置。 +脚本会向您提出一系列问题,以帮助设置配置。 脚本完成后,您可以查看并更新配置文件。 -运行脚本: +运行以下命令启动脚本: ```bash python3 wis2box-create-config.py @@ -68,7 +68,7 @@ The directory /home/username/wis2box-data has been created. ### wis2box URL -接下来,您将被要求输入您的 wis2box 的 URL。此 URL 将用于访问 wis2box 的 Web 应用程序、API 和 UI。 +接下来,您需要输入 wis2box 的 URL。此 URL 将用于访问 wis2box 的 Web 应用程序、API 和用户界面。 请使用 `http://` 作为 URL。 @@ -86,11 +86,11 @@ Is this correct? (y/n/exit) 当提示输入 `WIS2BOX_WEBAPP_PASSWORD`、`WIS2BOX_STORAGE_PASSWORD` 和 `WIS2BOX_BROKER_PASSWORD` 时,您可以选择随机生成密码或自行定义。 -无需担心记住这些密码,它们将存储在您 wis2box 目录中的 `wis2box.env` 文件中。 +无需担心记住这些密码,它们会存储在 `wis2box.env` 文件中,位于您的 wis2box 目录中。 ### 检查 `wis2box.env` -脚本完成后,检查当前目录中的 `wis2box.env` 文件内容: +脚本完成后,请检查当前目录中的 `wis2box.env` 文件内容: ```bash cat ~/wis2box/wis2box.env @@ -124,7 +124,7 @@ cat ~/wis2box/wis2box.env !!! note - `wis2box.env` 文件包含定义 wis2box 配置的环境变量。有关更多信息,请参考 [wis2box-documentation](https://docs.wis2box.wis.wmo.int/en/latest/reference/configuration.html)。 + `wis2box.env` 文件包含定义 wis2box 配置的环境变量。有关更多信息,请参阅 [wis2box-documentation](https://docs.wis2box.wis.wmo.int/en/latest/reference/configuration.html)。 除非您确定所做的更改,否则不要编辑 `wis2box.env` 文件。不正确的更改可能导致您的 wis2box 无法正常工作。 @@ -144,7 +144,7 @@ cd ~/wis2box python3 wis2box-ctl.py start ``` -首次运行此命令时,您将看到以下输出: +首次运行此命令时,您会看到以下输出: ``` No docker-compose.images-*.yml files found, creating one @@ -154,7 +154,7 @@ Would you like to update ? (y/n/exit) 选择 ``y``,脚本将创建文件 ``docker-compose.images-1.3.0.yml``,下载所需的 Docker 镜像并启动服务。 -根据您的网络连接速度,下载镜像可能需要一些时间。此步骤仅在首次启动 wis2box 时需要。 +根据您的网络连接速度,下载镜像可能需要一些时间。此步骤仅在首次启动 wis2box 时需要完成。 使用以下命令检查状态: @@ -169,9 +169,9 @@ python3 wis2box-ctl.py status 服务定义在 `~/wis2box/` 目录中的各种 `docker-compose*.yml` 文件中。 - Python 脚本 `wis2box-ctl.py` 用于运行底层 Docker Compose 命令以控制 wis2box 服务。 + Python 脚本 `wis2box-ctl.py` 用于运行底层的 Docker Compose 命令,以控制 wis2box 服务。 - 您无需了解 Docker 容器的详细信息即可运行 wis2box 软件栈,但可以查看 `docker-compose*.yml` 文件以了解服务的定义。如果您对 Docker 感兴趣,可以在 [Docker 文档](https://docs.docker.com/) 中找到更多信息。 + 您无需了解 Docker 容器的详细信息即可运行 wis2box 软件栈,但可以查看 `docker-compose*.yml` 文件以了解服务的定义。如果您有兴趣了解更多关于 Docker 的信息,可以参考 [Docker 文档](https://docs.docker.com/)。 要登录到 wis2box-management 容器,请使用以下命令: @@ -179,13 +179,13 @@ python3 wis2box-ctl.py status python3 wis2box-ctl.py login ``` -注意,登录后您的提示符会发生变化,表明您现在位于 wis2box-management 容器内: +注意,登录后您的提示符会发生变化,表明您现在处于 wis2box-management 容器中: ```{bash} root@025381da3c40:/home/wis2box# ``` -在 wis2box-management 容器内,您可以运行各种命令来管理您的 wis2box,例如: +在 wis2box-management 容器中,您可以运行各种命令来管理您的 wis2box,例如: - `wis2box auth add-token --path processes/wis2box`:为 *processes/wis2box* 端点创建授权令牌 - `wis2box data clean --days=`:清理 *wis2box-public* 存储桶中超过指定天数的数据 @@ -245,7 +245,7 @@ docker volume ls ## wis2box API -wis2box 包含一个 API(应用程序编程接口),提供数据访问和处理功能,用于交互式可视化、数据转换和发布。 +wis2box 包含一个 API(应用程序编程接口),提供数据访问和交互式可视化、数据转换及发布的处理功能。 打开一个新标签页并导航到页面 `http://YOUR-HOST/oapi`。 @@ -259,7 +259,7 @@ wis2box 包含一个 API(应用程序编程接口),提供数据访问和 ??? success "点击查看答案" - 要查看通过 API 当前可用的集合,请点击 `View the collections in this service`: + 要查看 API 当前可用的集合,请点击 `View the collections in this service`: wis2box-api-collections.png @@ -269,15 +269,14 @@ wis2box 包含一个 API(应用程序编程接口),提供数据访问和 - 数据通知 - 发现元数据 - !!! question - 已发布了多少数据通知? + 已发布了多少条数据通知? ??? success "点击查看答案" - 点击 "Data notifications",然后点击 `Browse through the items of "Data Notifications"`。 - + 点击 "Data notifications",然后点击 `Browse through the items of "Data Notifications"`。 + 您会注意到页面显示 "No items",因为尚未发布任何数据通知。 ## wis2box webapp @@ -294,11 +293,11 @@ wis2box 包含一个 API(应用程序编程接口),提供数据访问和 cat ~/wis2box/wis2box.env | grep WIS2BOX_WEBAPP_PASSWORD ``` -登录后,将鼠标移到左侧菜单以查看 wis2box Web 应用程序中可用的选项: +登录后,将鼠标移到左侧菜单以查看 wis2box Web 应用程序中的可用选项: wis2box-webapp-menu.png -这是 wis2box Web 应用程序,用于与您的 wis2box 进行交互: +这是 wis2box Web 应用程序,您可以通过它与您的 wis2box 进行交互: - 创建和管理数据集 - 更新/审查您的站点元数据 @@ -324,17 +323,17 @@ wis2box 包含一个 API(应用程序编程接口),提供数据访问和 !!! note - `#` 主题是一个通配符订阅,它将订阅 broker 上发布的所有主题。 + `#` 主题是一个通配符订阅,它会订阅 broker 上发布的所有主题。 发布在 `$SYS` 主题下的消息是由 mosquitto 服务本身发布的系统消息。 -使用以下连接详细信息,确保将 `` 的值替换为您的主机名,并将 `` 的值替换为您的 `wis2box.env` 文件中的值: +使用以下连接详情,确保将 `` 替换为您的主机名,将 `` 替换为您 `wis2box.env` 文件中的值: -- **协议:mqtt://** -- **主机:``** -- **端口:1883** -- **用户名:wis2box** -- **密码:``** +- **协议: mqtt://** +- **主机: ``** +- **端口: 1883** +- **用户名: wis2box** +- **密码: ``** !!! note @@ -346,7 +345,7 @@ wis2box 包含一个 API(应用程序编程接口),提供数据访问和 请注意,这是您的 **内部** broker 密码,Global Broker 将使用不同的(只读)凭据订阅您的 broker。切勿与任何人共享此密码。 -确保点击 "SAVE" 保存您的连接详细信息。 +确保点击 "SAVE" 保存您的连接详情。 然后点击 "CONNECT" 连接到您的 **wis2box-broker**。 @@ -356,11 +355,11 @@ wis2box 包含一个 API(应用程序编程接口),提供数据访问和 mqtt-explorer-sys-topic.png -同样的连接也可以通过 WebSockets 使用 MQTT 在端口 80 上实现,连接详细信息如下: +同样的连接也可以通过 WebSockets 使用 MQTT 在端口 80 上实现,连接详情如下: mqtt-explorer-wis2box-broker-websockets.png -## 总结 +## 结论 !!! success "恭喜!" 在本次实践课程中,您学习了如何: @@ -368,4 +367,5 @@ wis2box 包含一个 API(应用程序编程接口),提供数据访问和 - 运行 `wis2box-create-config.py` 脚本以创建初始配置 - 启动 wis2box 并检查其组件状态 - 在浏览器中访问 wis2box-webapp 和 wis2box-API - - 使用 MQTT Explorer 连接到学生虚拟机上的 MQTT broker \ No newline at end of file + - 使用 MQTT Explorer 连接到学生虚拟机上的 MQTT broker +``` \ No newline at end of file