Last typo rapport

This commit is contained in:
Leopold Clement 2021-08-25 11:13:48 +02:00
parent 513db00589
commit fb9be95864
6 changed files with 88 additions and 194 deletions

View file

@ -210,7 +210,7 @@
%------- Abréviations, langages et programme utiles
\newcommand{\ens}{École normale supérieur Paris-Saclay}
\newcommand{\ens}{École normale supérieure Paris-Saclay}
\newcommand{\matlab}{\textsc{Matlab}}
\newcommand{\python}{\emph{python}}

View file

@ -1,6 +1,6 @@
FIGURES_SVG=$(wildcard raw_img/*.svg)
FIGURES_PDF=$(subst raw_img/,pdf_img/,$(FIGURES_SVG:.svg=.pdf_tex))
FIGURES_PNG=$(subst raw_img/,png_svg_img/,$(FIGURES_SVG:.svg=.png))
FIGURES_PDF=$(FIGURES_SVG:.svg=.pdf_tex)
FIGURES_PNG=$(FIGURES_SVG:.svg=.png)
DOT_DOT=$(wildcard dot/*.dot)
DOT_PNG=$(DOT_DOT:.dot=.png)
@ -14,9 +14,9 @@ all : rapport.pdf poster.pdf
rapport.pdf : rapport.tex rapport.bib $(FIGURES_PNG) $(UML_PNG) png_img/gain_action.png $(DOT_PNG)
lualatex -shell-escape rapport.tex
bibtex rapport
makeglossaries rapport
lualatex -shell-escape rapport.tex
bibtex rapport
lualatex -shell-escape rapport.tex
lualatex -shell-escape rapport.tex
@ -25,7 +25,6 @@ poster.pdf : poster.tex poster.bib $(FIGURES_PNG) $(UML_PNG) png_img/gain_action
bibtex poster
lualatex -shell-escape poster.tex
lualatex -shell-escape poster.tex
lualatex -shell-escape poster.tex
rapport.bib : biblio.bib
cp biblio.bib rapport.bib
@ -37,12 +36,14 @@ png_img/gain_action.png :
python3 png_img/gen_fig_g.py
clean : clean-rapport clean-poster
rm -f -r pdf_img/
rm -f -r png_svg_img/
rm -f -r svg_img/*.png
rm -f -r svg_img/*.pdf
rm -f -r svg_img/*.pdf_tex
rm -f -r puml/*.svg
rm -f -r puml/*.png
rm -f -r dot/*.png
rm -f rapport.pdf
rm -f poster.pdf
clean-rapport :
rm -f rapport.aux
@ -78,13 +79,13 @@ clean-poster :
rm -f poster.glo
rm -f texput.log
pdf_img/%.pdf : raw_img/%.svg pdf_img/%.pdf_tex
svg_img/%.pdf : svg_img/%.svg svg_img/%.pdf_tex
inkscape -D -z --file=$< --export-pdf=$@ --export-latex
pdf_img/%.pdf_tex : raw_img/%.svg
svg_img/%.pdf_tex : svg_img/%.svg
inkscape -D -z --file=$< --export-pdf=$@ --export-latex
png_svg_img/%.png : raw_img/%.svg
svg_img/%.png : svg_img/%.svg
inkscape $< --export-type=png --export-filename=$@
puml/%.svg : puml/%.puml

View file

@ -4,7 +4,7 @@ hide footbox
participant Capteur as capt
database Cloud as cld
[-> capt ++: activation exterieur\ntimer, interuption...
[-> capt ++: activation extérieure\ntimer, interruption...
capt -> cld : CON[0x77]\nPUT/url?val
cld --> capt !!: ACK[0x77]

View file

@ -21,7 +21,7 @@ package "Notre ajout" as us {
+float avg_RTT
+envoie_token()
+receprion_token()
+reception_token()
+failed_request()
+reset()
}
@ -61,14 +61,14 @@ package "tf_agent" as tf{
}
helper_client_coap "1" *-- "1" client_coap : > Simplifie l'usage
client_coap "1" *-- "1" superviseur_local : < Surveille et controle
client_coap "1" *-- "1" superviseur_local : < Surveille et contrôle
superviseur_global "1" o-- "N" superviseur_local : > fait la synthèse
maquette "1" *-- "N" helper_client_coap
maquette "1" *-- "1" superviseur_global : < envoie les données\nrécoltées
maquette "1" *-- "N" requette : < permet le controle\nde la charge du réseau
requette "1" --> "1" helper_client_coap : > envoie des requettes\navec une période précise
maquette "1" *-- "N" requette : < permet le contrôle\nde la charge du réseau
requette "1" --> "1" helper_client_coap : > envoie des requêtes\navec une période précise
tfenv <|-- maquette : < implémente
@enduml

View file

@ -21,6 +21,12 @@
\usepackage{lscape}
\usepackage{wrapfig}
\usepackage[%
all,
defaultlines=3 % nombre minimum de lignes
]{nowidow}
\newcommand{\code}[1]{\mintinline[breaklines, breakafter=.]{python}{#1}}
\usepackage[toc]{glossaries}
@ -61,7 +67,7 @@
\newglossaryentry{cocoa}
{
name=Cocoa+,
description={Evolution de \coap{}, protocole de la couche \osi{} 7, voir \cite{shelbyConstrainedApplicationProtocol2014}}
description={Évolution de \coap{}, protocole de la couche \osi{} 7, voir \cite{shelbyConstrainedApplicationProtocol2014}}
}
\newcommand{\cocoa}{\gls{cocoa}}
@ -76,7 +82,7 @@
\newglossaryentry{keras}
{
name=keras,
name=Keras,
description={Module Python pour la manipulation de réseaux de neurones}
}
@ -141,7 +147,7 @@
\newglossaryentry{mac}
{
name=MAC,
description={Media Access Control, Contrôle de l'accès à médium de communication}
description={Media Access Control, Contrôle de l'accès au médium de communication}
}
\newcommand{\mac}{\gls{mac}}
@ -236,8 +242,9 @@
\hspace{0pt}
\vfill
\begin{center}
\section*{Remerciement}
Je remercie Lynda Zitoune et Véronique Vèque de m'avoir permis de réalisé ce stage dans leur équipe.
\section*{Remerciements}
Je remercie Lynda Zitoune et Véronique Vèque\\
de m'avoir permis de effectuer ce stage dans leur équipe.
\end{center}
\vfill
\hspace{0pt}
@ -276,7 +283,7 @@ Nos objectifs sont \begin{itemize}
\item détermination des scénarios pertinents
\item simulation ou test de ces scénarios
\end {itemize}
Le stage se déroule entièrement en distanciel, avec des réunions hébdomadaires avec mes encadrantes, soit en présentiel dans les locaux de CentralSupélec, soit sur Teams.
Le stage se déroule entièrement en distanciel, avec des réunions hebdomadaires avec mes encadrantes, soit en présentiel dans les locaux de CentraleSupélec, soit sur Teams.
\subsection{Qu'est-ce qu'un réseau \iot{} ?}
@ -296,9 +303,9 @@ Ces connexions se font au moyen de normes et de protocoles organisés dans un mo
\toprule
Couche & Rôle & Protocole\\
\midrule
7 - Application & Utilisation finale & http, ssh...\\
7 - Application & Utilisation finale & \http{}, ssh...\\
4 - Transport & \CC{} \& multiplexage & \tcp{}, \udp{}\\
3 - Réseau & Routage & IP\\
3 - Réseau & Routage & \ip{}\\
1 \& 2 - Physique & Support des communications & Ethernet, Wi-Fi...\\
\bottomrule
\end{tabular}
@ -306,9 +313,9 @@ Ces connexions se font au moyen de normes et de protocoles organisés dans un mo
Les couches $1$ et $2$ permettent la communication entre deux machines directement reliées.
C'est ici qu'intervient l'adresse \mac{}.
La couches $3$ décrit le routage pour passer par des machines intermédiaires afin de voyager dans l'ensemble du réseau.
La couche $3$ décrit le routage pour passer par des machines intermédiaires afin de voyager dans l'ensemble du réseau.
C'est ici qu'intervient l'adresse \ip{}.
La couches $4$ décrit les protocoles permettant d'établir une connexion entre deux applications sur les machines hôtes.
La couche $4$ décrit les protocoles permettant d'établir une connexion entre deux applications sur les machines hôtes.
Cela inclut donc le multiplexage des données (c'est le port sur la machine hôte), ainsi que la gestion de la congestion.
Les couches $5$ et $6$ n'ont pas d'influence sur la suite, et sont donc négligées.
Elles permettent par exemple d'encrypter la connexion avec le \emph{SSL}.
@ -328,18 +335,19 @@ Suivant l'application, il faut favoriser l'un ou l'autre, ou trouver un compromi
\subsubsection{Qu'est-ce que la congestion ?}
Malheureusement, les réseaux étant hétérogènes, on ne contrôle pas tout les paramètres lorsqu'on les utilise.
Malheureusement, les réseaux étant hétérogènes, on ne contrôle pas tous les paramètres lorsqu'on les utilise.
En effet, pour envoyer un paquet à une autre machine, il faut (dans le cas général) passer par plusieurs intermédiaires, les routeurs.
Lesdits routeurs ne doivent pas gérer qu'un seul flux, et tous les liens entre les routeurs n'ont pas la même capacité ; ainsi on se retrouve avec des accumulations de paquets dans certains routeurs.
L'accumulation se produit au niveau des goulots d'étranglement.
Les routeurs n'ont pas une mémoire infinie, ils ne peuvent donc pas laisser les queues d'envoi grandir indéfiniment.
Elles ont une taille limite, et il faut donc parfois ne pas traiter certains paquets lorsque le réseau est trop chargé.
Ce phénomène est appelé congestion.
On cherche à l'éviter, car un paquet non traité est un paquet perdu, et le message n'est pas complet pour le client.
La gestion de la congestion sera expliquée plus en détail dans la partie \ref{part_cc}.
La détection de la congestion se fait souvent à l'aide d'un accusé de réception : si l'accusé n'est pas reçu au bout d'un certain temps, on considère le message comme perdu.
Lorsque des paquets sont perdus à cause de la congestion, il faut les réenvoyer, en faisant attention de ne pas recongestionner le réseau.
Une grande partie des optimisations du \CC a lieu au niveau de ce temps d'attente, le \rto.
Une grande partie des optimisations du \CC{} a lieu au niveau de ce temps d'attente, le \rto{}.
\subsubsection{Quelles sont les spécificités des réseaux \iot{} ?}
@ -350,7 +358,7 @@ Dans un réseau \iot, les contraintes et applications sont différentes : \begin
\end{itemize}
Les technologies employées sont surtout des connexions sans fil à basse consommation, et à bas débit.
On peut citer les technologies comme le BLE, le 802.15.4, 6LoWPAN. %manque référence
On peut citer les technologies comme le BLE, le 802.15.4, 6LoWPAN \dots %manque référence
De plus, pour accéder aux ressources d'une autre machine, on ne peut pas utiliser l'\http{} comme sur un ordinateur de bureau ou un téléphone.
En effet, \http{} s'appuie sur \tcp{}, et induit donc beaucoup de messages supplémentaires.
@ -363,8 +371,8 @@ Un nouveau protocole a donc été développé pour proposer des fonctionnalités
L'interface en question est une interface \emph{RestFull} :\begin{itemize}
\item Les ressources sont identifiées par des url, par exemple \url{coap://exemple.com/ressource/en/ligne},
\item On peut interagir avec les ressources au moyen de plusieurs méthodes: \begin{itemize}
\item GET : On demande le contenu de la ressource distante,
\item POST, PUT : On crée ou remplace le contenu de la ressource distante,
\item GET : on demande le contenu de la ressource distante,
\item POST, PUT : on crée ou remplace le contenu de la ressource distante,
\item DELETE : on supprime la ressource.
\end{itemize}
\end{itemize}
@ -425,7 +433,7 @@ Les deux paramètres sont : \begin{itemize}
\end{itemize}
La méthode pour déterminer l'action appropriée à chaque pas de temps est juste de prendre $argmax_{a \in \mathbb{A}} \mathbb{Q}\left(s_t, a \right) $.
En réalité, on fait des actions aléatoires avec une probabilité faible pour explorer l'environnement.
Deux des limites de cette solution sont la taille en mémoire d'un tel tableau quand les ensembles $mathbb{S}$ et $\mathbb{A}$ sont grands, et le temps qu'il faut pour que la convergence des valeurs du tableau ait lieu.
Deux des limites de cette solution sont la taille en mémoire d'un tel tableau quand les ensembles $\mathbb{S}$ et $\mathbb{A}$ sont grands, et le temps qu'il faut pour que la convergence des valeurs du tableau ait lieu.
Pour pallier à cela, on peut approximer la fonction par un réseau de neurones, c'est le principe du \dqlearn{}.
\section{État de l'art\label{part_cc}}
@ -465,9 +473,9 @@ Mais interpréter ces variations de \rtt{} et prendre la décision adéquate est
\subsection{Comment gère-t-on la congestion avec limplémentation classique de \coap{} ?}
Pour le \coap{}, la gestion de la congestion est différente, car on utilise une fenêtre unitaire ; c'est sur le \rto que se fait le travail.
Pour le \coap{}, la gestion de la congestion est différente, car on utilise une fenêtre unitaire ; c'est sur le \rto{} que se fait le travail.
Dans la version de base, le \rto{} de base est tiré aléatoirement entre $2 s$ et $3 s$, et est doublé à chaque retransmission.
C'est un protocole simple mais peu performant, car si le délai de transmission est déjà de l'ordre du \rto, alors il risque d'y avoir des retransmissions systématiques.
C'est un protocole simple mais peu performant, car si le délai de transmission est déjà de l'ordre du \rto{}, alors il risque d'y avoir des retransmissions systématiques.
Une des évolutions du \coap{} est \cocoa{}, qui ne change que le \CCA{}\cite{ancillottiRTTBasedCongestionControl2018}.
C'est un algorithme inspiré de FAST-\tcp{} et Compound-\tcp{}.
@ -488,8 +496,8 @@ Ensuite, on crée une fonction $T$ permettant de prendre une décision :
\end{equation}
On a donc $4$ cas pour prendre une décision : \begin{itemize}
\item $RTT_S < T\left( -1 \right)$ : pas de congestion, on peut être beaucoup plus agressif,
\item $T\left( -1 \right) \le RTT_S < T\left( +1 \right)$ : congestion faible, on se trouve à un point de fonctionement correct, on ne change rien, mais on peut aussi être un peu plus agressif si besoin,
\item $T\left( +1 \right) \le RTT_S < T\left( +2 \right)$ : congestion normale, la congestion augmente, il faut être moins agressif pour ne pas congestioner le réseau,
\item $T\left( -1 \right) \le RTT_S < T\left( +1 \right)$ : congestion faible, on se trouve à un point de fonctionnement correct, on ne change rien, mais on peut aussi être un peu plus agressif si besoin,
\item $T\left( +1 \right) \le RTT_S < T\left( +2 \right)$ : congestion normale mais en augmentation, il faut être moins agressif pour ne pas congestionner le réseau,
\item $T\left( +2 \right) \le RTT_S$ : congestion importante, le réseau est totalement congestionné, il faut être beaucoup moins agressif.
\end{itemize}
La seule contrainte est que $\alpha_S \gg \alpha_L$.
@ -497,12 +505,12 @@ Le choix des autres valeurs, les seuils et les actions prises sont choisis empir
\subsection{Comment l'apprentissage machine prend-il place dans les \CCA{}?}
Pour pallier ces problèmes, plusieurs \CCA{} utilisant de l'apprentissage machine sont apparus : Q-\tcp{}\cite{liQTCPAdaptiveCongestion2019}, \tcp{}-Drinc\cite{xiaoTCPDrincSmartCongestion2019}\dots
L'idée derriere ces algorithmes est de déléguer la prise de decision à une IA qui serait capable de reconnaître les signes de congestion bien plus efficacement qu'un algorithme "fait-main" classique.
L'idée derrière ces algorithmes est de déléguer la prise de décision à une IA qui serait capable de reconnaître les signes de congestion bien plus efficacement qu'un algorithme "fait-main" classique.
Plusieurs problèmatiques se présentent : \begin{itemize}
\item La modélisation de l'environement : \begin{itemize}
\item La modélisation de l'environnement : \begin{itemize}
\item quel est $\mathbb{S}$, c'est-à-dire comment représenter l'environnement pour l'acteur,
\item quel est $\mathbb{A}$, c'est-à-dire qu'est-ce que l'acteur doit donner comme consigne,
\item quel est $r_t$, c'est à dire qu'est-ce qu'une bonne action
\item quel est $r_t$, c'est-à-dire qu'est-ce qu'une bonne action
\end{itemize}
\item mais aussi des problèmes de compétition multi-agents: \begin{itemize}
\item comment être sûr que les ressources réseau sont équitablement réparties entre les agents,
@ -514,35 +522,36 @@ L'intégration de l'IA dans le \CC{} n'est encore qu'à l'état de tests, de bal
\section{Modélisation choisie}
La première étape est de modéliser le système.
Notre modélisation s'appuie sur la modélisation de \cite{xiaoTCPDrincSmartCongestion2019}.
Notre modélisation s'appuie sur celle de \cite{xiaoTCPDrincSmartCongestion2019}.
\subsection{Quel cas d'utilisation nous est le plus favorable ?}
Pour notre travail, on se positionne dans une situation où un serveur central puissant voudrait récupérer des données sur un ensemble de capteurs.
Les contraintes pour les codes s'exécutant sur le serveur central (un serveur cloud généralement) et sur les capteurs sont radicalement différentes.
Le cloud peut exécuter le code qu'il veut avec beaucoup de puissance, alors que les capteurs doivent se limiter au maximum.
Le could a accès aux données de toutes les connexions alors que les capteurs n'ont à priori que les données de leur connexion.
On choisit de se placer dans le cas où on intéragit avec un nombre fixe de capteurs, $N$.
On choisit de se placer dans le cas où on interagit avec un nombre fixe de capteurs, $N$.
\begin{figure}[htp]
\centering
\includegraphics[scale=1]{puml/cas_utilisation_coap_1.png}
\includegraphics[scale=0.9]{puml/cas_utilisation_coap_1.png}
\caption[Diagramme de séquence de transaction \coap{}, cas 1]{Diagramme de séquence entre le capteur et le serveur \coap{} avec déclenchement de la transaction par le capteur.}
\label{fig:seq_coap:1}
\end{figure}
\begin{figure}[htp]
\centering
\includegraphics[scale=1]{puml/cas_utilisation_coap_2.png}
\includegraphics[scale=0.9]{puml/cas_utilisation_coap_2.png}
\caption[Diagramme de séquence de transaction \coap{}, cas 2]{Diagramme de séquence entre le capteur et le serveur \coap{} avec déclenchement de la transaction par le cloud et réponse dans l'acquittement.}
\label{fig:seq_coap:2}
\end{figure}
\begin{figure}[htp]
\centering
\includegraphics[scale=1]{puml/cas_utilisation_coap_3.png}
\includegraphics[scale=0.9]{puml/cas_utilisation_coap_3.png}
\caption[Diagramme de séquence de transaction \coap{}, cas 3]{Diagramme de séquence entre le capteur et le serveur \coap{} avec déclenchement de la transaction par le cloud et réponse dans un message séparé.}
\label{fig:seq_coap:3}
\end{figure}
Lorsque l'on veut établir une connexion avec un capteur, il y a trois cas de figure, il faut donc choisir celui qui nous avantage le plus. Le cas 1 (figure \ref{fig:seq_coap:1}) permet de réagir à un événement, mais demande au capteur de prendre le rôle de gestionnaire du \CC{}, ce qui n'est pas le plus simple.
Lorsque l'on veut établir une connexion avec un capteur, il y a trois cas de figure, il faut donc choisir le plus avantageux.
Le cas 1 (figure \ref{fig:seq_coap:1}) permet de réagir à un événement, mais demande au capteur de prendre le rôle de gestionnaire du \CC{}, ce qui n'est pas le plus simple.
Les cas 2 (figure \ref{fig:seq_coap:2}) et 3 (figure \ref{fig:seq_coap:3}) permettent tous deux au cloud de prendre en charge le \CC{}, mais le cas 3 demande l'échange de bien plus de messages et sature plus vite le réseau.
On choisit donc de travailler dans le cas 2, qui permet d'avoir à la fois toutes les informations au niveau de l'acteur, et de la puissance de calcul.
Pour ce qui est de la gestion des événements, on peut imaginer que le cloud envoie régulièrement au capteur des consignes simples pour le \CC{}, même si nous n'allons pas traiter cette problématique.
@ -553,7 +562,7 @@ La grandeur la plus simple à se représenter est le \rtt{}.
Chaque envoi de message permet de récupérer un échantillon de \rtt{}.
Mais un problème se pose lorsque le \rto{} de base est plus faible que le \rtt{} à cause des retransmissions : on ne sait pas si l'acquittement vient de l'original ou de la retransmission, car ils ont le même token.
Par exemple, dans la figure \ref{fig:temp_coap:valide}, on a sans ambiguïté un \rto{} de $25$, mais dans la figure \ref{fig:temp_coap:invalide}, le \rto{} semble être $5$ alors qu'il est de $30$.
Ce problème peut être contourné en changeant le token dans les retransmissions, mais nous ne metterons pas en place cette solution pour l'instant.
Ce problème peut être contourné en changeant le token dans les retransmissions, mais nous ne mett rons pas en place cette solution pour l'instant.
\begin{figure}[htp]
\centering
@ -577,7 +586,7 @@ Ces retransmissions peuvent être dues à la congestion mais aussi à des probl
Une fois que l'on a mesuré une grandeur, il faut la transmettre à l'acteur.
Le premier problème est que l'acteur voit un temps discontinu, alors que les nouvelles mesures arrivent à des instants irréguliers.
On choisit donc de couper le temps en une série d'intervalles de longueur fixe.
Dans ces intervalles, on supose que l'état du réseau est constant, et les valeurs utilisées par le \coap{} le sont aussi.
Dans ces intervalles, on suppose que l'état du réseau est constant, et les valeurs utilisées par le \coap{} le sont aussi.
Il faut prendre une durée de l'intervalle qui soit plus longue que le \rtt{}, car ainsi on ne se retrouve pas dans un cas limite où un message part pendant l'intervalle $t$, avec les consignes de l'instant $t$, mais arrive dans l'instant $t+1$ et influe $s_{t+1}$ au lieu de $s_t$.
Il faut aussi que cette durée ne soit pas trop importante, car on ne change les consignes qu'à la fin de ces intervalles.
On nomme cet intervalle "intervalle de contrôle".
@ -585,7 +594,7 @@ On nomme cet intervalle "intervalle de contrôle".
De plus, on travaille sur un réseau de capteurs qui renvoient leurs informations à un serveur cloud unique.
Puisque le serveur cloud centralise toutes les connexions, on choisit d'avoir un seul agent, qui donne des consignes pour toutes les connexions.
Pour la suite, on appelle "serveur \coap{}" la partie de programme s'exécutant sur les capteurs, et "clients \coap{}" les programmes s'éxecutant sur le serveur cloud afin de récupérer les données des capteurs.
Pour la suite, on appelle "serveur \coap{}" la partie de programme s'exécutant sur les capteurs, et "clients \coap{}" les programmes s'ecutant sur le serveur cloud afin de récupérer les données des capteurs.
On remarque aussi qu'on ne fait pas la différence entre l'état du réseau et l'observation que l'on en fait.
\subsubsection{État d'un client seul.}
@ -632,7 +641,7 @@ Une fois que chaque client a généré son vecteur, il suffit de les concaténer
\label{eq:modele:mat}
\end{equation}
L'avantage d'une telle matrice est que l'on pourra utiliser une convolution dans le réseau de neurones.
Une autre possibilité, qui est de concaténer les matrices de plusieurs échantillon de temps successifs pour créer un tenseur à trois dimensions, qui permettrait d'avoir plus d'informations sur l'évolution temporelle des valeurs, n'a pas pu être testée.
Une autre possibilité, qui est de concaténer les matrices de plusieurs échantillon de temps successifs pour créer un tenseur à trois dimensions (ce qui permettrait d'avoir plus d'informations sur l'évolution temporelle des valeurs) n'a pas pu être testée.
\subsection{Comment l'acteur influence-t-il le client \coap{} ?}
La principale valeur permettant de contrôler le comportement du client est le \rto{}.
@ -659,11 +668,11 @@ D'autres choix sont possibles, par exemple $\mathbb{A} = \left\lbrace 0.1, 0.5,
\subsection{Comment quantifier la réussite de l'agent ?}
Une fois que l'on sait représenter l'état du réseau, il faut déterminer si cet état est favorable ou non.
Pour cela, il faut se demander ce que l'on veut comme caractéristiques.
Les critaires choisis sont : \begin{itemize}
Les critères choisis sont : \begin{itemize}
\item Le délai est le plus petit possible, pour avoir un système réactif,
\item il y a peu de retransmissions, pour ne pas encombrer le réseau et abuser des ressources énergétiques des capteurs,
\item il y a très peu d'échecs, c'est-à-dire de messages qui dépassent le nombre de retransmissions maximal,
\item le nombre de message envoyés est équitablement réparti entre les clients.
\item le nombre de messages envoyés est équitablement réparti entre les clients.
\end{itemize}
L'équité est une grandeur permettant de mesurer si certains capteurs utilisent plus le réseau que d'autres.
@ -703,12 +712,12 @@ Cela représente le fonctionnement normal du système.
Mais en plus de cela, il faut que l'on fasse s'optimiser la politique.
Pour cela on va procéder en deux temps : \begin{enumerate}
\item Le pré-entraînement,
\item le pré-entraînement,
\item l'entraînement en position.
\end{enumerate}
Le pré-entraînement se déroule avant le déploiment du réseau de capteurs.
Il consiste à rendre la politique proche de ce qui est attendu pour qu'elle soit exploitable, même si elle n'est pas encore optimale.
Pour cela, il faut généré de l'expérience (les transitions $\left( s_t, a_t, r_t, s_{t+1} \right)$ que on a vu plus haut), et l'utilisé pour optimisé la politique.
Pour cela, il faut générer de l'expérience (les transitions $\left( s_t, a_t, r_t, s_{t+1} \right)$ que l'on a vues plus haut), et l'utiliser pour optimiser la politique.
Cette génération peut se faire de plusieurs manières, que on évoquera plus tard.
Une fois que la politique est correcte, on peut la déployer sur le réseau de capteurs réels.
Mais elle n'est pas fixe, puisqu'on continue à l'optimiser avec de l'expérience récoltée sur le réseau réel.
@ -736,24 +745,24 @@ Il faut donc trouver des solutions plus rapides que l'exploration simple si on v
\subsubsection{Par exploration en simulateur}
Une solution simple, en théorie, est d'utiliser un simulateur.
Le plus utilisé est \ns{}.
C'est un simulateur à événements discrets, destiné à la simulation de réseau informatique permettant de travaillier sur toutes les couches du modèle \osi{}.
C'est un simulateur à événements discrets destiné à la simulation de réseaux informatiques permettant de travailler sur toutes les couches du modèle \osi{}.
Ainsi on peut entraîner le simulateur avec la topologie du réseau que l'on veut, et la qualité des connexions sans fil que l'on veut.
Malheureusment, c'est un simulateur complexe à utiliser : tous les scripts de simulation sont écrit en \cpp{}.
Malheureusment, c'est un simulateur complexe à utiliser : tous les scripts de simulation sont écrits en \cpp{}.
Par manque de temps et de compétence, les simulations sur \ns{} n'ont pas pu être réalisées, mais cela reste une piste à étudier pour le pré-entraînement.
\subsubsection{Par création artificielle de transitions\label{part:yaml}}
Une autre méthode possible est de créer des transitions artificiellement.
Une autre méthode est de créer des transitions artificiellement.
Pour cela, l'algorithme commence par fixer une charge sur le réseau $f$, c'est-à-dire la fréquence à laquelle chaque client interroge le capteur associé.
Selon cette charge, le réseau est plus ou moins congestionné.
Ensuite l'algorithme prend plusieurs consignes de \rto{} $c_n$, et pour chaque consigne, l'algorithme l'applique à l'agent et mesure le vecteur d'observation associé $s_n$ ainsi que $r_n$.
Puis pour chaque couple $(s_n, s_m)$, l'algorithme calcule l'action $a_{n , m}$ pour passer de $c_n$ à $c_m$.
L'algorithme peut ainsi construire une série de transitions $s_n, a_{n, m}, r_m, s_m$.
On recommence avec un autre $f$
On recommence avec un autre $f$.
Ces transitions sont uniquements des approximations car elles ne tiennent pas réellement compte des effets de $s_t$ sur $s_{t+1}$ liés au temps de propagation des messages dans le système.
De plus elles supposent que la charge ne change pas sur le système.
Malgré cela, elle permet d'aller plus vite dans la génération de transitions pour le pré-entraînement, car en $n$ intervalles de contrôle à $f$ fixe, on génère $n^2$ transitions.
Cela permet malgres tout d'aller plus vite dans la génération de transitions pour le pré-entraînement, car en $n$ intervalles de contrôle à $f$ fixe, on génère $n^2$ transitions.
\section{Implémentation de l'algorithme}
L'implémentation de l'algorithme est réalisée en Python.
@ -767,7 +776,7 @@ De plus, pour la partie apprentissage, on utilise \TF{}, un module répandu pour
\label{fig:imple:class}
\end{figure}
\subsection{Modules uilisés}
\subsection{Modules utilisés}
Les modules que nous utilisons ont leur propre interface et fonctionnement Internet, auxquels nous devont nous adapter.
\paragraph{\coapthon{}}, pour sa partie client, utilise deux objets (voir figure \ref{fig:imple:class}) : \begin{itemize}
@ -778,9 +787,9 @@ Les modules que nous utilisons ont leur propre interface et fonctionnement Inter
Il y a aussi une partie serveur, mais nous ne la modifions pas du tout.
C'est elle qui joue le rôle de serveur \coap{} sur les \rasp{}.
\paragraph{\TF{} et \keras{}} sont des modules \python{} fournissant les outils nécessaires à l'entraînement de modèles d'IA.
\paragraph{\TF{} et \keras{}}sont des modules \python{} fournissant les outils nécessaires à l'entraînement de modèles d'IA.
\TF{} s'occupe des fonctions hautes, avec les outils permettant de mettre en place la boucle d'apprentissage.
Pour cela, il a besoin que l'on mette l'environement sous un format spécial : l'interface \gym{}.
Pour cela, il a besoin que l'on mette l'environnement sous un format spécial : l'interface \gym{}.
Cette interface permet la standardisation des interfaces des environnements.
Pour cela, il faut définir une nouvelle classe, héritant de \code{tf_agents.environements.py_environement.PyEnvironement}, et surchargeant les attributs et méthodes suivantes :
\begin{enumerate}
@ -789,13 +798,13 @@ Pour cela, il faut définir une nouvelle classe, héritant de \code{tf_agents.en
\item \code{._reset()}, qui doit renvoyer un objet \code{tf_agents.trajectories.time_step.transition},
\item \code{._step(action)}, qui doit renvoyer un objet \code{tf_agents.trajectories.time_step.transition} ou \code{tf_agents.trajectories.time_step.termination}.
\end{enumerate}
Les deux premiers permettent de signaler à l'agent quelles valeurs sont autorisées.
Les deux premiers membres permettent de signaler à l'agent quelles valeurs sont autorisées.
Le troisième permet de remettre l'environnement dans un état initial.
Le quatrième est le plus important, car il représente le passage d'un pas de temps.
Les transitions sont les objets $\left( s_t, a_t, r_t, s_{t+1} \right)$.
\keras{} quant à lui, permet l'utilisation et la manipulation des réseaux de neurones.
Puisqu'on n'utilise que des réseaux simples, les fonctionalités du module ne seront pas abordées.
Puisqu'on n'utilise que des réseaux simples, les fonctionnalités du module ne seront pas abordées.
\subsection{Structure du code}
@ -822,7 +831,7 @@ On modifie aussi \code{client.CoAP.send_datagram._start_retransmission} pour que
On modifie finalement \code{client.CoAP.receive_datagram} pour enregistrer les réceptions de messages en fonction de leurs tokens.
Je définis plusieurs types de \code{SuperviseurLocal} : \begin{itemize}
\item \code{SuperviseurLocalPlaceHolder}, qui est utilisé par défaut et n'a aucune fonctionalité, et qui réutilise la génération de \rto{} de base dans \coapthon{},
\item \code{SuperviseurLocalPlaceHolder}, qui est utilisé par défaut et n'a aucune fonctionn alité, et qui réutilise la génération de \rto{} de base dans \coapthon{},
\item \code{SuperviseurLocal}, qui prend en charge l'enregistrement des \rto{}, la moyenne et le minimum, et qui est capable d'utiliser un \rto{} déterminé par l'IA,
\item \code{SuperviseurLocalFiltre}, qui prend aussi en charge le filtrage exponentiel pour générer $RTT_L$ et $RTT_S$.
\end{itemize}
@ -832,7 +841,7 @@ Elle réalise aussi le calcul des récompenses.
\subsubsection{Boucle d'apprentissage}
L'objet \code{Maquette} est celui qui intéragit avec l'agent IA.
La méthode la plus importante est \code{step(action)}, qui prend l'action déterminée par l'IA comme entrée, l'applique
La méthode la plus importante est \code{step(action)}, qui prend l'action déterminée par l'IA comme entrée, l'applique, attend la durée de l'intervalle de contrôle, puis renvoie l'état du système.
C'est donc cette méthode qui joue un rôle prédominant dans l'algorithme de la partie \ref{part:description_boucle}.
\begin{listing}[htp]
@ -880,7 +889,7 @@ while True:
Le code \ref{lst:collecteur} implémente le collecteur d'expérience.
Le collecteur est éxecuté dans un thread à part.
Le collecteur est ecuté dans un thread à part.
On lui donne comme paramètres une maquette sur laquelle travailler, et la politique \code{policy}.
Cette politique est déterminée par un autre thread.
Les transitions sont stockées dans le \code{replay_buffer}.
@ -939,21 +948,21 @@ Si on tentait de réduire le \rto{}, ces messages seraient retransmis alors qu'i
\begin{figure}[htp]
\centering
\includegraphics[width=0.7\textwidth]{png_img/n_client_saturation.png}
\caption[Evolution des grandeurs mesurées en fonction du nombre de requêtes simultanées]{Evolution des grandeurs mesurées en fonction du nombre de requêtes simultanées traitées par le serveur \coap{} tournant sur un \rasp{}. Le \CCA{} de \coap{} de base est utilisé.}
\caption[Évolution des grandeurs mesurées en fonction du nombre de requêtes simultanées]{Évolution des grandeurs mesurées en fonction du nombre de requêtes simultanées traitées par le serveur \coap{} tournant sur un \rasp{}. Le \CCA{} de \coap{} de base est utilisé.}
\label{fig:res:evo_grandeur}
\end{figure}
\begin{figure}[htp]
\centering
\includegraphics[width=0.7 \textwidth]{png_img/distri_rtt_distant.png}
\caption[Distribution du \rtt{} et évolution de $RTT_L$ et $RTT_S$ avec un seul client.]{Distribution du \rtt{} et évolution de $RTT_L$ et $RTT_S$ pendant un envoi de message sans délai entre la réception d'un message et l'envoi du suivant, avec un seul client et un serveur sur le \rasp{}. Même si on ne les distingue pas sur l'histogramme, il y a quelque valeurs de \rtt{} très élevées.}
\caption[Distribution du \rtt{} et évolution de $RTT_L$ et $RTT_S$ avec un seul client.]{Distribution du \rtt{} et évolution de $RTT_L$ et $RTT_S$ pendant un envoi de messages sans délai entre la réception d'un message et l'envoi du suivant, avec un seul client et un serveur sur le \rasp{}. Même si on ne les distingue pas sur l'histogramme, il y a quelque valeurs de \rtt{} très élevées.}
\label{fig:res:rtt_distant}
\end{figure}
\begin{figure}[htp]
\centering
\includegraphics[width=0.7 \textwidth]{png_img/varrtt_demo.png}
\caption[Evolution de $VARRTT$ lors d'un changement de charge du réseau.]{Evolution de $VARRTT$ lors d'un changement de charge du réseau au moment du $500$-ième message.}
\caption[Évolution de $VARRTT$ lors d'un changement de charge du réseau.]{Évolution de $VARRTT$ lors d'un changement de charge du réseau au moment du $500$-ième message.}
\label{fig:res:varrtt}
\end{figure}
@ -962,7 +971,7 @@ On place d'abord un unique client sur le réseau, et on regarde l'évolution de
Au $500$-ieme message, on active $20$ autres clients qui vont eux aussi envoyer des requêtes au serveur.
Dans la figure \ref{fig:res:varrtt}, on constate qu'il y a bien un pic au moment de l'augmentation de la charge du système, mais il y a aussi des pics dus au bruit dans la mesure du \rtt{}.
\subsection{Test d'apprentissage}
\subsection{Tests d'apprentissage}
Les tests de pré-apprentissage ont été réalisés avec : \begin{itemize}
\item des réseaux de $25$ capteurs, ce qui est un ordre de grandeur du nombre de capteurs dans le type de réseaux cibles,
@ -994,8 +1003,8 @@ La modélisation que nous proposons est une transposition de méthodes existante
L'apprentissage machine a déjà montré qu'il était capable de résoudre des problèmes liés aux réseaux et au \CC{}.
Nous avons proposé ici une nouvelle modélisation pour intégrer ces nouveaux outils à des problématiques de l'\iot{}.
On ne s'intéresse plus à une connexion seule mais à l'ensemble des connexions vers tout un réseau de capteurs.
On ne mesure que les \rtt{} de chaque message, ainsi que le nombre de retransmissions.
On construit ensuite une matrices qui représente l'état du réseau durant un intervalle de contrôle.
On ne mesure que le \rtt{} de chaque message, ainsi que le nombre de retransmissions.
On construit ensuite une matrice qui représente l'état du réseau durant un intervalle de contrôle.
Cette matrice est utilisée par un agent IA pour déterminer l'action à prendre.
Cette action est une liste de facteurs multiplicatifs à appliquer aux \rto{} de chaque capteur.
La difficulté est que l'on ne peut pas récupérer assez d'expérience pour réaliser un pré-entraînement.
@ -1005,7 +1014,7 @@ La solution de la partie \ref{part:yaml} n'a pas pu être testée.
Par manque de temps et de capacité, ledit simulateur n'a pas pu être réalisé.
Parmi les autres éléments à perfectionner, il y a les valeurs de pondération utilisées dans la fonction de récompense, qui sont pour l'instant arbitraires.
De même, l'agent est pour l'instant assez basique, on pourrait utiliser une structure de réseau de neurones plus complexe pour prendre en compte les particularités de la matrice d'état.
Le travail réalisé sera repris dans une thèse de \lss{}.
Le travail réalisé sera repris dans une thèse du \lss{}.
\clearpage
@ -1078,12 +1087,12 @@ Le travail réalisé sera repris dans une thèse de \lss{}.
\noindent\rule[2pt]{\textwidth}{0.5pt}\\
{\textbf{Abstract :}}
Congestion control the bottleneck of network throughput.
Since a few year, deep-learning is beeing used in congestion control algorithm.
We aim to applied deep-learning to congestion control and \coap{}, an embbeded system protocol.
The environement chosen is a whole network of sensor, this way the AI agent has access to every connection information.
The only input used are the \rtt{} and number of retransmission of every transaction.
Our protocol use a pre-traning phase in a \ns{}, then an inline traning to tune itself to the network.
Congestion control is the bottleneck of network throughput.
For a few years, deep-learning has beeing used in congestion control algorithms.
We aim to apply deep-learning to congestion control and \coap{}, an embbeded system protocol.
The environement chosen is a whole network of sensors, this way the AI agent has access to every connection information.
The only inputs used are the \rtt{} and number of retransmission of every transaction.
Our protocol uses a pre-training phase in a \ns{}, then an inline training to tune itself to the network.
The protocol was implemented in \python{} as a patch to \coapthon{}.
We tried to test the protocol on a physical system, a \rasp{}.

View file

@ -1,116 +0,0 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?><svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" contentScriptType="application/ecmascript" contentStyleType="text/css" height="1224px" preserveAspectRatio="none" style="width:1351px;height:1224px;background:#FFFFFF;" version="1.1" viewBox="0 0 1351 1224" width="1351px" zoomAndPan="magnify"><defs><filter height="300%" id="f16ihaszaea5jq" width="300%" x="-1" y="-1"><feGaussianBlur result="blurOut" stdDeviation="2.0"/><feColorMatrix in="blurOut" result="blurOut2" type="matrix" values="0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 .4 0"/><feOffset dx="4.0" dy="4.0" in="blurOut2" result="blurOut3"/><feBlend in="SourceGraphic" in2="blurOut3" mode="normal"/></filter></defs><g><!--MD5=[b9ab6c91daa042623ac722868ebc2597]
cluster global--><polygon fill="#FFFFFF" filter="url(#f16ihaszaea5jq)" points="16,148.5,115,148.5,122,170.7969,1217,170.7969,1217,1101.5,16,1101.5,16,148.5" style="stroke:#000000;stroke-width:1.5;"/><line style="stroke:#000000;stroke-width:1.5;" x1="16" x2="122" y1="170.7969" y2="170.7969"/><text fill="#000000" font-family="sans-serif" font-size="14" font-weight="bold" lengthAdjust="spacing" textLength="93" x="20" y="163.4951">Client CoAP</text><!--MD5=[9d8156834bfc9526c23a84bd8a4eb9f5]
cluster super--><rect fill="#FFFFFF" filter="url(#f16ihaszaea5jq)" height="538" style="stroke:#000000;stroke-width:1.5;" width="718" x="475" y="191.5"/><rect fill="#FFFFFF" height="10" style="stroke:#000000;stroke-width:1.5;" width="15" x="1173" y="196.5"/><rect fill="#FFFFFF" height="2" style="stroke:#000000;stroke-width:1.5;" width="4" x="1171" y="198.5"/><rect fill="#FFFFFF" height="2" style="stroke:#000000;stroke-width:1.5;" width="4" x="1171" y="202.5"/><text fill="#000000" font-family="sans-serif" font-size="14" font-style="italic" lengthAdjust="spacing" textLength="69" x="799.5" y="217.4951">«Thread»</text><text fill="#000000" font-family="sans-serif" font-size="14" font-weight="bold" lengthAdjust="spacing" textLength="95" x="786.5" y="233.792">Superviseur</text><!--MD5=[aa2f05b2676d7d34ffa7e771fb7634f3]
cluster client--><rect fill="#FFFFFF" filter="url(#f16ihaszaea5jq)" height="502" style="stroke:#000000;stroke-width:1.5;" width="382" x="61" y="567.5"/><rect fill="#FFFFFF" height="10" style="stroke:#000000;stroke-width:1.5;" width="15" x="423" y="572.5"/><rect fill="#FFFFFF" height="2" style="stroke:#000000;stroke-width:1.5;" width="4" x="421" y="574.5"/><rect fill="#FFFFFF" height="2" style="stroke:#000000;stroke-width:1.5;" width="4" x="421" y="578.5"/><text fill="#000000" font-family="sans-serif" font-size="14" font-style="italic" lengthAdjust="spacing" textLength="76" x="214" y="593.4951">«Threads»</text><text fill="#000000" font-family="sans-serif" font-size="14" font-weight="bold" lengthAdjust="spacing" textLength="62" x="221" y="609.792">Session</text><path d="M69,444.5 L69,469.6328 L185,469.6328 L185,454.5 L175,444.5 L69,444.5 " fill="#FBFB77" filter="url(#f16ihaszaea5jq)" style="stroke:#A80036;stroke-width:1.0;"/><path d="M175,444.5 L175,454.5 L185,454.5 L175,444.5 " fill="#FBFB77" style="stroke:#A80036;stroke-width:1.0;"/><text fill="#000000" font-family="sans-serif" font-size="13" lengthAdjust="spacing" textLength="95" x="75" y="461.5669">Un par capteur</text><!--MD5=[afa0aa9786e57ad2ec3dfc302e641c1c]
entity h_coap--><ellipse cx="765" cy="309" fill="#FEFECE" filter="url(#f16ihaszaea5jq)" rx="8" ry="8" style="stroke:#A80036;stroke-width:1.5;"/><text fill="#000000" font-family="sans-serif" font-size="14" lengthAdjust="spacing" textLength="108" x="711" y="338.9951">Interface CoAP</text><!--MD5=[32a3dbe902e7e3707910d23f943dda71]
entity h_stat--><ellipse cx="500" cy="309" fill="#FEFECE" filter="url(#f16ihaszaea5jq)" rx="8" ry="8" style="stroke:#A80036;stroke-width:1.5;"/><text fill="#000000" font-family="sans-serif" font-size="14" lengthAdjust="spacing" textLength="132" x="434" y="338.9951">Collecteur donnée</text><!--MD5=[0544887a6193e5bf5f374726bfa990c0]
entity main_super--><rect fill="#FEFECE" filter="url(#f16ihaszaea5jq)" height="78.8906" style="stroke:#A80036;stroke-width:1.5;" width="123" x="544.5" y="417.5"/><rect fill="#FEFECE" height="10" style="stroke:#A80036;stroke-width:1.5;" width="15" x="647.5" y="422.5"/><rect fill="#FEFECE" height="2" style="stroke:#A80036;stroke-width:1.5;" width="4" x="645.5" y="424.5"/><rect fill="#FEFECE" height="2" style="stroke:#A80036;stroke-width:1.5;" width="4" x="645.5" y="428.5"/><text fill="#000000" font-family="sans-serif" font-size="14" font-style="italic" lengthAdjust="spacing" textLength="54" x="574" y="450.4951">«main»</text><text fill="#000000" font-family="sans-serif" font-size="14" lengthAdjust="spacing" textLength="83" x="559.5" y="466.792">Gestionaire</text><text fill="#000000" font-family="sans-serif" font-size="14" lengthAdjust="spacing" textLength="44" x="559.5" y="483.0889">global</text><!--MD5=[299d1c4a2ba6184a4b2319b3d939ce68]
entity stat--><rect fill="#FEFECE" filter="url(#f16ihaszaea5jq)" height="46.2969" style="stroke:#A80036;stroke-width:1.5;" width="123" x="544.5" y="286"/><rect fill="#FEFECE" height="10" style="stroke:#A80036;stroke-width:1.5;" width="15" x="647.5" y="291"/><rect fill="#FEFECE" height="2" style="stroke:#A80036;stroke-width:1.5;" width="4" x="645.5" y="293"/><rect fill="#FEFECE" height="2" style="stroke:#A80036;stroke-width:1.5;" width="4" x="645.5" y="297"/><text fill="#000000" font-family="sans-serif" font-size="14" lengthAdjust="spacing" textLength="83" x="559.5" y="318.9951">Statisticien</text><!--MD5=[fade500c9f62cce835db878c83a60e51]
entity buff--><rect fill="#FEFECE" height="52.5938" style="stroke:none;stroke-width:1.5;" width="114" x="1048" y="282.5"/><path d="M1033,282.5 L1048,282.5 L1048,335.0938 L1162,335.0938 L1162,282.5 L1177,282.5 " fill="none" filter="url(#f16ihaszaea5jq)" style="stroke:#A80036;stroke-width:1.5;"/><text fill="#000000" font-family="sans-serif" font-size="14" lengthAdjust="spacing" textLength="45" x="1058" y="305.4951">buffer</text><text fill="#000000" font-family="sans-serif" font-size="14" lengthAdjust="spacing" textLength="94" x="1058" y="321.792">d'experience</text><!--MD5=[1baef995baf605750a18e6de17020cf1]
entity NN--><rect fill="#FEFECE" filter="url(#f16ihaszaea5jq)" height="46.2969" style="stroke:#A80036;stroke-width:1.5;" width="60" x="1074" y="667.5"/><rect fill="#FEFECE" height="10" style="stroke:#A80036;stroke-width:1.5;" width="15" x="1114" y="672.5"/><rect fill="#FEFECE" height="2" style="stroke:#A80036;stroke-width:1.5;" width="4" x="1112" y="674.5"/><rect fill="#FEFECE" height="2" style="stroke:#A80036;stroke-width:1.5;" width="4" x="1112" y="678.5"/><text fill="#000000" font-family="sans-serif" font-size="14" lengthAdjust="spacing" textLength="20" x="1089" y="700.4951">NN</text><!--MD5=[8e0cf92e53a407ca35d63255ba9bf9db]
entity optimiseur--><rect fill="#FEFECE" filter="url(#f16ihaszaea5jq)" height="46.2969" style="stroke:#A80036;stroke-width:1.5;" width="118" x="1045" y="434"/><rect fill="#FEFECE" height="10" style="stroke:#A80036;stroke-width:1.5;" width="15" x="1143" y="439"/><rect fill="#FEFECE" height="2" style="stroke:#A80036;stroke-width:1.5;" width="4" x="1141" y="441"/><rect fill="#FEFECE" height="2" style="stroke:#A80036;stroke-width:1.5;" width="4" x="1141" y="445"/><text fill="#000000" font-family="sans-serif" font-size="14" lengthAdjust="spacing" textLength="78" x="1060" y="466.9951">optimiseur</text><!--MD5=[00ccade4d2e9d34be0442221a6cff66c]
entity horloge--><rect fill="#FEFECE" filter="url(#f16ihaszaea5jq)" height="62.5938" style="stroke:#A80036;stroke-width:1.5;" width="136" x="862" y="277.5"/><rect fill="#FEFECE" height="10" style="stroke:#A80036;stroke-width:1.5;" width="15" x="978" y="282.5"/><rect fill="#FEFECE" height="2" style="stroke:#A80036;stroke-width:1.5;" width="4" x="976" y="284.5"/><rect fill="#FEFECE" height="2" style="stroke:#A80036;stroke-width:1.5;" width="4" x="976" y="288.5"/><text fill="#000000" font-family="sans-serif" font-size="14" font-style="italic" lengthAdjust="spacing" textLength="96" x="877" y="310.4951">«interuption»</text><text fill="#000000" font-family="sans-serif" font-size="14" lengthAdjust="spacing" textLength="55" x="897.5" y="326.792">horloge</text><!--MD5=[34b9dfdf6eee65fbbd1532cc0642e804]
entity s_udp--><ellipse cx="133" cy="1014" fill="#FEFECE" filter="url(#f16ihaszaea5jq)" rx="8" ry="8" style="stroke:#A80036;stroke-width:1.5;"/><text fill="#000000" font-family="sans-serif" font-size="14" lengthAdjust="spacing" textLength="84" x="91" y="1043.9951">Socket UDP</text><!--MD5=[a1e3d70e5da20b3e5a11dc250470e676]
entity h_session_message--><ellipse cx="358" cy="690.5" fill="#FEFECE" filter="url(#f16ihaszaea5jq)" rx="8" ry="8" style="stroke:#A80036;stroke-width:1.5;"/><text fill="#000000" font-family="sans-serif" font-size="14" lengthAdjust="spacing" textLength="106" x="305" y="720.4951">Session handle</text><!--MD5=[23de89f1cfa838dd70d864c6d1f1df45]
entity h_session_rto--><ellipse cx="235" cy="690.5" fill="#FEFECE" filter="url(#f16ihaszaea5jq)" rx="8" ry="8" style="stroke:#A80036;stroke-width:1.5;"/><text fill="#000000" font-family="sans-serif" font-size="14" lengthAdjust="spacing" textLength="30" x="220" y="720.4951">RTO</text><!--MD5=[8d209b981869ba51a2440fe93c6b67e7]
entity file_attente--><path d="M187.5,1001 L242.5,1001 C247.5,1001 247.5,1014.1484 247.5,1014.1484 C247.5,1014.1484 247.5,1027.2969 242.5,1027.2969 L187.5,1027.2969 C182.5,1027.2969 182.5,1014.1484 182.5,1014.1484 C182.5,1014.1484 182.5,1001 187.5,1001 " fill="#FEFECE" filter="url(#f16ihaszaea5jq)" style="stroke:#A80036;stroke-width:1.5;"/><path d="M242.5,1001 C237.5,1001 237.5,1014.1484 237.5,1014.1484 C237.5,1027.2969 242.5,1027.2969 242.5,1027.2969 " fill="none" style="stroke:#A80036;stroke-width:1.5;"/><text fill="#000000" font-family="sans-serif" font-size="14" lengthAdjust="spacing" textLength="45" x="187.5" y="1018.9951">Buffer</text><!--MD5=[a84a2f5a2d8e3077147b7b8a99f6a912]
entity main_sess--><rect fill="#FEFECE" filter="url(#f16ihaszaea5jq)" height="78.8906" style="stroke:#A80036;stroke-width:1.5;" width="130" x="170" y="796.5"/><rect fill="#FEFECE" height="10" style="stroke:#A80036;stroke-width:1.5;" width="15" x="280" y="801.5"/><rect fill="#FEFECE" height="2" style="stroke:#A80036;stroke-width:1.5;" width="4" x="278" y="803.5"/><rect fill="#FEFECE" height="2" style="stroke:#A80036;stroke-width:1.5;" width="4" x="278" y="807.5"/><text fill="#000000" font-family="sans-serif" font-size="14" font-style="italic" lengthAdjust="spacing" textLength="54" x="203" y="829.4951">«main»</text><text fill="#000000" font-family="sans-serif" font-size="14" lengthAdjust="spacing" textLength="83" x="185" y="845.792">Gestionaire</text><text fill="#000000" font-family="sans-serif" font-size="14" lengthAdjust="spacing" textLength="90" x="185" y="862.0889">de la session</text><!--MD5=[13dff29a2267c98a2d820d96b9b744fb]
entity timer--><rect fill="#FEFECE" filter="url(#f16ihaszaea5jq)" height="62.5938" style="stroke:#A80036;stroke-width:1.5;" width="136" x="283" y="982.5"/><rect fill="#FEFECE" height="10" style="stroke:#A80036;stroke-width:1.5;" width="15" x="399" y="987.5"/><rect fill="#FEFECE" height="2" style="stroke:#A80036;stroke-width:1.5;" width="4" x="397" y="989.5"/><rect fill="#FEFECE" height="2" style="stroke:#A80036;stroke-width:1.5;" width="4" x="397" y="993.5"/><text fill="#000000" font-family="sans-serif" font-size="14" font-style="italic" lengthAdjust="spacing" textLength="96" x="298" y="1015.4951">«interuption»</text><text fill="#000000" font-family="sans-serif" font-size="14" lengthAdjust="spacing" textLength="40" x="326" y="1031.792">timer</text><!--MD5=[778fdad4168e1c9e2d13c8a5e427c42e]
entity usr--><ellipse cx="710" cy="14" fill="#FEFECE" filter="url(#f16ihaszaea5jq)" rx="8" ry="8" style="stroke:#A80036;stroke-width:1.5;"/><path d="M710,22 L710,49 M697,30 L723,30 M710,49 L697,64 M710,49 L723,64 " fill="none" filter="url(#f16ihaszaea5jq)" style="stroke:#A80036;stroke-width:1.5;"/><text fill="#000000" font-family="sans-serif" font-size="14" lengthAdjust="spacing" textLength="73" x="673.5" y="82.4951">Utilisateur</text><!--MD5=[7468467f3b6b392f1d176d828c753b77]
entity db--><path d="M782,24 C782,14 820,14 820,14 C820,14 858,14 858,24 L858,65.5938 C858,75.5938 820,75.5938 820,75.5938 C820,75.5938 782,75.5938 782,65.5938 L782,24 " fill="#FEFECE" filter="url(#f16ihaszaea5jq)" style="stroke:#000000;stroke-width:1.5;"/><path d="M782,24 C782,34 820,34 820,34 C820,34 858,34 858,24 " fill="none" style="stroke:#000000;stroke-width:1.5;"/><text fill="#000000" font-family="sans-serif" font-size="14" lengthAdjust="spacing" textLength="56" x="792" y="50.9951">Base de</text><text fill="#000000" font-family="sans-serif" font-size="14" lengthAdjust="spacing" textLength="54" x="792" y="67.292">donnée</text><!--MD5=[c610bd6632b8a77f1f1b3723a00c362f]
entity udp--><polygon fill="#FEFECE" filter="url(#f16ihaszaea5jq)" points="105.5,1164.5,105.5,1217.0938,160.5,1217.0938,160.5,1174.5,150.5,1164.5,105.5,1164.5" style="stroke:#000000;stroke-width:1.5;"/><path d="M150.5,1164.5 L150.5,1174.5 L160.5,1174.5 " fill="#FEFECE" style="stroke:#000000;stroke-width:1.5;"/><text fill="#000000" font-family="sans-serif" font-size="14" font-style="italic" lengthAdjust="spacing" textLength="35" x="115.5" y="1187.4951">«lib»</text><text fill="#000000" font-family="sans-serif" font-size="14" lengthAdjust="spacing" textLength="29" x="118.5" y="1203.792">UDP</text><!--MD5=[00f9e30d6ead67871b5f4dcdb52564e0]
entity tf--><polygon fill="#FEFECE" filter="url(#f16ihaszaea5jq)" points="1233.5,664,1233.5,716.5938,1334.5,716.5938,1334.5,674,1324.5,664,1233.5,664" style="stroke:#000000;stroke-width:1.5;"/><path d="M1324.5,664 L1324.5,674 L1334.5,674 " fill="#FEFECE" style="stroke:#000000;stroke-width:1.5;"/><text fill="#000000" font-family="sans-serif" font-size="14" font-style="italic" lengthAdjust="spacing" textLength="35" x="1266.5" y="686.9951">«lib»</text><text fill="#000000" font-family="sans-serif" font-size="14" lengthAdjust="spacing" textLength="81" x="1243.5" y="703.292">TensorFlow</text><!--MD5=[1c8f5b81a31bcb335baf7fc7f30eecf0]
entity keras--><polygon fill="#FEFECE" filter="url(#f16ihaszaea5jq)" points="1233,809.5,1233,862.0938,1293,862.0938,1293,819.5,1283,809.5,1233,809.5" style="stroke:#000000;stroke-width:1.5;"/><path d="M1283,809.5 L1283,819.5 L1293,819.5 " fill="#FEFECE" style="stroke:#000000;stroke-width:1.5;"/><text fill="#000000" font-family="sans-serif" font-size="14" font-style="italic" lengthAdjust="spacing" textLength="35" x="1245.5" y="832.4951">«lib»</text><text fill="#000000" font-family="sans-serif" font-size="14" lengthAdjust="spacing" textLength="40" x="1243" y="848.792">Keras</text><!--MD5=[44d1b863b7cf48b60c60df6e4197ceba]
link h_coap to main_super--><path d="M755.996,318.268 C735.631,336.968 684.939,383.515 648.11,417.333 " fill="none" id="h_coap-main_super" style="stroke:#A80036;stroke-width:1.0;"/><!--MD5=[c3a97ac6bd5938361921b1a80d181d45]
link buff to optimiseur--><path d="M1104.82,335.766 C1104.64,361.86 1104.37,402.064 1104.19,428.696 " fill="none" id="buff-to-optimiseur" style="stroke:#A80036;stroke-width:1.0;"/><polygon fill="#A80036" points="1104.15,433.833,1108.2116,424.8606,1104.1843,428.8331,1100.2118,424.8058,1104.15,433.833" style="stroke:#A80036;stroke-width:1.0;"/><text fill="#000000" font-family="sans-serif" font-size="13" lengthAdjust="spacing" textLength="71" x="1105" y="383.5669">expérience</text><!--MD5=[8dc40196e7be32b7499da14a3a158fab]
link optimiseur to NN--><path d="M1104,480.197 C1104,522.804 1104,615.924 1104,662.23 " fill="none" id="optimiseur-to-NN" style="stroke:#A80036;stroke-width:1.0;"/><polygon fill="#A80036" points="1104,667.37,1108,658.37,1104,662.37,1100,658.37,1104,667.37" style="stroke:#A80036;stroke-width:1.0;"/><text fill="#000000" font-family="sans-serif" font-size="13" lengthAdjust="spacing" textLength="66" x="1105" y="539.5669">met à jour</text><!--MD5=[00e0e56bb8942f7d045b72b28410dcb8]
link horloge to optimiseur--><path d="M966.476,340.606 C998.33,367.334 1044.01,405.666 1073.84,430.694 " fill="none" id="horloge-to-optimiseur" style="stroke:#A80036;stroke-width:1.0;"/><polygon fill="#A80036" points="1077.76,433.983,1073.4358,425.1342,1073.9295,430.7695,1068.2942,431.2631,1077.76,433.983" style="stroke:#A80036;stroke-width:1.0;"/><text fill="#000000" font-family="sans-serif" font-size="13" lengthAdjust="spacing" textLength="65" x="1023" y="383.5669">déclanche</text><!--MD5=[0a9c8fbc5e6be315dc2579d6523c8be8]
link h_stat to stat--><path d="M509.109,309 C520.842,309 532.575,309 544.308,309 " fill="none" id="h_stat-stat" style="stroke:#A80036;stroke-width:1.0;"/><!--MD5=[2a53bd9146470a4be8de7aed6b5e91cc]
link stat to buff--><path d="M611.258,285.928 C620.128,253.062 641.521,193.93 685,168.5 C748.491,131.36 951.558,133.04 1016,168.5 C1057.95,191.59 1082.9,243.726 1095.27,277.587 " fill="none" id="stat-to-buff" style="stroke:#A80036;stroke-width:1.0;"/><polygon fill="#A80036" points="1097,282.445,1097.7441,272.6243,1095.3203,277.7356,1090.209,275.3118,1097,282.445" style="stroke:#A80036;stroke-width:1.0;"/><text fill="#000000" font-family="sans-serif" font-size="13" lengthAdjust="spacing" textLength="47" x="741.5" y="128.5669">remplis</text><!--MD5=[6a54ee8702427f98472c00275752958b]
link h_session_message to main_sess--><path d="M351.035,699.626 C335.382,717.888 296.571,763.167 268.129,796.35 " fill="none" id="h_session_message-main_sess" style="stroke:#A80036;stroke-width:1.0;"/><!--MD5=[2d05a6350c3effd7dbed848763bf8dc3]
link h_session_rto to main_sess--><path d="M235,699.626 C235,717.888 235,763.167 235,796.35 " fill="none" id="h_session_rto-main_sess" style="stroke:#A80036;stroke-width:1.0;"/><!--MD5=[74528d00b0bff99990fc7889a8a0826b]
link main_sess to s_udp--><path d="M169.78,863.04 C152.081,873.469 135.048,887.405 125,905.5 C108.164,935.817 119.892,978.566 127.654,999.867 " fill="none" id="main_sess-to-s_udp" style="stroke:#A80036;stroke-width:1.0;"/><polygon fill="#A80036" points="129.522,1004.8,130.074,994.9666,127.7506,1000.1243,122.5929,997.8009,129.522,1004.8" style="stroke:#A80036;stroke-width:1.0;"/><text fill="#000000" font-family="sans-serif" font-size="13" lengthAdjust="spacing" textLength="43" x="126" y="926.0669">packet</text><text fill="#000000" font-family="sans-serif" font-size="13" lengthAdjust="spacing" textLength="24" x="135.5" y="941.1997">udp</text><!--MD5=[4fe7736ffa86495e5c2d9f1f23a257e1]
reverse link main_sess to s_udp--><path d="M213.626,880.167 C202.39,902.14 188.059,929.086 174,952.5 C162.374,971.863 147.093,993.548 138.861,1004.966 " fill="none" id="main_sess-backto-s_udp" style="stroke:#A80036;stroke-width:1.0;"/><polygon fill="#A80036" points="215.976,875.556,208.3264,881.7595,213.7063,880.0112,215.4546,885.391,215.976,875.556" style="stroke:#A80036;stroke-width:1.0;"/><text fill="#000000" font-family="sans-serif" font-size="13" lengthAdjust="spacing" textLength="74" x="202" y="918.5669">aquitement</text><text fill="#000000" font-family="sans-serif" font-size="13" lengthAdjust="spacing" textLength="10" x="234" y="933.6997">&amp;</text><text fill="#000000" font-family="sans-serif" font-size="13" lengthAdjust="spacing" textLength="52" x="213" y="948.8325">réponse</text><!--MD5=[4dc824d22c09885eb383f3198762067a]
link main_sess to file_attente--><path d="M273.47,875.866 C280.246,884.915 286.305,894.997 290,905.5 C296.932,925.205 299.011,933.654 290,952.5 C284.341,964.336 257.464,984.378 237.492,998.129 " fill="none" id="main_sess-to-file_attente" style="stroke:#A80036;stroke-width:1.0;stroke-dasharray:7.0,7.0;"/><polygon fill="#A80036" points="233.345,1000.962,243.0322,999.1849,237.4727,998.1402,238.5174,992.5807,233.345,1000.962" style="stroke:#A80036;stroke-width:1.0;"/><text fill="#000000" font-family="sans-serif" font-size="13" lengthAdjust="spacing" textLength="23" x="298" y="933.5669">use</text><!--MD5=[6e782e06c0d2e17c0f5dc02bf57560f0]
link main_sess to timer--><path d="M300.421,873.953 C311.745,882.96 322.325,893.513 330,905.5 C343.574,926.701 348.725,954.723 350.535,976.842 " fill="none" id="main_sess-to-timer" style="stroke:#A80036;stroke-width:1.0;stroke-dasharray:7.0,7.0;"/><polygon fill="#A80036" points="350.908,982.041,354.2549,972.7783,350.5509,977.0538,346.2753,973.3497,350.908,982.041" style="stroke:#A80036;stroke-width:1.0;"/><text fill="#000000" font-family="sans-serif" font-size="13" lengthAdjust="spacing" textLength="23" x="348" y="933.5669">use</text><!--MD5=[7ce8e2bcdca09a44590c89891d28fe3f]
link main_super to h_session_message--><path d="M545.243,496.709 C522.263,512.522 496.489,531.731 475,551.5 C431.989,591.068 389.694,646.017 369.795,673.088 " fill="none" id="main_super-to-h_session_message" style="stroke:#A80036;stroke-width:1.0;"/><path d="M372.3756,683.9168 A9,9 0 0 0 358.6985 673.9651" style="stroke:#A80036;stroke-width:1.5;fill:none;"/><!--MD5=[ef2e0f79354206e0cc2b9607dccfbee3]
link NN to h_session_rto--><path d="M1073.98,678.515 C945.413,627.995 441.44,438.471 302.333,514.833 C246.288,545.599 236.584,632.025 235.12,671.002 " fill="none" id="NN-to-h_session_rto" style="stroke:#A80036;stroke-width:1.0;"/><path d="M243.4117,678.5711 A9,9 0 0 0 226.5015 678.1941" style="stroke:#A80036;stroke-width:1.5;fill:none;"/><!--MD5=[e7d46baa1e450a057fba51bfb34eb936]
link main_sess to h_stat--><path d="M169.629,817.568 C128.973,803.11 79.5398,778.179 53,737.5 C35.8582,711.226 11.1533,451.311 38,417.5 C94.8622,345.888 400.744,317.623 480.809,311.39 " fill="none" id="main_sess-to-h_stat" style="stroke:#A80036;stroke-width:1.0;"/><path d="M487.222,302.426 A9,9 0 0 0 488.493 319.2926" style="stroke:#A80036;stroke-width:1.5;fill:none;"/><!--MD5=[6d15f5afd906b4a05315f45878a919c1]
link GMN1269701 to client--><path d="M118.575,469.68 C106.818,486.708 85.9312,519.783 77,551.5 C75.9755,555.1383 75.0467,558.8512 74.2059,562.6158 C73.9957,563.557 73.7909,564.5014 73.5916,565.4486 C73.4919,565.9223 73.3936,566.3966 73.2966,566.8716 " fill="none" id="GMN1269701-client" style="stroke:#A80036;stroke-width:1.0;stroke-dasharray:7.0,7.0;"/><!--MD5=[be411837912adfb435f6f18d03088f30]
link usr to h_coap--><path d="M718.294,85.51 C730.389,143.12 752.385,247.905 761.198,289.89 " fill="none" id="usr-to-h_coap" style="stroke:#A80036;stroke-width:1.0;"/><path d="M770.9166,295.0192 A9,9 0 0 0 754.3628 298.4938" style="stroke:#A80036;stroke-width:1.5;fill:none;"/><!--MD5=[030ca119770c76539f4bb2f11fd02f62]
link db to h_coap--><path d="M813.691,76.05 C802.166,130.95 778.042,245.872 768.755,290.111 " fill="none" id="db-to-h_coap" style="stroke:#A80036;stroke-width:1.0;"/><path d="M775.5952,298.696 A9,9 0 0 0 759.0416 295.221" style="stroke:#A80036;stroke-width:1.5;fill:none;"/><!--MD5=[98669b2e2b94e771ebe6a5424a2eb69f]
link buff to tf--><path d="M1148.85,335.624 C1162.03,345.139 1175.49,356.961 1185,370.5 C1249.53,462.407 1273.08,597.81 1280.73,658.309 " fill="none" id="buff-to-tf" style="stroke:#A80036;stroke-width:1.0;stroke-dasharray:7.0,7.0;"/><polygon fill="#A80036" points="1281.38,663.579,1284.2482,654.157,1280.7679,658.6166,1276.3083,655.1364,1281.38,663.579" style="stroke:#A80036;stroke-width:1.0;"/><text fill="#000000" font-family="sans-serif" font-size="13" lengthAdjust="spacing" textLength="23" x="1245" y="461.5669">use</text><!--MD5=[4d8c7b75c91428342e9b727caf112eb9]
link optimiseur to tf--><path d="M1132.06,480.142 C1147.2,492.826 1165.65,509.555 1180,526.5 C1216.12,569.16 1249.26,625.291 1268,659.317 " fill="none" id="optimiseur-to-tf" style="stroke:#A80036;stroke-width:1.0;stroke-dasharray:7.0,7.0;"/><polygon fill="#A80036" points="1270.44,663.763,1269.6236,653.948,1268.0375,659.378,1262.6076,657.792,1270.44,663.763" style="stroke:#A80036;stroke-width:1.0;"/><text fill="#000000" font-family="sans-serif" font-size="13" lengthAdjust="spacing" textLength="23" x="1194" y="539.5669">use</text><!--MD5=[414b4abe29706d3b1d235c982f330774]
link NN to keras--><path d="M1128.5,713.607 C1155.92,738.362 1200.48,778.579 1230.73,805.878 " fill="none" id="NN-to-keras" style="stroke:#A80036;stroke-width:1.0;stroke-dasharray:7.0,7.0;"/><polygon fill="#A80036" points="1234.72,809.475,1230.7287,800.4711,1231.0119,806.1209,1225.3622,806.4041,1234.72,809.475" style="stroke:#A80036;stroke-width:1.0;"/><text fill="#000000" font-family="sans-serif" font-size="13" lengthAdjust="spacing" textLength="23" x="1184" y="762.5669">use</text><!--MD5=[74d8804e3d4c7fb6dc3d2e83290e718e]
link s_udp to udp--><path d="M133,1023.441 C133,1047.601 133,1117.9266 133,1159.0631 " fill="none" id="s_udp-to-udp" style="stroke:#A80036;stroke-width:1.0;stroke-dasharray:7.0,7.0;"/><polygon fill="#A80036" points="133,1164.1752,137,1155.1752,133,1159.1752,129,1155.1752,133,1164.1752" style="stroke:#A80036;stroke-width:1.0;"/><text fill="#000000" font-family="sans-serif" font-size="13" lengthAdjust="spacing" textLength="23" x="134" y="1130.5669">use</text><!--MD5=[572256f3a60bec37f8387ca93c52b5ac]
@startuml
:Utilisateur: as usr
database "Base de\ndonnée" as db
file "UDP" <<lib>> as udp
file "TensorFlow" <<lib>> as tf
file "Keras" <<lib>> as keras
package "Client CoAP" as global {
component "Superviseur" as super <<Thread>>{
() "Interface CoAP" as h_coap
() "Collecteur donnée" as h_stat
component "Gestionaire\nglobal" <<main>> as main_super
component "Statisticien" as stat
stack "buffer\nd'experience" as buff
[NN]
[optimiseur]
[horloge] <<interuption>>
h_coap - - main_super
buff - -> optimiseur : expérience
optimiseur - -> NN : met à jour
horloge - -> optimiseur : déclanche
h_stat - stat
stat -> buff : remplis
}
component "Session" as client <<Threads>> {
() "Socket UDP" as s_udp
() "Session handle" as h_session_message
() "RTO" as h_session_rto
queue "Buffer" as file_attente
[Gestionaire\nde la session] <<main>> as main_sess
[timer] <<interuption>> as timer
h_session_message - - main_sess
h_session_rto - - main_sess
main_sess - -> s_udp : packet\nudp
main_sess ..> file_attente : use
main_sess <- - s_udp : aquitement\n&\nréponse
main_sess ..> timer : use
}
main_super - -( h_session_message
NN - -( h_session_rto
main_sess - -( h_stat
note top of client
Un par capteur
end note
}
usr - -( h_coap
db - -( h_coap
buff ..> tf : use
optimiseur ..> tf : use
NN ..> keras : use
s_udp ..> udp : use
@enduml
PlantUML version 1.2021.7(Sun May 23 12:40:07 UTC 2021)
(GPL source distribution)
Java Runtime: Java(TM) SE Runtime Environment
JVM: Java HotSpot(TM) 64-Bit Server VM
Default Encoding: UTF-8
Language: en
Country: US
--></g></svg>

Before

Width:  |  Height:  |  Size: 26 KiB