<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="fr">
	<id>https://wiki-se.plil.fr/mediawiki/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=Gthomas</id>
	<title>wiki-se.plil.fr - Contributions [fr]</title>
	<link rel="self" type="application/atom+xml" href="https://wiki-se.plil.fr/mediawiki/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=Gthomas"/>
	<link rel="alternate" type="text/html" href="https://wiki-se.plil.fr/mediawiki/index.php/Sp%C3%A9cial:Contributions/Gthomas"/>
	<updated>2026-05-15T05:13:38Z</updated>
	<subtitle>Contributions</subtitle>
	<generator>MediaWiki 1.39.1</generator>
	<entry>
		<id>https://wiki-se.plil.fr/mediawiki/index.php?title=RodenburgThomas&amp;diff=4761</id>
		<title>RodenburgThomas</title>
		<link rel="alternate" type="text/html" href="https://wiki-se.plil.fr/mediawiki/index.php?title=RodenburgThomas&amp;diff=4761"/>
		<updated>2024-01-28T13:46:36Z</updated>

		<summary type="html">&lt;p&gt;Gthomas : /* Résultats */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;=Le binôme=&lt;br /&gt;
&lt;br /&gt;
Le binôme est constitué de 2 élèves de SE5-SC :&lt;br /&gt;
* Dann RODENBURG&lt;br /&gt;
* Gabriel THOMAS&lt;br /&gt;
=Objectifs= &lt;br /&gt;
&lt;br /&gt;
Le but de ce TP est de créer un réseau de systèmes communicants en partant d'un capteur XNucléo 53L5A1 pour finir sur une machine virtuelle Xen.&lt;br /&gt;
La particularité est d'intégrer une composante de Machine Learning  &lt;br /&gt;
&lt;br /&gt;
[[Fichier:Capture d'écran 2023-12-19 151237.png|néant|vignette|800x800px]]&lt;br /&gt;
&lt;br /&gt;
=Edge Computing and Embedded AI=&lt;br /&gt;
&lt;br /&gt;
===Machine virtuelle===&lt;br /&gt;
====Création====&lt;br /&gt;
Création d'une machine virtuelle '''gabidann''' sur le serveur chassiron :&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;xen-create-image --hostname=gabidann --force --dist=bookworm --size=10G --memory=10G --dir=/usr/local/xen --password=glopglop --dhcp --bridge=bridgeStudents&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
La machine virtuelle est à présent connectée au WiFi.&lt;br /&gt;
&lt;br /&gt;
Après cela, nous avons configuré la machine virtuelle selon l'énoncé du TP en faisant un xen console gabidann. Nous avons ensuite participé à la mise en place du point d'accès WiFi.&lt;br /&gt;
&lt;br /&gt;
====Serveur TCP====&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
import socket&lt;br /&gt;
import subprocess&lt;br /&gt;
&lt;br /&gt;
def write_csv(filename, data):&lt;br /&gt;
	if data == &amp;quot;,&amp;quot;:&lt;br /&gt;
		return		# avoid to put single commas in csv file&lt;br /&gt;
	f = open(filename, &amp;quot;a&amp;quot;)&lt;br /&gt;
	f.write(data + &amp;quot;\n&amp;quot;)&lt;br /&gt;
	f.close()&lt;br /&gt;
&lt;br /&gt;
def process_data(data):&lt;br /&gt;
	if data == &amp;quot;,&amp;quot;:&lt;br /&gt;
		return&lt;br /&gt;
	&lt;br /&gt;
	formatted_data = data.replace(',', ' ')&lt;br /&gt;
&lt;br /&gt;
	cmd = f'emulators/NanoEdgeAI_Class_Emulator neai_classification --knowledge_path emulators/knowledge.dat --array &amp;quot;{formatted_data}&amp;quot;'&lt;br /&gt;
	signal = str(subprocess.check_output(cmd.split(&amp;quot; &amp;quot;)))	&lt;br /&gt;
	write_csv(&amp;quot;signal.csv&amp;quot;, signal)&lt;br /&gt;
&lt;br /&gt;
	if &amp;quot;dann&amp;quot; in signal:&lt;br /&gt;
		print(&amp;quot;dann&amp;quot;)&lt;br /&gt;
	elif &amp;quot;gaby&amp;quot; in signal:&lt;br /&gt;
		print(&amp;quot;gaby&amp;quot;)&lt;br /&gt;
	else:&lt;br /&gt;
		print(&amp;quot;Unknown face&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
def handle_connection(conn, filename):&lt;br /&gt;
	while True:&lt;br /&gt;
		try:&lt;br /&gt;
			msg = conn.recv(1024)&lt;br /&gt;
			msg = msg.decode('utf-8')&lt;br /&gt;
		except KeyboardInterrupt:&lt;br /&gt;
			exit()&lt;br /&gt;
		if not msg:&lt;br /&gt;
			print(&amp;quot;Cannot receive message from Raspberry client !&amp;quot;)&lt;br /&gt;
			break&lt;br /&gt;
		else:&lt;br /&gt;
			process_data(msg)&lt;br /&gt;
	print(&amp;quot;Closing Raspberry client connection...&amp;quot;)&lt;br /&gt;
	conn.close()&lt;br /&gt;
&lt;br /&gt;
filename = 'data.csv'&lt;br /&gt;
server_ipv6 = '2001:660:4401:6050:216:3eff:fe98:11ff'&lt;br /&gt;
port = 9999&lt;br /&gt;
&lt;br /&gt;
s = socket.socket(socket.AF_INET6, socket.SOCK_STREAM)&lt;br /&gt;
s.bind((server_ipv6, port))&lt;br /&gt;
s.listen(1)&lt;br /&gt;
print(&amp;quot;Listening on port &amp;quot; + str(port))&lt;br /&gt;
&lt;br /&gt;
while True:&lt;br /&gt;
	try:&lt;br /&gt;
		conn,addr = s.accept()&lt;br /&gt;
	except KeyboardInterrupt:&lt;br /&gt;
		exit()&lt;br /&gt;
	with conn:&lt;br /&gt;
		print(f&amp;quot;New connection from {addr[0]}&amp;quot;)&lt;br /&gt;
		handle_connection(conn, filename)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====Serveur HTTP====&lt;br /&gt;
Configuration d'un serveur HTTP sur la machine virtuelle gabidann :&amp;lt;syntaxhighlight lang=&amp;quot;python3&amp;quot;&amp;gt;&lt;br /&gt;
import socket&lt;br /&gt;
from http.server import HTTPServer, SimpleHTTPRequestHandler&lt;br /&gt;
&lt;br /&gt;
class MyHandler(SimpleHTTPRequestHandler):&lt;br /&gt;
  def do_GET(self):&lt;br /&gt;
    if self.path == '/ip':&lt;br /&gt;
      self.send_response(200)&lt;br /&gt;
      self.send_header('Content-type', 'text/html')&lt;br /&gt;
      self.end_headers()&lt;br /&gt;
      self.wfile.write(f'Your IP address is {self.client_address[0]}'.encode())&lt;br /&gt;
      return&lt;br /&gt;
    else:&lt;br /&gt;
      return SimpleHTTPRequestHandler.do_GET(self)&lt;br /&gt;
&lt;br /&gt;
class HTTPServerV6(HTTPServer):&lt;br /&gt;
  address_family = socket.AF_INET6&lt;br /&gt;
&lt;br /&gt;
def main():&lt;br /&gt;
  server = HTTPServerV6(('::', 8080), MyHandler)&lt;br /&gt;
  server.serve_forever()&lt;br /&gt;
&lt;br /&gt;
if __name__ == '__main__':&lt;br /&gt;
  main()&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Pour se connecter au serveur depuis un navigateur, on peut ouvrir un navigateur depuis la zabeth et y accéder avec l'adresse : ''[&amp;lt;ipv6_VM&amp;gt;]:&amp;lt;port&amp;gt;''. Dans notre cas, le serveur écoute le port '''8080'''.&lt;br /&gt;
&lt;br /&gt;
La page index.html s'affiche par défaut lorsque l'on se connecte au serveur HTTP :&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;html&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;!DOCTYPE html&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;html lang=&amp;quot;fr&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;head&amp;gt;&lt;br /&gt;
	&amp;lt;meta charset=&amp;quot;UTF-8&amp;quot;&amp;gt;&lt;br /&gt;
	&amp;lt;title&amp;gt;Gabidann&amp;lt;/title&amp;gt;&lt;br /&gt;
&amp;lt;/head&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;body&amp;gt;&lt;br /&gt;
	&amp;lt;h1&amp;gt;Bienvenue sur Gabidann !&amp;lt;h1&amp;gt;&lt;br /&gt;
	&amp;lt;div id=&amp;quot;data&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/body&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/html&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;Nous avons également testé la communication en TCP avec l'utilitaire socat&lt;br /&gt;
&lt;br /&gt;
Nous avons créé un serveur python en TCP. Nous pouvons maintenant envoyer des messages du client ( raspberry ) au serveur (VM Xen). Nous nous servirons de cette architecture pour envoyer les données du Nucleo à la Vm Xen &lt;br /&gt;
&lt;br /&gt;
Une fois le modèle entrainé et les tests concluants, on peut déployer notre modèle sur n'importe quel appareils linux ou windows. Pour cela, on va dans l'onglet deployment et on télécharge notre librairie personnalisée.  &lt;br /&gt;
&lt;br /&gt;
===Raspberry===&lt;br /&gt;
D'un autre côté, nous avons branché la Raspberry Pi à l'ordinateur selon le pinout fourni dans la documentation.&lt;br /&gt;
&lt;br /&gt;
[[Fichier:20231218 085218.jpg|vignette|néant]]&lt;br /&gt;
&lt;br /&gt;
Enfin, nous avons activé la communication UART de la Raspberry Pi afin de pouvoir communiquer avec. En fin de séance, nous étions en train de vérifier que la Raspberry Pi répondait bien, même en ayant ajouté la ligne enable_uart=1 dans le fichier config.txt de la Raspberry.&lt;br /&gt;
&lt;br /&gt;
====Configuration de la Raspberry====&lt;br /&gt;
Nous avons résolu le problème de la Raspberry qui ne répondait pas. Cela était dû à l'alimentation : brancher la carte en USBC résoud le problème. Cependant, nous recevons une erreur l'erreur EXT4-fs error (device mmcblk0p2).&lt;br /&gt;
Le problème venait des arguments saisis lors du lancement de Minicom. Avec la commande suivante, il est à présent possible de se connecter sur la Raspberry : &amp;lt;code&amp;gt;minicom -D /dev/ttyUSB0 -b 115200&amp;lt;/code&amp;gt;&lt;br /&gt;
Dans la Raspberry, nous avons configuré une interface réseau wlan0 pour se connecter à WiFi_IE_1 :&lt;br /&gt;
    auto wlan0&lt;br /&gt;
    iface wlan0 inet dhcp&lt;br /&gt;
    wpa-conf /etc/wpa_supplicant/wpa_supplicant.conf&lt;br /&gt;
A présent à partir de la Raspberry, on peut ping la machine virtuelle sur chassiron avec son IPv6.&lt;br /&gt;
&lt;br /&gt;
====Client TCP====&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
import serial&lt;br /&gt;
import socket&lt;br /&gt;
&lt;br /&gt;
server_ipv6 = '2001:660:4401:6050:216:3eff:fe98:11ff'&lt;br /&gt;
server_port = 9999&lt;br /&gt;
&lt;br /&gt;
nucleo_baudrate = 460800&lt;br /&gt;
nucleo_port = '/dev/ttyACM0'&lt;br /&gt;
&lt;br /&gt;
def read_serial(ser):&lt;br /&gt;
        try:&lt;br /&gt;
                serial_data = ser.readline().decode('utf-8').strip()&lt;br /&gt;
                return serial_data&lt;br /&gt;
        except KeyboardInterrupt:&lt;br /&gt;
                ser.close()&lt;br /&gt;
                return None&lt;br /&gt;
&lt;br /&gt;
client = socket.socket(socket.AF_INET6, socket.SOCK_STREAM)&lt;br /&gt;
&lt;br /&gt;
ser = serial.Serial(port=nucleo_port, baudrate=nucleo_baudrate)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Configuration du capteur de distance===&lt;br /&gt;
Un programme était déjà présent sur le capteur. On a téléchargé le logiciel STM32CubeIDE pour pouvoir éditer du code et le téléverser sur le capteur. Nous avons testé de téléverser un programme d'exemple dont voici le résultat :&lt;br /&gt;
[[Fichier:Screenshot 2023-12-18 13-12-19.jpg|vignette|néant|700x700px]]&lt;br /&gt;
&lt;br /&gt;
Nous avons modifié ce programme afin d'effectuer un formatage des données transmises par le capteur sous le format ''&amp;lt;distance&amp;gt;,'' pour chaque valeur. Grâce à ce formatage, il est à présent possible d'utiliser les données reçues par le logiciel NanoEdgeStudio AI pour la partie Machine Learning.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Pour recevoir les valeurs de manière exploitable, il faut modifier le code Exemple dans le logiciel STM Cube IDE&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Capture d'écran 2023-12-20 084719.png|néant|vignette|800x800px]]&lt;br /&gt;
&lt;br /&gt;
L'objectif est d'obtenir une liste séparée par des virgules, il a donc fallu supprimer les espaces et les barres verticales de la fonction d'affichage ainsi que les statuts de chacun des capteurs :&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
static void print_result(RANGING_SENSOR_Result_t *Result)&lt;br /&gt;
{&lt;br /&gt;
  int8_t j;&lt;br /&gt;
  int8_t k;&lt;br /&gt;
  int8_t l;&lt;br /&gt;
  uint8_t zones_per_line;&lt;br /&gt;
  zones_per_line = ((Profile.RangingProfile == RS_PROFILE_8x8_AUTONOMOUS) ||&lt;br /&gt;
         (Profile.RangingProfile == RS_PROFILE_8x8_CONTINUOUS)) ? 8 : 4;&lt;br /&gt;
  for (j = 0; j &amp;lt; Result-&amp;gt;NumberOfZones; j += zones_per_line)&lt;br /&gt;
  {&lt;br /&gt;
    for (l = 0; l &amp;lt; RANGING_SENSOR_NB_TARGET_PER_ZONE; l++)&lt;br /&gt;
    {&lt;br /&gt;
      /* Print distance and status */&lt;br /&gt;
      for (k = (zones_per_line - 1); k &amp;gt;= 0; k--)&lt;br /&gt;
      {&lt;br /&gt;
        if (Result-&amp;gt;ZoneResult[j+k].NumberOfTargets &amp;gt; 0)&lt;br /&gt;
          printf(&amp;quot;%ld,&amp;quot;,(long)Result-&amp;gt;ZoneResult[j+k].Distance[l]);&lt;br /&gt;
      }&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
  printf(&amp;quot;\n&amp;quot;);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Emulation avec NanoEdgeStudio AI===&lt;br /&gt;
&lt;br /&gt;
On passe ensuite sur Nano Edge Studio pour définir les signaux dans l'onglet &amp;quot;Signals&amp;quot; et entraîner le modèle dans l'onglet &amp;quot;Benchmark&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Capture d'écran 2023-12-18 172047.png|néant|vignette|800x800px]]&lt;br /&gt;
&lt;br /&gt;
Une fois le modèle entraîné, on peut le tester avec l'onglet &amp;quot;Emulator&amp;quot; &lt;br /&gt;
&lt;br /&gt;
[[Fichier:Capture d'écran 2023-12-18 173255.png|néant|vignette|800x800px]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Dans un premier temps, nous avons essayé d'entraîner le programme à reconnaître les chiffres 1, 2, 3, 4 et 5 sur les doigts d'une main. Les résultats n'étaient pas concluant, il semblerait que le capteur détecte avant tout le volume de la main à la place de détecter le nombre de doigts.&lt;br /&gt;
&lt;br /&gt;
Nous avons ensuite choisi de faire un détecteur de visages capable de faire la différence entre Gabriel et Dann. L'émulation donne des résultats très satisfaisant proche de 100% de réussite&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
On peut lui passer un fichier CSV contenant les données brutes du capteur et grâce au fichier knowledge.dat, l'émulateur est capable de faire la différence entre les situations&amp;lt;syntaxhighlight lang=&amp;quot;bat&amp;quot;&amp;gt;&lt;br /&gt;
PS C:\Users\gabyt\Documents\Gaby\emulators&amp;gt; .\NanoEdgeAI_Class_Emulator.exe neai_classification --knowledge_path .\knowledge.dat --file .\data.csv&lt;br /&gt;
{&lt;br /&gt;
        &amp;quot;status&amp;quot;: &amp;quot;classification&amp;quot;,&lt;br /&gt;
        &amp;quot;lib_id&amp;quot;: &amp;quot;6582b12625c3e0368b2c2a09&amp;quot;,&lt;br /&gt;
        &amp;quot;input&amp;quot;: &amp;quot;.\data.csv&amp;quot;,&lt;br /&gt;
        &amp;quot;results&amp;quot;: [&lt;br /&gt;
                {&amp;quot;signal&amp;quot;: 1, &amp;quot;line&amp;quot;: 1, &amp;quot;class_status&amp;quot;: 2, &amp;quot;class_name&amp;quot;: &amp;quot;dann&amp;quot;, &amp;quot;class_proba&amp;quot;: [0.01, 0.99]},&lt;br /&gt;
                {&amp;quot;signal&amp;quot;: 2, &amp;quot;line&amp;quot;: 2, &amp;quot;class_status&amp;quot;: 2, &amp;quot;class_name&amp;quot;: &amp;quot;dann&amp;quot;, &amp;quot;class_proba&amp;quot;: [0.01, 0.99]},&lt;br /&gt;
                {&amp;quot;signal&amp;quot;: 3, &amp;quot;line&amp;quot;: 3, &amp;quot;class_status&amp;quot;: 2, &amp;quot;class_name&amp;quot;: &amp;quot;dann&amp;quot;, &amp;quot;class_proba&amp;quot;: [0.37, 0.63]},&lt;br /&gt;
                {&amp;quot;signal&amp;quot;: 4, &amp;quot;line&amp;quot;: 4, &amp;quot;class_status&amp;quot;: 1, &amp;quot;class_name&amp;quot;: &amp;quot;dann&amp;quot;, &amp;quot;class_proba&amp;quot;: [0.83, 0.17]},&lt;br /&gt;
                {&amp;quot;signal&amp;quot;: 5, &amp;quot;line&amp;quot;: 5, &amp;quot;class_status&amp;quot;: 1, &amp;quot;class_name&amp;quot;: &amp;quot;dann&amp;quot;, &amp;quot;class_proba&amp;quot;: [0.63, 0.37]},&lt;br /&gt;
                {&amp;quot;signal&amp;quot;: 6, &amp;quot;line&amp;quot;: 6, &amp;quot;class_status&amp;quot;: 1, &amp;quot;class_name&amp;quot;: &amp;quot;dann&amp;quot;, &amp;quot;class_proba&amp;quot;: [0.63, 0.37]},&lt;br /&gt;
                {&amp;quot;signal&amp;quot;: 7, &amp;quot;line&amp;quot;: 7, &amp;quot;class_status&amp;quot;: 1, &amp;quot;class_name&amp;quot;: &amp;quot;dann&amp;quot;, &amp;quot;class_proba&amp;quot;: [0.50, 0.50]},&lt;br /&gt;
                {&amp;quot;signal&amp;quot;: 8, &amp;quot;line&amp;quot;: 8, &amp;quot;class_status&amp;quot;: 1, &amp;quot;class_name&amp;quot;: &amp;quot;dann&amp;quot;, &amp;quot;class_proba&amp;quot;: [0.63, 0.37]},&lt;br /&gt;
                {&amp;quot;signal&amp;quot;: 9, &amp;quot;line&amp;quot;: 9, &amp;quot;class_status&amp;quot;: 2, &amp;quot;class_name&amp;quot;: &amp;quot;dann&amp;quot;, &amp;quot;class_proba&amp;quot;: [0.37, 0.63]},&lt;br /&gt;
                {&amp;quot;signal&amp;quot;: 10, &amp;quot;line&amp;quot;: 10, &amp;quot;class_status&amp;quot;: 2, &amp;quot;class_name&amp;quot;: &amp;quot;dann&amp;quot;, &amp;quot;class_proba&amp;quot;: [0.17, 0.83]},&lt;br /&gt;
                {&amp;quot;signal&amp;quot;: 11, &amp;quot;line&amp;quot;: 11, &amp;quot;class_status&amp;quot;: 1, &amp;quot;class_name&amp;quot;: &amp;quot;dann&amp;quot;, &amp;quot;class_proba&amp;quot;: [0.63, 0.37]},&lt;br /&gt;
                {&amp;quot;signal&amp;quot;: 12, &amp;quot;line&amp;quot;: 12, &amp;quot;class_status&amp;quot;: 1, &amp;quot;class_name&amp;quot;: &amp;quot;gaby&amp;quot;, &amp;quot;class_proba&amp;quot;: [0.63, 0.37]},&lt;br /&gt;
                {&amp;quot;signal&amp;quot;: 13, &amp;quot;line&amp;quot;: 13, &amp;quot;class_status&amp;quot;: 2, &amp;quot;class_name&amp;quot;: &amp;quot;gaby&amp;quot;, &amp;quot;class_proba&amp;quot;: [0.37, 0.63]},&lt;br /&gt;
                {&amp;quot;signal&amp;quot;: 14, &amp;quot;line&amp;quot;: 14, &amp;quot;class_status&amp;quot;: 1, &amp;quot;class_name&amp;quot;: &amp;quot;gaby&amp;quot;, &amp;quot;class_proba&amp;quot;: [0.74, 0.26]},&lt;br /&gt;
                {&amp;quot;signal&amp;quot;: 15, &amp;quot;line&amp;quot;: 15, &amp;quot;class_status&amp;quot;: 1, &amp;quot;class_name&amp;quot;: &amp;quot;gaby&amp;quot;, &amp;quot;class_proba&amp;quot;: [0.63, 0.37]},&lt;br /&gt;
                {&amp;quot;signal&amp;quot;: 16, &amp;quot;line&amp;quot;: 16, &amp;quot;class_status&amp;quot;: 1, &amp;quot;class_name&amp;quot;: &amp;quot;gaby&amp;quot;, &amp;quot;class_proba&amp;quot;: [0.74, 0.26]},&lt;br /&gt;
                {&amp;quot;signal&amp;quot;: 17, &amp;quot;line&amp;quot;: 17, &amp;quot;class_status&amp;quot;: 1, &amp;quot;class_name&amp;quot;: &amp;quot;gaby&amp;quot;, &amp;quot;class_proba&amp;quot;: [0.63, 0.37]},&lt;br /&gt;
                {&amp;quot;signal&amp;quot;: 18, &amp;quot;line&amp;quot;: 18, &amp;quot;class_status&amp;quot;: 1, &amp;quot;class_name&amp;quot;: &amp;quot;gaby&amp;quot;, &amp;quot;class_proba&amp;quot;: [0.63, 0.37]},&lt;br /&gt;
                {&amp;quot;signal&amp;quot;: 19, &amp;quot;line&amp;quot;: 19, &amp;quot;class_status&amp;quot;: 2, &amp;quot;class_name&amp;quot;: &amp;quot;dann&amp;quot;, &amp;quot;class_proba&amp;quot;: [0.37, 0.63]},&lt;br /&gt;
                {&amp;quot;signal&amp;quot;: 20, &amp;quot;line&amp;quot;: 20, &amp;quot;class_status&amp;quot;: 1, &amp;quot;class_name&amp;quot;: &amp;quot;gaby&amp;quot;, &amp;quot;class_proba&amp;quot;: [0.63, 0.37]},&lt;br /&gt;
                {&amp;quot;signal&amp;quot;: 21, &amp;quot;line&amp;quot;: 21, &amp;quot;class_status&amp;quot;: 2, &amp;quot;class_name&amp;quot;: &amp;quot;dann&amp;quot;, &amp;quot;class_proba&amp;quot;: [0.11, 0.89]},&lt;br /&gt;
                {&amp;quot;signal&amp;quot;: 22, &amp;quot;line&amp;quot;: 22, &amp;quot;class_status&amp;quot;: 1, &amp;quot;class_name&amp;quot;: &amp;quot;gaby&amp;quot;, &amp;quot;class_proba&amp;quot;: [0.74, 0.26]},&lt;br /&gt;
                {&amp;quot;signal&amp;quot;: 23, &amp;quot;line&amp;quot;: 23, &amp;quot;class_status&amp;quot;: 1, &amp;quot;class_name&amp;quot;: &amp;quot;gaby&amp;quot;, &amp;quot;class_proba&amp;quot;: [0.63, 0.37]},&lt;br /&gt;
                {&amp;quot;signal&amp;quot;: 24, &amp;quot;line&amp;quot;: 24, &amp;quot;class_status&amp;quot;: 1, &amp;quot;class_name&amp;quot;: &amp;quot;gaby&amp;quot;, &amp;quot;class_proba&amp;quot;: [0.74, 0.26]},&lt;br /&gt;
                {&amp;quot;signal&amp;quot;: 25, &amp;quot;line&amp;quot;: 25, &amp;quot;class_status&amp;quot;: 1, &amp;quot;class_name&amp;quot;: &amp;quot;gaby&amp;quot;, &amp;quot;class_proba&amp;quot;: [0.50, 0.50]},&lt;br /&gt;
                {&amp;quot;signal&amp;quot;: 26, &amp;quot;line&amp;quot;: 26, &amp;quot;class_status&amp;quot;: 2, &amp;quot;class_name&amp;quot;: &amp;quot;gaby&amp;quot;, &amp;quot;class_proba&amp;quot;: [0.06, 0.94]},&lt;br /&gt;
                {&amp;quot;signal&amp;quot;: 27, &amp;quot;line&amp;quot;: 27, &amp;quot;class_status&amp;quot;: 2, &amp;quot;class_name&amp;quot;: &amp;quot;gaby&amp;quot;, &amp;quot;class_proba&amp;quot;: [0.37, 0.63]},&lt;br /&gt;
                {&amp;quot;signal&amp;quot;: 28, &amp;quot;line&amp;quot;: 28, &amp;quot;class_status&amp;quot;: 1, &amp;quot;class_name&amp;quot;: &amp;quot;gaby&amp;quot;, &amp;quot;class_proba&amp;quot;: [0.63, 0.37]},&lt;br /&gt;
                {&amp;quot;signal&amp;quot;: 29, &amp;quot;line&amp;quot;: 29, &amp;quot;class_status&amp;quot;: 1, &amp;quot;class_name&amp;quot;: &amp;quot;gaby&amp;quot;, &amp;quot;class_proba&amp;quot;: [0.63, 0.37]}&lt;br /&gt;
        ],&lt;br /&gt;
        &amp;quot;classification_summary&amp;quot;: {&amp;quot;signals&amp;quot;: 29, &amp;quot;classified&amp;quot;: [13, 16], &amp;quot;unclassified&amp;quot;: 0}&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=Utilisation=&lt;br /&gt;
&lt;br /&gt;
Vérifier que la Raspberry est branchée à l'ordinateur et vérifier le Nucleo est bien connecté à la Raspberry et vérifier que la machine virtuelle gabidann est bien lancée.&lt;br /&gt;
&lt;br /&gt;
Lancer dans un premier temps le serveur TCP sur la machine virtuelle gabidann. Lancer ensuite le client TCP sur la Raspberry.&lt;br /&gt;
&lt;br /&gt;
Les résultats seront affichés dans le terminal de la machine virtuelle.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=Résultats=&lt;br /&gt;
[[Fichier:Vidéo de présentation du modèle.mp4|sans_cadre]]&lt;br /&gt;
[[Fichier:Gabidann results.jpg|néant|vignette|800px]]&lt;br /&gt;
[[Fichier:Gabidann results2.jpg|néant|vignette|800px]]&lt;br /&gt;
[[Fichier:Resultatdann.png|gauche|sans_cadre|600x600px]]&lt;br /&gt;
[[Fichier:Resultatgaby.png|gauche|sans_cadre|600x600px]]&lt;br /&gt;
[[Fichier:Resultatpersonne.png|gauche|sans_cadre|600x600px]]&lt;/div&gt;</summary>
		<author><name>Gthomas</name></author>
	</entry>
	<entry>
		<id>https://wiki-se.plil.fr/mediawiki/index.php?title=RodenburgThomas&amp;diff=4760</id>
		<title>RodenburgThomas</title>
		<link rel="alternate" type="text/html" href="https://wiki-se.plil.fr/mediawiki/index.php?title=RodenburgThomas&amp;diff=4760"/>
		<updated>2024-01-28T13:45:56Z</updated>

		<summary type="html">&lt;p&gt;Gthomas : /* Résultats */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;=Le binôme=&lt;br /&gt;
&lt;br /&gt;
Le binôme est constitué de 2 élèves de SE5-SC :&lt;br /&gt;
* Dann RODENBURG&lt;br /&gt;
* Gabriel THOMAS&lt;br /&gt;
=Objectifs= &lt;br /&gt;
&lt;br /&gt;
Le but de ce TP est de créer un réseau de systèmes communicants en partant d'un capteur XNucléo 53L5A1 pour finir sur une machine virtuelle Xen.&lt;br /&gt;
La particularité est d'intégrer une composante de Machine Learning  &lt;br /&gt;
&lt;br /&gt;
[[Fichier:Capture d'écran 2023-12-19 151237.png|néant|vignette|800x800px]]&lt;br /&gt;
&lt;br /&gt;
=Edge Computing and Embedded AI=&lt;br /&gt;
&lt;br /&gt;
===Machine virtuelle===&lt;br /&gt;
====Création====&lt;br /&gt;
Création d'une machine virtuelle '''gabidann''' sur le serveur chassiron :&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;xen-create-image --hostname=gabidann --force --dist=bookworm --size=10G --memory=10G --dir=/usr/local/xen --password=glopglop --dhcp --bridge=bridgeStudents&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
La machine virtuelle est à présent connectée au WiFi.&lt;br /&gt;
&lt;br /&gt;
Après cela, nous avons configuré la machine virtuelle selon l'énoncé du TP en faisant un xen console gabidann. Nous avons ensuite participé à la mise en place du point d'accès WiFi.&lt;br /&gt;
&lt;br /&gt;
====Serveur TCP====&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
import socket&lt;br /&gt;
import subprocess&lt;br /&gt;
&lt;br /&gt;
def write_csv(filename, data):&lt;br /&gt;
	if data == &amp;quot;,&amp;quot;:&lt;br /&gt;
		return		# avoid to put single commas in csv file&lt;br /&gt;
	f = open(filename, &amp;quot;a&amp;quot;)&lt;br /&gt;
	f.write(data + &amp;quot;\n&amp;quot;)&lt;br /&gt;
	f.close()&lt;br /&gt;
&lt;br /&gt;
def process_data(data):&lt;br /&gt;
	if data == &amp;quot;,&amp;quot;:&lt;br /&gt;
		return&lt;br /&gt;
	&lt;br /&gt;
	formatted_data = data.replace(',', ' ')&lt;br /&gt;
&lt;br /&gt;
	cmd = f'emulators/NanoEdgeAI_Class_Emulator neai_classification --knowledge_path emulators/knowledge.dat --array &amp;quot;{formatted_data}&amp;quot;'&lt;br /&gt;
	signal = str(subprocess.check_output(cmd.split(&amp;quot; &amp;quot;)))	&lt;br /&gt;
	write_csv(&amp;quot;signal.csv&amp;quot;, signal)&lt;br /&gt;
&lt;br /&gt;
	if &amp;quot;dann&amp;quot; in signal:&lt;br /&gt;
		print(&amp;quot;dann&amp;quot;)&lt;br /&gt;
	elif &amp;quot;gaby&amp;quot; in signal:&lt;br /&gt;
		print(&amp;quot;gaby&amp;quot;)&lt;br /&gt;
	else:&lt;br /&gt;
		print(&amp;quot;Unknown face&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
def handle_connection(conn, filename):&lt;br /&gt;
	while True:&lt;br /&gt;
		try:&lt;br /&gt;
			msg = conn.recv(1024)&lt;br /&gt;
			msg = msg.decode('utf-8')&lt;br /&gt;
		except KeyboardInterrupt:&lt;br /&gt;
			exit()&lt;br /&gt;
		if not msg:&lt;br /&gt;
			print(&amp;quot;Cannot receive message from Raspberry client !&amp;quot;)&lt;br /&gt;
			break&lt;br /&gt;
		else:&lt;br /&gt;
			process_data(msg)&lt;br /&gt;
	print(&amp;quot;Closing Raspberry client connection...&amp;quot;)&lt;br /&gt;
	conn.close()&lt;br /&gt;
&lt;br /&gt;
filename = 'data.csv'&lt;br /&gt;
server_ipv6 = '2001:660:4401:6050:216:3eff:fe98:11ff'&lt;br /&gt;
port = 9999&lt;br /&gt;
&lt;br /&gt;
s = socket.socket(socket.AF_INET6, socket.SOCK_STREAM)&lt;br /&gt;
s.bind((server_ipv6, port))&lt;br /&gt;
s.listen(1)&lt;br /&gt;
print(&amp;quot;Listening on port &amp;quot; + str(port))&lt;br /&gt;
&lt;br /&gt;
while True:&lt;br /&gt;
	try:&lt;br /&gt;
		conn,addr = s.accept()&lt;br /&gt;
	except KeyboardInterrupt:&lt;br /&gt;
		exit()&lt;br /&gt;
	with conn:&lt;br /&gt;
		print(f&amp;quot;New connection from {addr[0]}&amp;quot;)&lt;br /&gt;
		handle_connection(conn, filename)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====Serveur HTTP====&lt;br /&gt;
Configuration d'un serveur HTTP sur la machine virtuelle gabidann :&amp;lt;syntaxhighlight lang=&amp;quot;python3&amp;quot;&amp;gt;&lt;br /&gt;
import socket&lt;br /&gt;
from http.server import HTTPServer, SimpleHTTPRequestHandler&lt;br /&gt;
&lt;br /&gt;
class MyHandler(SimpleHTTPRequestHandler):&lt;br /&gt;
  def do_GET(self):&lt;br /&gt;
    if self.path == '/ip':&lt;br /&gt;
      self.send_response(200)&lt;br /&gt;
      self.send_header('Content-type', 'text/html')&lt;br /&gt;
      self.end_headers()&lt;br /&gt;
      self.wfile.write(f'Your IP address is {self.client_address[0]}'.encode())&lt;br /&gt;
      return&lt;br /&gt;
    else:&lt;br /&gt;
      return SimpleHTTPRequestHandler.do_GET(self)&lt;br /&gt;
&lt;br /&gt;
class HTTPServerV6(HTTPServer):&lt;br /&gt;
  address_family = socket.AF_INET6&lt;br /&gt;
&lt;br /&gt;
def main():&lt;br /&gt;
  server = HTTPServerV6(('::', 8080), MyHandler)&lt;br /&gt;
  server.serve_forever()&lt;br /&gt;
&lt;br /&gt;
if __name__ == '__main__':&lt;br /&gt;
  main()&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Pour se connecter au serveur depuis un navigateur, on peut ouvrir un navigateur depuis la zabeth et y accéder avec l'adresse : ''[&amp;lt;ipv6_VM&amp;gt;]:&amp;lt;port&amp;gt;''. Dans notre cas, le serveur écoute le port '''8080'''.&lt;br /&gt;
&lt;br /&gt;
La page index.html s'affiche par défaut lorsque l'on se connecte au serveur HTTP :&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;html&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;!DOCTYPE html&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;html lang=&amp;quot;fr&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;head&amp;gt;&lt;br /&gt;
	&amp;lt;meta charset=&amp;quot;UTF-8&amp;quot;&amp;gt;&lt;br /&gt;
	&amp;lt;title&amp;gt;Gabidann&amp;lt;/title&amp;gt;&lt;br /&gt;
&amp;lt;/head&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;body&amp;gt;&lt;br /&gt;
	&amp;lt;h1&amp;gt;Bienvenue sur Gabidann !&amp;lt;h1&amp;gt;&lt;br /&gt;
	&amp;lt;div id=&amp;quot;data&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/body&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/html&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;Nous avons également testé la communication en TCP avec l'utilitaire socat&lt;br /&gt;
&lt;br /&gt;
Nous avons créé un serveur python en TCP. Nous pouvons maintenant envoyer des messages du client ( raspberry ) au serveur (VM Xen). Nous nous servirons de cette architecture pour envoyer les données du Nucleo à la Vm Xen &lt;br /&gt;
&lt;br /&gt;
Une fois le modèle entrainé et les tests concluants, on peut déployer notre modèle sur n'importe quel appareils linux ou windows. Pour cela, on va dans l'onglet deployment et on télécharge notre librairie personnalisée.  &lt;br /&gt;
&lt;br /&gt;
===Raspberry===&lt;br /&gt;
D'un autre côté, nous avons branché la Raspberry Pi à l'ordinateur selon le pinout fourni dans la documentation.&lt;br /&gt;
&lt;br /&gt;
[[Fichier:20231218 085218.jpg|vignette|néant]]&lt;br /&gt;
&lt;br /&gt;
Enfin, nous avons activé la communication UART de la Raspberry Pi afin de pouvoir communiquer avec. En fin de séance, nous étions en train de vérifier que la Raspberry Pi répondait bien, même en ayant ajouté la ligne enable_uart=1 dans le fichier config.txt de la Raspberry.&lt;br /&gt;
&lt;br /&gt;
====Configuration de la Raspberry====&lt;br /&gt;
Nous avons résolu le problème de la Raspberry qui ne répondait pas. Cela était dû à l'alimentation : brancher la carte en USBC résoud le problème. Cependant, nous recevons une erreur l'erreur EXT4-fs error (device mmcblk0p2).&lt;br /&gt;
Le problème venait des arguments saisis lors du lancement de Minicom. Avec la commande suivante, il est à présent possible de se connecter sur la Raspberry : &amp;lt;code&amp;gt;minicom -D /dev/ttyUSB0 -b 115200&amp;lt;/code&amp;gt;&lt;br /&gt;
Dans la Raspberry, nous avons configuré une interface réseau wlan0 pour se connecter à WiFi_IE_1 :&lt;br /&gt;
    auto wlan0&lt;br /&gt;
    iface wlan0 inet dhcp&lt;br /&gt;
    wpa-conf /etc/wpa_supplicant/wpa_supplicant.conf&lt;br /&gt;
A présent à partir de la Raspberry, on peut ping la machine virtuelle sur chassiron avec son IPv6.&lt;br /&gt;
&lt;br /&gt;
====Client TCP====&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
import serial&lt;br /&gt;
import socket&lt;br /&gt;
&lt;br /&gt;
server_ipv6 = '2001:660:4401:6050:216:3eff:fe98:11ff'&lt;br /&gt;
server_port = 9999&lt;br /&gt;
&lt;br /&gt;
nucleo_baudrate = 460800&lt;br /&gt;
nucleo_port = '/dev/ttyACM0'&lt;br /&gt;
&lt;br /&gt;
def read_serial(ser):&lt;br /&gt;
        try:&lt;br /&gt;
                serial_data = ser.readline().decode('utf-8').strip()&lt;br /&gt;
                return serial_data&lt;br /&gt;
        except KeyboardInterrupt:&lt;br /&gt;
                ser.close()&lt;br /&gt;
                return None&lt;br /&gt;
&lt;br /&gt;
client = socket.socket(socket.AF_INET6, socket.SOCK_STREAM)&lt;br /&gt;
&lt;br /&gt;
ser = serial.Serial(port=nucleo_port, baudrate=nucleo_baudrate)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Configuration du capteur de distance===&lt;br /&gt;
Un programme était déjà présent sur le capteur. On a téléchargé le logiciel STM32CubeIDE pour pouvoir éditer du code et le téléverser sur le capteur. Nous avons testé de téléverser un programme d'exemple dont voici le résultat :&lt;br /&gt;
[[Fichier:Screenshot 2023-12-18 13-12-19.jpg|vignette|néant|700x700px]]&lt;br /&gt;
&lt;br /&gt;
Nous avons modifié ce programme afin d'effectuer un formatage des données transmises par le capteur sous le format ''&amp;lt;distance&amp;gt;,'' pour chaque valeur. Grâce à ce formatage, il est à présent possible d'utiliser les données reçues par le logiciel NanoEdgeStudio AI pour la partie Machine Learning.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Pour recevoir les valeurs de manière exploitable, il faut modifier le code Exemple dans le logiciel STM Cube IDE&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Capture d'écran 2023-12-20 084719.png|néant|vignette|800x800px]]&lt;br /&gt;
&lt;br /&gt;
L'objectif est d'obtenir une liste séparée par des virgules, il a donc fallu supprimer les espaces et les barres verticales de la fonction d'affichage ainsi que les statuts de chacun des capteurs :&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
static void print_result(RANGING_SENSOR_Result_t *Result)&lt;br /&gt;
{&lt;br /&gt;
  int8_t j;&lt;br /&gt;
  int8_t k;&lt;br /&gt;
  int8_t l;&lt;br /&gt;
  uint8_t zones_per_line;&lt;br /&gt;
  zones_per_line = ((Profile.RangingProfile == RS_PROFILE_8x8_AUTONOMOUS) ||&lt;br /&gt;
         (Profile.RangingProfile == RS_PROFILE_8x8_CONTINUOUS)) ? 8 : 4;&lt;br /&gt;
  for (j = 0; j &amp;lt; Result-&amp;gt;NumberOfZones; j += zones_per_line)&lt;br /&gt;
  {&lt;br /&gt;
    for (l = 0; l &amp;lt; RANGING_SENSOR_NB_TARGET_PER_ZONE; l++)&lt;br /&gt;
    {&lt;br /&gt;
      /* Print distance and status */&lt;br /&gt;
      for (k = (zones_per_line - 1); k &amp;gt;= 0; k--)&lt;br /&gt;
      {&lt;br /&gt;
        if (Result-&amp;gt;ZoneResult[j+k].NumberOfTargets &amp;gt; 0)&lt;br /&gt;
          printf(&amp;quot;%ld,&amp;quot;,(long)Result-&amp;gt;ZoneResult[j+k].Distance[l]);&lt;br /&gt;
      }&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
  printf(&amp;quot;\n&amp;quot;);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Emulation avec NanoEdgeStudio AI===&lt;br /&gt;
&lt;br /&gt;
On passe ensuite sur Nano Edge Studio pour définir les signaux dans l'onglet &amp;quot;Signals&amp;quot; et entraîner le modèle dans l'onglet &amp;quot;Benchmark&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Capture d'écran 2023-12-18 172047.png|néant|vignette|800x800px]]&lt;br /&gt;
&lt;br /&gt;
Une fois le modèle entraîné, on peut le tester avec l'onglet &amp;quot;Emulator&amp;quot; &lt;br /&gt;
&lt;br /&gt;
[[Fichier:Capture d'écran 2023-12-18 173255.png|néant|vignette|800x800px]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Dans un premier temps, nous avons essayé d'entraîner le programme à reconnaître les chiffres 1, 2, 3, 4 et 5 sur les doigts d'une main. Les résultats n'étaient pas concluant, il semblerait que le capteur détecte avant tout le volume de la main à la place de détecter le nombre de doigts.&lt;br /&gt;
&lt;br /&gt;
Nous avons ensuite choisi de faire un détecteur de visages capable de faire la différence entre Gabriel et Dann. L'émulation donne des résultats très satisfaisant proche de 100% de réussite&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
On peut lui passer un fichier CSV contenant les données brutes du capteur et grâce au fichier knowledge.dat, l'émulateur est capable de faire la différence entre les situations&amp;lt;syntaxhighlight lang=&amp;quot;bat&amp;quot;&amp;gt;&lt;br /&gt;
PS C:\Users\gabyt\Documents\Gaby\emulators&amp;gt; .\NanoEdgeAI_Class_Emulator.exe neai_classification --knowledge_path .\knowledge.dat --file .\data.csv&lt;br /&gt;
{&lt;br /&gt;
        &amp;quot;status&amp;quot;: &amp;quot;classification&amp;quot;,&lt;br /&gt;
        &amp;quot;lib_id&amp;quot;: &amp;quot;6582b12625c3e0368b2c2a09&amp;quot;,&lt;br /&gt;
        &amp;quot;input&amp;quot;: &amp;quot;.\data.csv&amp;quot;,&lt;br /&gt;
        &amp;quot;results&amp;quot;: [&lt;br /&gt;
                {&amp;quot;signal&amp;quot;: 1, &amp;quot;line&amp;quot;: 1, &amp;quot;class_status&amp;quot;: 2, &amp;quot;class_name&amp;quot;: &amp;quot;dann&amp;quot;, &amp;quot;class_proba&amp;quot;: [0.01, 0.99]},&lt;br /&gt;
                {&amp;quot;signal&amp;quot;: 2, &amp;quot;line&amp;quot;: 2, &amp;quot;class_status&amp;quot;: 2, &amp;quot;class_name&amp;quot;: &amp;quot;dann&amp;quot;, &amp;quot;class_proba&amp;quot;: [0.01, 0.99]},&lt;br /&gt;
                {&amp;quot;signal&amp;quot;: 3, &amp;quot;line&amp;quot;: 3, &amp;quot;class_status&amp;quot;: 2, &amp;quot;class_name&amp;quot;: &amp;quot;dann&amp;quot;, &amp;quot;class_proba&amp;quot;: [0.37, 0.63]},&lt;br /&gt;
                {&amp;quot;signal&amp;quot;: 4, &amp;quot;line&amp;quot;: 4, &amp;quot;class_status&amp;quot;: 1, &amp;quot;class_name&amp;quot;: &amp;quot;dann&amp;quot;, &amp;quot;class_proba&amp;quot;: [0.83, 0.17]},&lt;br /&gt;
                {&amp;quot;signal&amp;quot;: 5, &amp;quot;line&amp;quot;: 5, &amp;quot;class_status&amp;quot;: 1, &amp;quot;class_name&amp;quot;: &amp;quot;dann&amp;quot;, &amp;quot;class_proba&amp;quot;: [0.63, 0.37]},&lt;br /&gt;
                {&amp;quot;signal&amp;quot;: 6, &amp;quot;line&amp;quot;: 6, &amp;quot;class_status&amp;quot;: 1, &amp;quot;class_name&amp;quot;: &amp;quot;dann&amp;quot;, &amp;quot;class_proba&amp;quot;: [0.63, 0.37]},&lt;br /&gt;
                {&amp;quot;signal&amp;quot;: 7, &amp;quot;line&amp;quot;: 7, &amp;quot;class_status&amp;quot;: 1, &amp;quot;class_name&amp;quot;: &amp;quot;dann&amp;quot;, &amp;quot;class_proba&amp;quot;: [0.50, 0.50]},&lt;br /&gt;
                {&amp;quot;signal&amp;quot;: 8, &amp;quot;line&amp;quot;: 8, &amp;quot;class_status&amp;quot;: 1, &amp;quot;class_name&amp;quot;: &amp;quot;dann&amp;quot;, &amp;quot;class_proba&amp;quot;: [0.63, 0.37]},&lt;br /&gt;
                {&amp;quot;signal&amp;quot;: 9, &amp;quot;line&amp;quot;: 9, &amp;quot;class_status&amp;quot;: 2, &amp;quot;class_name&amp;quot;: &amp;quot;dann&amp;quot;, &amp;quot;class_proba&amp;quot;: [0.37, 0.63]},&lt;br /&gt;
                {&amp;quot;signal&amp;quot;: 10, &amp;quot;line&amp;quot;: 10, &amp;quot;class_status&amp;quot;: 2, &amp;quot;class_name&amp;quot;: &amp;quot;dann&amp;quot;, &amp;quot;class_proba&amp;quot;: [0.17, 0.83]},&lt;br /&gt;
                {&amp;quot;signal&amp;quot;: 11, &amp;quot;line&amp;quot;: 11, &amp;quot;class_status&amp;quot;: 1, &amp;quot;class_name&amp;quot;: &amp;quot;dann&amp;quot;, &amp;quot;class_proba&amp;quot;: [0.63, 0.37]},&lt;br /&gt;
                {&amp;quot;signal&amp;quot;: 12, &amp;quot;line&amp;quot;: 12, &amp;quot;class_status&amp;quot;: 1, &amp;quot;class_name&amp;quot;: &amp;quot;gaby&amp;quot;, &amp;quot;class_proba&amp;quot;: [0.63, 0.37]},&lt;br /&gt;
                {&amp;quot;signal&amp;quot;: 13, &amp;quot;line&amp;quot;: 13, &amp;quot;class_status&amp;quot;: 2, &amp;quot;class_name&amp;quot;: &amp;quot;gaby&amp;quot;, &amp;quot;class_proba&amp;quot;: [0.37, 0.63]},&lt;br /&gt;
                {&amp;quot;signal&amp;quot;: 14, &amp;quot;line&amp;quot;: 14, &amp;quot;class_status&amp;quot;: 1, &amp;quot;class_name&amp;quot;: &amp;quot;gaby&amp;quot;, &amp;quot;class_proba&amp;quot;: [0.74, 0.26]},&lt;br /&gt;
                {&amp;quot;signal&amp;quot;: 15, &amp;quot;line&amp;quot;: 15, &amp;quot;class_status&amp;quot;: 1, &amp;quot;class_name&amp;quot;: &amp;quot;gaby&amp;quot;, &amp;quot;class_proba&amp;quot;: [0.63, 0.37]},&lt;br /&gt;
                {&amp;quot;signal&amp;quot;: 16, &amp;quot;line&amp;quot;: 16, &amp;quot;class_status&amp;quot;: 1, &amp;quot;class_name&amp;quot;: &amp;quot;gaby&amp;quot;, &amp;quot;class_proba&amp;quot;: [0.74, 0.26]},&lt;br /&gt;
                {&amp;quot;signal&amp;quot;: 17, &amp;quot;line&amp;quot;: 17, &amp;quot;class_status&amp;quot;: 1, &amp;quot;class_name&amp;quot;: &amp;quot;gaby&amp;quot;, &amp;quot;class_proba&amp;quot;: [0.63, 0.37]},&lt;br /&gt;
                {&amp;quot;signal&amp;quot;: 18, &amp;quot;line&amp;quot;: 18, &amp;quot;class_status&amp;quot;: 1, &amp;quot;class_name&amp;quot;: &amp;quot;gaby&amp;quot;, &amp;quot;class_proba&amp;quot;: [0.63, 0.37]},&lt;br /&gt;
                {&amp;quot;signal&amp;quot;: 19, &amp;quot;line&amp;quot;: 19, &amp;quot;class_status&amp;quot;: 2, &amp;quot;class_name&amp;quot;: &amp;quot;dann&amp;quot;, &amp;quot;class_proba&amp;quot;: [0.37, 0.63]},&lt;br /&gt;
                {&amp;quot;signal&amp;quot;: 20, &amp;quot;line&amp;quot;: 20, &amp;quot;class_status&amp;quot;: 1, &amp;quot;class_name&amp;quot;: &amp;quot;gaby&amp;quot;, &amp;quot;class_proba&amp;quot;: [0.63, 0.37]},&lt;br /&gt;
                {&amp;quot;signal&amp;quot;: 21, &amp;quot;line&amp;quot;: 21, &amp;quot;class_status&amp;quot;: 2, &amp;quot;class_name&amp;quot;: &amp;quot;dann&amp;quot;, &amp;quot;class_proba&amp;quot;: [0.11, 0.89]},&lt;br /&gt;
                {&amp;quot;signal&amp;quot;: 22, &amp;quot;line&amp;quot;: 22, &amp;quot;class_status&amp;quot;: 1, &amp;quot;class_name&amp;quot;: &amp;quot;gaby&amp;quot;, &amp;quot;class_proba&amp;quot;: [0.74, 0.26]},&lt;br /&gt;
                {&amp;quot;signal&amp;quot;: 23, &amp;quot;line&amp;quot;: 23, &amp;quot;class_status&amp;quot;: 1, &amp;quot;class_name&amp;quot;: &amp;quot;gaby&amp;quot;, &amp;quot;class_proba&amp;quot;: [0.63, 0.37]},&lt;br /&gt;
                {&amp;quot;signal&amp;quot;: 24, &amp;quot;line&amp;quot;: 24, &amp;quot;class_status&amp;quot;: 1, &amp;quot;class_name&amp;quot;: &amp;quot;gaby&amp;quot;, &amp;quot;class_proba&amp;quot;: [0.74, 0.26]},&lt;br /&gt;
                {&amp;quot;signal&amp;quot;: 25, &amp;quot;line&amp;quot;: 25, &amp;quot;class_status&amp;quot;: 1, &amp;quot;class_name&amp;quot;: &amp;quot;gaby&amp;quot;, &amp;quot;class_proba&amp;quot;: [0.50, 0.50]},&lt;br /&gt;
                {&amp;quot;signal&amp;quot;: 26, &amp;quot;line&amp;quot;: 26, &amp;quot;class_status&amp;quot;: 2, &amp;quot;class_name&amp;quot;: &amp;quot;gaby&amp;quot;, &amp;quot;class_proba&amp;quot;: [0.06, 0.94]},&lt;br /&gt;
                {&amp;quot;signal&amp;quot;: 27, &amp;quot;line&amp;quot;: 27, &amp;quot;class_status&amp;quot;: 2, &amp;quot;class_name&amp;quot;: &amp;quot;gaby&amp;quot;, &amp;quot;class_proba&amp;quot;: [0.37, 0.63]},&lt;br /&gt;
                {&amp;quot;signal&amp;quot;: 28, &amp;quot;line&amp;quot;: 28, &amp;quot;class_status&amp;quot;: 1, &amp;quot;class_name&amp;quot;: &amp;quot;gaby&amp;quot;, &amp;quot;class_proba&amp;quot;: [0.63, 0.37]},&lt;br /&gt;
                {&amp;quot;signal&amp;quot;: 29, &amp;quot;line&amp;quot;: 29, &amp;quot;class_status&amp;quot;: 1, &amp;quot;class_name&amp;quot;: &amp;quot;gaby&amp;quot;, &amp;quot;class_proba&amp;quot;: [0.63, 0.37]}&lt;br /&gt;
        ],&lt;br /&gt;
        &amp;quot;classification_summary&amp;quot;: {&amp;quot;signals&amp;quot;: 29, &amp;quot;classified&amp;quot;: [13, 16], &amp;quot;unclassified&amp;quot;: 0}&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=Utilisation=&lt;br /&gt;
&lt;br /&gt;
Vérifier que la Raspberry est branchée à l'ordinateur et vérifier le Nucleo est bien connecté à la Raspberry et vérifier que la machine virtuelle gabidann est bien lancée.&lt;br /&gt;
&lt;br /&gt;
Lancer dans un premier temps le serveur TCP sur la machine virtuelle gabidann. Lancer ensuite le client TCP sur la Raspberry.&lt;br /&gt;
&lt;br /&gt;
Les résultats seront affichés dans le terminal de la machine virtuelle.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=Résultats=&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Gabidann results.jpg|néant|vignette|800px]][[Fichier:Vidéo de présentation du modèle.mp4|sans_cadre]][[Fichier:Gabidann results2.jpg|néant|vignette|800px]]&lt;br /&gt;
[[Fichier:Resultatdann.png|gauche|sans_cadre|600x600px]]&lt;br /&gt;
[[Fichier:Resultatgaby.png|gauche|sans_cadre|600x600px]]&lt;br /&gt;
[[Fichier:Resultatpersonne.png|gauche|sans_cadre|600x600px]]&lt;/div&gt;</summary>
		<author><name>Gthomas</name></author>
	</entry>
	<entry>
		<id>https://wiki-se.plil.fr/mediawiki/index.php?title=Fichier:Vid%C3%A9o_de_pr%C3%A9sentation_du_mod%C3%A8le.mp4&amp;diff=4759</id>
		<title>Fichier:Vidéo de présentation du modèle.mp4</title>
		<link rel="alternate" type="text/html" href="https://wiki-se.plil.fr/mediawiki/index.php?title=Fichier:Vid%C3%A9o_de_pr%C3%A9sentation_du_mod%C3%A8le.mp4&amp;diff=4759"/>
		<updated>2024-01-28T13:44:45Z</updated>

		<summary type="html">&lt;p&gt;Gthomas : &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;glopglop&lt;/div&gt;</summary>
		<author><name>Gthomas</name></author>
	</entry>
	<entry>
		<id>https://wiki-se.plil.fr/mediawiki/index.php?title=RodenburgThomas&amp;diff=4172</id>
		<title>RodenburgThomas</title>
		<link rel="alternate" type="text/html" href="https://wiki-se.plil.fr/mediawiki/index.php?title=RodenburgThomas&amp;diff=4172"/>
		<updated>2024-01-24T17:45:33Z</updated>

		<summary type="html">&lt;p&gt;Gthomas : /* Résultats */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;=Le binôme=&lt;br /&gt;
&lt;br /&gt;
Le binôme est constitué de 2 élèves de SE5-SC :&lt;br /&gt;
* Dann RODENBURG&lt;br /&gt;
* Gabriel THOMAS&lt;br /&gt;
=Objectifs= &lt;br /&gt;
&lt;br /&gt;
Le but de ce TP est de créer un réseau de systèmes communicants en partant d'un capteur XNucléo 53L5A1 pour finir sur une machine virtuelle Xen.&lt;br /&gt;
La particularité est d'intégrer une composante de Machine Learning  &lt;br /&gt;
&lt;br /&gt;
[[Fichier:Capture d'écran 2023-12-19 151237.png|néant|vignette|800x800px]]&lt;br /&gt;
&lt;br /&gt;
=Edge Computing and Embedded AI=&lt;br /&gt;
&lt;br /&gt;
===Machine virtuelle===&lt;br /&gt;
====Création====&lt;br /&gt;
Création d'une machine virtuelle '''gabidann''' sur le serveur chassiron :&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;xen-create-image --hostname=gabidann --force --dist=bookworm --size=10G --memory=10G --dir=/usr/local/xen --password=glopglop --dhcp --bridge=bridgeStudents&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
La machine virtuelle est à présent connectée au WiFi.&lt;br /&gt;
&lt;br /&gt;
Après cela, nous avons configuré la machine virtuelle selon l'énoncé du TP en faisant un xen console gabidann. Nous avons ensuite participé à la mise en place du point d'accès WiFi.&lt;br /&gt;
&lt;br /&gt;
====Serveur TCP====&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
import socket&lt;br /&gt;
import subprocess&lt;br /&gt;
&lt;br /&gt;
def write_csv(filename, data):&lt;br /&gt;
	if data == &amp;quot;,&amp;quot;:&lt;br /&gt;
		return		# avoid to put single commas in csv file&lt;br /&gt;
	f = open(filename, &amp;quot;a&amp;quot;)&lt;br /&gt;
	f.write(data + &amp;quot;\n&amp;quot;)&lt;br /&gt;
	f.close()&lt;br /&gt;
&lt;br /&gt;
def process_data(data):&lt;br /&gt;
	if data == &amp;quot;,&amp;quot;:&lt;br /&gt;
		return&lt;br /&gt;
	&lt;br /&gt;
	formatted_data = data.replace(',', ' ')&lt;br /&gt;
&lt;br /&gt;
	cmd = f'emulators/NanoEdgeAI_Class_Emulator neai_classification --knowledge_path emulators/knowledge.dat --array &amp;quot;{formatted_data}&amp;quot;'&lt;br /&gt;
	signal = str(subprocess.check_output(cmd.split(&amp;quot; &amp;quot;)))	&lt;br /&gt;
	write_csv(&amp;quot;signal.csv&amp;quot;, signal)&lt;br /&gt;
&lt;br /&gt;
	if &amp;quot;dann&amp;quot; in signal:&lt;br /&gt;
		print(&amp;quot;dann&amp;quot;)&lt;br /&gt;
	elif &amp;quot;gaby&amp;quot; in signal:&lt;br /&gt;
		print(&amp;quot;gaby&amp;quot;)&lt;br /&gt;
	else:&lt;br /&gt;
		print(&amp;quot;Unknown face&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
def handle_connection(conn, filename):&lt;br /&gt;
	while True:&lt;br /&gt;
		try:&lt;br /&gt;
			msg = conn.recv(1024)&lt;br /&gt;
			msg = msg.decode('utf-8')&lt;br /&gt;
		except KeyboardInterrupt:&lt;br /&gt;
			exit()&lt;br /&gt;
		if not msg:&lt;br /&gt;
			print(&amp;quot;Cannot receive message from Raspberry client !&amp;quot;)&lt;br /&gt;
			break&lt;br /&gt;
		else:&lt;br /&gt;
			process_data(msg)&lt;br /&gt;
	print(&amp;quot;Closing Raspberry client connection...&amp;quot;)&lt;br /&gt;
	conn.close()&lt;br /&gt;
&lt;br /&gt;
filename = 'data.csv'&lt;br /&gt;
server_ipv6 = '2001:660:4401:6050:216:3eff:fe98:11ff'&lt;br /&gt;
port = 9999&lt;br /&gt;
&lt;br /&gt;
s = socket.socket(socket.AF_INET6, socket.SOCK_STREAM)&lt;br /&gt;
s.bind((server_ipv6, port))&lt;br /&gt;
s.listen(1)&lt;br /&gt;
print(&amp;quot;Listening on port &amp;quot; + str(port))&lt;br /&gt;
&lt;br /&gt;
while True:&lt;br /&gt;
	try:&lt;br /&gt;
		conn,addr = s.accept()&lt;br /&gt;
	except KeyboardInterrupt:&lt;br /&gt;
		exit()&lt;br /&gt;
	with conn:&lt;br /&gt;
		print(f&amp;quot;New connection from {addr[0]}&amp;quot;)&lt;br /&gt;
		handle_connection(conn, filename)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====Serveur HTTP====&lt;br /&gt;
Configuration d'un serveur HTTP sur la machine virtuelle gabidann :&amp;lt;syntaxhighlight lang=&amp;quot;python3&amp;quot;&amp;gt;&lt;br /&gt;
import socket&lt;br /&gt;
from http.server import HTTPServer, SimpleHTTPRequestHandler&lt;br /&gt;
&lt;br /&gt;
class MyHandler(SimpleHTTPRequestHandler):&lt;br /&gt;
  def do_GET(self):&lt;br /&gt;
    if self.path == '/ip':&lt;br /&gt;
      self.send_response(200)&lt;br /&gt;
      self.send_header('Content-type', 'text/html')&lt;br /&gt;
      self.end_headers()&lt;br /&gt;
      self.wfile.write(f'Your IP address is {self.client_address[0]}'.encode())&lt;br /&gt;
      return&lt;br /&gt;
    else:&lt;br /&gt;
      return SimpleHTTPRequestHandler.do_GET(self)&lt;br /&gt;
&lt;br /&gt;
class HTTPServerV6(HTTPServer):&lt;br /&gt;
  address_family = socket.AF_INET6&lt;br /&gt;
&lt;br /&gt;
def main():&lt;br /&gt;
  server = HTTPServerV6(('::', 8080), MyHandler)&lt;br /&gt;
  server.serve_forever()&lt;br /&gt;
&lt;br /&gt;
if __name__ == '__main__':&lt;br /&gt;
  main()&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Pour se connecter au serveur depuis un navigateur, on peut ouvrir un navigateur depuis la zabeth et y accéder avec l'adresse : ''[&amp;lt;ipv6_VM&amp;gt;]:&amp;lt;port&amp;gt;''. Dans notre cas, le serveur écoute le port '''8080'''.&lt;br /&gt;
&lt;br /&gt;
La page index.html s'affiche par défaut lorsque l'on se connecte au serveur HTTP :&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;html&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;!DOCTYPE html&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;html lang=&amp;quot;fr&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;head&amp;gt;&lt;br /&gt;
	&amp;lt;meta charset=&amp;quot;UTF-8&amp;quot;&amp;gt;&lt;br /&gt;
	&amp;lt;title&amp;gt;Gabidann&amp;lt;/title&amp;gt;&lt;br /&gt;
&amp;lt;/head&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;body&amp;gt;&lt;br /&gt;
	&amp;lt;h1&amp;gt;Bienvenue sur Gabidann !&amp;lt;h1&amp;gt;&lt;br /&gt;
	&amp;lt;div id=&amp;quot;data&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/body&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/html&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;Nous avons également testé la communication en TCP avec l'utilitaire socat&lt;br /&gt;
&lt;br /&gt;
Nous avons créé un serveur python en TCP. Nous pouvons maintenant envoyer des messages du client ( raspberry ) au serveur (VM Xen). Nous nous servirons de cette architecture pour envoyer les données du Nucleo à la Vm Xen &lt;br /&gt;
&lt;br /&gt;
Une fois le modèle entrainé et les tests concluants, on peut déployer notre modèle sur n'importe quel appareils linux ou windows. Pour cela, on va dans l'onglet deployment et on télécharge notre librairie personnalisée.  &lt;br /&gt;
&lt;br /&gt;
===Raspberry===&lt;br /&gt;
D'un autre côté, nous avons branché la Raspberry Pi à l'ordinateur selon le pinout fourni dans la documentation.&lt;br /&gt;
&lt;br /&gt;
[[Fichier:20231218 085218.jpg|vignette|néant]]&lt;br /&gt;
&lt;br /&gt;
Enfin, nous avons activé la communication UART de la Raspberry Pi afin de pouvoir communiquer avec. En fin de séance, nous étions en train de vérifier que la Raspberry Pi répondait bien, même en ayant ajouté la ligne enable_uart=1 dans le fichier config.txt de la Raspberry.&lt;br /&gt;
&lt;br /&gt;
====Configuration de la Raspberry====&lt;br /&gt;
Nous avons résolu le problème de la Raspberry qui ne répondait pas. Cela était dû à l'alimentation : brancher la carte en USBC résoud le problème. Cependant, nous recevons une erreur l'erreur EXT4-fs error (device mmcblk0p2).&lt;br /&gt;
Le problème venait des arguments saisis lors du lancement de Minicom. Avec la commande suivante, il est à présent possible de se connecter sur la Raspberry : &amp;lt;code&amp;gt;minicom -D /dev/ttyUSB0 -b 115200&amp;lt;/code&amp;gt;&lt;br /&gt;
Dans la Raspberry, nous avons configuré une interface réseau wlan0 pour se connecter à WiFi_IE_1 :&lt;br /&gt;
    auto wlan0&lt;br /&gt;
    iface wlan0 inet dhcp&lt;br /&gt;
    wpa-conf /etc/wpa_supplicant/wpa_supplicant.conf&lt;br /&gt;
A présent à partir de la Raspberry, on peut ping la machine virtuelle sur chassiron avec son IPv6.&lt;br /&gt;
&lt;br /&gt;
====Client TCP====&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
import serial&lt;br /&gt;
import socket&lt;br /&gt;
&lt;br /&gt;
server_ipv6 = '2001:660:4401:6050:216:3eff:fe98:11ff'&lt;br /&gt;
server_port = 9999&lt;br /&gt;
&lt;br /&gt;
nucleo_baudrate = 460800&lt;br /&gt;
nucleo_port = '/dev/ttyACM0'&lt;br /&gt;
&lt;br /&gt;
def read_serial(ser):&lt;br /&gt;
        try:&lt;br /&gt;
                serial_data = ser.readline().decode('utf-8').strip()&lt;br /&gt;
                return serial_data&lt;br /&gt;
        except KeyboardInterrupt:&lt;br /&gt;
                ser.close()&lt;br /&gt;
                return None&lt;br /&gt;
&lt;br /&gt;
client = socket.socket(socket.AF_INET6, socket.SOCK_STREAM)&lt;br /&gt;
&lt;br /&gt;
ser = serial.Serial(port=nucleo_port, baudrate=nucleo_baudrate)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Configuration du capteur de distance===&lt;br /&gt;
Un programme était déjà présent sur le capteur. On a téléchargé le logiciel STM32CubeIDE pour pouvoir éditer du code et le téléverser sur le capteur. Nous avons testé de téléverser un programme d'exemple dont voici le résultat :&lt;br /&gt;
[[Fichier:Screenshot 2023-12-18 13-12-19.jpg|vignette|néant|700x700px]]&lt;br /&gt;
&lt;br /&gt;
Nous avons modifié ce programme afin d'effectuer un formatage des données transmises par le capteur sous le format ''&amp;lt;distance&amp;gt;,'' pour chaque valeur. Grâce à ce formatage, il est à présent possible d'utiliser les données reçues par le logiciel NanoEdgeStudio AI pour la partie Machine Learning.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Pour recevoir les valeurs de manière exploitable, il faut modifier le code Exemple dans le logiciel STM Cube IDE&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Capture d'écran 2023-12-20 084719.png|néant|vignette|800x800px]]&lt;br /&gt;
&lt;br /&gt;
L'objectif est d'obtenir une liste séparée par des virgules, il a donc fallu supprimer les espaces et les barres verticales de la fonction d'affichage ainsi que les statuts de chacun des capteurs :&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
static void print_result(RANGING_SENSOR_Result_t *Result)&lt;br /&gt;
{&lt;br /&gt;
  int8_t j;&lt;br /&gt;
  int8_t k;&lt;br /&gt;
  int8_t l;&lt;br /&gt;
  uint8_t zones_per_line;&lt;br /&gt;
  zones_per_line = ((Profile.RangingProfile == RS_PROFILE_8x8_AUTONOMOUS) ||&lt;br /&gt;
         (Profile.RangingProfile == RS_PROFILE_8x8_CONTINUOUS)) ? 8 : 4;&lt;br /&gt;
  for (j = 0; j &amp;lt; Result-&amp;gt;NumberOfZones; j += zones_per_line)&lt;br /&gt;
  {&lt;br /&gt;
    for (l = 0; l &amp;lt; RANGING_SENSOR_NB_TARGET_PER_ZONE; l++)&lt;br /&gt;
    {&lt;br /&gt;
      /* Print distance and status */&lt;br /&gt;
      for (k = (zones_per_line - 1); k &amp;gt;= 0; k--)&lt;br /&gt;
      {&lt;br /&gt;
        if (Result-&amp;gt;ZoneResult[j+k].NumberOfTargets &amp;gt; 0)&lt;br /&gt;
          printf(&amp;quot;%ld,&amp;quot;,(long)Result-&amp;gt;ZoneResult[j+k].Distance[l]);&lt;br /&gt;
      }&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
  printf(&amp;quot;\n&amp;quot;);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Emulation avec NanoEdgeStudio AI===&lt;br /&gt;
&lt;br /&gt;
On passe ensuite sur Nano Edge Studio pour définir les signaux dans l'onglet &amp;quot;Signals&amp;quot; et entraîner le modèle dans l'onglet &amp;quot;Benchmark&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Capture d'écran 2023-12-18 172047.png|néant|vignette|800x800px]]&lt;br /&gt;
&lt;br /&gt;
Une fois le modèle entraîné, on peut le tester avec l'onglet &amp;quot;Emulator&amp;quot; &lt;br /&gt;
&lt;br /&gt;
[[Fichier:Capture d'écran 2023-12-18 173255.png|néant|vignette|800x800px]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Dans un premier temps, nous avons essayé d'entraîner le programme à reconnaître les chiffres 1, 2, 3, 4 et 5 sur les doigts d'une main. Les résultats n'étaient pas concluant, il semblerait que le capteur détecte avant tout le volume de la main à la place de détecter le nombre de doigts.&lt;br /&gt;
&lt;br /&gt;
Nous avons ensuite choisi de faire un détecteur de visages capable de faire la différence entre Gabriel et Dann. L'émulation donne des résultats très satisfaisant proche de 100% de réussite&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
On peut lui passer un fichier CSV contenant les données brutes du capteur et grâce au fichier knowledge.dat, l'émulateur est capable de faire la différence entre les situations&amp;lt;syntaxhighlight lang=&amp;quot;bat&amp;quot;&amp;gt;&lt;br /&gt;
PS C:\Users\gabyt\Documents\Gaby\emulators&amp;gt; .\NanoEdgeAI_Class_Emulator.exe neai_classification --knowledge_path .\knowledge.dat --file .\data.csv&lt;br /&gt;
{&lt;br /&gt;
        &amp;quot;status&amp;quot;: &amp;quot;classification&amp;quot;,&lt;br /&gt;
        &amp;quot;lib_id&amp;quot;: &amp;quot;6582b12625c3e0368b2c2a09&amp;quot;,&lt;br /&gt;
        &amp;quot;input&amp;quot;: &amp;quot;.\data.csv&amp;quot;,&lt;br /&gt;
        &amp;quot;results&amp;quot;: [&lt;br /&gt;
                {&amp;quot;signal&amp;quot;: 1, &amp;quot;line&amp;quot;: 1, &amp;quot;class_status&amp;quot;: 2, &amp;quot;class_name&amp;quot;: &amp;quot;dann&amp;quot;, &amp;quot;class_proba&amp;quot;: [0.01, 0.99]},&lt;br /&gt;
                {&amp;quot;signal&amp;quot;: 2, &amp;quot;line&amp;quot;: 2, &amp;quot;class_status&amp;quot;: 2, &amp;quot;class_name&amp;quot;: &amp;quot;dann&amp;quot;, &amp;quot;class_proba&amp;quot;: [0.01, 0.99]},&lt;br /&gt;
                {&amp;quot;signal&amp;quot;: 3, &amp;quot;line&amp;quot;: 3, &amp;quot;class_status&amp;quot;: 2, &amp;quot;class_name&amp;quot;: &amp;quot;dann&amp;quot;, &amp;quot;class_proba&amp;quot;: [0.37, 0.63]},&lt;br /&gt;
                {&amp;quot;signal&amp;quot;: 4, &amp;quot;line&amp;quot;: 4, &amp;quot;class_status&amp;quot;: 1, &amp;quot;class_name&amp;quot;: &amp;quot;dann&amp;quot;, &amp;quot;class_proba&amp;quot;: [0.83, 0.17]},&lt;br /&gt;
                {&amp;quot;signal&amp;quot;: 5, &amp;quot;line&amp;quot;: 5, &amp;quot;class_status&amp;quot;: 1, &amp;quot;class_name&amp;quot;: &amp;quot;dann&amp;quot;, &amp;quot;class_proba&amp;quot;: [0.63, 0.37]},&lt;br /&gt;
                {&amp;quot;signal&amp;quot;: 6, &amp;quot;line&amp;quot;: 6, &amp;quot;class_status&amp;quot;: 1, &amp;quot;class_name&amp;quot;: &amp;quot;dann&amp;quot;, &amp;quot;class_proba&amp;quot;: [0.63, 0.37]},&lt;br /&gt;
                {&amp;quot;signal&amp;quot;: 7, &amp;quot;line&amp;quot;: 7, &amp;quot;class_status&amp;quot;: 1, &amp;quot;class_name&amp;quot;: &amp;quot;dann&amp;quot;, &amp;quot;class_proba&amp;quot;: [0.50, 0.50]},&lt;br /&gt;
                {&amp;quot;signal&amp;quot;: 8, &amp;quot;line&amp;quot;: 8, &amp;quot;class_status&amp;quot;: 1, &amp;quot;class_name&amp;quot;: &amp;quot;dann&amp;quot;, &amp;quot;class_proba&amp;quot;: [0.63, 0.37]},&lt;br /&gt;
                {&amp;quot;signal&amp;quot;: 9, &amp;quot;line&amp;quot;: 9, &amp;quot;class_status&amp;quot;: 2, &amp;quot;class_name&amp;quot;: &amp;quot;dann&amp;quot;, &amp;quot;class_proba&amp;quot;: [0.37, 0.63]},&lt;br /&gt;
                {&amp;quot;signal&amp;quot;: 10, &amp;quot;line&amp;quot;: 10, &amp;quot;class_status&amp;quot;: 2, &amp;quot;class_name&amp;quot;: &amp;quot;dann&amp;quot;, &amp;quot;class_proba&amp;quot;: [0.17, 0.83]},&lt;br /&gt;
                {&amp;quot;signal&amp;quot;: 11, &amp;quot;line&amp;quot;: 11, &amp;quot;class_status&amp;quot;: 1, &amp;quot;class_name&amp;quot;: &amp;quot;dann&amp;quot;, &amp;quot;class_proba&amp;quot;: [0.63, 0.37]},&lt;br /&gt;
                {&amp;quot;signal&amp;quot;: 12, &amp;quot;line&amp;quot;: 12, &amp;quot;class_status&amp;quot;: 1, &amp;quot;class_name&amp;quot;: &amp;quot;gaby&amp;quot;, &amp;quot;class_proba&amp;quot;: [0.63, 0.37]},&lt;br /&gt;
                {&amp;quot;signal&amp;quot;: 13, &amp;quot;line&amp;quot;: 13, &amp;quot;class_status&amp;quot;: 2, &amp;quot;class_name&amp;quot;: &amp;quot;gaby&amp;quot;, &amp;quot;class_proba&amp;quot;: [0.37, 0.63]},&lt;br /&gt;
                {&amp;quot;signal&amp;quot;: 14, &amp;quot;line&amp;quot;: 14, &amp;quot;class_status&amp;quot;: 1, &amp;quot;class_name&amp;quot;: &amp;quot;gaby&amp;quot;, &amp;quot;class_proba&amp;quot;: [0.74, 0.26]},&lt;br /&gt;
                {&amp;quot;signal&amp;quot;: 15, &amp;quot;line&amp;quot;: 15, &amp;quot;class_status&amp;quot;: 1, &amp;quot;class_name&amp;quot;: &amp;quot;gaby&amp;quot;, &amp;quot;class_proba&amp;quot;: [0.63, 0.37]},&lt;br /&gt;
                {&amp;quot;signal&amp;quot;: 16, &amp;quot;line&amp;quot;: 16, &amp;quot;class_status&amp;quot;: 1, &amp;quot;class_name&amp;quot;: &amp;quot;gaby&amp;quot;, &amp;quot;class_proba&amp;quot;: [0.74, 0.26]},&lt;br /&gt;
                {&amp;quot;signal&amp;quot;: 17, &amp;quot;line&amp;quot;: 17, &amp;quot;class_status&amp;quot;: 1, &amp;quot;class_name&amp;quot;: &amp;quot;gaby&amp;quot;, &amp;quot;class_proba&amp;quot;: [0.63, 0.37]},&lt;br /&gt;
                {&amp;quot;signal&amp;quot;: 18, &amp;quot;line&amp;quot;: 18, &amp;quot;class_status&amp;quot;: 1, &amp;quot;class_name&amp;quot;: &amp;quot;gaby&amp;quot;, &amp;quot;class_proba&amp;quot;: [0.63, 0.37]},&lt;br /&gt;
                {&amp;quot;signal&amp;quot;: 19, &amp;quot;line&amp;quot;: 19, &amp;quot;class_status&amp;quot;: 2, &amp;quot;class_name&amp;quot;: &amp;quot;dann&amp;quot;, &amp;quot;class_proba&amp;quot;: [0.37, 0.63]},&lt;br /&gt;
                {&amp;quot;signal&amp;quot;: 20, &amp;quot;line&amp;quot;: 20, &amp;quot;class_status&amp;quot;: 1, &amp;quot;class_name&amp;quot;: &amp;quot;gaby&amp;quot;, &amp;quot;class_proba&amp;quot;: [0.63, 0.37]},&lt;br /&gt;
                {&amp;quot;signal&amp;quot;: 21, &amp;quot;line&amp;quot;: 21, &amp;quot;class_status&amp;quot;: 2, &amp;quot;class_name&amp;quot;: &amp;quot;dann&amp;quot;, &amp;quot;class_proba&amp;quot;: [0.11, 0.89]},&lt;br /&gt;
                {&amp;quot;signal&amp;quot;: 22, &amp;quot;line&amp;quot;: 22, &amp;quot;class_status&amp;quot;: 1, &amp;quot;class_name&amp;quot;: &amp;quot;gaby&amp;quot;, &amp;quot;class_proba&amp;quot;: [0.74, 0.26]},&lt;br /&gt;
                {&amp;quot;signal&amp;quot;: 23, &amp;quot;line&amp;quot;: 23, &amp;quot;class_status&amp;quot;: 1, &amp;quot;class_name&amp;quot;: &amp;quot;gaby&amp;quot;, &amp;quot;class_proba&amp;quot;: [0.63, 0.37]},&lt;br /&gt;
                {&amp;quot;signal&amp;quot;: 24, &amp;quot;line&amp;quot;: 24, &amp;quot;class_status&amp;quot;: 1, &amp;quot;class_name&amp;quot;: &amp;quot;gaby&amp;quot;, &amp;quot;class_proba&amp;quot;: [0.74, 0.26]},&lt;br /&gt;
                {&amp;quot;signal&amp;quot;: 25, &amp;quot;line&amp;quot;: 25, &amp;quot;class_status&amp;quot;: 1, &amp;quot;class_name&amp;quot;: &amp;quot;gaby&amp;quot;, &amp;quot;class_proba&amp;quot;: [0.50, 0.50]},&lt;br /&gt;
                {&amp;quot;signal&amp;quot;: 26, &amp;quot;line&amp;quot;: 26, &amp;quot;class_status&amp;quot;: 2, &amp;quot;class_name&amp;quot;: &amp;quot;gaby&amp;quot;, &amp;quot;class_proba&amp;quot;: [0.06, 0.94]},&lt;br /&gt;
                {&amp;quot;signal&amp;quot;: 27, &amp;quot;line&amp;quot;: 27, &amp;quot;class_status&amp;quot;: 2, &amp;quot;class_name&amp;quot;: &amp;quot;gaby&amp;quot;, &amp;quot;class_proba&amp;quot;: [0.37, 0.63]},&lt;br /&gt;
                {&amp;quot;signal&amp;quot;: 28, &amp;quot;line&amp;quot;: 28, &amp;quot;class_status&amp;quot;: 1, &amp;quot;class_name&amp;quot;: &amp;quot;gaby&amp;quot;, &amp;quot;class_proba&amp;quot;: [0.63, 0.37]},&lt;br /&gt;
                {&amp;quot;signal&amp;quot;: 29, &amp;quot;line&amp;quot;: 29, &amp;quot;class_status&amp;quot;: 1, &amp;quot;class_name&amp;quot;: &amp;quot;gaby&amp;quot;, &amp;quot;class_proba&amp;quot;: [0.63, 0.37]}&lt;br /&gt;
        ],&lt;br /&gt;
        &amp;quot;classification_summary&amp;quot;: {&amp;quot;signals&amp;quot;: 29, &amp;quot;classified&amp;quot;: [13, 16], &amp;quot;unclassified&amp;quot;: 0}&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=Utilisation=&lt;br /&gt;
&lt;br /&gt;
Vérifier que la Raspberry est branchée à l'ordinateur et vérifier le Nucleo est bien connecté à la Raspberry et vérifier que la machine virtuelle gabidann est bien lancée.&lt;br /&gt;
&lt;br /&gt;
Lancer dans un premier temps le serveur TCP sur la machine virtuelle gabidann. Lancer ensuite le client TCP sur la Raspberry.&lt;br /&gt;
&lt;br /&gt;
Les résultats seront affichés dans le terminal de la machine virtuelle.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=Résultats=&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Gabidann results.jpg|néant|vignette|800px]]&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Gabidann results2.jpg|néant|vignette|800px]]&lt;br /&gt;
[[Fichier:Resultatdann.png|gauche|sans_cadre|600x600px]]&lt;br /&gt;
[[Fichier:Resultatgaby.png|gauche|sans_cadre|600x600px]]&lt;br /&gt;
[[Fichier:Resultatpersonne.png|gauche|sans_cadre|600x600px]]&lt;/div&gt;</summary>
		<author><name>Gthomas</name></author>
	</entry>
	<entry>
		<id>https://wiki-se.plil.fr/mediawiki/index.php?title=Fichier:Resultatdann.png&amp;diff=4171</id>
		<title>Fichier:Resultatdann.png</title>
		<link rel="alternate" type="text/html" href="https://wiki-se.plil.fr/mediawiki/index.php?title=Fichier:Resultatdann.png&amp;diff=4171"/>
		<updated>2024-01-24T17:45:14Z</updated>

		<summary type="html">&lt;p&gt;Gthomas : &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;gloplgop&lt;/div&gt;</summary>
		<author><name>Gthomas</name></author>
	</entry>
	<entry>
		<id>https://wiki-se.plil.fr/mediawiki/index.php?title=Fichier:Resultatgaby.png&amp;diff=4170</id>
		<title>Fichier:Resultatgaby.png</title>
		<link rel="alternate" type="text/html" href="https://wiki-se.plil.fr/mediawiki/index.php?title=Fichier:Resultatgaby.png&amp;diff=4170"/>
		<updated>2024-01-24T17:44:09Z</updated>

		<summary type="html">&lt;p&gt;Gthomas : &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;glopglop&lt;/div&gt;</summary>
		<author><name>Gthomas</name></author>
	</entry>
	<entry>
		<id>https://wiki-se.plil.fr/mediawiki/index.php?title=Fichier:Resultatpersonne.png&amp;diff=4169</id>
		<title>Fichier:Resultatpersonne.png</title>
		<link rel="alternate" type="text/html" href="https://wiki-se.plil.fr/mediawiki/index.php?title=Fichier:Resultatpersonne.png&amp;diff=4169"/>
		<updated>2024-01-24T17:43:00Z</updated>

		<summary type="html">&lt;p&gt;Gthomas : &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;glopglop&lt;/div&gt;</summary>
		<author><name>Gthomas</name></author>
	</entry>
	<entry>
		<id>https://wiki-se.plil.fr/mediawiki/index.php?title=Atelier_SysRes_SE5_2023/2024_E19&amp;diff=3811</id>
		<title>Atelier SysRes SE5 2023/2024 E19</title>
		<link rel="alternate" type="text/html" href="https://wiki-se.plil.fr/mediawiki/index.php?title=Atelier_SysRes_SE5_2023/2024_E19&amp;diff=3811"/>
		<updated>2024-01-16T08:20:07Z</updated>

		<summary type="html">&lt;p&gt;Gthomas : Page créée avec « Crack wifi cracote8 WEP                                 Aircrack-ng 1.7                            [00:00:00] Tested 681 keys (got 54738 IVs)     KB    depth   byte(vote)      0    0/ 25   FF(72448) 0D(66560) F2(66560) B5(65792) 2F(65536) FB(65024) 9A(63744)       1    7/  1   D6(63232) 83(62464) FF(62464) 03(61952) 0E(61952) BA(61952) E1(61952)       2    0/  1   FD(80640) B2(64256) 1A(64000) AF(63232) 04(624... »&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Crack wifi cracote8 WEP &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
                             Aircrack-ng 1.7 &lt;br /&gt;
&lt;br /&gt;
                         [00:00:00] Tested 681 keys (got 54738 IVs)&lt;br /&gt;
&lt;br /&gt;
   KB    depth   byte(vote)&lt;br /&gt;
&lt;br /&gt;
    0    0/ 25   FF(72448) 0D(66560) F2(66560) B5(65792) 2F(65536) FB(65024) 9A(63744) &lt;br /&gt;
&lt;br /&gt;
    1    7/  1   D6(63232) 83(62464) FF(62464) 03(61952) 0E(61952) BA(61952) E1(61952) &lt;br /&gt;
&lt;br /&gt;
    2    0/  1   FD(80640) B2(64256) 1A(64000) AF(63232) 04(62464) 28(62464) 2A(62464) &lt;br /&gt;
&lt;br /&gt;
    3    0/  1   FC(77568) 36(64000) 48(64000) 7D(63744) B8(62976) 2C(62720) 7B(62720) &lt;br /&gt;
&lt;br /&gt;
    4    4/  4   C3(64512) 37(62720) 59(62720) DB(62208) 15(61696) A1(61696) 1D(61440) &lt;br /&gt;
&lt;br /&gt;
             KEY FOUND! [ FF:FF:FF:FF:FA:BC:09:CB:AE:EE:EE:EE:EE ] &lt;br /&gt;
&lt;br /&gt;
        Decrypted correctly: 100%&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Crack wifi kracote8 WPA        &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
                  Aircrack-ng 1.7 &lt;br /&gt;
&lt;br /&gt;
      [00:00:07] 58411/59049 keys tested (8462.26 k/s) &lt;br /&gt;
&lt;br /&gt;
      Time left: 0 seconds                                      98.92%&lt;br /&gt;
&lt;br /&gt;
                           KEY FOUND! [ 66682666 ]&lt;br /&gt;
&lt;br /&gt;
      Master Key     : 6B 9D EC F5 AD BC C8 92 47 81 18 5A 5A 37 74 51 &lt;br /&gt;
&lt;br /&gt;
                       A6 3E 25 D4 0B 74 26 E3 B4 B9 0A 6E 21 9D 1F 3C &lt;br /&gt;
&lt;br /&gt;
      Transient Key  : BD 41 57 6B 9F 08 E9 82 A9 2C 56 1F F7 7A C8 2D &lt;br /&gt;
&lt;br /&gt;
                       CE 38 2D 36 30 F1 F5 65 3A BD B1 34 20 E2 20 81 &lt;br /&gt;
&lt;br /&gt;
                       C2 13 DB 3E 1C 4A FE D6 33 98 C1 25 27 C9 6A 73 &lt;br /&gt;
&lt;br /&gt;
                       04 FD F1 30 26 FD BE 7E E4 B7 0F BE F6 C1 F2 A3 &lt;br /&gt;
&lt;br /&gt;
      EAPOL HMAC     : 1B 15 CC D9 41 1D 3E 1E 8E F6 28 DE 56 8C A9 B1&lt;/div&gt;</summary>
		<author><name>Gthomas</name></author>
	</entry>
	<entry>
		<id>https://wiki-se.plil.fr/mediawiki/index.php?title=SE5_syst%C3%A8me/r%C3%A9seau_2023/2024&amp;diff=3751</id>
		<title>SE5 système/réseau 2023/2024</title>
		<link rel="alternate" type="text/html" href="https://wiki-se.plil.fr/mediawiki/index.php?title=SE5_syst%C3%A8me/r%C3%A9seau_2023/2024&amp;diff=3751"/>
		<updated>2024-01-13T07:44:48Z</updated>

		<summary type="html">&lt;p&gt;Gthomas : /* Répartition des binômes en PRA */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= PRA SE5 =&lt;br /&gt;
&lt;br /&gt;
== Menu de la première séance ==&lt;br /&gt;
&lt;br /&gt;
Pour la  première séance du 06/10/2023 il vous est demandé d'effectuer individuellement les opérations listées ci-dessous.&lt;br /&gt;
* création d'une machine virtuelle sur le serveur &amp;lt;code&amp;gt;capbreton&amp;lt;/code&amp;gt; ;&lt;br /&gt;
* création d'un conteneur &amp;quot;à la main&amp;quot; sur votre station de travail &amp;lt;code&amp;gt;zabeth&amp;lt;/code&amp;gt; :&lt;br /&gt;
** créez un conteneur isolé au maximum (sauf pour les utilisateur) avec la méthode décrite en cours,&lt;br /&gt;
** création d'un commutateur virtuel privé sur la &amp;lt;code&amp;gt;zabeth&amp;lt;/code&amp;gt; dans le réseau IPv4 &amp;lt;code&amp;gt;192.168.68.0/24&amp;lt;/code&amp;gt;, l'adresse &amp;lt;code&amp;gt;192.168.68.1&amp;lt;/code&amp;gt; est affectée au commutateur lui-même,&lt;br /&gt;
** création d'une interface Ethernet virtuelle, une extrémité doit être envoyée dans le conteneur, l'autre dans le commutateur virtuel privé,&lt;br /&gt;
** mise en place d'une mascarade sur la &amp;lt;code&amp;gt;zabeth&amp;lt;/code&amp;gt;, vérifiez que le conteneur a accès aux mêmes machines que la  &amp;lt;code&amp;gt;zabeth&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Par binôme vous devez créer une machine virtuelle mandataire connectée sur le commutateur virtuel SE5 et sur le commutateur virtuel privé des machines virtuelles de services concernées (voir deuxième section du sujet).&lt;br /&gt;
&lt;br /&gt;
Globalement vous devez configurer le routeur principal de la promotion (voir la troisième section du sujet). Pour votre promotion il s'agit du Catalyst 9200 situé en E304. Il faut le connecter en fibre vers le serveur &amp;lt;code&amp;gt;capbreton&amp;lt;/code&amp;gt; de la E306 dans le commutateur virtuel SE5 et aussi en fibre vers le local technique SR52 sur un port dans le VLAN 531. Vous pouvez configurer le commutateur via l'utilitaire &amp;lt;code&amp;gt;minicom&amp;lt;/code&amp;gt; à partir de la machine &amp;lt;code&amp;gt;zabeth09&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Répartition des élèves pour la première séance :&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Station de travail !! Elève&lt;br /&gt;
|-&lt;br /&gt;
| zabeth02 || Elias SIMON&lt;br /&gt;
|-&lt;br /&gt;
| zabeth03 || Mathis RIFFAUT&lt;br /&gt;
|-&lt;br /&gt;
| zabeth04 || Dann RODENBURG&lt;br /&gt;
|-&lt;br /&gt;
| zabeth05 || Benjamin NGUYEN&lt;br /&gt;
|-&lt;br /&gt;
| zabeth06 || Halaoui Mohammed&lt;br /&gt;
|-&lt;br /&gt;
| zabeth07 || Blgrim Haitam&lt;br /&gt;
|-&lt;br /&gt;
| zabeth08 || Florian Vallée&lt;br /&gt;
|-&lt;br /&gt;
| zabeth09 (routeur) || Julien Charleux&lt;br /&gt;
|-&lt;br /&gt;
| zabeth10 || Amine SELLALI&lt;br /&gt;
|-&lt;br /&gt;
| zabeth11 || Paul Amoros&lt;br /&gt;
|-&lt;br /&gt;
| zabeth12 || Maël Delaby&lt;br /&gt;
|-&lt;br /&gt;
| zabeth13 || Black Baptiste&lt;br /&gt;
|-&lt;br /&gt;
| zabeth14 || Timothé Brenier&lt;br /&gt;
|-&lt;br /&gt;
| zabeth15 || Jeanne Delcourt&lt;br /&gt;
|-&lt;br /&gt;
| zabeth16 || Estelle Godard&lt;br /&gt;
|-&lt;br /&gt;
| zabeth17 || Jason DELANNOY&lt;br /&gt;
|-&lt;br /&gt;
| zabeth18 || Chloé Lemaire&lt;br /&gt;
|-&lt;br /&gt;
| zabeth19 || Gabriel THOMAS&lt;br /&gt;
|-&lt;br /&gt;
| zabeth20 || Albin MOUTON&lt;br /&gt;
|-&lt;br /&gt;
| zabeth21 || Konstantin PATRIKEEV&lt;br /&gt;
|-&lt;br /&gt;
| zabeth22 || Maxime Balbastre&lt;br /&gt;
|-&lt;br /&gt;
| zabeth26 || François NAUDOT&lt;br /&gt;
|-&lt;br /&gt;
| zabeth27 || Karl HABRE&lt;br /&gt;
|-&lt;br /&gt;
| zabeth28 || Rémi FARAULT&lt;br /&gt;
|-&lt;br /&gt;
| zabeth30 || Prénom Nom&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Répartition des binômes en PRA ==&lt;br /&gt;
&lt;br /&gt;
Concertez-vous pour trouver des noms de machines de services et de machines mandataires dans deux thèmes.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Cahier !! Nom machine services &lt;br /&gt;
!IP machine services !! Nom de domaine !! Nom machine mandataire &lt;br /&gt;
!IP machine mandataires!! Elève &lt;br /&gt;
|-&lt;br /&gt;
| [[Atelier SysRes SE5 2023/2024 E1 | Cahier n°1]]&lt;br /&gt;
| || || || || || Prénom Nom&lt;br /&gt;
|-&lt;br /&gt;
| [[Atelier SysRes SE5 2023/2024 E2 | Cahier n°2]]&lt;br /&gt;
| Elom|| || || Baloo|| || Elias SIMON&lt;br /&gt;
|-&lt;br /&gt;
| [[Atelier SysRes SE5 2023/2024 E3 | Cahier n°3]]&lt;br /&gt;
| Mustafar (Mustafare)|| || mustafare.lol|| Baloo|| 193.48.57.189|| Mathis RIFFAUT&lt;br /&gt;
|-&lt;br /&gt;
| [[Atelier SysRes SE5 2023/2024 E4 | Cahier n°4]]&lt;br /&gt;
| Dagobah|| || || Aladin|| || Dann RODENBURG&lt;br /&gt;
|-&lt;br /&gt;
| [[Atelier SysRes SE5 2023/2024 E5 | Cahier n°5]]&lt;br /&gt;
| Motis|| || || Dingo|| || Mohammed Halaoui&lt;br /&gt;
|-&lt;br /&gt;
| [[Atelier SysRes SE5 2023/2024 E6 | Cahier n°6]]&lt;br /&gt;
| bogano|| || || Timon|| || Benjamin Nguyen&lt;br /&gt;
|-&lt;br /&gt;
| [[Atelier SysRes SE5 2023/2024 E7 | Cahier n°7]]&lt;br /&gt;
| Takobo|| || || Timon|| 193.48.57.184|| Timothé Brenier&lt;br /&gt;
|-&lt;br /&gt;
| [[Atelier SysRes SE5 2023/2024 E8 | Cahier n°8]]&lt;br /&gt;
| Fondor|| || || mushu|| 193.48.57.190|| Florian Vallée&lt;br /&gt;
|-&lt;br /&gt;
| [[Atelier SysRes SE5 2023/2024 E9 | Cahier n°9]]&lt;br /&gt;
| hoth|| || || BlancheNeige|| 193.48.57.187|| Haitam Blgrim&lt;br /&gt;
|-&lt;br /&gt;
| [[Atelier SysRes SE5 2023/2024 E10 | Cahier n°10]]&lt;br /&gt;
| Abafar|| || abafar.lol|| Aladin|| 193.48.57.179|| Amine SELLALI&lt;br /&gt;
|-&lt;br /&gt;
| [[Atelier SysRes SE5 2023/2024 E11 | Cahier n°11]]&lt;br /&gt;
| Rotia|| || || DIngo|| 193.48.57.181|| Rémi Farault&lt;br /&gt;
|-&lt;br /&gt;
| [[Atelier SysRes SE5 2023/2024 E12 | Cahier n°12]]&lt;br /&gt;
| jedha|| || || judy|| 193.48.57.182|| Julien Charleux&lt;br /&gt;
|-&lt;br /&gt;
| [[Atelier SysRes SE5 2023/2024 E13 | Cahier n°13]]&lt;br /&gt;
| Bogden|| || || BlancheNeige|| || Black Baptiste&lt;br /&gt;
|-&lt;br /&gt;
| [[Atelier SysRes SE5 2023/2024 E14 | Cahier n°14]]&lt;br /&gt;
| endor|| 10.10.10.10|| || mickey|| 193.48.57.188 / 10.10.10.1|| Maël Delaby&lt;br /&gt;
|-&lt;br /&gt;
| [[Atelier SysRes SE5 2023/2024 E15 | Cahier n°15]]&lt;br /&gt;
| jiruus|| || || cruella|| || Jeanne Delcourt&lt;br /&gt;
|-&lt;br /&gt;
| [[Atelier SysRes SE5 2023/2024 E16 | Cahier n°16]]&lt;br /&gt;
| exegol|| || || cruella|| 193.48.57.186|| Estelle Godard&lt;br /&gt;
|-&lt;br /&gt;
| [[Atelier SysRes SE5 2023/2024 E17 | Cahier n°17]]&lt;br /&gt;
| Jakku|| || || Jafar|| || Jason DELANNOY&lt;br /&gt;
|-&lt;br /&gt;
| [[Atelier SysRes SE5 2023/2024 E18 | Cahier n°18]]&lt;br /&gt;
| naboo|| 192.168.18.2|| naboo.lol|| bouh|| 193.48.57.180 / 192.168.18.1|| Chloé Lemaire&lt;br /&gt;
|-&lt;br /&gt;
| [[Atelier SysRes SE5 2023/2024 E19 | Cahier n°19]]&lt;br /&gt;
| geonosis|| 192.168.18.3|| geonosis.lol|| bouh|| || Gabriel THOMAS&lt;br /&gt;
|-&lt;br /&gt;
| [[Atelier SysRes SE5 2023/2024 E20 | Cahier n°20]]&lt;br /&gt;
| alderaan|| || || Jafar|| 193.48.57.183|| Albin MOUTON&lt;br /&gt;
|-&lt;br /&gt;
| [[Atelier SysRes SE5 2023/2024 E21 | Cahier n°21]]&lt;br /&gt;
| kesh|| || || Judy|| || Konstantin Patrikeev&lt;br /&gt;
|-&lt;br /&gt;
| [[Atelier SysRes SE5 2023/2024 E22 | Cahier n°22]]&lt;br /&gt;
| kashyyyk|| || || mushu|| || Maxime BALBASTRE&lt;br /&gt;
|-&lt;br /&gt;
| [[Atelier SysRes SE5 2023/2024 E23 | Cahier n°23]]&lt;br /&gt;
| Felucia|| || || || 193.48.57.185|| François NAUDOT&lt;br /&gt;
|-&lt;br /&gt;
| [[Atelier SysRes SE5 2023/2024 E24 | Cahier n°24]]&lt;br /&gt;
| Pelagon|| 10.10.10.11|| || mickey|| 193.48.57.188 / 10.10.10.1|| Paul Amoros&lt;br /&gt;
|-&lt;br /&gt;
|[[Atelier SysRes SE5 2023/2024 E24 | Cahier n°25]]&lt;br /&gt;
|Kalee&lt;br /&gt;
|&lt;br /&gt;
|kalee.lol&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|Karl Habre&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Contrôle continu ==&lt;br /&gt;
&lt;br /&gt;
=== Contrôle du 20/11/2023 ===&lt;br /&gt;
&lt;br /&gt;
A noter qu'aucune machine, quelle soit de service ou mandataire, ne peut avoir accès à Internet vu qu'aucun effort n'a été fait pour relier le serveur &amp;lt;code&amp;gt;capbreton&amp;lt;/code&amp;gt; au réseau SE5.&lt;br /&gt;
&lt;br /&gt;
Machines de service.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Elève !! Nom machine !! Configuration IP&lt;br /&gt;
|-&lt;br /&gt;
| Elom || Elias SIMON || une seule interface dans le &amp;lt;code&amp;gt;.cfg&amp;lt;/code&amp;gt; (CV SE5), pas de configuration IP&lt;br /&gt;
|-&lt;br /&gt;
| Mustafar|| Mathis RIFFAUT || une seule interface dans le &amp;lt;code&amp;gt;.cfg&amp;lt;/code&amp;gt; (CV SE5), pas de configuration IP&lt;br /&gt;
|-&lt;br /&gt;
| Dagobah|| Dann RODENBURG || une seule interface dans le &amp;lt;code&amp;gt;.cfg&amp;lt;/code&amp;gt; (CV SE5), pas de configuration IP&lt;br /&gt;
|-&lt;br /&gt;
| Motis || Mohammed Halaoui || une seule interface dans le &amp;lt;code&amp;gt;.cfg&amp;lt;/code&amp;gt; (CV SE5), pas de configuration IP&lt;br /&gt;
|-&lt;br /&gt;
| bogano || Benjamin Nguyen || une seule interface dans le &amp;lt;code&amp;gt;.cfg&amp;lt;/code&amp;gt; (CV SE5), pas de configuration IP&lt;br /&gt;
|-&lt;br /&gt;
| Takobo || Timothé Brenier || une seule interface dans le &amp;lt;code&amp;gt;.cfg&amp;lt;/code&amp;gt; (CV SE5), pas de configuration IP&lt;br /&gt;
|-&lt;br /&gt;
| Fondor || Florian Vallée || une seule interface dans le &amp;lt;code&amp;gt;.cfg&amp;lt;/code&amp;gt; (CV SE5), pas de configuration IP&lt;br /&gt;
|-&lt;br /&gt;
| hoth || Haitam Blgrim || une seule interface dans le &amp;lt;code&amp;gt;.cfg&amp;lt;/code&amp;gt; (CV SE5), pas de configuration IP&lt;br /&gt;
|-&lt;br /&gt;
| Abafar || Amine SELLALI || une seule interface dans le &amp;lt;code&amp;gt;.cfg&amp;lt;/code&amp;gt; (CV SE5), pas de configuration IP&lt;br /&gt;
|-&lt;br /&gt;
| Rotia || Rémi Farault || une seule interface dans le &amp;lt;code&amp;gt;.cfg&amp;lt;/code&amp;gt; (CV SE5), pas de configuration IP&lt;br /&gt;
|-&lt;br /&gt;
| jedha || Julien Charleux || une seule interface dans le &amp;lt;code&amp;gt;.cfg&amp;lt;/code&amp;gt; (CV SE5), pas de configuration IP&lt;br /&gt;
|-&lt;br /&gt;
| Bogden || Black Baptiste || une seule interface dans le &amp;lt;code&amp;gt;.cfg&amp;lt;/code&amp;gt; (CV SE5), pas de configuration IP&lt;br /&gt;
|-&lt;br /&gt;
| jiruus || Jeanne Delcourt || une seule interface dans le &amp;lt;code&amp;gt;.cfg&amp;lt;/code&amp;gt; (CV SE5), pas de configuration IP&lt;br /&gt;
|-&lt;br /&gt;
| exegol || Estelle Godard || une seule interface dans le &amp;lt;code&amp;gt;.cfg&amp;lt;/code&amp;gt; (CV SE5), pas de configuration IP&lt;br /&gt;
|-&lt;br /&gt;
| Jakku || Jason DELANNOY || une seule interface dans le &amp;lt;code&amp;gt;.cfg&amp;lt;/code&amp;gt; (CV SE5), pas de configuration IP&lt;br /&gt;
|-&lt;br /&gt;
| naboo || Chloé Lemaire || une seule interface dans le &amp;lt;code&amp;gt;.cfg&amp;lt;/code&amp;gt; (CV SE5), pas de configuration IP&lt;br /&gt;
|-&lt;br /&gt;
| geonosis || Gabriel THOMAS || une seule interface dans le &amp;lt;code&amp;gt;.cfg&amp;lt;/code&amp;gt; (CV SE5), pas de configuration IP&lt;br /&gt;
|-&lt;br /&gt;
| alderaan || Albin MOUTON || une seule interface dans le &amp;lt;code&amp;gt;.cfg&amp;lt;/code&amp;gt; (CV SE5), pas de configuration IP&lt;br /&gt;
|-&lt;br /&gt;
| kesh || Konstantin Patrikeev || une seule interface dans le &amp;lt;code&amp;gt;.cfg&amp;lt;/code&amp;gt; (CV SE5), pas de configuration IP&lt;br /&gt;
|-&lt;br /&gt;
| kashyyyk || Maxime BALBASTRE || une seule interface dans le &amp;lt;code&amp;gt;.cfg&amp;lt;/code&amp;gt; (CV SE5), pas de configuration IP&lt;br /&gt;
|-&lt;br /&gt;
| Felucia || François NAUDOT || une seule interface dans le &amp;lt;code&amp;gt;.cfg&amp;lt;/code&amp;gt; (CV SE5), pas de configuration IP&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Machines mandataires.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Elèves !! Nom machine !! Configuration IP&lt;br /&gt;
|-&lt;br /&gt;
| Elias SIMON &amp;amp; Mathis RIFFAUT || Baloo || une seule interface dans le &amp;lt;code&amp;gt;.cfg&amp;lt;/code&amp;gt; (CV SE5), aucun CV privé, pas de configuration IP&lt;br /&gt;
|-&lt;br /&gt;
| Dann RODENBURG &amp;amp; Amine SELLALI || Aladin || une seule interface dans le &amp;lt;code&amp;gt;.cfg&amp;lt;/code&amp;gt; (CV SE5), aucun CV privé, pas de configuration IP&lt;br /&gt;
|-&lt;br /&gt;
| Mohammed Halaoui &amp;amp; Rémi Farault || Dingo || une seule interface dans le &amp;lt;code&amp;gt;.cfg&amp;lt;/code&amp;gt; (CV SE5), aucun CV privé, pas de configuration IP&lt;br /&gt;
|-&lt;br /&gt;
| Benjamin Nguyen &amp;amp; Timothé Brenier || Timon || une seule interface dans le &amp;lt;code&amp;gt;.cfg&amp;lt;/code&amp;gt; (CV SE5), aucun CV privé, pas de configuration IP&lt;br /&gt;
|-&lt;br /&gt;
| Florian Vallée &amp;amp; Maxime BALBASTRE || mushu || une seule interface dans le &amp;lt;code&amp;gt;.cfg&amp;lt;/code&amp;gt; (CV SE5), aucun CV privé, pas de configuration IP&lt;br /&gt;
|-&lt;br /&gt;
| Haitam Blgrim &amp;amp; Black Baptiste || BlancheNeige || une seule interface dans le &amp;lt;code&amp;gt;.cfg&amp;lt;/code&amp;gt; (CV SE5), aucun CV privé, pas de configuration IP&lt;br /&gt;
|-&lt;br /&gt;
| Jeanne Delcourt &amp;amp; Estelle Godard || cruella || une seule interface dans le &amp;lt;code&amp;gt;.cfg&amp;lt;/code&amp;gt; (CV SE5), aucun CV privé, pas de configuration IP&lt;br /&gt;
|-&lt;br /&gt;
| Jason DELANNOY &amp;amp; Albin MOUTON || Jafar || une seule interface dans le &amp;lt;code&amp;gt;.cfg&amp;lt;/code&amp;gt; (CV SE5), aucun CV privé, pas de configuration IP&lt;br /&gt;
|-&lt;br /&gt;
| Chloé Lemaire &amp;amp; Gabriel THOMAS || bouh || une seule interface dans le &amp;lt;code&amp;gt;.cfg&amp;lt;/code&amp;gt; (CV SE5), aucun CV privé, pas de configuration IP&lt;br /&gt;
|-&lt;br /&gt;
| Konstantin Patrikeev &amp;amp; Julien Charleux || judy || une seule interface dans le &amp;lt;code&amp;gt;.cfg&amp;lt;/code&amp;gt; (CV SE5), aucun CV privé, pas de configuration IP&lt;br /&gt;
|-&lt;br /&gt;
| François NAUDOT || || rien&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Liste des machines&lt;br /&gt;
&lt;br /&gt;
 Elom Mustafar dagobah Motis bogano Takobo Fondor hoth abafar Rotia jedha Bogden jiruus exegol Jakku naboo geonosis alderaan kesh kashyyyk Felucia&lt;br /&gt;
&lt;br /&gt;
 Baloo aladin Dingo Timon mushu BlancheNeige cruella Jafar bouh judy&lt;br /&gt;
&lt;br /&gt;
=== Contrôle du 03/12/2023 ===&lt;br /&gt;
&lt;br /&gt;
Le serveur &amp;lt;code&amp;gt;capbreton&amp;lt;/code&amp;gt; a été relié au réseau SE5 par &amp;lt;code&amp;gt;naboo&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Il est normal de ne pas avoir d'adresse IPv4 sur la machine de services pour l'interface sur le commutateur virtuel. Par contre, avec mise en place de la mascarade sur la machine mandataire, il doit être possible, pour la machine de services, de se connecter à Internet en IPv4.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Elève !! Nom machine !! Configuration IP&lt;br /&gt;
|-&lt;br /&gt;
| Elom || Elias SIMON&lt;br /&gt;
| IPv4 sur CV : 10.0.69.220, pas d'IPv4 sur SE5, IPv6 sur SE5 : 2001:660:4401:60b0:216:3eff:fe0f:b26d, pas de connexion à Internet en IPv4, connexion à Internet en IPv6 possible, pas de résolution DNS fonctionnelle&lt;br /&gt;
|-&lt;br /&gt;
| Mustafar|| Mathis RIFFAUT&lt;br /&gt;
| IPv4 sur CV : 10.0.69.165, pas d'IPv4 sur SE5, IPv6 sur SE5 : 2001:660:4401:60b0:216:3eff:fea9:f79, pas de connexion à Internet en IPv4, connexion à Internet en IPv6 possible, pas de résolution DNS fonctionnelle &lt;br /&gt;
|-&lt;br /&gt;
| Dagobah|| Dann RODENBURG&lt;br /&gt;
| IPv4 sur CV : 10.0.69.205, pas d'IPv4 sur SE5, IPv6 sur SE5 : 2001:660:4401:60b0:216:3eff:fe53:7d33, pas de connexion à Internet en IPv4, connexion à Internet en IPv6 possible, pas de résolution DNS fonctionnelle &lt;br /&gt;
|-&lt;br /&gt;
| Motis || Mohammed Halaoui&lt;br /&gt;
| IPv4 sur CV : 10.0.69.195, pas d'IPv4 sur SE5, IPv6 sur SE5 : 2001:660:4401:60b0:216:3eff:fe7c:2d6a, pas de connexion à Internet en IPv4, connexion à Internet en IPv6 possible, pas de résolution DNS fonctionnelle &lt;br /&gt;
|-&lt;br /&gt;
| bogano || Benjamin Nguyen&lt;br /&gt;
| IPv4 sur CV : 10.0.69.245, pas d'IPv4 sur SE5, IPv6 sur SE5 : 2001:660:4401:60b0:216:3eff:fe62:6960, pas de connexion à Internet en IPv4, connexion à Internet en IPv6 possible, pas de résolution DNS fonctionnelle&lt;br /&gt;
|-&lt;br /&gt;
| Takobo || Timothé Brenier&lt;br /&gt;
| IPv4 sur CV : 10.0.69.181, pas d'IPv4 sur SE5, IPv6 sur SE5 : 2001:660:4401:60b0:216:3eff:fe93:8c48, pas de connexion à Internet en IPv4, connexion à Internet en IPv6 possible, pas de résolution DNS fonctionnelle&lt;br /&gt;
|-&lt;br /&gt;
| Fondor || Florian Vallée&lt;br /&gt;
| IPv4 sur CV : 10.0.69.200, pas d'IPv4 sur SE5, IPv6 sur SE5 : 2001:660:4401:60b0:216:3eff:fe2d:82bf, pas de connexion à Internet en IPv4, connexion à Internet en IPv6 possible, pas de résolution DNS fonctionnelle&lt;br /&gt;
|-&lt;br /&gt;
| hoth || Haitam Blgrim&lt;br /&gt;
| IPv4 sur CV : 10.0.69.157, pas d'IPv4 sur SE5, IPv6 sur SE5 : 2001:660:4401:60b0:216:3eff:fee8:4736, pas de connexion à Internet en IPv4, connexion à Internet en IPv6 possible, pas de résolution DNS fonctionnelle &lt;br /&gt;
|-&lt;br /&gt;
| Abafar || Amine SELLALI&lt;br /&gt;
| IPv4 sur CV : 10.0.69.233, pas d'IPv4 sur SE5, IPv6 sur SE5 : 2001:660:4401:60b0:216:3eff:feae:bcbb, pas de connexion à Internet en IPv4, connexion à Internet en IPv6 possible, pas de résolution DNS fonctionnelle&lt;br /&gt;
|-&lt;br /&gt;
| Rotia || Rémi Farault&lt;br /&gt;
| IPv4 sur CV : 10.0.69.130, pas d'IPv4 sur SE5, IPv6 sur SE5 : 2001:660:4401:60b0:216:3eff:fe2e:ec48, pas de connexion à Internet en IPv4, connexion à Internet en IPv6 possible, pas de résolution DNS fonctionnelle&lt;br /&gt;
|-&lt;br /&gt;
| jedha || Julien Charleux&lt;br /&gt;
| IPv4 sur CV : 10.0.69.221, pas d'IPv4 sur SE5, IPv6 sur SE5 : 2001:660:4401:60b0:216:3eff:fef6:364f, pas de connexion à Internet en IPv4, connexion à Internet en IPv6 possible, pas de résolution DNS fonctionnelle&lt;br /&gt;
|-&lt;br /&gt;
| Bogden || Black Baptiste&lt;br /&gt;
| IPv4 sur CV : 10.0.69.246, pas d'IPv4 sur SE5, IPv6 sur SE5 : 2001:660:4401:60b0:216:3eff:fe67:89fd, pas de connexion à Internet en IPv4, connexion à Internet en IPv6 possible, pas de résolution DNS fonctionnelle&lt;br /&gt;
|-&lt;br /&gt;
| jiruus || Jeanne Delcourt&lt;br /&gt;
| IPv4 sur CV : 10.0.69.247, pas d'IPv4 sur SE5, IPv6 sur SE5 : 2001:660:4401:60b0:216:3eff:fe9c:6f0e, pas de connexion à Internet en IPv4, connexion à Internet en IPv6 possible, pas de résolution DNS fonctionnelle&lt;br /&gt;
|-&lt;br /&gt;
| exegol || Estelle Godard&lt;br /&gt;
| IPv4 sur CV : 10.0.69.147, pas d'IPv4 sur SE5, IPv6 sur SE5 : 2001:660:4401:60b0:216:3eff:fe17:bc38, pas de connexion à Internet en IPv4, connexion à Internet en IPv6 possible, pas de résolution DNS fonctionnelle&lt;br /&gt;
|-&lt;br /&gt;
| Jakku || Jason DELANNOY&lt;br /&gt;
| IPv4 sur CV : 10.0.69.136, pas d'IPv4 sur SE5, IPv6 sur SE5 : 2001:660:4401:60b0:216:3eff:fee1:1e4d, pas de connexion à Internet en IPv4, connexion à Internet en IPv6 possible, pas de résolution DNS fonctionnelle&lt;br /&gt;
|-&lt;br /&gt;
| naboo || Chloé Lemaire&lt;br /&gt;
| IPv4 sur CV : 192.168.18.2, pas d'IPv4 sur SE5, IPv6 sur SE5 : 2001:660:4401:60b0:216:3eff:fef2:7e2, pas de connexion à Internet en IPv4, connexion à Internet en IPv6 possible, résolution DNS fonctionnelle&lt;br /&gt;
|-&lt;br /&gt;
| geonosis || Gabriel THOMAS&lt;br /&gt;
| IPv4 sur CV : 10.0.69.231, pas d'IPv4 sur SE5, IPv6 sur SE5 : 2001:660:4401:60b0:216:3eff:feb0:b140, pas de connexion à Internet en IPv4, connexion à Internet en IPv6 possible, pas de résolution DNS fonctionnelle&lt;br /&gt;
|-&lt;br /&gt;
| alderaan || Albin MOUTON&lt;br /&gt;
| IPv4 sur CV : 10.0.69.106, pas d'IPv4 sur SE5, IPv6 sur SE5 : 2001:660:4401:60b0:216:3eff:fe97:2114, pas de connexion à Internet en IPv4, connexion à Internet en IPv6 possible, pas de résolution DNS fonctionnelle&lt;br /&gt;
|-&lt;br /&gt;
| kesh || Konstantin Patrikeev&lt;br /&gt;
| IPv4 sur CV : 10.0.69.222, pas d'IPv4 sur SE5, IPv6 sur SE5 : 2001:660:4401:60b0:216:3eff:fe10:e2cb, pas de connexion à Internet en IPv4, connexion à Internet en IPv6 possible, pas de résolution DNS fonctionnelle&lt;br /&gt;
|-&lt;br /&gt;
| kashyyyk || Maxime BALBASTRE&lt;br /&gt;
| IPv4 sur CV : 10.0.69.240, pas d'IPv4 sur SE5, IPv6 sur SE5 : 2001:660:4401:60b0:216:3eff:feca:73e7, pas de connexion à Internet en IPv4, connexion à Internet en IPv6 possible, pas de résolution DNS fonctionnelle&lt;br /&gt;
|-&lt;br /&gt;
| Felucia || François NAUDOT&lt;br /&gt;
| IPv4 sur CV : 10.0.69.139, pas d'IPv4 sur SE5, IPv6 sur SE5 : 2001:660:4401:60b0:216:3eff:fe89:460a, pas de connexion à Internet en IPv4, connexion à Internet en IPv6 possible, pas de résolution DNS fonctionnelle&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Machines mandataires.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Elèves !! Nom machine !! Configuration IP&lt;br /&gt;
|-&lt;br /&gt;
| Elias SIMON &amp;amp; Mathis RIFFAUT || Baloo &lt;br /&gt;
| IPv4 sur CV : 10.0.69.152, pas d'IPv4 sur SE5, IPv6 sur SE5 : 2001:660:4401:60b0:216:3eff:fec8:5379, pas de connexion à Internet en IPv4, connexion à Internet en IPv6 possible, pas de résolution DNS fonctionnelle&lt;br /&gt;
|-&lt;br /&gt;
| Dann RODENBURG &amp;amp; Amine SELLALI || Aladin&lt;br /&gt;
| IPv4 sur CV : 10.0.69.107, pas d'IPv4 sur SE5, IPv6 sur SE5 : 2001:660:4401:60b0:216:3eff:fe6b:c000, pas de connexion à Internet en IPv4, connexion à Internet en IPv6 possible, pas de résolution DNS fonctionnelle&lt;br /&gt;
|-&lt;br /&gt;
| Mohammed Halaoui &amp;amp; Rémi Farault || Dingo&lt;br /&gt;
| IPv4 sur CV : 10.0.69.156, pas d'IPv4 sur SE5, IPv6 sur SE5 : 2001:660:4401:60b0:216:3eff:fe0d:4f9c, pas de connexion à Internet en IPv4, connexion à Internet en IPv6 possible, pas de résolution DNS fonctionnelle&lt;br /&gt;
|-&lt;br /&gt;
| Benjamin Nguyen &amp;amp; Timothé Brenier || Timon&lt;br /&gt;
| IPv4 sur CV : 10.0.69.104, pas d'IPv4 sur SE5, IPv6 sur SE5 : 2001:660:4401:60b0:216:3eff:fedc:7539, pas de connexion à Internet en IPv4, connexion à Internet en IPv6 possible, pas de résolution DNS fonctionnelle&lt;br /&gt;
|-&lt;br /&gt;
| Florian Vallée &amp;amp; Maxime BALBASTRE || mushu&lt;br /&gt;
| IPv4 sur CV : 10.0.69.160, pas d'IPv4 sur SE5, IPv6 sur SE5 : 2001:660:4401:60b0:216:3eff:fe20:8816, pas de connexion à Internet en IPv4, connexion à Internet en IPv6 possible, pas de résolution DNS fonctionnelle&lt;br /&gt;
|-&lt;br /&gt;
| Haitam Blgrim &amp;amp; Black Baptiste || BlancheNeige&lt;br /&gt;
| IPv4 sur CV : 10.0.69.182, pas d'IPv4 sur SE5, IPv6 sur SE5 : 2001:660:4401:60b0:216:3eff:feba:38f4, pas de connexion à Internet en IPv4, connexion à Internet en IPv6 possible, pas de résolution DNS fonctionnelle&lt;br /&gt;
|-&lt;br /&gt;
| Jeanne Delcourt &amp;amp; Estelle Godard || cruella&lt;br /&gt;
| IPv4 sur CV : 10.0.69.108, pas d'IPv4 sur SE5, IPv6 sur SE5 : 2001:660:4401:60b0:216:3eff:fee5:ff99, pas de connexion à Internet en IPv4, connexion à Internet en IPv6 possible, pas de résolution DNS fonctionnelle&lt;br /&gt;
|-&lt;br /&gt;
| Jason DELANNOY &amp;amp; Albin MOUTON || Jafar&lt;br /&gt;
| IPv4 sur CV : 10.0.69.171, pas d'IPv4 sur SE5, IPv6 sur SE5 : 2001:660:4401:60b0:216:3eff:fe3e:f0bb, pas de connexion à Internet en IPv4, connexion à Internet en IPv6 possible, pas de résolution DNS fonctionnelle&lt;br /&gt;
|-&lt;br /&gt;
| Chloé Lemaire &amp;amp; Gabriel THOMAS || bouh&lt;br /&gt;
| IPv4 sur CV : 192.168.18.1, IPv4 sur SE5 : 193.48.57.180, IPv6 sur SE5 : 2001:660:4401:60b0:216:3eff:fe4f:dde2, connexion à Internet en IPv4 possible, connexion à Internet en IPv6 possible, résolution DNS fonctionnelle&lt;br /&gt;
|-&lt;br /&gt;
| Konstantin Patrikeev &amp;amp; Julien Charleux || judy&lt;br /&gt;
| IPv4 sur CV : 10.0.69.216, pas d'IPv4 sur SE5, IPv6 sur SE5 : 2001:660:4401:60b0:216:3eff:fe7d:4762, pas de connexion à Internet en IPv4, connexion à Internet en IPv6 possible, pas de résolution DNS fonctionnelle&lt;br /&gt;
|-&lt;br /&gt;
| François NAUDOT || &lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Contrôle du 11/01/2024 ===&lt;br /&gt;
&lt;br /&gt;
Il est normal de ne pas avoir d'adresse IPv4 sur la machine de services pour l'interface sur le commutateur virtuel. Par contre, avec mise en place de la mascarade sur la machine mandataire, il doit être possible, pour la machine de services, de se connecter à Internet en IPv4.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Elève !! Nom machine !! Interfaces dans SE5 et CV !! Domaine Internet !! Accès &amp;lt;code&amp;gt;ssh&amp;lt;/code&amp;gt; root !! DNS installé&lt;br /&gt;
|-&lt;br /&gt;
| Elom || Elias SIMON&lt;br /&gt;
| SE5 uniquement || &amp;lt;code&amp;gt;elom.lol&amp;lt;/code&amp;gt;&lt;br /&gt;
| Non || Non&lt;br /&gt;
|-&lt;br /&gt;
| Mustafar|| Mathis RIFFAUT&lt;br /&gt;
| SE5 uniquement || &amp;lt;code&amp;gt;mustafare.lol&amp;lt;/code&amp;gt;&lt;br /&gt;
| Non || Non&lt;br /&gt;
|-&lt;br /&gt;
| Dagobah|| Dann RODENBURG&lt;br /&gt;
| SE5 uniquement || &amp;lt;code&amp;gt;dagobah.lol&amp;lt;/code&amp;gt;&lt;br /&gt;
| Non || Non&lt;br /&gt;
|-&lt;br /&gt;
| Motis || Mohammed Halaoui&lt;br /&gt;
| SE5 uniquement || &amp;lt;code&amp;gt;motis.hair&amp;lt;/code&amp;gt;&lt;br /&gt;
| Non || Non&lt;br /&gt;
|-&lt;br /&gt;
| bogano || Benjamin Nguyen&lt;br /&gt;
| SE5 uniquement || &amp;lt;code&amp;gt;bogano.lol&amp;lt;/code&amp;gt;&lt;br /&gt;
| Non || Non&lt;br /&gt;
|-&lt;br /&gt;
| Takobo || Timothé Brenier&lt;br /&gt;
| SE5 uniquement || &amp;lt;code&amp;gt;takobo.lol&amp;lt;/code&amp;gt;&lt;br /&gt;
| Non || Non&lt;br /&gt;
|-&lt;br /&gt;
| Fondor || Florian Vallée&lt;br /&gt;
| SE5 uniquement || &amp;lt;code&amp;gt;fondor.lol&amp;lt;/code&amp;gt;&lt;br /&gt;
| Non || Non&lt;br /&gt;
|-&lt;br /&gt;
| hoth || Haitam Blgrim&lt;br /&gt;
| SE5 uniquement || &amp;lt;code&amp;gt;hoth.lol&amp;lt;/code&amp;gt;&lt;br /&gt;
| Non || Non&lt;br /&gt;
|-&lt;br /&gt;
| Abafar || Amine SELLALI&lt;br /&gt;
| SE5 uniquement || &amp;lt;code&amp;gt;abafar.lol&amp;lt;/code&amp;gt;&lt;br /&gt;
| Non || Non&lt;br /&gt;
|-&lt;br /&gt;
| Rotia || Rémi Farault&lt;br /&gt;
| SE5 uniquement || Aucun&lt;br /&gt;
| Ajouté || Non&lt;br /&gt;
|-&lt;br /&gt;
| jedha || Julien Charleux&lt;br /&gt;
| SE5 uniquement || Aucun&lt;br /&gt;
| Non || Non&lt;br /&gt;
|-&lt;br /&gt;
| Bogden || Black Baptiste&lt;br /&gt;
| SE5 uniquement || &amp;lt;code&amp;gt;bodgen.lol&amp;lt;/code&amp;gt;&lt;br /&gt;
| Non || Non&lt;br /&gt;
|-&lt;br /&gt;
| jiruus || Jeanne Delcourt&lt;br /&gt;
| SE5 uniquement || &amp;lt;code&amp;gt;jiruus.lol&amp;lt;/code&amp;gt;&lt;br /&gt;
| Ajouté || Non&lt;br /&gt;
|-&lt;br /&gt;
| exegol || Estelle Godard&lt;br /&gt;
| SE5 uniquement || &amp;lt;code&amp;gt;exegol.lol&amp;lt;/code&amp;gt;&lt;br /&gt;
| Ajouté || Non&lt;br /&gt;
|-&lt;br /&gt;
| Jakku || Jason DELANNOY&lt;br /&gt;
| SE5 uniquement || &amp;lt;code&amp;gt;jakku.lol&amp;lt;/code&amp;gt;&lt;br /&gt;
| Ajouté || Non&lt;br /&gt;
|-&lt;br /&gt;
| naboo || Chloé Lemaire&lt;br /&gt;
| SE5 uniquement || &amp;lt;code&amp;gt;naboo.lol&amp;lt;/code&amp;gt;&lt;br /&gt;
| Ajouté || Non&lt;br /&gt;
|-&lt;br /&gt;
| geonosis || Gabriel THOMAS&lt;br /&gt;
| SE5 uniquement || &amp;lt;code&amp;gt;geonosis.lol&amp;lt;/code&amp;gt;&lt;br /&gt;
| Ajouté || Non&lt;br /&gt;
|-&lt;br /&gt;
| alderaan || Albin MOUTON&lt;br /&gt;
| SE5 uniquement || &amp;lt;code&amp;gt;alderaan.website&amp;lt;/code&amp;gt;&lt;br /&gt;
| Ajouté || Non&lt;br /&gt;
|-&lt;br /&gt;
| kesh || Konstantin Patrikeev&lt;br /&gt;
| SE5 uniquement || &amp;lt;code&amp;gt;kesh.lol&amp;lt;/code&amp;gt;&lt;br /&gt;
| Non || Non&lt;br /&gt;
|-&lt;br /&gt;
| kashyyyk || Maxime BALBASTRE&lt;br /&gt;
| SE5 uniquement || &amp;lt;code&amp;gt;kashyyyk.lol&amp;lt;/code&amp;gt;&lt;br /&gt;
| Non || Non&lt;br /&gt;
|-&lt;br /&gt;
| Felucia || François NAUDOT&lt;br /&gt;
| SE5 uniquement || &amp;lt;code&amp;gt;felucia.lol&amp;lt;/code&amp;gt;&lt;br /&gt;
| Non || Non&lt;br /&gt;
|-&lt;br /&gt;
| pelagon || Paul AMOROS&lt;br /&gt;
| activée le 11/01/2024 (IPv6 &amp;lt;code&amp;gt;2001:660:4401:60b0:216:3eff:fe03:2af3&amp;lt;/code&amp;gt;) || &amp;lt;code&amp;gt;pelagon.lol&amp;lt;/code&amp;gt;&lt;br /&gt;
| Non || Non&lt;br /&gt;
|-&lt;br /&gt;
| Kalee || Karl HABRE&lt;br /&gt;
| pas de machine virtuelle || &amp;lt;code&amp;gt;kalee.lol&amp;lt;/code&amp;gt;&lt;br /&gt;
| Non || Non&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Machines mandataires.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Elèves !! Nom machine !! Commutateur virtuel !! Interfaces dans SE5 et CV !! Accès &amp;lt;code&amp;gt;ssh&amp;lt;/code&amp;gt; root !! DNS installé&lt;br /&gt;
|-&lt;br /&gt;
| Elias SIMON &amp;amp; Mathis RIFFAUT || Baloo &lt;br /&gt;
| Non || Non&lt;br /&gt;
| Non || Non&lt;br /&gt;
|-&lt;br /&gt;
| Dann RODENBURG &amp;amp; Amine SELLALI || Aladin&lt;br /&gt;
| Non || Non&lt;br /&gt;
| Non || Non&lt;br /&gt;
|-&lt;br /&gt;
| Mohammed Halaoui &amp;amp; Rémi Farault || Dingo&lt;br /&gt;
| Non || Non&lt;br /&gt;
| Non || Non&lt;br /&gt;
|-&lt;br /&gt;
| Benjamin Nguyen &amp;amp; Timothé Brenier || Timon&lt;br /&gt;
| Non || Non&lt;br /&gt;
| Non || Non&lt;br /&gt;
|-&lt;br /&gt;
| Florian Vallée &amp;amp; Maxime BALBASTRE || mushu&lt;br /&gt;
| Non || Non&lt;br /&gt;
| Non || Non&lt;br /&gt;
|-&lt;br /&gt;
| Haitam Blgrim &amp;amp; Black Baptiste || BlancheNeige&lt;br /&gt;
| Non || Non&lt;br /&gt;
| Non || Non&lt;br /&gt;
|-&lt;br /&gt;
| Jeanne Delcourt &amp;amp; Estelle Godard || cruella&lt;br /&gt;
| Non || Non&lt;br /&gt;
| Ajouté || Non&lt;br /&gt;
|-&lt;br /&gt;
| Jason DELANNOY &amp;amp; Albin MOUTON || Jafar&lt;br /&gt;
| Non || Non&lt;br /&gt;
| Ajouté || Non&lt;br /&gt;
|-&lt;br /&gt;
| Chloé Lemaire &amp;amp; Gabriel THOMAS || bouh&lt;br /&gt;
| Oui || Oui&lt;br /&gt;
| Ajouté || Non&lt;br /&gt;
|-&lt;br /&gt;
| Konstantin Patrikeev &amp;amp; Julien Charleux || judy&lt;br /&gt;
| Non || Non&lt;br /&gt;
| Non || Non&lt;br /&gt;
|-&lt;br /&gt;
| François NAUDOT || mandataire inconnu&lt;br /&gt;
| || &lt;br /&gt;
| || &lt;br /&gt;
|-&lt;br /&gt;
| Paul AMOROS || mandataire inconnu&lt;br /&gt;
| || &lt;br /&gt;
| || &lt;br /&gt;
|-&lt;br /&gt;
| Karl HABRE || mandataire inconnu&lt;br /&gt;
| || &lt;br /&gt;
| || &lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Répartition des binômes en ASR ==&lt;br /&gt;
&lt;br /&gt;
Donnez les élèves dans chaque groupe.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Groupe !! Elèves &lt;br /&gt;
|-&lt;br /&gt;
| g1 || Konstantin Patrikeev &amp;amp; Julien Charleux &lt;br /&gt;
|-&lt;br /&gt;
| g2 || Chloé Lemaire &amp;amp; Gabriel Thomas&lt;br /&gt;
|-&lt;br /&gt;
| g3 || Timothé Brenier &amp;amp; Benjamin Nguyen&lt;br /&gt;
|-&lt;br /&gt;
| g4 || François Naudot &amp;amp; Dann Rodenburg &lt;br /&gt;
|-&lt;br /&gt;
| g5 || Maël Delaby &amp;amp; Paul Amoros &lt;br /&gt;
|-&lt;br /&gt;
| g6 || Haitam Blgrim &amp;amp; Baptiste Black &lt;br /&gt;
|-&lt;br /&gt;
| g7 || Jason Delannoy &amp;amp; Albin Mouton &lt;br /&gt;
|-&lt;br /&gt;
| g8 || Elias Simon &amp;amp; Mathis Riffaut &lt;br /&gt;
|-&lt;br /&gt;
| g10 || Estelle Godard &amp;amp; Jeanne Delcourt&lt;br /&gt;
|-&lt;br /&gt;
| g11 || Karl Habre &amp;amp; Amine Sellali &lt;br /&gt;
|-&lt;br /&gt;
| g12 || Mohammed Halaoui &amp;amp; Rémi Farault &lt;br /&gt;
|-&lt;br /&gt;
|g13&lt;br /&gt;
|Maxime Balbastre &amp;amp; Florian Vallée&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Le 05/11/2023, aucun commutateur virtuel correctement configuré, soit une adresse IPv4 sur le commutateur pour aucune raison, soit une configuration &amp;lt;code&amp;gt;static&amp;lt;/code&amp;gt; non adaptée, pas de &amp;lt;code&amp;gt;up&amp;lt;/code&amp;gt; sur le commutateur virtuel.&lt;br /&gt;
&lt;br /&gt;
== Contrôle continu ==&lt;br /&gt;
&lt;br /&gt;
=== Contrôle au 05/11/2023 ===&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Groupe !! Elèves !! Migration !! Archi. penfret !! Archi. antifer&lt;br /&gt;
|-&lt;br /&gt;
| g1 || Konstantin Patrikeev &amp;amp; Julien Charleux || || jcharleu, CV conf. erronée, MV interf. vlan50, pas de config. IPv4 || kpatrikee, CV conf. erronée, MV interf. vlan50, pas de config. IPv4, routeur mauvais disque dans le &amp;lt;code&amp;gt;.cfg&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| g2 || Chloé Lemaire &amp;amp; Gabriel Thomas || || gthomas, CV conf. erronée, MV mdp erroné, interf. vlan50 || clemair1, CV conf. erronée, MV interf. vlan50, pas de config. IPv4, routeur lancé, une seule interface réseau, pas de config. réseau&lt;br /&gt;
|-&lt;br /&gt;
| g3 || Timothé Brenier &amp;amp; Benjamin Nguyen || || bnguyen1, CV conf. erronée, MV interf. vlan50, pas de config. IPv4 || tbrenier, CV conf. erronée, MV interf. vlan50, pas de config. IPv4, routeur mauvais disque dans le &amp;lt;code&amp;gt;.cfg&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| g4 || François Naudot &amp;amp; Dann Rodenburg || || drodenbu, CV conf. erronée, MV interf. vlan50, pas de config. IPv4 || fnaudot, CV conf. erronée, MV interf. vlan50, pas de config. IPv4, routeur mauvais disque dans le &amp;lt;code&amp;gt;.cfg&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| g5 || Maël Delaby &amp;amp; Paul Amoros || || pas de CV, pas de MV || mdelaby, CV conf. erronée, pygrub dans la MV ? pas de routeur, faut lui créer son propre &amp;lt;code&amp;gt;.cfg&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| g6 || Haitam Blgrim &amp;amp; Baptiste Black || || hblgrim, CV conf. erronée, MV avec 2 interfaces, pas de MAC sur la 1ère, config. IPv4 OK || bblack, CV commenté, pas de MV (plus exactement une machine visible via &amp;lt;code&amp;gt;xen list&amp;lt;/code&amp;gt; mais pas de &amp;lt;code&amp;gt;.cfg&amp;lt;/code&amp;gt; dans &amp;lt;code&amp;gt;/etc/xen&amp;lt;/code&amp;gt;), pas de routeur OpenWRT&lt;br /&gt;
|-&lt;br /&gt;
| g7 || Jason Delannoy &amp;amp; Albin Mouton || || jdelanno, CV conf. erronée, MV interf. vlan50, pas de config. IPv4 || amouton, CV conf. erronée, MV interf. vlan50, pas de config. IPv4, routeur lancé, une seule interface réseau&lt;br /&gt;
|-&lt;br /&gt;
| g8 || Elias Simon &amp;amp; Mathis Riffaut || || mriffaut, CV conf. erronée, MV interf. vlan50, pas de config. IPv4 || esimon, CV conf. erronée, MV interf. vlan50, pas de config. IPv4, pas de routeur&lt;br /&gt;
|-&lt;br /&gt;
| g10 || Estelle Godard &amp;amp; Jeanne Delcourt || || jdelcour, CV conf. erronée, MV interf. vlan50, pas de config. IPv4 || egodard, CV conf. erronée, MV interf. vlan50, pas de config. IPv4, routeur lancé, deux interfaces réseau, changez l'ordre des interfaces dans le &amp;lt;code&amp;gt;.cfg&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| g11 || Karl Habre &amp;amp; Amine Sellali || || khabre, CV conf. erronée, MV non créée, MV interf. vlan50, pas de config. IPv4 || asellali, CV conf. erronée, MV interf. vlan50, pas de config. IPv4, routeur avec une définition de disque aberrante dans le &amp;lt;code&amp;gt;.cfg&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| g12 || Mohammed Halaoui &amp;amp; Rémi Farault || || rfarault, CV conf. erronée, MV interf. vlan50, pas de config. IPv4 || pas de CV, MV interf. vlan50, pas de config. IPv4, pas de routeur&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Contrôle au 20/11/2023 ===&lt;br /&gt;
&lt;br /&gt;
A noter qu'un sacré coup de pouce aura été nécessaire pour configurer le routeur de promotion, avec un seul élève en appui.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Groupe !! Elèves !! Migration !! Archi. penfret !! Archi. antifer&lt;br /&gt;
|-&lt;br /&gt;
| g1 || Konstantin Patrikeev &amp;amp; Julien Charleux || || jcharleu, CV configuration toujours erronée, pas de VLAN, MV avec une seule interface (vlan50), toujours pas de configuration IPv4 correcte || kpatrikee, CV configuration toujours erronée, pas de VLAN, MV avec une seule interface réseau (dans le vlan50), pas de configuration IPv4 correcte, pour le routeur toujours une mauvaise définition de disque dans le &amp;lt;code&amp;gt;.cfg&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| g2 || Chloé Lemaire &amp;amp; Gabriel Thomas || || gthomas, CV configuration toujours erronée, pas de VLAN, MV avec une seule interface (vlan50), pas de configuration IPv4 correcte || clemair1, CV configuré, VLAN configuré, MV lancée et totalement configurée en IPv4, routeur lancé et correctement configuré&lt;br /&gt;
|-&lt;br /&gt;
| g3 || Timothé Brenier &amp;amp; Benjamin Nguyen || || bnguyen1, CV conf. toujours erronée, pas de VLAN, MV avec une seule interface (vlan50), toujours pas de configuration IPv4 correcte || tbrenier, CV configuration toujours erronée, pas de VLAN, MV avec une seule interface réseau (dans le vlan50), pas de configuration IPv4 correcte, pour le routeur toujours une mauvaise définition de disque dans le &amp;lt;code&amp;gt;.cfg&amp;lt;/code&amp;gt;, deux interfaces cependant&lt;br /&gt;
|-&lt;br /&gt;
| g4 || François Naudot &amp;amp; Dann Rodenburg || || drodenbu, CV conf. toujours erronée, pas de VLAN, MV avec une seule interface (vlan50), toujours pas de configuration IPv4 correcte || fnaudot, CV configuration toujours erronée, pas de VLAN, MV avec une seule interface réseau (dans le vlan50), pas de configuration IPv4 correcte, pour le routeur toujours une mauvaise définition de disque dans le &amp;lt;code&amp;gt;.cfg&amp;lt;/code&amp;gt;, deux interfaces cependant&lt;br /&gt;
|-&lt;br /&gt;
| g5 || Maël Delaby &amp;amp; Paul Amoros || || toujours pas de CV, pas de VLAN, toujours pas de MV || mdelaby, CV configuration toujours erronée, pas de VLAN, toujours le bootloader &amp;lt;code&amp;gt;pygrub&amp;lt;/code&amp;gt; dans la MV (commenté), MV avec une seule interface réseau (dans le CV), configuration DHCP OK pour l'interface (dans le CV), toujours pas de routeur : il faut lui créer son propre &amp;lt;code&amp;gt;.cfg&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| g6 || Haitam Blgrim &amp;amp; Baptiste Black || || hblgrim, CV conf. toujours erronée, pas de VLAN, MV ne démarre pas à cause de l'erreur sur le CV (correction ReX sur le CV), MV avec 2 interfaces, pas de MAC sur la première interface dans le .cfg, configuration IPv4 OK dans la MV || bblack, CV configuration toujours erronée, pas de VLAN, toujours pas e &amp;lt;code&amp;gt;.cfg&amp;lt;/code&amp;gt; pour la MV, un routeur OpenWRT avec la bonne définition de disque, deux interface mais sans @MAC, aucune configuration du routeur&lt;br /&gt;
|-&lt;br /&gt;
| g7 || Jason Delannoy &amp;amp; Albin Mouton || || jdelanno, CV conf. toujours, erronée, pas de VLAN, MV avec une seule interface (vlan50), toujours pas de configuration IPv4 correcte || amouton, CV configuration toujours erronée, pas de VLAN, MV avec une seule interface réseau (dans le vlan50), pas de configuration IPv4 correcte, routeur lancé, une seule interface réseau, pas de configuration du routeur&lt;br /&gt;
|-&lt;br /&gt;
| g8 || Elias Simon &amp;amp; Mathis Riffaut || || mriffaut, CV conf. toujours erronée, pas de VLAN, MV avec une seule interface (vlan50), pas de configuration IPv4 correcte || esimon, CV configuration toujours erronée, pas de VLAN, MV avec une seule interface réseau (dans le vlan50), pas de configuration IPv4 correcte, toujours pas de routeur&lt;br /&gt;
|-&lt;br /&gt;
| g10 || Estelle Godard &amp;amp; Jeanne Delcourt || || jdelcour, CV conf. toujours erronée, pas de VLAN, MV avec une seule interface (vlan50), pas de configuration IPv4 correcte || egodard, CV configuration toujours erronée, pas de VLAN, MV avec une seule interface réseau (dans le vlan50), pas de configuration IPv4 correcte, routeur lancé, deux interfaces réseau, pas de configuration du routeur&lt;br /&gt;
|-&lt;br /&gt;
| g11 || Karl Habre &amp;amp; Amine Sellali || || khabre, CV conf. toujours erronée, pas de VLAN, MV enfin créée avec une seule interface, pas de configuration IPv4 correcte || asellali, CV configuration toujours erronée, pas de VLAN, MV avec une seule interface réseau (dans le vlan50), pas de configuration IPv4 correcte, routeur avec une définition de disque aberrante dans le &amp;lt;code&amp;gt;.cfg&amp;lt;/code&amp;gt;, une seule interface, pas de configuration du routeur&lt;br /&gt;
|-&lt;br /&gt;
| g12 || Mohammed Halaoui &amp;amp; Rémi Farault || || rfarault, CV conf. toujours erronée, pas de VLAN, MV avec une seule interface (vlan50), pas de configuration IPv4 correcte || pas de CV, MV avec une seule interface réseau (dans le vlan50), pas de configuration IPv4 correcte, toujours pas de routeur&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Contrôle au 30/11/2023 ===&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Groupe !! Elèves !! Archi. penfret !! Archi. antifer&lt;br /&gt;
|-&lt;br /&gt;
| g1 || Konstantin Patrikeev &amp;amp; Julien Charleux || jcharleu, CV configuration toujours erronée, pas de VLAN, MV avec une seule interface (vlan50), toujours pas de configuration IPv4 correcte. || kpatrikee, CV et VLAN configurés mais dites moi comment vous trouvez 1 avec la formule &amp;lt;code&amp;gt;6+N%4&amp;lt;/code&amp;gt;, MV avec les bonnes interfaces, inversion dans la configuration IPv4 entre &amp;lt;code&amp;gt;enX0&amp;lt;/code&amp;gt; et &amp;lt;code&amp;gt;enX1&amp;lt;/code&amp;gt;, pour le routeur toujours une mauvaise définition de disque dans le &amp;lt;code&amp;gt;.cfg&amp;lt;/code&amp;gt; par contre les deux interfaces demandées sont présentes.&lt;br /&gt;
|-&lt;br /&gt;
| g2 || Chloé Lemaire &amp;amp; Gabriel Thomas || gthomas, CV configuré, VLAN configuré, MV lancée et totalement configurée en IPv4. || clemair1, CV configuré, VLAN configuré, MV lancée et totalement configurée en IPv4, routeur lancé et correctement configuré.&lt;br /&gt;
|-&lt;br /&gt;
| g3 || Timothé Brenier &amp;amp; Benjamin Nguyen || bnguyen1, CV conf. toujours erronée, pas de VLAN, MV avec une seule interface (vlan50), toujours pas de configuration IPv4 correcte. || tbrenier, CV configuration toujours erronée, pas de VLAN, MV avec une seule interface réseau (dans le vlan50), pas de configuration IPv4 correcte, pour le routeur toujours une mauvaise définition de disque dans le &amp;lt;code&amp;gt;.cfg&amp;lt;/code&amp;gt;, deux interfaces cependant.&lt;br /&gt;
|-&lt;br /&gt;
| g4 || François Naudot &amp;amp; Dann Rodenburg || drodenbu, CV conf. toujours erronée, pas de VLAN, MV avec une seule interface (vlan50), toujours pas de configuration IPv4 correcte. || fnaudot, CV configuration toujours erronée, pas de VLAN, MV avec une seule interface réseau (dans le vlan50), pas de configuration IPv4 correcte, pour le routeur toujours une mauvaise définition de disque dans le &amp;lt;code&amp;gt;.cfg&amp;lt;/code&amp;gt;, deux interfaces cependant.&lt;br /&gt;
|-&lt;br /&gt;
| g5 || Maël Delaby &amp;amp; Paul Amoros || toujours pas de CV, pas de VLAN, toujours pas de MV. || mdelaby, CV configuration toujours erronée, pas de VLAN, toujours le bootloader &amp;lt;code&amp;gt;pygrub&amp;lt;/code&amp;gt; dans la MV (commenté), MV avec un chemin des disques étranges, MV avec une seule interface réseau (dans le CV), configuration DHCP OK pour l'interface (dans le CV), toujours pas de routeur : il faut lui créer son propre &amp;lt;code&amp;gt;.cfg&amp;lt;/code&amp;gt;.&lt;br /&gt;
|-&lt;br /&gt;
| g6 || Haitam Blgrim &amp;amp; Baptiste Black || hblgrim, il manque les directives pour démarrer et arrêter les interfaces mais sinon CV et VLAN configurés, MV lancé et configurée, il ne faut pas de &amp;lt;code&amp;gt;gateway&amp;lt;/code&amp;gt; sur &amp;lt;code&amp;gt;enX1&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;enX0&amp;lt;/code&amp;gt; ne trouve pas son adresse par DHCP à cause du commutateur virtuel non activé. || bblack, CV et VLAN configurés mais pas toutes les directives de démarrage et d'arrêt, toujours pas de &amp;lt;code&amp;gt;.cfg&amp;lt;/code&amp;gt; pour la MV, un routeur OpenWRT avec la bonne définition de disque, deux interface mais sans @MAC, aucune configuration du routeur.&lt;br /&gt;
|-&lt;br /&gt;
| g7 || Jason Delannoy &amp;amp; Albin Mouton || jdelanno, CV conf. toujours, erronée, pas de VLAN, MV avec une seule interface (vlan50), toujours pas de configuration IPv4 correcte; || amouton, CV configuration toujours erronée, pas de VLAN, MV avec une seule interface réseau (dans le vlan50), pas de configuration IPv4 correcte, routeur lancé, une seule interface réseau, pas de configuration du routeur.&lt;br /&gt;
|-&lt;br /&gt;
| g8 || Elias Simon &amp;amp; Mathis Riffaut || mriffaut, CV conf. toujours erronée, pas de VLAN, MV avec une seule interface (vlan50), pas de configuration IPv4 correcte. || esimon, CV configuration toujours erronée, pas de VLAN, MV avec une seule interface réseau (dans le vlan50), pas de configuration IPv4 correcte, toujours pas de routeur.&lt;br /&gt;
|-&lt;br /&gt;
| g10 || Estelle Godard &amp;amp; Jeanne Delcourt || jdelcour, CV configuré, VLAN configuré (par contre l'utilisation de &amp;lt;code&amp;gt;ether4&amp;lt;/code&amp;gt; est impossible), MV lancée et correctement configurée en IPv4, &amp;lt;code&amp;gt;enX0&amp;lt;/code&amp;gt; ne trouve pas son @IPv4 à cause de l'erreur sur le VLAN. || egodard, CV configuré, VLAN configuré (par contre l'utilisation de &amp;lt;code&amp;gt;ether4&amp;lt;/code&amp;gt; est impossible), MV avec deux interfaces, correctement configurée en IPv4, pas d'adresse obtenue par DHCP, problème de l'OpenWRT, routeur OpenWRT avec les bonnes interfaces, l'adresse IPv4 sur SE5 est donnée avec un mauvais masque, linterface &amp;lt;code&amp;gt;enX0&amp;lt;/code&amp;gt; reçoit bien son adresse IPv4 par DHCP.&lt;br /&gt;
|-&lt;br /&gt;
| g11 || Karl Habre &amp;amp; Amine Sellali || khabre, CV configuration toujours erronée, pas de VLAN, MV avec une seule interface, pas de configuration IPv4 correcte || asellali, CV configuration toujours erronée, pas de VLAN, MV avec une seule interface réseau (dans le vlan50), pas de configuration IPv4 correcte, routeur avec une définition de disque aberrante dans le &amp;lt;code&amp;gt;.cfg&amp;lt;/code&amp;gt;, une seule interface, pas de configuration du routeur&lt;br /&gt;
|-&lt;br /&gt;
| g12 || Mohammed Halaoui &amp;amp; Rémi Farault || rfarault, CV configuré, VLAN configuré mais configuration commentée (pourquoi donc ?!), MV lancée et correctement configurée en IPv4, &amp;lt;code&amp;gt;enX0&amp;lt;/code&amp;gt; ne trouve pas son @IPv4 à cause de l'absence d'interface VLAN. || CV configuré, VLAN configuré, MV avec deux interfaces, correctement configurée en IPv4, un routeur avec les deux interfaces demandées, pas d'adresse IPv4 sur SE5, serveur DHCP fonctionnel.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Contrôle au 02/12/2023 ===&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Groupe !! Elèves !! MV &amp;lt;code&amp;gt;penfret&amp;lt;/code&amp;gt; !! MV &amp;lt;code&amp;gt;antifer&amp;lt;/code&amp;gt; !! Routeur OpenWRT&lt;br /&gt;
|-&lt;br /&gt;
| g1 || Konstantin Patrikeev &amp;amp; Julien Charleux&lt;br /&gt;
| IPv4 sur CV : 10.0.69.185, IPv4 sur VLAN50 : 172.126.145.103, IPv6 sur VLAN50 : 2001:660:4401:6050:216:3eff:fe00:a98d, pas de connexion à Internet en IPv4, pas de résolution DNS fonctionnelle&lt;br /&gt;
| IPv4 sur CV : 10.0.69.218, IPv4 sur VLAN50 : 172.26.145.102, IPv6 sur VLAN50 : 2001:660:4401:6050:216:3eff:fe7d:bc44, pas de connexion à Internet en IPv4, pas de résolution DNS fonctionnelle&lt;br /&gt;
| pas d'IPv4 routée sur Internet, une IPv6 routée sur Internet, pas de connexion à Internet en IPv4&lt;br /&gt;
|-&lt;br /&gt;
| g2 || Chloé Lemaire &amp;amp; Gabriel Thomas&lt;br /&gt;
| IPv4 sur CV : 10.0.69.212, IPv4 sur VLAN50 : 172.26.145.105, IPv6 sur VLAN50 : 2001:660:4401:6050:216:3eff:fedb:2ac4, connexion à Internet en IPv4 possible, pas de résolution DNS fonctionnelle&lt;br /&gt;
| IPv4 sur CV : 10.0.69.145, IPv4 sur VLAN50 : 172.26.145.104, IPv6 sur VLAN50 : 2001:660:4401:6050:216:3eff:fe31:b916, connexion à Internet en IPv4 possible, resolution DNS fonctionnelle&lt;br /&gt;
| IPv4 sur Internet : 193.48.57.180, une IPv6 routée sur Internet, connexion à Internet en IPv4 possible&lt;br /&gt;
|-&lt;br /&gt;
| g3 || Timothé Brenier &amp;amp; Benjamin Nguyen &lt;br /&gt;
| MV non contactable sur le VLAN 50 en IPv6&lt;br /&gt;
| pas d'IPv4 sur le CV, IPv4 sur VLAN50 : 172.26.145.106, IPv6 sur VLAN50 : 2001:660:4401:6050:216:3eff:feaa:f292, pas de connexion à Internet en IPv4, pas de résolution DNS fonctionnelle&lt;br /&gt;
| routeur openWRT non fonctionnel&lt;br /&gt;
|-&lt;br /&gt;
| g4 || François Naudot &amp;amp; Dann Rodenburg &lt;br /&gt;
| MV non contactable sur le VLAN 50 en IPv6&lt;br /&gt;
| pas d'IPv4 sur le CV, IPv4 sur VLAN50 : 172.26.145.108, IPv6 sur VLAN50 : 2001:660:4401:6050:216:3eff:fec6:168, pas de connexion à Internet en IPv4, pas de résolution DNS fonctionnelle&lt;br /&gt;
| routeur openWRT non fonctionnel (si ? non, inversion des &amp;lt;code&amp;gt;vif&amp;lt;/code&amp;gt;)&lt;br /&gt;
|-&lt;br /&gt;
| g5 || Maël Delaby &amp;amp; Paul Amoros&lt;br /&gt;
| MV non contactable sur le VLAN 50 en IPv6&lt;br /&gt;
| image disque du fichier de configuration non présente sur &amp;lt;code&amp;gt;antifer&amp;lt;/code&amp;gt;&lt;br /&gt;
| routeur openWRT non fonctionnel&lt;br /&gt;
|-&lt;br /&gt;
| g6 || Haitam Blgrim &amp;amp; Baptiste Black &lt;br /&gt;
| MV non contactable sur le VLAN 50 en IPv6&lt;br /&gt;
| pas de fichier de configuration&lt;br /&gt;
| routeur openWRT non fonctionnel&lt;br /&gt;
|-&lt;br /&gt;
| g7 || Jason Delannoy &amp;amp; Albin Mouton&lt;br /&gt;
| MV non contactable sur le VLAN 50 en IPv6&lt;br /&gt;
| machine non contactable en IPv6 sur le bridgeStudents&lt;br /&gt;
| pas d'adresse MAC dans le fichier de configuration&lt;br /&gt;
|-&lt;br /&gt;
| g8 || Elias Simon &amp;amp; Mathis Riffaut&lt;br /&gt;
| MV non contactable sur le VLAN 50 en IPv6&lt;br /&gt;
| pas d'IPv4 sur le CV, IPv4 sur VLAN50 : 172.26.145.116, IPv6 sur VLAN50 : 2001:660:4401:6050:216:3eff:fe01:754c, pas de connexion à Internet en IPv4, pas de résolution DNS fonctionnelle&lt;br /&gt;
| routeur openWRT non fonctionnel&lt;br /&gt;
|-&lt;br /&gt;
| g10 || Estelle Godard &amp;amp; Jeanne Delcourt&lt;br /&gt;
| IPv4 sur CV : 10.0.69.165, IPv4 sur VLAN50 : 172.26.145.121, IPv6 sur VLAN50 : 2001:660:4401:6050:216:3eff:fe7e:35e1, pas de connexion à Internet en IPv4, pas de résolution DNS fonctionnelle&lt;br /&gt;
| IPv4 sur CV : 10.0.69.132, IPv4 sur VLAN50 : 172.26.145.120, IPv6 sur VLAN50 : 2001:660:4401:6050:216:3eff:feb4:5ea3, pas de connexion à Internet en IPv4, pas de résolution DNS fonctionnelle&lt;br /&gt;
| IPv4 sur Internet : 193.48.57.191, une IPv6 routée sur Internet, pas de connexion à Internet en IPv4&lt;br /&gt;
|-&lt;br /&gt;
| g11 || Karl Habre &amp;amp; Amine Sellali&lt;br /&gt;
| MV non contactable sur le VLAN 50 en IPv6&lt;br /&gt;
| machine non contactable en IPv6 sur le bridgeStudents&lt;br /&gt;
| pas d'adresse MAC dans le fichier de configuration, création du routeur impossible&lt;br /&gt;
|-&lt;br /&gt;
| g12 || Mohammed Halaoui &amp;amp; Rémi Farault&lt;br /&gt;
| pas d'IPv4 sur le CV, IPv4 sur VLAN50 : 172.26.145.125, IPv6 sur VLAN50 : 2001:660:4401:6050:216:3eff:fe54:5aee, pas de connexion à Internet en IPv4, pas de résolution DNS fonctionnelle&lt;br /&gt;
| pas d'IPv4 sur le CV, IPv4 sur VLAN50 : 172.26.145.124, IPv6 sur VLAN50 : 2001:660:4401:6050:216:3eff:fe9a:5186, pas de connexion à Internet en IPv4, pas de résolution DNS fonctionnelle&lt;br /&gt;
| pas d'IPv4 routée sur Internet, pas d'IPv6 routée sur Internet, pas de connexion à Internet en IPv4&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Contrôle au 05/12/2023 ===&lt;br /&gt;
&lt;br /&gt;
Pour utiliser l'interface Web LuCi des openWRT à partir d'une zabeth :&lt;br /&gt;
* vérifiez que vous avez bien une IPv6 routée sur IPv6 (avec &amp;lt;code&amp;gt;ip address show dev eth0&amp;lt;/code&amp;gt;, l'adresse commence par &amp;lt;code&amp;gt;2001:660:4401:60b0:&amp;lt;/code&amp;gt;) ;&lt;br /&gt;
* si vous n'en avez pas, prenez le suffixe (les derniers 8 octets de l'adresse locale, celle qui commence par &amp;lt;code&amp;gt;fe80::&amp;lt;/code&amp;gt;) et créez votre adresse IPv6 routée par la commande :&lt;br /&gt;
  ip address add dev eth0 2001:660:4401:60b0:&amp;lt;suffixe&amp;gt;/64&lt;br /&gt;
bien entendu vous n'aurez oublié de rajouter la route IPv6 par défaut vers le routeur de la promotion :&lt;br /&gt;
  ip -6 route add default via 2001:660:4401:60b0:6a9e:bff:fe46:5a76&lt;br /&gt;
* établissez un tunnel &amp;lt;code&amp;gt;ssh&amp;lt;/code&amp;gt; avec la commande :&lt;br /&gt;
 zabethXX# ssh -L 6443:localhost:6443 root@IPv6&lt;br /&gt;
* connectez vous sur LuCi avec le navigateur de la zabeth pointant sur &amp;lt;code&amp;gt;https://localhost:6443&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Attention l'ordre des interfaces &amp;lt;code&amp;gt;vif&amp;lt;/code&amp;gt; dans le &amp;lt;code&amp;gt;.cfg&amp;lt;/code&amp;gt; a une importance.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Groupe !! Elèves !! MV &amp;lt;code&amp;gt;penfret&amp;lt;/code&amp;gt; !! MV &amp;lt;code&amp;gt;antifer&amp;lt;/code&amp;gt; !! Routeur OpenWRT&lt;br /&gt;
|-&lt;br /&gt;
| g1 || Konstantin Patrikeev &amp;amp; Julien Charleux&lt;br /&gt;
| IPv4 sur CV : 10.0.69.185, IPv4 sur VLAN50 : 172.126.145.103, IPv6 sur VLAN50 : 2001:660:4401:6050:216:3eff:fe00:a98d, pas de connexion à Internet en IPv4, pas de résolution DNS fonctionnelle&lt;br /&gt;
| IPv4 sur CV : 10.0.69.218, IPv4 sur VLAN50 : 172.26.145.102, IPv6 sur VLAN50 : 2001:660:4401:6050:216:3eff:fe7d:bc44, pas de connexion à Internet en IPv4, pas de résolution DNS fonctionnelle&lt;br /&gt;
| pas d'IPv4 routée sur Internet (puis &amp;lt;code&amp;gt;193.48.57.191&amp;lt;/code&amp;gt; donc une erreur), pas d'IPv6 routée sur Internet, pas de connexion à Internet en IPv4&lt;br /&gt;
|-&lt;br /&gt;
| g2 || Chloé Lemaire &amp;amp; Gabriel Thomas&lt;br /&gt;
| IPv4 sur CV : 10.0.69.212, IPv4 sur VLAN50 : 172.26.145.105, IPv6 sur VLAN50 : 2001:660:4401:6050:216:3eff:fedb:2ac4, connexion à Internet en IPv4 possible, pas de résolution DNS fonctionnelle&lt;br /&gt;
| IPv4 sur CV : 10.0.69.145, IPv4 sur VLAN50 : 172.26.145.104, IPv6 sur VLAN50 : 2001:660:4401:6050:216:3eff:fe31:b916, connexion à Internet en IPv4 possible, resolution DNS fonctionnelle&lt;br /&gt;
| IPv4 sur Internet : 193.48.57.180, IPv6 sur Internet : 2001:660:4401:60b0:216:3eff:fe31:b916, connexion à Internet en IPv4 possible&lt;br /&gt;
|-&lt;br /&gt;
| g3 || Timothé Brenier &amp;amp; Benjamin Nguyen &lt;br /&gt;
| IPv4 sur CV : 10.0.69.130, IPv4 sur VLAN50 : 172.26.145.107, IPv6 sur VLAN50 : 2001:660:4401:6050:216:3eff:feff:4c44, connexion à Internet en IPv4 possible, résolution DNS fonctionnelle&lt;br /&gt;
| IPv4 sur CV : 10.0.69.167, IPv4 sur VLAN50 : 172.26.145.106, IPv6 sur VLAN50 : 2001:660:4401:6050:216:3eff:feaa:f292, connexion à Internet en IPv4 possible, pas de résolution DNS fonctionnelle&lt;br /&gt;
| IPv4 sur Internet : 193.48.57.184, IPv6 sur Internet : 2001:660:4401:60b0:216:3eff:feaa:f293, connexion à Internet en IPv4 possible&lt;br /&gt;
|-&lt;br /&gt;
| g4 || François Naudot &amp;amp; Dann Rodenburg &lt;br /&gt;
| IPv4 sur CV : 10.0.69.156, IPv4 sur VLAN50 : 172.26.145.109, IPv6 sur VLAN50 : 2001:660:4401:6050:216:3eff:fe46:70cd, connexion à Internet en IPv4 possible, pas de résolution DNS fonctionnelle&lt;br /&gt;
| IPv4 sur CV : 10.0.69.106, IPv4 sur VLAN50 : 172.26.145.108, IPv6 sur VLAN50 : 2001:660:4401:6050:216:3eff:fec6:168, connexion à Internet en IPv4 possible, pas de résolution DNS fonctionnelle&lt;br /&gt;
| IPv4 sur Internet : 193.48.57.185, IPv6 sur Internet : 2001:660:4401:60b0:216:3eff:fec6:169, connexion à Internet en IPv4 possible&lt;br /&gt;
|-&lt;br /&gt;
| g5 || Maël Delaby &amp;amp; Paul Amoros&lt;br /&gt;
| IPv4 sur CV : 10.0.69.189, IPv4 sur VLAN50 : 172.26.145.111, IPv6 sur VLAN50 : 2001:660:4401:6050:216:3eff:fe14:cdb5, connexion à Internet en IPv4 possible, pas de résolution DNS fonctionnelle&lt;br /&gt;
| IPv4 sur CV : 10.0.69.171, IPv4 sur VLAN50 : 172.26.145.110, IPv6 sur VLAN50 : 2001:660:4401:6050:216:3eff:fe5b:b2b5, connexion à Internet en IPv4 possible, resolution DNS fonctionnelle&lt;br /&gt;
| IPv4 sur Internet : 193.48.57.188, IPv6 sur Internet : 2001:660:4401:60b0:216:3eff:fe5b:b2b6, connexion à Internet en IPv4 possible&lt;br /&gt;
|-&lt;br /&gt;
| g6 || Haitam Blgrim &amp;amp; Baptiste Black &lt;br /&gt;
| IPv4 sur CV : 10.0.69.100, IPv4 sur VLAN50 : 172.26.145.113, IPv6 sur VLAN50 : 2001:660:4401:6050:216:3eff:fef9:2bb9, pas de connexion à Internet en IPv4, pas de résolution DNS fonctionnelle&lt;br /&gt;
| pas de machine virtuelle&lt;br /&gt;
| bloquage du serveur &amp;lt;code&amp;gt;antifer&amp;lt;/code&amp;gt; par installation du routeur openWRT sous la racine, machine non contactable en IPv6 sur le SE5&lt;br /&gt;
|-&lt;br /&gt;
| g7 || Jason Delannoy &amp;amp; Albin Mouton&lt;br /&gt;
| CV non configuré, machine non contactable en IPv6 sur le VLAN50&lt;br /&gt;
| machine non contactable en IPv6 sur le bridgeStudent&lt;br /&gt;
| pas d'adresse MAC dans le &amp;lt;code&amp;gt;.cfg&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| g8 || Elias Simon &amp;amp; Mathis Riffaut&lt;br /&gt;
| CV non configuré, machine non contactable en IPv6 sur le VLAN50&lt;br /&gt;
| machine non contactable en IPv6 sur le bridgeStudents&lt;br /&gt;
| machine non contactable en IPv6 sur le SE5&lt;br /&gt;
|-&lt;br /&gt;
| g10 || Estelle Godard &amp;amp; Jeanne Delcourt&lt;br /&gt;
| IPv4 sur CV : 10.0.69.165, IPv4 sur VLAN50 : 172.26.145.121, IPv6 sur VLAN50 : 2001:660:4401:6050:216:3eff:fe7e:35e1, pas de connexion à Internet en IPv4, pas de résolution DNS fonctionnelle&lt;br /&gt;
| IPv4 sur CV : 10.0.69.132, IPv4 sur VLAN50 : 172.26.145.120, IPv6 sur VLAN50 : 2001:660:4401:6050:216:3eff:feb4:5ea3, pas de connexion à Internet en IPv4, pas de résolution DNS fonctionnelle&lt;br /&gt;
| IPv4 sur Internet : 193.48.57.191 (erreur !!), IPv6 sur Internet : 2001:660:4401:60b0:216:3eff:feb4:5ea4, pas de connexion à Internet en IPv4&lt;br /&gt;
|-&lt;br /&gt;
| g11 || Karl Habre &amp;amp; Amine Sellali&lt;br /&gt;
| machine non contactable en IPv6 sur le VLAN50&lt;br /&gt;
| machine non contactable en IPv6 sur le bridgeStudents&lt;br /&gt;
| pas d'adresse MAC dans le &amp;lt;code&amp;gt;.cfg&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| g12 || Mohammed Halaoui &amp;amp; Rémi Farault&lt;br /&gt;
| IPv4 sur CV : 10.0.69.131, IPv4 sur VLAN50 : 172.26.145.125, IPv6 sur VLAN50 : 2001:660:4401:6050:216:3eff:fe54:5aee, pas de connexion à Internet en IPv4, pas de résolution DNS fonctionnelle&lt;br /&gt;
| pas d'IPv4 sur le CV, IPv4 sur VLAN50 : 172.26.145.124, IPv6 sur VLAN50 : 2001:660:4401:6050:216:3eff:fe9a:5186, pas de connexion à Internet en IPv4, pas de résolution DNS fonctionnelle&lt;br /&gt;
| IPv4 sur Internet : 193.48.57.181, IPv6 sur Internet : 2001:660:4401:60b0:216:3eff:fe9a:5186, pas de connexion à Internet en IPv4&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Pas de changement sur les routeurs OpenWRT à 17h30.&lt;br /&gt;
&lt;br /&gt;
Pas de changement sur les MV d'&amp;lt;code&amp;gt;antifer&amp;lt;/code&amp;gt; à 18h00.&lt;br /&gt;
&lt;br /&gt;
Une seule modification sur les MV de &amp;lt;code&amp;gt;penfret&amp;lt;/code&amp;gt; à 18h15 : la G7 (&amp;lt;code&amp;gt;g7jdelannoVM&amp;lt;/code&amp;gt;) est maintenant contactable (@IPv4 et @IPv6 sur le VLAN50) mais sans rien de plus.&lt;br /&gt;
&lt;br /&gt;
=== Contrôle au 06/12/2023 ===&lt;br /&gt;
&lt;br /&gt;
Données brutes pour les routeurs openWRT (pas de relancement) :&lt;br /&gt;
&lt;br /&gt;
 G1 | IPv4 sur Internet : 193.48.57.191, IPv6 sur Internet : 2001:660:4401:60b0:216:3eff:fe7d:bc44, pas de connexion à Internet en IPv4&lt;br /&gt;
 G2 | IPv4 sur Internet : 193.48.57.180, IPv6 sur Internet : 2001:660:4401:60b0:216:3eff:fe31:b916, connexion à Internet en IPv4 possible&lt;br /&gt;
 G3 | IPv4 sur Internet : 193.48.57.184, IPv6 sur Internet : 2001:660:4401:60b0:216:3eff:feaa:f293, connexion à Internet en IPv4 possible&lt;br /&gt;
 G4 | IPv4 sur Internet : 193.48.57.185, IPv6 sur Internet : 2001:660:4401:60b0:216:3eff:fec6:169, connexion à Internet en IPv4 possible&lt;br /&gt;
 G5 | IPv4 sur Internet : 193.48.57.188, IPv6 sur Internet : 2001:660:4401:60b0:216:3eff:fe5b:b2b6, connexion à Internet en IPv4 possible&lt;br /&gt;
 G6 | IPv4 sur Internet : 193.48.57.187, IPv6 sur Internet : 2001:660:4401:60b0:216:3eff:fef9:2bba, connexion à Internet en IPv4 possible&lt;br /&gt;
 G7 | Bad MAC address &lt;br /&gt;
 G8 | machine non contactable en IPv6 sur le SE5&lt;br /&gt;
 G9 | Rien&lt;br /&gt;
 G10 | IPv4 sur Internet : 193.48.57.186, IPv6 sur Internet : 2001:660:4401:60b0:216:3eff:feb4:5ea4, pas de connexion à Internet en IPv4&lt;br /&gt;
 G11 | machine non contactable en IPv6 sur le SE5&lt;br /&gt;
 G12 | IPv4 sur Internet : 193.48.57.181, IPv6 sur Internet : 2001:660:4401:60b0:216:3eff:fe9a:5186, pas de connexion à Internet en IPv4&lt;br /&gt;
&lt;br /&gt;
Données brutes pour les MV sur &amp;lt;code&amp;gt;antifer&amp;lt;/code&amp;gt; :&lt;br /&gt;
&lt;br /&gt;
 ==== g1kpatrikeevVM&lt;br /&gt;
 | IPv4 sur CV : 10.0.69.218, IPv4 sur VLAN50 : 172.26.145.102, IPv6 sur VLAN50 : 2001:660:4401:6050:216:3eff:fe7d:bc44, pas de connexion à Internet en IPv4, pas de résolution DNS fonctionnelle&lt;br /&gt;
 ==== g2clemair1VM&lt;br /&gt;
 | IPv4 sur CV : 10.0.69.145, IPv4 sur VLAN50 : 172.26.145.104, IPv6 sur VLAN50 : 2001:660:4401:6050:216:3eff:fe31:b916, connexion à Internet en IPv4 possible, resolution DNS fonctionnelle&lt;br /&gt;
 ==== g3tbrenierVM&lt;br /&gt;
 | IPv4 sur CV : 10.0.69.167, IPv4 sur VLAN50 : 172.26.145.106, IPv6 sur VLAN50 : 2001:660:4401:6050:216:3eff:feaa:f292, connexion à Internet en IPv4 possible, pas de résolution DNS fonctionnelle&lt;br /&gt;
 ==== g4fnaudotVM&lt;br /&gt;
 | IPv4 sur CV : 10.0.69.106, IPv4 sur VLAN50 : 172.26.145.108, IPv6 sur VLAN50 : 2001:660:4401:6050:216:3eff:fec6:168, connexion à Internet en IPv4 possible, pas de résolution DNS fonctionnelle&lt;br /&gt;
 ==== g5mdelabyVM&lt;br /&gt;
 | IPv4 sur CV : 10.0.69.171, IPv4 sur VLAN50 : 172.26.145.110, IPv6 sur VLAN50 : 2001:660:4401:6050:216:3eff:fe5b:b2b5, connexion à Internet en IPv4 possible, resolution DNS fonctionnelle&lt;br /&gt;
 ==== g6bblackVM&lt;br /&gt;
 | IPv4 sur CV : 10.0.69.113, IPv4 sur VLAN50 : 172.26.145.112, IPv6 sur VLAN50 : 2001:660:4401:6050:216:3eff:fe4a:d2be, connexion à Internet en IPv4 possible, resolution DNS fonctionnelle&lt;br /&gt;
 ==== g7amoutonVM&lt;br /&gt;
 | pas d'IPv4 sur le CV, IPv4 sur VLAN50 : 172.26.145.114, IPv6 sur VLAN50 : 2001:660:4401:6050:216:3eff:fe59:7616, pas de connexion à Internet en IPv4, pas de résolution DNS fonctionnelle&lt;br /&gt;
 ==== g8esimonVM&lt;br /&gt;
 | machine non contactable en IPv6 sur le bridgeStudents&lt;br /&gt;
 ==== g10egodardVM&lt;br /&gt;
 | IPv4 sur CV : 10.0.69.132, IPv4 sur VLAN50 : 172.26.145.120, IPv6 sur VLAN50 : 2001:660:4401:6050:216:3eff:feb4:5ea3, pas de connexion à Internet en IPv4, pas de résolution DNS fonctionnelle&lt;br /&gt;
 ==== g11asellaliVM&lt;br /&gt;
 | machine non contactable en IPv6 sur le bridgeStudents&lt;br /&gt;
 ==== g12mhalaouiVM&lt;br /&gt;
 | pas d'IPv4 sur le CV, IPv4 sur VLAN50 : 172.26.145.124, IPv6 sur VLAN50 : 2001:660:4401:6050:216:3eff:fe9a:5186, pas de connexion à Internet en IPv4, pas de résolution DNS fonctionnelle&lt;br /&gt;
&lt;br /&gt;
Données brutes pour les MV sur &amp;lt;code&amp;gt;penfret&amp;lt;/code&amp;gt; :&lt;br /&gt;
&lt;br /&gt;
 ==== g1jcharleuxVM&lt;br /&gt;
 | IPv4 sur CV : 10.0.69.185, IPv4 sur VLAN50 : 172.126.145.103, IPv6 sur VLAN50 : 2001:660:4401:6050:216:3eff:fe00:a98d, pas de connexion à Internet en IPv4, pas de résolution DNS fonctionnelle&lt;br /&gt;
 ==== g2gthomasVM&lt;br /&gt;
 | IPv4 sur CV : 10.0.69.212, IPv4 sur VLAN50 : 172.26.145.105, IPv6 sur VLAN50 : 2001:660:4401:6050:216:3eff:fedb:2ac4, connexion à Internet en IPv4 possible, pas de résolution DNS fonctionnelle&lt;br /&gt;
 ==== g3bnguyen1VM&lt;br /&gt;
 | IPv4 sur CV : 10.0.69.130, IPv4 sur VLAN50 : 172.26.145.107, IPv6 sur VLAN50 : 2001:660:4401:6050:216:3eff:feff:4c44, connexion à Internet en IPv4 possible, résolution DNS fonctionnelle&lt;br /&gt;
 ==== g4drodenbuVM&lt;br /&gt;
 | IPv4 sur CV : 10.0.69.156, IPv4 sur VLAN50 : 172.26.145.109, IPv6 sur VLAN50 : 2001:660:4401:6050:216:3eff:fe46:70cd, connexion à Internet en IPv4 possible, pas de résolution DNS fonctionnelle&lt;br /&gt;
 ==== g5pamorosVM&lt;br /&gt;
 | IPv4 sur CV : 10.0.69.189, IPv4 sur VLAN50 : 172.26.145.111, IPv6 sur VLAN50 : 2001:660:4401:6050:216:3eff:fe14:cdb5, connexion à Internet en IPv4 possible, pas de résolution DNS fonctionnelle&lt;br /&gt;
 ==== g6hblgrimVM&lt;br /&gt;
 | IPv4 sur CV : 10.0.69.100, IPv4 sur VLAN50 : 172.26.145.113, IPv6 sur VLAN50 : 2001:660:4401:6050:216:3eff:fef9:2bb9, connexion à Internet en IPv4 possible, résolution DNS fonctionnelle&lt;br /&gt;
 ==== g7jdelannoVM&lt;br /&gt;
 | pas d'IPv4 sur le CV, IPv4 sur VLAN50 : 172.26.145.115, IPv6 sur VLAN50 : 2001:660:4401:6050:216:3eff:fe0f:aba1, pas de connexion à Internet en IPv4, pas de résolution DNS fonctionnelle&lt;br /&gt;
 ==== g8mriffautVM&lt;br /&gt;
 | machine non contactable en IPv6 sur le VLAN50&lt;br /&gt;
 ==== g10jdelcourVM&lt;br /&gt;
 | IPv4 sur CV : 10.0.69.165, IPv4 sur VLAN50 : 172.26.145.121, IPv6 sur VLAN50 : 2001:660:4401:6050:216:3eff:fe7e:35e1, pas de connexion à Internet en IPv4, pas de résolution DNS fonctionnelle&lt;br /&gt;
 ==== g11khabreVM&lt;br /&gt;
 | machine non contactable en IPv6 sur le VLAN50&lt;br /&gt;
 ==== g12rfaraultVM&lt;br /&gt;
 | IPv4 sur CV : 10.0.69.131, IPv4 sur VLAN50 : 172.26.145.125, IPv6 sur VLAN50 : 2001:660:4401:6050:216:3eff:fe54:5aee, pas de connexion à Internet en IPv4, pas de résolution DNS fonctionnelle&lt;br /&gt;
&lt;br /&gt;
Trois groupes finissent à 17h : G2, G5 et G7.&lt;br /&gt;
&lt;br /&gt;
Un groupe à 17h20 : G6.&lt;br /&gt;
&lt;br /&gt;
Un groupe à 17h40 : G10.&lt;br /&gt;
&lt;br /&gt;
Le reste :&lt;br /&gt;
&lt;br /&gt;
  G8 -&amp;gt; installation du conteneur synapse&lt;br /&gt;
  G3 -&amp;gt; erreur à la connexion de la base de données, encodage ASCII&lt;br /&gt;
  G4 -&amp;gt; création de la base de données&lt;br /&gt;
  G12 -&amp;gt; problème à l'exécution du conteneur&lt;br /&gt;
  G11 -&amp;gt; essayent d'installer le conteneur synapse sur la zabeth&lt;br /&gt;
  G13 -&amp;gt; installation du mandataire inverse (reverse proxy nginx)&lt;br /&gt;
  G1 -&amp;gt; installation du conteneur synapse, se lance mais en échec&lt;br /&gt;
&lt;br /&gt;
G13 n'a pas mis à jour le tableau de répartition.&lt;/div&gt;</summary>
		<author><name>Gthomas</name></author>
	</entry>
	<entry>
		<id>https://wiki-se.plil.fr/mediawiki/index.php?title=RodenburgThomas&amp;diff=3681</id>
		<title>RodenburgThomas</title>
		<link rel="alternate" type="text/html" href="https://wiki-se.plil.fr/mediawiki/index.php?title=RodenburgThomas&amp;diff=3681"/>
		<updated>2023-12-20T17:00:05Z</updated>

		<summary type="html">&lt;p&gt;Gthomas : /* Emulation avec NanoEdgeStudio AI */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;=Le binôme=&lt;br /&gt;
&lt;br /&gt;
Le binôme est constitué de 2 élèves de SE5-SC :&lt;br /&gt;
* Dann RODENBURG&lt;br /&gt;
* Gabriel THOMAS&lt;br /&gt;
=Objectifs= &lt;br /&gt;
&lt;br /&gt;
Le but de ce TP est de créer un réseau de systèmes communicants en partant d'un capteur XNucléo 53L5A1 pour finir sur une machine virtuelle Xen.&lt;br /&gt;
La particularité est d'intégrer une composante de Machine Learning  &lt;br /&gt;
&lt;br /&gt;
[[Fichier:Capture d'écran 2023-12-19 151237.png|néant|vignette|800x800px]]&lt;br /&gt;
&lt;br /&gt;
=Edge Computing and Embedded AI=&lt;br /&gt;
&lt;br /&gt;
===Machine virtuelle===&lt;br /&gt;
====Création====&lt;br /&gt;
Création d'une machine virtuelle '''gabidann''' sur le serveur chassiron :&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;xen-create-image --hostname=gabidann --force --dist=bookworm --size=10G --memory=10G --dir=/usr/local/xen --password=glopglop --dhcp --bridge=bridgeStudents&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
La machine virtuelle est à présent connectée au WiFi.&lt;br /&gt;
&lt;br /&gt;
Après cela, nous avons configuré la machine virtuelle selon l'énoncé du TP en faisant un xen console gabidann. Nous avons ensuite participé à la mise en place du point d'accès WiFi.&lt;br /&gt;
&lt;br /&gt;
====Serveur TCP====&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
import socket&lt;br /&gt;
import subprocess&lt;br /&gt;
&lt;br /&gt;
def write_csv(filename, data):&lt;br /&gt;
	if data == &amp;quot;,&amp;quot;:&lt;br /&gt;
		return		# avoid to put single commas in csv file&lt;br /&gt;
	f = open(filename, &amp;quot;a&amp;quot;)&lt;br /&gt;
	f.write(data + &amp;quot;\n&amp;quot;)&lt;br /&gt;
	f.close()&lt;br /&gt;
&lt;br /&gt;
def process_data(data):&lt;br /&gt;
	if data == &amp;quot;,&amp;quot;:&lt;br /&gt;
		return&lt;br /&gt;
	&lt;br /&gt;
	formatted_data = data.replace(',', ' ')&lt;br /&gt;
&lt;br /&gt;
	cmd = f'emulators/NanoEdgeAI_Class_Emulator neai_classification --knowledge_path emulators/knowledge.dat --array &amp;quot;{formatted_data}&amp;quot;'&lt;br /&gt;
	signal = str(subprocess.check_output(cmd.split(&amp;quot; &amp;quot;)))	&lt;br /&gt;
	write_csv(&amp;quot;signal.csv&amp;quot;, signal)&lt;br /&gt;
&lt;br /&gt;
	if &amp;quot;dann&amp;quot; in signal:&lt;br /&gt;
		print(&amp;quot;dann&amp;quot;)&lt;br /&gt;
	elif &amp;quot;gaby&amp;quot; in signal:&lt;br /&gt;
		print(&amp;quot;gaby&amp;quot;)&lt;br /&gt;
	else:&lt;br /&gt;
		print(&amp;quot;Unknown face&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
def handle_connection(conn, filename):&lt;br /&gt;
	while True:&lt;br /&gt;
		try:&lt;br /&gt;
			msg = conn.recv(1024)&lt;br /&gt;
			msg = msg.decode('utf-8')&lt;br /&gt;
		except KeyboardInterrupt:&lt;br /&gt;
			exit()&lt;br /&gt;
		if not msg:&lt;br /&gt;
			print(&amp;quot;Cannot receive message from Raspberry client !&amp;quot;)&lt;br /&gt;
			break&lt;br /&gt;
		else:&lt;br /&gt;
			process_data(msg)&lt;br /&gt;
	print(&amp;quot;Closing Raspberry client connection...&amp;quot;)&lt;br /&gt;
	conn.close()&lt;br /&gt;
&lt;br /&gt;
filename = 'data.csv'&lt;br /&gt;
server_ipv6 = '2001:660:4401:6050:216:3eff:fe98:11ff'&lt;br /&gt;
port = 9999&lt;br /&gt;
&lt;br /&gt;
s = socket.socket(socket.AF_INET6, socket.SOCK_STREAM)&lt;br /&gt;
s.bind((server_ipv6, port))&lt;br /&gt;
s.listen(1)&lt;br /&gt;
print(&amp;quot;Listening on port &amp;quot; + str(port))&lt;br /&gt;
&lt;br /&gt;
while True:&lt;br /&gt;
	try:&lt;br /&gt;
		conn,addr = s.accept()&lt;br /&gt;
	except KeyboardInterrupt:&lt;br /&gt;
		exit()&lt;br /&gt;
	with conn:&lt;br /&gt;
		print(f&amp;quot;New connection from {addr[0]}&amp;quot;)&lt;br /&gt;
		handle_connection(conn, filename)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====Serveur HTTP====&lt;br /&gt;
Configuration d'un serveur HTTP sur la machine virtuelle gabidann :&amp;lt;syntaxhighlight lang=&amp;quot;python3&amp;quot;&amp;gt;&lt;br /&gt;
import socket&lt;br /&gt;
from http.server import HTTPServer, SimpleHTTPRequestHandler&lt;br /&gt;
&lt;br /&gt;
class MyHandler(SimpleHTTPRequestHandler):&lt;br /&gt;
  def do_GET(self):&lt;br /&gt;
    if self.path == '/ip':&lt;br /&gt;
      self.send_response(200)&lt;br /&gt;
      self.send_header('Content-type', 'text/html')&lt;br /&gt;
      self.end_headers()&lt;br /&gt;
      self.wfile.write(f'Your IP address is {self.client_address[0]}'.encode())&lt;br /&gt;
      return&lt;br /&gt;
    else:&lt;br /&gt;
      return SimpleHTTPRequestHandler.do_GET(self)&lt;br /&gt;
&lt;br /&gt;
class HTTPServerV6(HTTPServer):&lt;br /&gt;
  address_family = socket.AF_INET6&lt;br /&gt;
&lt;br /&gt;
def main():&lt;br /&gt;
  server = HTTPServerV6(('::', 8080), MyHandler)&lt;br /&gt;
  server.serve_forever()&lt;br /&gt;
&lt;br /&gt;
if __name__ == '__main__':&lt;br /&gt;
  main()&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Pour se connecter au serveur depuis un navigateur, on peut ouvrir un navigateur depuis la zabeth et y accéder avec l'adresse : ''[&amp;lt;ipv6_VM&amp;gt;]:&amp;lt;port&amp;gt;''. Dans notre cas, le serveur écoute le port '''8080'''.&lt;br /&gt;
&lt;br /&gt;
La page index.html s'affiche par défaut lorsque l'on se connecte au serveur HTTP :&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;html&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;!DOCTYPE html&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;html lang=&amp;quot;fr&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;head&amp;gt;&lt;br /&gt;
	&amp;lt;meta charset=&amp;quot;UTF-8&amp;quot;&amp;gt;&lt;br /&gt;
	&amp;lt;title&amp;gt;Gabidann&amp;lt;/title&amp;gt;&lt;br /&gt;
&amp;lt;/head&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;body&amp;gt;&lt;br /&gt;
	&amp;lt;h1&amp;gt;Bienvenue sur Gabidann !&amp;lt;h1&amp;gt;&lt;br /&gt;
	&amp;lt;div id=&amp;quot;data&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/body&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/html&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;Nous avons également testé la communication en TCP avec l'utilitaire socat&lt;br /&gt;
&lt;br /&gt;
Nous avons créé un serveur python en TCP. Nous pouvons maintenant envoyer des messages du client ( raspberry ) au serveur (VM Xen). Nous nous servirons de cette architecture pour envoyer les données du Nucleo à la Vm Xen &lt;br /&gt;
&lt;br /&gt;
Une fois le modèle entrainé et les tests concluants, on peut déployer notre modèle sur n'importe quel appareils linux ou windows. Pour cela, on va dans l'onglet deployment et on télécharge notre librairie personnalisée.  &lt;br /&gt;
&lt;br /&gt;
===Raspberry===&lt;br /&gt;
D'un autre côté, nous avons branché la Raspberry Pi à l'ordinateur selon le pinout fourni dans la documentation.&lt;br /&gt;
&lt;br /&gt;
[[Fichier:20231218 085218.jpg|vignette|néant]]&lt;br /&gt;
&lt;br /&gt;
Enfin, nous avons activé la communication UART de la Raspberry Pi afin de pouvoir communiquer avec. En fin de séance, nous étions en train de vérifier que la Raspberry Pi répondait bien, même en ayant ajouté la ligne enable_uart=1 dans le fichier config.txt de la Raspberry.&lt;br /&gt;
&lt;br /&gt;
====Configuration de la Raspberry====&lt;br /&gt;
Nous avons résolu le problème de la Raspberry qui ne répondait pas. Cela était dû à l'alimentation : brancher la carte en USBC résoud le problème. Cependant, nous recevons une erreur l'erreur EXT4-fs error (device mmcblk0p2).&lt;br /&gt;
Le problème venait des arguments saisis lors du lancement de Minicom. Avec la commande suivante, il est à présent possible de se connecter sur la Raspberry : &amp;lt;code&amp;gt;minicom -D /dev/ttyUSB0 -b 115200&amp;lt;/code&amp;gt;&lt;br /&gt;
Dans la Raspberry, nous avons configuré une interface réseau wlan0 pour se connecter à WiFi_IE_1 :&lt;br /&gt;
    auto wlan0&lt;br /&gt;
    iface wlan0 inet dhcp&lt;br /&gt;
    wpa-conf /etc/wpa_supplicant/wpa_supplicant.conf&lt;br /&gt;
A présent à partir de la Raspberry, on peut ping la machine virtuelle sur chassiron avec son IPv6.&lt;br /&gt;
&lt;br /&gt;
====Client TCP====&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
import serial&lt;br /&gt;
import socket&lt;br /&gt;
&lt;br /&gt;
server_ipv6 = '2001:660:4401:6050:216:3eff:fe98:11ff'&lt;br /&gt;
server_port = 9999&lt;br /&gt;
&lt;br /&gt;
nucleo_baudrate = 460800&lt;br /&gt;
nucleo_port = '/dev/ttyACM0'&lt;br /&gt;
&lt;br /&gt;
def read_serial(ser):&lt;br /&gt;
        try:&lt;br /&gt;
                serial_data = ser.readline().decode('utf-8').strip()&lt;br /&gt;
                return serial_data&lt;br /&gt;
        except KeyboardInterrupt:&lt;br /&gt;
                ser.close()&lt;br /&gt;
                return None&lt;br /&gt;
&lt;br /&gt;
client = socket.socket(socket.AF_INET6, socket.SOCK_STREAM)&lt;br /&gt;
&lt;br /&gt;
ser = serial.Serial(port=nucleo_port, baudrate=nucleo_baudrate)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Configuration du capteur de distance===&lt;br /&gt;
Un programme était déjà présent sur le capteur. On a téléchargé le logiciel STM32CubeIDE pour pouvoir éditer du code et le téléverser sur le capteur. Nous avons testé de téléverser un programme d'exemple dont voici le résultat :&lt;br /&gt;
[[Fichier:Screenshot 2023-12-18 13-12-19.jpg|vignette|néant|700x700px]]&lt;br /&gt;
&lt;br /&gt;
Nous avons modifié ce programme afin d'effectuer un formatage des données transmises par le capteur sous le format ''&amp;lt;distance&amp;gt;,'' pour chaque valeur. Grâce à ce formatage, il est à présent possible d'utiliser les données reçues par le logiciel NanoEdgeStudio AI pour la partie Machine Learning.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Pour recevoir les valeurs de manière exploitable, il faut modifier le code Exemple dans le logiciel STM Cube IDE&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Capture d'écran 2023-12-20 084719.png|néant|vignette|800x800px]]&lt;br /&gt;
&lt;br /&gt;
L'objectif est d'obtenir une liste séparée par des virgules, il a donc fallu supprimer les espaces et les barres verticales de la fonction d'affichage ainsi que les statuts de chacun des capteurs :&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
static void print_result(RANGING_SENSOR_Result_t *Result)&lt;br /&gt;
{&lt;br /&gt;
  int8_t j;&lt;br /&gt;
  int8_t k;&lt;br /&gt;
  int8_t l;&lt;br /&gt;
  uint8_t zones_per_line;&lt;br /&gt;
  zones_per_line = ((Profile.RangingProfile == RS_PROFILE_8x8_AUTONOMOUS) ||&lt;br /&gt;
         (Profile.RangingProfile == RS_PROFILE_8x8_CONTINUOUS)) ? 8 : 4;&lt;br /&gt;
  for (j = 0; j &amp;lt; Result-&amp;gt;NumberOfZones; j += zones_per_line)&lt;br /&gt;
  {&lt;br /&gt;
    for (l = 0; l &amp;lt; RANGING_SENSOR_NB_TARGET_PER_ZONE; l++)&lt;br /&gt;
    {&lt;br /&gt;
      /* Print distance and status */&lt;br /&gt;
      for (k = (zones_per_line - 1); k &amp;gt;= 0; k--)&lt;br /&gt;
      {&lt;br /&gt;
        if (Result-&amp;gt;ZoneResult[j+k].NumberOfTargets &amp;gt; 0)&lt;br /&gt;
          printf(&amp;quot;%ld,&amp;quot;,(long)Result-&amp;gt;ZoneResult[j+k].Distance[l]);&lt;br /&gt;
      }&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
  printf(&amp;quot;\n&amp;quot;);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Emulation avec NanoEdgeStudio AI===&lt;br /&gt;
&lt;br /&gt;
On passe ensuite sur Nano Edge Studio pour définir les signaux dans l'onglet &amp;quot;Signals&amp;quot; et entraîner le modèle dans l'onglet &amp;quot;Benchmark&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Capture d'écran 2023-12-18 172047.png|néant|vignette|800x800px]]&lt;br /&gt;
&lt;br /&gt;
Une fois le modèle entraîné, on peut le tester avec l'onglet &amp;quot;Emulator&amp;quot; &lt;br /&gt;
&lt;br /&gt;
[[Fichier:Capture d'écran 2023-12-18 173255.png|néant|vignette|800x800px]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Dans un premier temps, nous avons essayé d'entraîner le programme à reconnaître les chiffres 1, 2, 3, 4 et 5 sur les doigts d'une main. Les résultats n'étaient pas concluant, il semblerait que le capteur détecte avant tout le volume de la main à la place de détecter le nombre de doigts.&lt;br /&gt;
&lt;br /&gt;
Nous avons ensuite choisi de faire un détecteur de visages capable de faire la différence entre Gabriel et Dann. L'émulation donne des résultats très satisfaisant proche de 100% de réussite&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
On peut lui passer un fichier CSV contenant les données brutes du capteur et grâce au fichier knowledge.dat, l'émulateur est capable de faire la différence entre les situations&amp;lt;syntaxhighlight lang=&amp;quot;bat&amp;quot;&amp;gt;&lt;br /&gt;
PS C:\Users\gabyt\Documents\Gaby\emulators&amp;gt; .\NanoEdgeAI_Class_Emulator.exe neai_classification --knowledge_path .\knowledge.dat --file .\data.csv&lt;br /&gt;
{&lt;br /&gt;
        &amp;quot;status&amp;quot;: &amp;quot;classification&amp;quot;,&lt;br /&gt;
        &amp;quot;lib_id&amp;quot;: &amp;quot;6582b12625c3e0368b2c2a09&amp;quot;,&lt;br /&gt;
        &amp;quot;input&amp;quot;: &amp;quot;.\data.csv&amp;quot;,&lt;br /&gt;
        &amp;quot;results&amp;quot;: [&lt;br /&gt;
                {&amp;quot;signal&amp;quot;: 1, &amp;quot;line&amp;quot;: 1, &amp;quot;class_status&amp;quot;: 2, &amp;quot;class_name&amp;quot;: &amp;quot;dann&amp;quot;, &amp;quot;class_proba&amp;quot;: [0.01, 0.99]},&lt;br /&gt;
                {&amp;quot;signal&amp;quot;: 2, &amp;quot;line&amp;quot;: 2, &amp;quot;class_status&amp;quot;: 2, &amp;quot;class_name&amp;quot;: &amp;quot;dann&amp;quot;, &amp;quot;class_proba&amp;quot;: [0.01, 0.99]},&lt;br /&gt;
                {&amp;quot;signal&amp;quot;: 3, &amp;quot;line&amp;quot;: 3, &amp;quot;class_status&amp;quot;: 2, &amp;quot;class_name&amp;quot;: &amp;quot;dann&amp;quot;, &amp;quot;class_proba&amp;quot;: [0.37, 0.63]},&lt;br /&gt;
                {&amp;quot;signal&amp;quot;: 4, &amp;quot;line&amp;quot;: 4, &amp;quot;class_status&amp;quot;: 1, &amp;quot;class_name&amp;quot;: &amp;quot;dann&amp;quot;, &amp;quot;class_proba&amp;quot;: [0.83, 0.17]},&lt;br /&gt;
                {&amp;quot;signal&amp;quot;: 5, &amp;quot;line&amp;quot;: 5, &amp;quot;class_status&amp;quot;: 1, &amp;quot;class_name&amp;quot;: &amp;quot;dann&amp;quot;, &amp;quot;class_proba&amp;quot;: [0.63, 0.37]},&lt;br /&gt;
                {&amp;quot;signal&amp;quot;: 6, &amp;quot;line&amp;quot;: 6, &amp;quot;class_status&amp;quot;: 1, &amp;quot;class_name&amp;quot;: &amp;quot;dann&amp;quot;, &amp;quot;class_proba&amp;quot;: [0.63, 0.37]},&lt;br /&gt;
                {&amp;quot;signal&amp;quot;: 7, &amp;quot;line&amp;quot;: 7, &amp;quot;class_status&amp;quot;: 1, &amp;quot;class_name&amp;quot;: &amp;quot;dann&amp;quot;, &amp;quot;class_proba&amp;quot;: [0.50, 0.50]},&lt;br /&gt;
                {&amp;quot;signal&amp;quot;: 8, &amp;quot;line&amp;quot;: 8, &amp;quot;class_status&amp;quot;: 1, &amp;quot;class_name&amp;quot;: &amp;quot;dann&amp;quot;, &amp;quot;class_proba&amp;quot;: [0.63, 0.37]},&lt;br /&gt;
                {&amp;quot;signal&amp;quot;: 9, &amp;quot;line&amp;quot;: 9, &amp;quot;class_status&amp;quot;: 2, &amp;quot;class_name&amp;quot;: &amp;quot;dann&amp;quot;, &amp;quot;class_proba&amp;quot;: [0.37, 0.63]},&lt;br /&gt;
                {&amp;quot;signal&amp;quot;: 10, &amp;quot;line&amp;quot;: 10, &amp;quot;class_status&amp;quot;: 2, &amp;quot;class_name&amp;quot;: &amp;quot;dann&amp;quot;, &amp;quot;class_proba&amp;quot;: [0.17, 0.83]},&lt;br /&gt;
                {&amp;quot;signal&amp;quot;: 11, &amp;quot;line&amp;quot;: 11, &amp;quot;class_status&amp;quot;: 1, &amp;quot;class_name&amp;quot;: &amp;quot;dann&amp;quot;, &amp;quot;class_proba&amp;quot;: [0.63, 0.37]},&lt;br /&gt;
                {&amp;quot;signal&amp;quot;: 12, &amp;quot;line&amp;quot;: 12, &amp;quot;class_status&amp;quot;: 1, &amp;quot;class_name&amp;quot;: &amp;quot;gaby&amp;quot;, &amp;quot;class_proba&amp;quot;: [0.63, 0.37]},&lt;br /&gt;
                {&amp;quot;signal&amp;quot;: 13, &amp;quot;line&amp;quot;: 13, &amp;quot;class_status&amp;quot;: 2, &amp;quot;class_name&amp;quot;: &amp;quot;gaby&amp;quot;, &amp;quot;class_proba&amp;quot;: [0.37, 0.63]},&lt;br /&gt;
                {&amp;quot;signal&amp;quot;: 14, &amp;quot;line&amp;quot;: 14, &amp;quot;class_status&amp;quot;: 1, &amp;quot;class_name&amp;quot;: &amp;quot;gaby&amp;quot;, &amp;quot;class_proba&amp;quot;: [0.74, 0.26]},&lt;br /&gt;
                {&amp;quot;signal&amp;quot;: 15, &amp;quot;line&amp;quot;: 15, &amp;quot;class_status&amp;quot;: 1, &amp;quot;class_name&amp;quot;: &amp;quot;gaby&amp;quot;, &amp;quot;class_proba&amp;quot;: [0.63, 0.37]},&lt;br /&gt;
                {&amp;quot;signal&amp;quot;: 16, &amp;quot;line&amp;quot;: 16, &amp;quot;class_status&amp;quot;: 1, &amp;quot;class_name&amp;quot;: &amp;quot;gaby&amp;quot;, &amp;quot;class_proba&amp;quot;: [0.74, 0.26]},&lt;br /&gt;
                {&amp;quot;signal&amp;quot;: 17, &amp;quot;line&amp;quot;: 17, &amp;quot;class_status&amp;quot;: 1, &amp;quot;class_name&amp;quot;: &amp;quot;gaby&amp;quot;, &amp;quot;class_proba&amp;quot;: [0.63, 0.37]},&lt;br /&gt;
                {&amp;quot;signal&amp;quot;: 18, &amp;quot;line&amp;quot;: 18, &amp;quot;class_status&amp;quot;: 1, &amp;quot;class_name&amp;quot;: &amp;quot;gaby&amp;quot;, &amp;quot;class_proba&amp;quot;: [0.63, 0.37]},&lt;br /&gt;
                {&amp;quot;signal&amp;quot;: 19, &amp;quot;line&amp;quot;: 19, &amp;quot;class_status&amp;quot;: 2, &amp;quot;class_name&amp;quot;: &amp;quot;dann&amp;quot;, &amp;quot;class_proba&amp;quot;: [0.37, 0.63]},&lt;br /&gt;
                {&amp;quot;signal&amp;quot;: 20, &amp;quot;line&amp;quot;: 20, &amp;quot;class_status&amp;quot;: 1, &amp;quot;class_name&amp;quot;: &amp;quot;gaby&amp;quot;, &amp;quot;class_proba&amp;quot;: [0.63, 0.37]},&lt;br /&gt;
                {&amp;quot;signal&amp;quot;: 21, &amp;quot;line&amp;quot;: 21, &amp;quot;class_status&amp;quot;: 2, &amp;quot;class_name&amp;quot;: &amp;quot;dann&amp;quot;, &amp;quot;class_proba&amp;quot;: [0.11, 0.89]},&lt;br /&gt;
                {&amp;quot;signal&amp;quot;: 22, &amp;quot;line&amp;quot;: 22, &amp;quot;class_status&amp;quot;: 1, &amp;quot;class_name&amp;quot;: &amp;quot;gaby&amp;quot;, &amp;quot;class_proba&amp;quot;: [0.74, 0.26]},&lt;br /&gt;
                {&amp;quot;signal&amp;quot;: 23, &amp;quot;line&amp;quot;: 23, &amp;quot;class_status&amp;quot;: 1, &amp;quot;class_name&amp;quot;: &amp;quot;gaby&amp;quot;, &amp;quot;class_proba&amp;quot;: [0.63, 0.37]},&lt;br /&gt;
                {&amp;quot;signal&amp;quot;: 24, &amp;quot;line&amp;quot;: 24, &amp;quot;class_status&amp;quot;: 1, &amp;quot;class_name&amp;quot;: &amp;quot;gaby&amp;quot;, &amp;quot;class_proba&amp;quot;: [0.74, 0.26]},&lt;br /&gt;
                {&amp;quot;signal&amp;quot;: 25, &amp;quot;line&amp;quot;: 25, &amp;quot;class_status&amp;quot;: 1, &amp;quot;class_name&amp;quot;: &amp;quot;gaby&amp;quot;, &amp;quot;class_proba&amp;quot;: [0.50, 0.50]},&lt;br /&gt;
                {&amp;quot;signal&amp;quot;: 26, &amp;quot;line&amp;quot;: 26, &amp;quot;class_status&amp;quot;: 2, &amp;quot;class_name&amp;quot;: &amp;quot;gaby&amp;quot;, &amp;quot;class_proba&amp;quot;: [0.06, 0.94]},&lt;br /&gt;
                {&amp;quot;signal&amp;quot;: 27, &amp;quot;line&amp;quot;: 27, &amp;quot;class_status&amp;quot;: 2, &amp;quot;class_name&amp;quot;: &amp;quot;gaby&amp;quot;, &amp;quot;class_proba&amp;quot;: [0.37, 0.63]},&lt;br /&gt;
                {&amp;quot;signal&amp;quot;: 28, &amp;quot;line&amp;quot;: 28, &amp;quot;class_status&amp;quot;: 1, &amp;quot;class_name&amp;quot;: &amp;quot;gaby&amp;quot;, &amp;quot;class_proba&amp;quot;: [0.63, 0.37]},&lt;br /&gt;
                {&amp;quot;signal&amp;quot;: 29, &amp;quot;line&amp;quot;: 29, &amp;quot;class_status&amp;quot;: 1, &amp;quot;class_name&amp;quot;: &amp;quot;gaby&amp;quot;, &amp;quot;class_proba&amp;quot;: [0.63, 0.37]}&lt;br /&gt;
        ],&lt;br /&gt;
        &amp;quot;classification_summary&amp;quot;: {&amp;quot;signals&amp;quot;: 29, &amp;quot;classified&amp;quot;: [13, 16], &amp;quot;unclassified&amp;quot;: 0}&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=Utilisation=&lt;br /&gt;
&lt;br /&gt;
Vérifier que la Raspberry est branchée à l'ordinateur et vérifier le Nucleo est bien connecté à la Raspberry et vérifier que la machine virtuelle gabidann est bien lancée.&lt;br /&gt;
&lt;br /&gt;
Lancer dans un premier temps le serveur TCP sur la machine virtuelle gabidann. Lancer ensuite le client TCP sur la Raspberry.&lt;br /&gt;
&lt;br /&gt;
Les résultats seront affichés dans le terminal de la machine virtuelle.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=Résultats=&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Gabidann results.jpg|néant|vignette|800px]]&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Gabidann results2.jpg|néant|vignette|800px]]&lt;/div&gt;</summary>
		<author><name>Gthomas</name></author>
	</entry>
	<entry>
		<id>https://wiki-se.plil.fr/mediawiki/index.php?title=RodenburgThomas&amp;diff=3679</id>
		<title>RodenburgThomas</title>
		<link rel="alternate" type="text/html" href="https://wiki-se.plil.fr/mediawiki/index.php?title=RodenburgThomas&amp;diff=3679"/>
		<updated>2023-12-20T16:59:20Z</updated>

		<summary type="html">&lt;p&gt;Gthomas : /* Emulation avec NanoEdgeStudio AI */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;=Le binôme=&lt;br /&gt;
&lt;br /&gt;
Le binôme est constitué de 2 élèves de SE5-SC :&lt;br /&gt;
* Dann RODENBURG&lt;br /&gt;
* Gabriel THOMAS&lt;br /&gt;
=Objectifs= &lt;br /&gt;
&lt;br /&gt;
Le but de ce TP est de créer un réseau de systèmes communicants en partant d'un capteur XNucléo 53L5A1 pour finir sur une machine virtuelle Xen.&lt;br /&gt;
La particularité est d'intégrer une composante de Machine Learning  &lt;br /&gt;
&lt;br /&gt;
[[Fichier:Capture d'écran 2023-12-19 151237.png|néant|vignette|800x800px]]&lt;br /&gt;
&lt;br /&gt;
=Edge Computing and Embedded AI=&lt;br /&gt;
&lt;br /&gt;
===Machine virtuelle===&lt;br /&gt;
====Création====&lt;br /&gt;
Création d'une machine virtuelle '''gabidann''' sur le serveur chassiron :&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;xen-create-image --hostname=gabidann --force --dist=bookworm --size=10G --memory=10G --dir=/usr/local/xen --password=glopglop --dhcp --bridge=bridgeStudents&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
La machine virtuelle est à présent connectée au WiFi.&lt;br /&gt;
&lt;br /&gt;
Après cela, nous avons configuré la machine virtuelle selon l'énoncé du TP en faisant un xen console gabidann. Nous avons ensuite participé à la mise en place du point d'accès WiFi.&lt;br /&gt;
&lt;br /&gt;
====Serveur TCP====&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
import socket&lt;br /&gt;
import subprocess&lt;br /&gt;
&lt;br /&gt;
def write_csv(filename, data):&lt;br /&gt;
	if data == &amp;quot;,&amp;quot;:&lt;br /&gt;
		return		# avoid to put single commas in csv file&lt;br /&gt;
	f = open(filename, &amp;quot;a&amp;quot;)&lt;br /&gt;
	f.write(data + &amp;quot;\n&amp;quot;)&lt;br /&gt;
	f.close()&lt;br /&gt;
&lt;br /&gt;
def process_data(data):&lt;br /&gt;
	if data == &amp;quot;,&amp;quot;:&lt;br /&gt;
		return&lt;br /&gt;
	&lt;br /&gt;
	formatted_data = data.replace(',', ' ')&lt;br /&gt;
&lt;br /&gt;
	cmd = f'emulators/NanoEdgeAI_Class_Emulator neai_classification --knowledge_path emulators/knowledge.dat --array &amp;quot;{formatted_data}&amp;quot;'&lt;br /&gt;
	signal = str(subprocess.check_output(cmd.split(&amp;quot; &amp;quot;)))	&lt;br /&gt;
	write_csv(&amp;quot;signal.csv&amp;quot;, signal)&lt;br /&gt;
&lt;br /&gt;
	if &amp;quot;dann&amp;quot; in signal:&lt;br /&gt;
		print(&amp;quot;dann&amp;quot;)&lt;br /&gt;
	elif &amp;quot;gaby&amp;quot; in signal:&lt;br /&gt;
		print(&amp;quot;gaby&amp;quot;)&lt;br /&gt;
	else:&lt;br /&gt;
		print(&amp;quot;Unknown face&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
def handle_connection(conn, filename):&lt;br /&gt;
	while True:&lt;br /&gt;
		try:&lt;br /&gt;
			msg = conn.recv(1024)&lt;br /&gt;
			msg = msg.decode('utf-8')&lt;br /&gt;
		except KeyboardInterrupt:&lt;br /&gt;
			exit()&lt;br /&gt;
		if not msg:&lt;br /&gt;
			print(&amp;quot;Cannot receive message from Raspberry client !&amp;quot;)&lt;br /&gt;
			break&lt;br /&gt;
		else:&lt;br /&gt;
			process_data(msg)&lt;br /&gt;
	print(&amp;quot;Closing Raspberry client connection...&amp;quot;)&lt;br /&gt;
	conn.close()&lt;br /&gt;
&lt;br /&gt;
filename = 'data.csv'&lt;br /&gt;
server_ipv6 = '2001:660:4401:6050:216:3eff:fe98:11ff'&lt;br /&gt;
port = 9999&lt;br /&gt;
&lt;br /&gt;
s = socket.socket(socket.AF_INET6, socket.SOCK_STREAM)&lt;br /&gt;
s.bind((server_ipv6, port))&lt;br /&gt;
s.listen(1)&lt;br /&gt;
print(&amp;quot;Listening on port &amp;quot; + str(port))&lt;br /&gt;
&lt;br /&gt;
while True:&lt;br /&gt;
	try:&lt;br /&gt;
		conn,addr = s.accept()&lt;br /&gt;
	except KeyboardInterrupt:&lt;br /&gt;
		exit()&lt;br /&gt;
	with conn:&lt;br /&gt;
		print(f&amp;quot;New connection from {addr[0]}&amp;quot;)&lt;br /&gt;
		handle_connection(conn, filename)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====Serveur HTTP====&lt;br /&gt;
Configuration d'un serveur HTTP sur la machine virtuelle gabidann :&amp;lt;syntaxhighlight lang=&amp;quot;python3&amp;quot;&amp;gt;&lt;br /&gt;
import socket&lt;br /&gt;
from http.server import HTTPServer, SimpleHTTPRequestHandler&lt;br /&gt;
&lt;br /&gt;
class MyHandler(SimpleHTTPRequestHandler):&lt;br /&gt;
  def do_GET(self):&lt;br /&gt;
    if self.path == '/ip':&lt;br /&gt;
      self.send_response(200)&lt;br /&gt;
      self.send_header('Content-type', 'text/html')&lt;br /&gt;
      self.end_headers()&lt;br /&gt;
      self.wfile.write(f'Your IP address is {self.client_address[0]}'.encode())&lt;br /&gt;
      return&lt;br /&gt;
    else:&lt;br /&gt;
      return SimpleHTTPRequestHandler.do_GET(self)&lt;br /&gt;
&lt;br /&gt;
class HTTPServerV6(HTTPServer):&lt;br /&gt;
  address_family = socket.AF_INET6&lt;br /&gt;
&lt;br /&gt;
def main():&lt;br /&gt;
  server = HTTPServerV6(('::', 8080), MyHandler)&lt;br /&gt;
  server.serve_forever()&lt;br /&gt;
&lt;br /&gt;
if __name__ == '__main__':&lt;br /&gt;
  main()&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Pour se connecter au serveur depuis un navigateur, on peut ouvrir un navigateur depuis la zabeth et y accéder avec l'adresse : ''[&amp;lt;ipv6_VM&amp;gt;]:&amp;lt;port&amp;gt;''. Dans notre cas, le serveur écoute le port '''8080'''.&lt;br /&gt;
&lt;br /&gt;
La page index.html s'affiche par défaut lorsque l'on se connecte au serveur HTTP :&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;html&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;!DOCTYPE html&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;html lang=&amp;quot;fr&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;head&amp;gt;&lt;br /&gt;
	&amp;lt;meta charset=&amp;quot;UTF-8&amp;quot;&amp;gt;&lt;br /&gt;
	&amp;lt;title&amp;gt;Gabidann&amp;lt;/title&amp;gt;&lt;br /&gt;
&amp;lt;/head&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;body&amp;gt;&lt;br /&gt;
	&amp;lt;h1&amp;gt;Bienvenue sur Gabidann !&amp;lt;h1&amp;gt;&lt;br /&gt;
	&amp;lt;div id=&amp;quot;data&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/body&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/html&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;Nous avons également testé la communication en TCP avec l'utilitaire socat&lt;br /&gt;
&lt;br /&gt;
Nous avons créé un serveur python en TCP. Nous pouvons maintenant envoyer des messages du client ( raspberry ) au serveur (VM Xen). Nous nous servirons de cette architecture pour envoyer les données du Nucleo à la Vm Xen &lt;br /&gt;
&lt;br /&gt;
Une fois le modèle entrainé et les tests concluants, on peut déployer notre modèle sur n'importe quel appareils linux ou windows. Pour cela, on va dans l'onglet deployment et on télécharge notre librairie personnalisée.  &lt;br /&gt;
&lt;br /&gt;
===Raspberry===&lt;br /&gt;
D'un autre côté, nous avons branché la Raspberry Pi à l'ordinateur selon le pinout fourni dans la documentation.&lt;br /&gt;
&lt;br /&gt;
[[Fichier:20231218 085218.jpg|vignette|néant]]&lt;br /&gt;
&lt;br /&gt;
Enfin, nous avons activé la communication UART de la Raspberry Pi afin de pouvoir communiquer avec. En fin de séance, nous étions en train de vérifier que la Raspberry Pi répondait bien, même en ayant ajouté la ligne enable_uart=1 dans le fichier config.txt de la Raspberry.&lt;br /&gt;
&lt;br /&gt;
====Configuration de la Raspberry====&lt;br /&gt;
Nous avons résolu le problème de la Raspberry qui ne répondait pas. Cela était dû à l'alimentation : brancher la carte en USBC résoud le problème. Cependant, nous recevons une erreur l'erreur EXT4-fs error (device mmcblk0p2).&lt;br /&gt;
Le problème venait des arguments saisis lors du lancement de Minicom. Avec la commande suivante, il est à présent possible de se connecter sur la Raspberry : &amp;lt;code&amp;gt;minicom -D /dev/ttyUSB0 -b 115200&amp;lt;/code&amp;gt;&lt;br /&gt;
Dans la Raspberry, nous avons configuré une interface réseau wlan0 pour se connecter à WiFi_IE_1 :&lt;br /&gt;
    auto wlan0&lt;br /&gt;
    iface wlan0 inet dhcp&lt;br /&gt;
    wpa-conf /etc/wpa_supplicant/wpa_supplicant.conf&lt;br /&gt;
A présent à partir de la Raspberry, on peut ping la machine virtuelle sur chassiron avec son IPv6.&lt;br /&gt;
&lt;br /&gt;
====Client TCP====&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
import serial&lt;br /&gt;
import socket&lt;br /&gt;
&lt;br /&gt;
server_ipv6 = '2001:660:4401:6050:216:3eff:fe98:11ff'&lt;br /&gt;
server_port = 9999&lt;br /&gt;
&lt;br /&gt;
nucleo_baudrate = 460800&lt;br /&gt;
nucleo_port = '/dev/ttyACM0'&lt;br /&gt;
&lt;br /&gt;
def read_serial(ser):&lt;br /&gt;
        try:&lt;br /&gt;
                serial_data = ser.readline().decode('utf-8').strip()&lt;br /&gt;
                return serial_data&lt;br /&gt;
        except KeyboardInterrupt:&lt;br /&gt;
                ser.close()&lt;br /&gt;
                return None&lt;br /&gt;
&lt;br /&gt;
client = socket.socket(socket.AF_INET6, socket.SOCK_STREAM)&lt;br /&gt;
&lt;br /&gt;
ser = serial.Serial(port=nucleo_port, baudrate=nucleo_baudrate)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Configuration du capteur de distance===&lt;br /&gt;
Un programme était déjà présent sur le capteur. On a téléchargé le logiciel STM32CubeIDE pour pouvoir éditer du code et le téléverser sur le capteur. Nous avons testé de téléverser un programme d'exemple dont voici le résultat :&lt;br /&gt;
[[Fichier:Screenshot 2023-12-18 13-12-19.jpg|vignette|néant|700x700px]]&lt;br /&gt;
&lt;br /&gt;
Nous avons modifié ce programme afin d'effectuer un formatage des données transmises par le capteur sous le format ''&amp;lt;distance&amp;gt;,'' pour chaque valeur. Grâce à ce formatage, il est à présent possible d'utiliser les données reçues par le logiciel NanoEdgeStudio AI pour la partie Machine Learning.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Pour recevoir les valeurs de manière exploitable, il faut modifier le code Exemple dans le logiciel STM Cube IDE&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Capture d'écran 2023-12-20 084719.png|néant|vignette|800x800px]]&lt;br /&gt;
&lt;br /&gt;
L'objectif est d'obtenir une liste séparée par des virgules, il a donc fallu supprimer les espaces et les barres verticales de la fonction d'affichage ainsi que les statuts de chacun des capteurs :&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
static void print_result(RANGING_SENSOR_Result_t *Result)&lt;br /&gt;
{&lt;br /&gt;
  int8_t j;&lt;br /&gt;
  int8_t k;&lt;br /&gt;
  int8_t l;&lt;br /&gt;
  uint8_t zones_per_line;&lt;br /&gt;
  zones_per_line = ((Profile.RangingProfile == RS_PROFILE_8x8_AUTONOMOUS) ||&lt;br /&gt;
         (Profile.RangingProfile == RS_PROFILE_8x8_CONTINUOUS)) ? 8 : 4;&lt;br /&gt;
  for (j = 0; j &amp;lt; Result-&amp;gt;NumberOfZones; j += zones_per_line)&lt;br /&gt;
  {&lt;br /&gt;
    for (l = 0; l &amp;lt; RANGING_SENSOR_NB_TARGET_PER_ZONE; l++)&lt;br /&gt;
    {&lt;br /&gt;
      /* Print distance and status */&lt;br /&gt;
      for (k = (zones_per_line - 1); k &amp;gt;= 0; k--)&lt;br /&gt;
      {&lt;br /&gt;
        if (Result-&amp;gt;ZoneResult[j+k].NumberOfTargets &amp;gt; 0)&lt;br /&gt;
          printf(&amp;quot;%ld,&amp;quot;,(long)Result-&amp;gt;ZoneResult[j+k].Distance[l]);&lt;br /&gt;
      }&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
  printf(&amp;quot;\n&amp;quot;);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Emulation avec NanoEdgeStudio AI===&lt;br /&gt;
&lt;br /&gt;
On passe ensuite sur Nano Edge Studio pour définir les signaux dans l'onglet &amp;quot;Signals&amp;quot; et entraîner le modèle dans l'onglet &amp;quot;Benchmark&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Capture d'écran 2023-12-18 172047.png|néant|vignette|800x800px]]&lt;br /&gt;
&lt;br /&gt;
Une fois le modèle entraîné, on peut le tester avec l'onglet &amp;quot;Emulator&amp;quot; &lt;br /&gt;
&lt;br /&gt;
[[Fichier:Capture d'écran 2023-12-18 173255.png|néant|vignette|800x800px]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Dans un premier temps, nous avons essayé d'entraîner le programme à reconnaître les chiffres 1, 2, 3, 4 et 5 sur les doigts d'une main. Les résultats n'étaient pas concluant, il semblerait que le capteur détecte avant tout le volume de la main à la place de détecter le nombre de doigts.&lt;br /&gt;
&lt;br /&gt;
Nous avons ensuite choisi de faire un détecteur de visages capable de faire la différence entre Gabriel et Dann. L'émulation donne des résultats très satisfaisant proche de 100% de réussite&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
On peut lui passer un fichier CSV contenant les données brutes du capteur et grâce au fichier knowledge.dat, l'émulateur est capable de faire la différence entre les situations&amp;lt;syntaxhighlight lang=&amp;quot;bat&amp;quot;&amp;gt;&lt;br /&gt;
PS C:\Users\gabyt\Documents\Gaby\emulators&amp;gt; .\NanoEdgeAI_Class_Emulator.exe neai_classification --knowledge_path .\knowledge.dat --file .\data.csv&lt;br /&gt;
{&lt;br /&gt;
        &amp;quot;status&amp;quot;: &amp;quot;classification&amp;quot;,&lt;br /&gt;
        &amp;quot;lib_id&amp;quot;: &amp;quot;6582b12625c3e0368b2c2a09&amp;quot;,&lt;br /&gt;
        &amp;quot;input&amp;quot;: &amp;quot;.\data.csv&amp;quot;,&lt;br /&gt;
        &amp;quot;results&amp;quot;: [&lt;br /&gt;
                {&amp;quot;signal&amp;quot;: 1, &amp;quot;line&amp;quot;: 1, &amp;quot;class_status&amp;quot;: 2, &amp;quot;class_name&amp;quot;: &amp;quot;dann&amp;quot;, &amp;quot;class_proba&amp;quot;: [0.01, 0.99]},&lt;br /&gt;
                {&amp;quot;signal&amp;quot;: 2, &amp;quot;line&amp;quot;: 2, &amp;quot;class_status&amp;quot;: 2, &amp;quot;class_name&amp;quot;: &amp;quot;dann&amp;quot;, &amp;quot;class_proba&amp;quot;: [0.01, 0.99]},&lt;br /&gt;
                {&amp;quot;signal&amp;quot;: 3, &amp;quot;line&amp;quot;: 3, &amp;quot;class_status&amp;quot;: 2, &amp;quot;class_name&amp;quot;: &amp;quot;dann&amp;quot;, &amp;quot;class_proba&amp;quot;: [0.37, 0.63]},&lt;br /&gt;
                {&amp;quot;signal&amp;quot;: 4, &amp;quot;line&amp;quot;: 4, &amp;quot;class_status&amp;quot;: 1, &amp;quot;class_name&amp;quot;: &amp;quot;dann&amp;quot;, &amp;quot;class_proba&amp;quot;: [0.83, 0.17]},&lt;br /&gt;
                {&amp;quot;signal&amp;quot;: 5, &amp;quot;line&amp;quot;: 5, &amp;quot;class_status&amp;quot;: 1, &amp;quot;class_name&amp;quot;: &amp;quot;dann&amp;quot;, &amp;quot;class_proba&amp;quot;: [0.63, 0.37]},&lt;br /&gt;
                {&amp;quot;signal&amp;quot;: 6, &amp;quot;line&amp;quot;: 6, &amp;quot;class_status&amp;quot;: 1, &amp;quot;class_name&amp;quot;: &amp;quot;dann&amp;quot;, &amp;quot;class_proba&amp;quot;: [0.63, 0.37]},&lt;br /&gt;
                {&amp;quot;signal&amp;quot;: 7, &amp;quot;line&amp;quot;: 7, &amp;quot;class_status&amp;quot;: 1, &amp;quot;class_name&amp;quot;: &amp;quot;dann&amp;quot;, &amp;quot;class_proba&amp;quot;: [0.50, 0.50]},&lt;br /&gt;
                {&amp;quot;signal&amp;quot;: 8, &amp;quot;line&amp;quot;: 8, &amp;quot;class_status&amp;quot;: 1, &amp;quot;class_name&amp;quot;: &amp;quot;dann&amp;quot;, &amp;quot;class_proba&amp;quot;: [0.63, 0.37]},&lt;br /&gt;
                {&amp;quot;signal&amp;quot;: 9, &amp;quot;line&amp;quot;: 9, &amp;quot;class_status&amp;quot;: 2, &amp;quot;class_name&amp;quot;: &amp;quot;dann&amp;quot;, &amp;quot;class_proba&amp;quot;: [0.37, 0.63]},&lt;br /&gt;
                {&amp;quot;signal&amp;quot;: 10, &amp;quot;line&amp;quot;: 10, &amp;quot;class_status&amp;quot;: 2, &amp;quot;class_name&amp;quot;: &amp;quot;dann&amp;quot;, &amp;quot;class_proba&amp;quot;: [0.17, 0.83]},&lt;br /&gt;
                {&amp;quot;signal&amp;quot;: 11, &amp;quot;line&amp;quot;: 11, &amp;quot;class_status&amp;quot;: 1, &amp;quot;class_name&amp;quot;: &amp;quot;dann&amp;quot;, &amp;quot;class_proba&amp;quot;: [0.63, 0.37]},&lt;br /&gt;
                {&amp;quot;signal&amp;quot;: 12, &amp;quot;line&amp;quot;: 12, &amp;quot;class_status&amp;quot;: 1, &amp;quot;class_name&amp;quot;: &amp;quot;gaby&amp;quot;, &amp;quot;class_proba&amp;quot;: [0.63, 0.37]},&lt;br /&gt;
                {&amp;quot;signal&amp;quot;: 13, &amp;quot;line&amp;quot;: 13, &amp;quot;class_status&amp;quot;: 2, &amp;quot;class_name&amp;quot;: &amp;quot;gaby&amp;quot;, &amp;quot;class_proba&amp;quot;: [0.37, 0.63]},&lt;br /&gt;
                {&amp;quot;signal&amp;quot;: 14, &amp;quot;line&amp;quot;: 14, &amp;quot;class_status&amp;quot;: 1, &amp;quot;class_name&amp;quot;: &amp;quot;gaby&amp;quot;, &amp;quot;class_proba&amp;quot;: [0.74, 0.26]},&lt;br /&gt;
                {&amp;quot;signal&amp;quot;: 15, &amp;quot;line&amp;quot;: 15, &amp;quot;class_status&amp;quot;: 1, &amp;quot;class_name&amp;quot;: &amp;quot;gaby&amp;quot;, &amp;quot;class_proba&amp;quot;: [0.63, 0.37]},&lt;br /&gt;
                {&amp;quot;signal&amp;quot;: 16, &amp;quot;line&amp;quot;: 16, &amp;quot;class_status&amp;quot;: 1, &amp;quot;class_name&amp;quot;: &amp;quot;gaby&amp;quot;, &amp;quot;class_proba&amp;quot;: [0.74, 0.26]},&lt;br /&gt;
                {&amp;quot;signal&amp;quot;: 17, &amp;quot;line&amp;quot;: 17, &amp;quot;class_status&amp;quot;: 1, &amp;quot;class_name&amp;quot;: &amp;quot;gaby&amp;quot;, &amp;quot;class_proba&amp;quot;: [0.63, 0.37]},&lt;br /&gt;
                {&amp;quot;signal&amp;quot;: 18, &amp;quot;line&amp;quot;: 18, &amp;quot;class_status&amp;quot;: 1, &amp;quot;class_name&amp;quot;: &amp;quot;gaby&amp;quot;, &amp;quot;class_proba&amp;quot;: [0.63, 0.37]},&lt;br /&gt;
                {&amp;quot;signal&amp;quot;: 19, &amp;quot;line&amp;quot;: 19, &amp;quot;class_status&amp;quot;: 2, &amp;quot;class_name&amp;quot;: &amp;quot;dann&amp;quot;, &amp;quot;class_proba&amp;quot;: [0.37, 0.63]},&lt;br /&gt;
                {&amp;quot;signal&amp;quot;: 20, &amp;quot;line&amp;quot;: 20, &amp;quot;class_status&amp;quot;: 1, &amp;quot;class_name&amp;quot;: &amp;quot;gaby&amp;quot;, &amp;quot;class_proba&amp;quot;: [0.63, 0.37]},&lt;br /&gt;
                {&amp;quot;signal&amp;quot;: 21, &amp;quot;line&amp;quot;: 21, &amp;quot;class_status&amp;quot;: 2, &amp;quot;class_name&amp;quot;: &amp;quot;dann&amp;quot;, &amp;quot;class_proba&amp;quot;: [0.11, 0.89]},&lt;br /&gt;
                {&amp;quot;signal&amp;quot;: 22, &amp;quot;line&amp;quot;: 22, &amp;quot;class_status&amp;quot;: 1, &amp;quot;class_name&amp;quot;: &amp;quot;gaby&amp;quot;, &amp;quot;class_proba&amp;quot;: [0.74, 0.26]},&lt;br /&gt;
                {&amp;quot;signal&amp;quot;: 23, &amp;quot;line&amp;quot;: 23, &amp;quot;class_status&amp;quot;: 1, &amp;quot;class_name&amp;quot;: &amp;quot;gaby&amp;quot;, &amp;quot;class_proba&amp;quot;: [0.63, 0.37]},&lt;br /&gt;
                {&amp;quot;signal&amp;quot;: 24, &amp;quot;line&amp;quot;: 24, &amp;quot;class_status&amp;quot;: 1, &amp;quot;class_name&amp;quot;: &amp;quot;gaby&amp;quot;, &amp;quot;class_proba&amp;quot;: [0.74, 0.26]},&lt;br /&gt;
                {&amp;quot;signal&amp;quot;: 25, &amp;quot;line&amp;quot;: 25, &amp;quot;class_status&amp;quot;: 1, &amp;quot;class_name&amp;quot;: &amp;quot;gaby&amp;quot;, &amp;quot;class_proba&amp;quot;: [0.50, 0.50]},&lt;br /&gt;
                {&amp;quot;signal&amp;quot;: 26, &amp;quot;line&amp;quot;: 26, &amp;quot;class_status&amp;quot;: 2, &amp;quot;class_name&amp;quot;: &amp;quot;gaby&amp;quot;, &amp;quot;class_proba&amp;quot;: [0.06, 0.94]},&lt;br /&gt;
                {&amp;quot;signal&amp;quot;: 27, &amp;quot;line&amp;quot;: 27, &amp;quot;class_status&amp;quot;: 2, &amp;quot;class_name&amp;quot;: &amp;quot;gaby&amp;quot;, &amp;quot;class_proba&amp;quot;: [0.37, 0.63]},&lt;br /&gt;
                {&amp;quot;signal&amp;quot;: 28, &amp;quot;line&amp;quot;: 28, &amp;quot;class_status&amp;quot;: 1, &amp;quot;class_name&amp;quot;: &amp;quot;gaby&amp;quot;, &amp;quot;class_proba&amp;quot;: [0.63, 0.37]},&lt;br /&gt;
                {&amp;quot;signal&amp;quot;: 29, &amp;quot;line&amp;quot;: 29, &amp;quot;class_status&amp;quot;: 1, &amp;quot;class_name&amp;quot;: &amp;quot;gaby&amp;quot;, &amp;quot;class_proba&amp;quot;: [0.63, 0.37]}&lt;br /&gt;
        ],&lt;br /&gt;
        &amp;quot;classification_summary&amp;quot;: {&amp;quot;signals&amp;quot;: 29, &amp;quot;classified&amp;quot;: [19, 10], &amp;quot;unclassified&amp;quot;: 0}&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=Utilisation=&lt;br /&gt;
&lt;br /&gt;
Vérifier que la Raspberry est branchée à l'ordinateur et vérifier le Nucleo est bien connecté à la Raspberry et vérifier que la machine virtuelle gabidann est bien lancée.&lt;br /&gt;
&lt;br /&gt;
Lancer dans un premier temps le serveur TCP sur la machine virtuelle gabidann. Lancer ensuite le client TCP sur la Raspberry.&lt;br /&gt;
&lt;br /&gt;
Les résultats seront affichés dans le terminal de la machine virtuelle.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=Résultats=&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Gabidann results.jpg|néant|vignette|800px]]&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Gabidann results2.jpg|néant|vignette|800px]]&lt;/div&gt;</summary>
		<author><name>Gthomas</name></author>
	</entry>
	<entry>
		<id>https://wiki-se.plil.fr/mediawiki/index.php?title=RodenburgThomas&amp;diff=3652</id>
		<title>RodenburgThomas</title>
		<link rel="alternate" type="text/html" href="https://wiki-se.plil.fr/mediawiki/index.php?title=RodenburgThomas&amp;diff=3652"/>
		<updated>2023-12-20T16:26:29Z</updated>

		<summary type="html">&lt;p&gt;Gthomas : /* Premières observations du capteur */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;=Le binôme=&lt;br /&gt;
&lt;br /&gt;
Le binôme est constitué de 2 élèves de SE5-SC :&lt;br /&gt;
* Dann RODENBURG&lt;br /&gt;
* Gabriel THOMAS&lt;br /&gt;
=Objectifs= &lt;br /&gt;
&lt;br /&gt;
Le but de ce TP est de créer un réseau de systèmes communicants en partant d'un capteur XNucléo 53L5A1 pour finir sur une machine virtuelle Xen.&lt;br /&gt;
La particularité est d'intégrer une composante de Machine Learning  &lt;br /&gt;
&lt;br /&gt;
[[Fichier:Capture d'écran 2023-12-19 151237.png|néant|vignette|800x800px]]&lt;br /&gt;
&lt;br /&gt;
=Edge Computing and Embedded AI=&lt;br /&gt;
&lt;br /&gt;
===Machine virtuelle===&lt;br /&gt;
====Création====&lt;br /&gt;
Création d'une machine virtuelle '''gabidann''' sur le serveur chassiron :&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;xen-create-image --hostname=gabidann --force --dist=bookworm --size=10G --memory=10G --dir=/usr/local/xen --password=glopglop --dhcp --bridge=bridgeStudents&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
La machine virtuelle est à présent connectée au WiFi.&lt;br /&gt;
&lt;br /&gt;
Après cela, nous avons configuré la machine virtuelle selon l'énoncé du TP en faisant un xen console gabidann. Nous avons ensuite participé à la mise en place du point d'accès WiFi.&lt;br /&gt;
&lt;br /&gt;
====Serveur TCP====&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
import socket&lt;br /&gt;
import subprocess&lt;br /&gt;
&lt;br /&gt;
def write_csv(filename, data):&lt;br /&gt;
	if data == &amp;quot;,&amp;quot;:&lt;br /&gt;
		return		# avoid to put single commas in csv file&lt;br /&gt;
	f = open(filename, &amp;quot;a&amp;quot;)&lt;br /&gt;
	f.write(data + &amp;quot;\n&amp;quot;)&lt;br /&gt;
	f.close()&lt;br /&gt;
&lt;br /&gt;
def process_data(data):&lt;br /&gt;
	if data == &amp;quot;,&amp;quot;:&lt;br /&gt;
		return&lt;br /&gt;
	&lt;br /&gt;
	formatted_data = data.replace(',', ' ')&lt;br /&gt;
&lt;br /&gt;
	cmd = f'emulators/NanoEdgeAI_Class_Emulator neai_classification --knowledge_path emulators/knowledge.dat --array &amp;quot;{formatted_data}&amp;quot;'&lt;br /&gt;
	signal = str(subprocess.check_output(cmd.split(&amp;quot; &amp;quot;)))	&lt;br /&gt;
	write_csv(&amp;quot;signal.csv&amp;quot;, signal)&lt;br /&gt;
&lt;br /&gt;
	if &amp;quot;dann&amp;quot; in signal:&lt;br /&gt;
		print(&amp;quot;dann&amp;quot;)&lt;br /&gt;
	elif &amp;quot;gaby&amp;quot; in signal:&lt;br /&gt;
		print(&amp;quot;gaby&amp;quot;)&lt;br /&gt;
	else:&lt;br /&gt;
		print(&amp;quot;Unknown face&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
def handle_connection(conn, filename):&lt;br /&gt;
	while True:&lt;br /&gt;
		try:&lt;br /&gt;
			msg = conn.recv(1024)&lt;br /&gt;
			msg = msg.decode('utf-8')&lt;br /&gt;
		except KeyboardInterrupt:&lt;br /&gt;
			exit()&lt;br /&gt;
		if not msg:&lt;br /&gt;
			print(&amp;quot;Cannot receive message from Raspberry client !&amp;quot;)&lt;br /&gt;
			break&lt;br /&gt;
		else:&lt;br /&gt;
			process_data(msg)&lt;br /&gt;
	print(&amp;quot;Closing Raspberry client connection...&amp;quot;)&lt;br /&gt;
	conn.close()&lt;br /&gt;
&lt;br /&gt;
filename = 'data.csv'&lt;br /&gt;
server_ipv6 = '2001:660:4401:6050:216:3eff:fe98:11ff'&lt;br /&gt;
port = 9999&lt;br /&gt;
&lt;br /&gt;
s = socket.socket(socket.AF_INET6, socket.SOCK_STREAM)&lt;br /&gt;
s.bind((server_ipv6, port))&lt;br /&gt;
s.listen(1)&lt;br /&gt;
print(&amp;quot;Listening on port &amp;quot; + str(port))&lt;br /&gt;
&lt;br /&gt;
while True:&lt;br /&gt;
	try:&lt;br /&gt;
		conn,addr = s.accept()&lt;br /&gt;
	except KeyboardInterrupt:&lt;br /&gt;
		exit()&lt;br /&gt;
	with conn:&lt;br /&gt;
		print(f&amp;quot;New connection from {addr[0]}&amp;quot;)&lt;br /&gt;
		handle_connection(conn, filename)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====Serveur HTTP====&lt;br /&gt;
Configuration d'un serveur HTTP sur la machine virtuelle gabidann :&amp;lt;syntaxhighlight lang=&amp;quot;python3&amp;quot;&amp;gt;&lt;br /&gt;
import socket&lt;br /&gt;
from http.server import HTTPServer, SimpleHTTPRequestHandler&lt;br /&gt;
&lt;br /&gt;
class MyHandler(SimpleHTTPRequestHandler):&lt;br /&gt;
  def do_GET(self):&lt;br /&gt;
    if self.path == '/ip':&lt;br /&gt;
      self.send_response(200)&lt;br /&gt;
      self.send_header('Content-type', 'text/html')&lt;br /&gt;
      self.end_headers()&lt;br /&gt;
      self.wfile.write(f'Your IP address is {self.client_address[0]}'.encode())&lt;br /&gt;
      return&lt;br /&gt;
    else:&lt;br /&gt;
      return SimpleHTTPRequestHandler.do_GET(self)&lt;br /&gt;
&lt;br /&gt;
class HTTPServerV6(HTTPServer):&lt;br /&gt;
  address_family = socket.AF_INET6&lt;br /&gt;
&lt;br /&gt;
def main():&lt;br /&gt;
  server = HTTPServerV6(('::', 8080), MyHandler)&lt;br /&gt;
  server.serve_forever()&lt;br /&gt;
&lt;br /&gt;
if __name__ == '__main__':&lt;br /&gt;
  main()&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Pour se connecter au serveur depuis un navigateur, on peut ouvrir un navigateur depuis la zabeth et y accéder avec l'adresse : ''[&amp;lt;ipv6_VM&amp;gt;]:&amp;lt;port&amp;gt;''. Dans notre cas, le serveur écoute le port '''8080'''.&lt;br /&gt;
&lt;br /&gt;
La page index.html s'affiche par défaut lorsque l'on se connecte au serveur HTTP :&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;html&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;!DOCTYPE html&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;html lang=&amp;quot;fr&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;head&amp;gt;&lt;br /&gt;
	&amp;lt;meta charset=&amp;quot;UTF-8&amp;quot;&amp;gt;&lt;br /&gt;
	&amp;lt;title&amp;gt;Gabidann&amp;lt;/title&amp;gt;&lt;br /&gt;
&amp;lt;/head&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;body&amp;gt;&lt;br /&gt;
	&amp;lt;h1&amp;gt;Bienvenue sur Gabidann !&amp;lt;h1&amp;gt;&lt;br /&gt;
	&amp;lt;div id=&amp;quot;data&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/body&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/html&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;Nous avons également testé la communication en TCP avec l'utilitaire socat&lt;br /&gt;
&lt;br /&gt;
Nous avons créé un serveur python en TCP. Nous pouvons maintenant envoyer des messages du client ( raspberry ) au serveur (VM Xen). Nous nous servirons de cette architecture pour envoyer les données du Nucleo à la Vm Xen &lt;br /&gt;
&lt;br /&gt;
Une fois le modèle entrainé et les tests concluants, on peut déployer notre modèle sur n'importe quel appareils linux ou windows. Pour cela, on va dans l'onglet deployment et on télécharge notre librairie personnalisée.  &lt;br /&gt;
&lt;br /&gt;
===Raspberry===&lt;br /&gt;
D'un autre côté, nous avons branché la Raspberry Pi à l'ordinateur selon le pinout fourni dans la documentation.&lt;br /&gt;
&lt;br /&gt;
[[Fichier:20231218 085218.jpg|vignette|néant]]&lt;br /&gt;
&lt;br /&gt;
Enfin, nous avons activé la communication UART de la Raspberry Pi afin de pouvoir communiquer avec. En fin de séance, nous étions en train de vérifier que la Raspberry Pi répondait bien, même en ayant ajouté la ligne enable_uart=1 dans le fichier config.txt de la Raspberry.&lt;br /&gt;
&lt;br /&gt;
====Configuration de la Raspberry====&lt;br /&gt;
Nous avons résolu le problème de la Raspberry qui ne répondait pas. Cela était dû à l'alimentation : brancher la carte en USBC résoud le problème. Cependant, nous recevons une erreur l'erreur EXT4-fs error (device mmcblk0p2).&lt;br /&gt;
Le problème venait des arguments saisis lors du lancement de Minicom. Avec la commande suivante, il est à présent possible de se connecter sur la Raspberry : &amp;lt;code&amp;gt;minicom -D /dev/ttyUSB0 -b 115200&amp;lt;/code&amp;gt;&lt;br /&gt;
Dans la Raspberry, nous avons configuré une interface réseau wlan0 pour se connecter à WiFi_IE_1 :&lt;br /&gt;
    auto wlan0&lt;br /&gt;
    iface wlan0 inet dhcp&lt;br /&gt;
    wpa-conf /etc/wpa_supplicant/wpa_supplicant.conf&lt;br /&gt;
A présent à partir de la Raspberry, on peut ping la machine virtuelle sur chassiron avec son IPv6.&lt;br /&gt;
&lt;br /&gt;
====Client TCP====&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
import serial&lt;br /&gt;
import socket&lt;br /&gt;
&lt;br /&gt;
server_ipv6 = '2001:660:4401:6050:216:3eff:fe98:11ff'&lt;br /&gt;
server_port = 9999&lt;br /&gt;
&lt;br /&gt;
nucleo_baudrate = 460800&lt;br /&gt;
nucleo_port = '/dev/ttyACM0'&lt;br /&gt;
&lt;br /&gt;
def read_serial(ser):&lt;br /&gt;
        try:&lt;br /&gt;
                serial_data = ser.readline().decode('utf-8').strip()&lt;br /&gt;
                return serial_data&lt;br /&gt;
        except KeyboardInterrupt:&lt;br /&gt;
                ser.close()&lt;br /&gt;
                return None&lt;br /&gt;
&lt;br /&gt;
client = socket.socket(socket.AF_INET6, socket.SOCK_STREAM)&lt;br /&gt;
&lt;br /&gt;
ser = serial.Serial(port=nucleo_port, baudrate=nucleo_baudrate)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Configuration du capteur de distance===&lt;br /&gt;
Un programme était déjà présent sur le capteur. On a téléchargé le logiciel STM32CubeIDE pour pouvoir éditer du code et le téléverser sur le capteur. Nous avons testé de téléverser un programme d'exemple dont voici le résultat :&lt;br /&gt;
[[Fichier:Screenshot 2023-12-18 13-12-19.jpg|vignette|néant|700x700px]]&lt;br /&gt;
&lt;br /&gt;
Nous avons modifié ce programme afin d'effectuer un formatage des données transmises par le capteur sous le format ''&amp;lt;distance&amp;gt;,'' pour chaque valeur. Grâce à ce formatage, il est à présent possible d'utiliser les données reçues par le logiciel NanoEdgeStudio AI pour la partie Machine Learning.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Pour recevoir les valeurs de manière exploitable, il faut modifier le code Exemple dans le logiciel STM Cube IDE&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Capture d'écran 2023-12-20 084719.png|néant|vignette|800x800px]]&lt;br /&gt;
&lt;br /&gt;
L'objectif est d'obtenir une liste séparée par des virgules, il a donc fallu supprimer les espaces et les barres verticales de la fonction d'affichage ainsi que les statuts de chacun des capteurs :&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
static void print_result(RANGING_SENSOR_Result_t *Result)&lt;br /&gt;
{&lt;br /&gt;
  int8_t j;&lt;br /&gt;
  int8_t k;&lt;br /&gt;
  int8_t l;&lt;br /&gt;
  uint8_t zones_per_line;&lt;br /&gt;
  zones_per_line = ((Profile.RangingProfile == RS_PROFILE_8x8_AUTONOMOUS) ||&lt;br /&gt;
         (Profile.RangingProfile == RS_PROFILE_8x8_CONTINUOUS)) ? 8 : 4;&lt;br /&gt;
  for (j = 0; j &amp;lt; Result-&amp;gt;NumberOfZones; j += zones_per_line)&lt;br /&gt;
  {&lt;br /&gt;
    for (l = 0; l &amp;lt; RANGING_SENSOR_NB_TARGET_PER_ZONE; l++)&lt;br /&gt;
    {&lt;br /&gt;
      /* Print distance and status */&lt;br /&gt;
      for (k = (zones_per_line - 1); k &amp;gt;= 0; k--)&lt;br /&gt;
      {&lt;br /&gt;
        if (Result-&amp;gt;ZoneResult[j+k].NumberOfTargets &amp;gt; 0)&lt;br /&gt;
          printf(&amp;quot;%ld,&amp;quot;,(long)Result-&amp;gt;ZoneResult[j+k].Distance[l]);&lt;br /&gt;
      }&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
  printf(&amp;quot;\n&amp;quot;);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Emulation avec NanoEdgeStudio AI===&lt;br /&gt;
&lt;br /&gt;
On passe ensuite sur Nano Edge Studio pour définir les signaux dans l'onglet &amp;quot;Signals&amp;quot; et entraîner le modèle dans l'onglet &amp;quot;Benchmark&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Capture d'écran 2023-12-18 172047.png|néant|vignette|800x800px]]&lt;br /&gt;
&lt;br /&gt;
Une fois le modèle entraîné, on peut le tester avec l'onglet &amp;quot;Emulator&amp;quot; &lt;br /&gt;
&lt;br /&gt;
[[Fichier:Capture d'écran 2023-12-18 173255.png|néant|vignette|800x800px]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Dans un premier temps, nous avons essayé d'entraîner le programme à reconnaître les chiffres 1, 2, 3, 4 et 5 sur les doigts d'une main. Les résultats n'étaient pas concluant, il semblerait que le capteur détecte avant tout le volume de la main à la place de détecter le nombre de doigts.&lt;br /&gt;
&lt;br /&gt;
Nous avons ensuite choisi de faire un détecteur de visages capable de faire la différence entre Gabriel et Dann. L'émulation donne des résultats très satisfaisant proche de 100% de réussite&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
On peut lui passer un fichier CSV contenant les données brutes du capteur et grâce au fichier knowledge.dat, l'émulateur est capable de faire la différence entre les situations&amp;lt;syntaxhighlight lang=&amp;quot;bat&amp;quot;&amp;gt;&lt;br /&gt;
PS C:\Users\gabyt\Documents\Gaby\emulators&amp;gt; .\NanoEdgeAI_Class_Emulator.exe neai_classification --knowledge_path .\knowledge.dat --file .\data.csv&lt;br /&gt;
{&lt;br /&gt;
        &amp;quot;status&amp;quot;: &amp;quot;classification&amp;quot;,&lt;br /&gt;
        &amp;quot;lib_id&amp;quot;: &amp;quot;6582b12625c3e0368b2c2a09&amp;quot;,&lt;br /&gt;
        &amp;quot;input&amp;quot;: &amp;quot;.\data.csv&amp;quot;,&lt;br /&gt;
        &amp;quot;results&amp;quot;: [&lt;br /&gt;
                {&amp;quot;signal&amp;quot;: 1, &amp;quot;line&amp;quot;: 1, &amp;quot;class_status&amp;quot;: 2, &amp;quot;class_name&amp;quot;: &amp;quot;dann&amp;quot;, &amp;quot;class_proba&amp;quot;: [0.01, 0.99]},&lt;br /&gt;
                {&amp;quot;signal&amp;quot;: 2, &amp;quot;line&amp;quot;: 2, &amp;quot;class_status&amp;quot;: 2, &amp;quot;class_name&amp;quot;: &amp;quot;dann&amp;quot;, &amp;quot;class_proba&amp;quot;: [0.01, 0.99]},&lt;br /&gt;
                {&amp;quot;signal&amp;quot;: 3, &amp;quot;line&amp;quot;: 3, &amp;quot;class_status&amp;quot;: 2, &amp;quot;class_name&amp;quot;: &amp;quot;dann&amp;quot;, &amp;quot;class_proba&amp;quot;: [0.37, 0.63]},&lt;br /&gt;
                {&amp;quot;signal&amp;quot;: 4, &amp;quot;line&amp;quot;: 4, &amp;quot;class_status&amp;quot;: 1, &amp;quot;class_name&amp;quot;: &amp;quot;gaby&amp;quot;, &amp;quot;class_proba&amp;quot;: [0.83, 0.17]},&lt;br /&gt;
                {&amp;quot;signal&amp;quot;: 5, &amp;quot;line&amp;quot;: 5, &amp;quot;class_status&amp;quot;: 1, &amp;quot;class_name&amp;quot;: &amp;quot;gaby&amp;quot;, &amp;quot;class_proba&amp;quot;: [0.63, 0.37]},&lt;br /&gt;
                {&amp;quot;signal&amp;quot;: 6, &amp;quot;line&amp;quot;: 6, &amp;quot;class_status&amp;quot;: 1, &amp;quot;class_name&amp;quot;: &amp;quot;gaby&amp;quot;, &amp;quot;class_proba&amp;quot;: [0.63, 0.37]},&lt;br /&gt;
                {&amp;quot;signal&amp;quot;: 7, &amp;quot;line&amp;quot;: 7, &amp;quot;class_status&amp;quot;: 1, &amp;quot;class_name&amp;quot;: &amp;quot;gaby&amp;quot;, &amp;quot;class_proba&amp;quot;: [0.50, 0.50]},&lt;br /&gt;
                {&amp;quot;signal&amp;quot;: 8, &amp;quot;line&amp;quot;: 8, &amp;quot;class_status&amp;quot;: 1, &amp;quot;class_name&amp;quot;: &amp;quot;gaby&amp;quot;, &amp;quot;class_proba&amp;quot;: [0.63, 0.37]},&lt;br /&gt;
                {&amp;quot;signal&amp;quot;: 9, &amp;quot;line&amp;quot;: 9, &amp;quot;class_status&amp;quot;: 2, &amp;quot;class_name&amp;quot;: &amp;quot;dann&amp;quot;, &amp;quot;class_proba&amp;quot;: [0.37, 0.63]},&lt;br /&gt;
                {&amp;quot;signal&amp;quot;: 10, &amp;quot;line&amp;quot;: 10, &amp;quot;class_status&amp;quot;: 2, &amp;quot;class_name&amp;quot;: &amp;quot;dann&amp;quot;, &amp;quot;class_proba&amp;quot;: [0.17, 0.83]},&lt;br /&gt;
                {&amp;quot;signal&amp;quot;: 11, &amp;quot;line&amp;quot;: 11, &amp;quot;class_status&amp;quot;: 1, &amp;quot;class_name&amp;quot;: &amp;quot;gaby&amp;quot;, &amp;quot;class_proba&amp;quot;: [0.63, 0.37]},&lt;br /&gt;
                {&amp;quot;signal&amp;quot;: 12, &amp;quot;line&amp;quot;: 12, &amp;quot;class_status&amp;quot;: 1, &amp;quot;class_name&amp;quot;: &amp;quot;gaby&amp;quot;, &amp;quot;class_proba&amp;quot;: [0.63, 0.37]},&lt;br /&gt;
                {&amp;quot;signal&amp;quot;: 13, &amp;quot;line&amp;quot;: 13, &amp;quot;class_status&amp;quot;: 2, &amp;quot;class_name&amp;quot;: &amp;quot;dann&amp;quot;, &amp;quot;class_proba&amp;quot;: [0.37, 0.63]},&lt;br /&gt;
                {&amp;quot;signal&amp;quot;: 14, &amp;quot;line&amp;quot;: 14, &amp;quot;class_status&amp;quot;: 1, &amp;quot;class_name&amp;quot;: &amp;quot;gaby&amp;quot;, &amp;quot;class_proba&amp;quot;: [0.74, 0.26]},&lt;br /&gt;
                {&amp;quot;signal&amp;quot;: 15, &amp;quot;line&amp;quot;: 15, &amp;quot;class_status&amp;quot;: 1, &amp;quot;class_name&amp;quot;: &amp;quot;gaby&amp;quot;, &amp;quot;class_proba&amp;quot;: [0.63, 0.37]},&lt;br /&gt;
                {&amp;quot;signal&amp;quot;: 16, &amp;quot;line&amp;quot;: 16, &amp;quot;class_status&amp;quot;: 1, &amp;quot;class_name&amp;quot;: &amp;quot;gaby&amp;quot;, &amp;quot;class_proba&amp;quot;: [0.74, 0.26]},&lt;br /&gt;
                {&amp;quot;signal&amp;quot;: 17, &amp;quot;line&amp;quot;: 17, &amp;quot;class_status&amp;quot;: 1, &amp;quot;class_name&amp;quot;: &amp;quot;gaby&amp;quot;, &amp;quot;class_proba&amp;quot;: [0.63, 0.37]},&lt;br /&gt;
                {&amp;quot;signal&amp;quot;: 18, &amp;quot;line&amp;quot;: 18, &amp;quot;class_status&amp;quot;: 1, &amp;quot;class_name&amp;quot;: &amp;quot;gaby&amp;quot;, &amp;quot;class_proba&amp;quot;: [0.63, 0.37]},&lt;br /&gt;
                {&amp;quot;signal&amp;quot;: 19, &amp;quot;line&amp;quot;: 19, &amp;quot;class_status&amp;quot;: 2, &amp;quot;class_name&amp;quot;: &amp;quot;dann&amp;quot;, &amp;quot;class_proba&amp;quot;: [0.37, 0.63]},&lt;br /&gt;
                {&amp;quot;signal&amp;quot;: 20, &amp;quot;line&amp;quot;: 20, &amp;quot;class_status&amp;quot;: 1, &amp;quot;class_name&amp;quot;: &amp;quot;gaby&amp;quot;, &amp;quot;class_proba&amp;quot;: [0.63, 0.37]},&lt;br /&gt;
                {&amp;quot;signal&amp;quot;: 21, &amp;quot;line&amp;quot;: 21, &amp;quot;class_status&amp;quot;: 2, &amp;quot;class_name&amp;quot;: &amp;quot;dann&amp;quot;, &amp;quot;class_proba&amp;quot;: [0.11, 0.89]},&lt;br /&gt;
                {&amp;quot;signal&amp;quot;: 22, &amp;quot;line&amp;quot;: 22, &amp;quot;class_status&amp;quot;: 1, &amp;quot;class_name&amp;quot;: &amp;quot;gaby&amp;quot;, &amp;quot;class_proba&amp;quot;: [0.74, 0.26]},&lt;br /&gt;
                {&amp;quot;signal&amp;quot;: 23, &amp;quot;line&amp;quot;: 23, &amp;quot;class_status&amp;quot;: 1, &amp;quot;class_name&amp;quot;: &amp;quot;gaby&amp;quot;, &amp;quot;class_proba&amp;quot;: [0.63, 0.37]},&lt;br /&gt;
                {&amp;quot;signal&amp;quot;: 24, &amp;quot;line&amp;quot;: 24, &amp;quot;class_status&amp;quot;: 1, &amp;quot;class_name&amp;quot;: &amp;quot;gaby&amp;quot;, &amp;quot;class_proba&amp;quot;: [0.74, 0.26]},&lt;br /&gt;
                {&amp;quot;signal&amp;quot;: 25, &amp;quot;line&amp;quot;: 25, &amp;quot;class_status&amp;quot;: 1, &amp;quot;class_name&amp;quot;: &amp;quot;gaby&amp;quot;, &amp;quot;class_proba&amp;quot;: [0.50, 0.50]},&lt;br /&gt;
                {&amp;quot;signal&amp;quot;: 26, &amp;quot;line&amp;quot;: 26, &amp;quot;class_status&amp;quot;: 2, &amp;quot;class_name&amp;quot;: &amp;quot;dann&amp;quot;, &amp;quot;class_proba&amp;quot;: [0.06, 0.94]},&lt;br /&gt;
                {&amp;quot;signal&amp;quot;: 27, &amp;quot;line&amp;quot;: 27, &amp;quot;class_status&amp;quot;: 2, &amp;quot;class_name&amp;quot;: &amp;quot;dann&amp;quot;, &amp;quot;class_proba&amp;quot;: [0.37, 0.63]},&lt;br /&gt;
                {&amp;quot;signal&amp;quot;: 28, &amp;quot;line&amp;quot;: 28, &amp;quot;class_status&amp;quot;: 1, &amp;quot;class_name&amp;quot;: &amp;quot;gaby&amp;quot;, &amp;quot;class_proba&amp;quot;: [0.63, 0.37]},&lt;br /&gt;
                {&amp;quot;signal&amp;quot;: 29, &amp;quot;line&amp;quot;: 29, &amp;quot;class_status&amp;quot;: 1, &amp;quot;class_name&amp;quot;: &amp;quot;gaby&amp;quot;, &amp;quot;class_proba&amp;quot;: [0.63, 0.37]}&lt;br /&gt;
        ],&lt;br /&gt;
        &amp;quot;classification_summary&amp;quot;: {&amp;quot;signals&amp;quot;: 29, &amp;quot;classified&amp;quot;: [19, 10], &amp;quot;unclassified&amp;quot;: 0}&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=Résultats=&lt;/div&gt;</summary>
		<author><name>Gthomas</name></author>
	</entry>
	<entry>
		<id>https://wiki-se.plil.fr/mediawiki/index.php?title=RodenburgThomas&amp;diff=3641</id>
		<title>RodenburgThomas</title>
		<link rel="alternate" type="text/html" href="https://wiki-se.plil.fr/mediawiki/index.php?title=RodenburgThomas&amp;diff=3641"/>
		<updated>2023-12-20T16:12:50Z</updated>

		<summary type="html">&lt;p&gt;Gthomas : &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;=Le binôme=&lt;br /&gt;
&lt;br /&gt;
Le binôme est constitué de 2 élèves de SE5-SC :&lt;br /&gt;
* Dann RODENBURG&lt;br /&gt;
* Gabriel THOMAS&lt;br /&gt;
=Objectifs= &lt;br /&gt;
&lt;br /&gt;
Le but de ce TP est de créer un réseau de systèmes communicants en partant d'un capteur XNucléo 53L5A1 pour finir sur une machine virtuelle Xen.&lt;br /&gt;
La particularité est d'intégrer une composante de Machine Learning  &lt;br /&gt;
&lt;br /&gt;
[[Fichier:Capture d'écran 2023-12-19 151237.png|néant|vignette|800x800px]]&lt;br /&gt;
&lt;br /&gt;
=Résultats=&lt;br /&gt;
&lt;br /&gt;
===Création de la machine virtuelle===&lt;br /&gt;
Création d'une machine virtuelle '''gabidann''' sur le serveur chassiron :&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;xen-create-image --hostname=gabidann --force --dist=bookworm --size=10G --memory=10G --dir=/usr/local/xen --password=glopglop --dhcp --bridge=bridgeStudents&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
La machine virtuelle est à présent connectée au WiFi.&lt;br /&gt;
&lt;br /&gt;
Après cela, nous avons configuré la machine virtuelle selon l'énoncé du TP en faisant un xen console gabidann. Nous avons ensuite participé à la mise en place du point d'accès WiFi.&lt;br /&gt;
&lt;br /&gt;
===Premières observations du capteur===&lt;br /&gt;
De plus nous avons observé le retour du capteur de distance Nucleo-53L5A1 avec l'outil minicom. Le contenu envoyé par le capteur était compréhensible avec une fréquence de 460 800 bauds ; sur minicom, on a pu constater que le capteur nous envoie des valeurs qui dépendent de la distance entre celui-ci et un obstacle.&lt;br /&gt;
&lt;br /&gt;
===Raspberry===&lt;br /&gt;
D'un autre côté, nous avons branché la Raspberry Pi à l'ordinateur selon le pinout fourni dans la documentation.&lt;br /&gt;
&lt;br /&gt;
[[Fichier:20231218 085218.jpg|vignette|néant]]&lt;br /&gt;
&lt;br /&gt;
Enfin, nous avons activé la communication UART de la Raspberry Pi afin de pouvoir communiquer avec. En fin de séance, nous étions en train de vérifier que la Raspberry Pi répondait bien, même en ayant ajouté la ligne enable_uart=1 dans le fichier config.txt de la Raspberry.&lt;br /&gt;
&lt;br /&gt;
===Configuration de la Raspberry===&lt;br /&gt;
Nous avons résolu le problème de la Raspberry qui ne répondait pas. Cela était dû à l'alimentation : brancher la carte en USBC résoud le problème. Cependant, nous recevons une erreur l'erreur EXT4-fs error (device mmcblk0p2).&lt;br /&gt;
Le problème venait des arguments saisis lors du lancement de Minicom. Avec la commande suivante, il est à présent possible de se connecter sur la Raspberry : &amp;lt;code&amp;gt;minicom -D /dev/ttyUSB0 -b 115200&amp;lt;/code&amp;gt;&lt;br /&gt;
Dans la Raspberry, nous avons configuré une interface réseau wlan0 pour se connecter à WiFi_IE_1 :&lt;br /&gt;
    auto wlan0&lt;br /&gt;
    iface wlan0 inet dhcp&lt;br /&gt;
    wpa-conf /etc/wpa_supplicant/wpa_supplicant.conf&lt;br /&gt;
A présent à partir de la Raspberry, on peut ping la machine virtuelle sur chassiron avec son IPv6.&lt;br /&gt;
&lt;br /&gt;
===Configuration du capteur de distance===&lt;br /&gt;
Un programme était déjà présent sur le capteur. On a téléchargé le logiciel STM32CubeIDE pour pouvoir éditer du code et le téléverser sur le capteur. Nous avons testé de téléverser un programme d'exemple dont voici le résultat :&lt;br /&gt;
[[Fichier:Screenshot 2023-12-18 13-12-19.jpg|vignette|néant|700x700px]]&lt;br /&gt;
&lt;br /&gt;
Nous avons modifié ce programme afin d'effectuer un formatage des données transmises par le capteur sous le format ''&amp;lt;distance&amp;gt;,'' pour chaque valeur. Grâce à ce formatage, il est à présent possible d'utiliser les données reçues par le logiciel NanoEdgeStudio AI pour la partie Machine Learning.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Pour recevoir les valeurs de manière exploitable, il faut modifier le code Exemple dans le logiciel STM Cube IDE&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Capture d'écran 2023-12-20 084719.png|néant|vignette|800x800px]]&lt;br /&gt;
&lt;br /&gt;
L'objectif est d'obtenir une liste séparée par des virgules, il a donc fallu supprimer les espaces et les barres verticales de la fonction d'affichage ainsi que les statuts de chacun des capteurs :&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
static void print_result(RANGING_SENSOR_Result_t *Result)&lt;br /&gt;
{&lt;br /&gt;
  int8_t j;&lt;br /&gt;
  int8_t k;&lt;br /&gt;
  int8_t l;&lt;br /&gt;
  uint8_t zones_per_line;&lt;br /&gt;
  zones_per_line = ((Profile.RangingProfile == RS_PROFILE_8x8_AUTONOMOUS) ||&lt;br /&gt;
         (Profile.RangingProfile == RS_PROFILE_8x8_CONTINUOUS)) ? 8 : 4;&lt;br /&gt;
  for (j = 0; j &amp;lt; Result-&amp;gt;NumberOfZones; j += zones_per_line)&lt;br /&gt;
  {&lt;br /&gt;
    for (l = 0; l &amp;lt; RANGING_SENSOR_NB_TARGET_PER_ZONE; l++)&lt;br /&gt;
    {&lt;br /&gt;
      /* Print distance and status */&lt;br /&gt;
      for (k = (zones_per_line - 1); k &amp;gt;= 0; k--)&lt;br /&gt;
      {&lt;br /&gt;
        if (Result-&amp;gt;ZoneResult[j+k].NumberOfTargets &amp;gt; 0)&lt;br /&gt;
          printf(&amp;quot;%ld,&amp;quot;,(long)Result-&amp;gt;ZoneResult[j+k].Distance[l]);&lt;br /&gt;
      }&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
  printf(&amp;quot;\n&amp;quot;);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;On passe ensuite sur Nano Edge Studio pour définir les signaux dans l'onglet &amp;quot;Signals&amp;quot; et entraîner le modèle dans l'onglet &amp;quot;Benchmark&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Capture d'écran 2023-12-18 172047.png|néant|vignette|800x800px]]&lt;br /&gt;
&lt;br /&gt;
Une fois le modèle entraîné, on peut le tester avec l'onglet &amp;quot;Emulator&amp;quot; &lt;br /&gt;
&lt;br /&gt;
[[Fichier:Capture d'écran 2023-12-18 173255.png|néant|vignette|800x800px]]&lt;br /&gt;
&lt;br /&gt;
===Emulation avec NanoEdgeStudio AI===&lt;br /&gt;
&lt;br /&gt;
Dans un premier temps, nous avons essayé d'entraîner le programme à reconnaître les chiffres 1, 2, 3, 4 et 5 sur les doigts d'une main. Les résultats n'étaient pas concluant, il semblerait que le capteur détecte avant tout le volume de la main à la place de détecter le nombre de doigts.&lt;br /&gt;
&lt;br /&gt;
Nous avons ensuite choisi de faire un détecteur de visages capable de faire la différence entre Gabriel et Dann. L'émulation donne des résultats très satisfaisant proche de 100% de réussite&lt;br /&gt;
&lt;br /&gt;
===Configuration du serveur===&lt;br /&gt;
Configuration d'un serveur HTTP sur la machine virtuelle gabidann :&amp;lt;syntaxhighlight lang=&amp;quot;python3&amp;quot;&amp;gt;&lt;br /&gt;
import socket&lt;br /&gt;
from http.server import HTTPServer, SimpleHTTPRequestHandler&lt;br /&gt;
&lt;br /&gt;
class MyHandler(SimpleHTTPRequestHandler):&lt;br /&gt;
  def do_GET(self):&lt;br /&gt;
    if self.path == '/ip':&lt;br /&gt;
      self.send_response(200)&lt;br /&gt;
      self.send_header('Content-type', 'text/html')&lt;br /&gt;
      self.end_headers()&lt;br /&gt;
      self.wfile.write(f'Your IP address is {self.client_address[0]}'.encode())&lt;br /&gt;
      return&lt;br /&gt;
    else:&lt;br /&gt;
      return SimpleHTTPRequestHandler.do_GET(self)&lt;br /&gt;
&lt;br /&gt;
class HTTPServerV6(HTTPServer):&lt;br /&gt;
  address_family = socket.AF_INET6&lt;br /&gt;
&lt;br /&gt;
def main():&lt;br /&gt;
  server = HTTPServerV6(('::', 8080), MyHandler)&lt;br /&gt;
  server.serve_forever()&lt;br /&gt;
&lt;br /&gt;
if __name__ == '__main__':&lt;br /&gt;
  main()&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Pour se connecter au serveur depuis un navigateur, on peut ouvrir un navigateur depuis la zabeth et y accéder avec l'adresse : ''[&amp;lt;ipv6_VM&amp;gt;]:&amp;lt;port&amp;gt;''. Dans notre cas, le serveur écoute le port '''8080'''.&lt;br /&gt;
&lt;br /&gt;
La page index.html s'affiche par défaut lorsque l'on se connecte au serveur HTTP :&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;html&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;!DOCTYPE html&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;html lang=&amp;quot;fr&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;head&amp;gt;&lt;br /&gt;
	&amp;lt;meta charset=&amp;quot;UTF-8&amp;quot;&amp;gt;&lt;br /&gt;
	&amp;lt;title&amp;gt;Gabidann&amp;lt;/title&amp;gt;&lt;br /&gt;
&amp;lt;/head&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;body&amp;gt;&lt;br /&gt;
	&amp;lt;h1&amp;gt;Bienvenue sur Gabidann !&amp;lt;h1&amp;gt;&lt;br /&gt;
	&amp;lt;div id=&amp;quot;data&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/body&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/html&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;Nous avons également testé la communication en TCP avec l'utilitaire socat&lt;br /&gt;
&lt;br /&gt;
Nous avons créé un serveur python en TCP. Nous pouvons maintenant envoyer des messages du client ( raspberry ) au serveur (VM Xen). Nous nous servirons de cette architecture pour envoyer les données du Nucleo à la Vm Xen &lt;br /&gt;
&lt;br /&gt;
Une fois le modèle entrainé et les tests concluants, on peut déployer notre modèle sur n'importe quel appareils linux ou windows. Pour cela, on va dans l'onglet deployment et on télécharge notre librairie personnalisée.  &lt;br /&gt;
&lt;br /&gt;
===Déploiement du modèle===&lt;br /&gt;
&lt;br /&gt;
On peut lui passer un fichier CSV contenant les données brutes du capteur et grâce au fichier knowledge.dat, l'émulateur est capable de faire la différence entre les situations&amp;lt;syntaxhighlight lang=&amp;quot;bat&amp;quot;&amp;gt;&lt;br /&gt;
PS C:\Users\gabyt\Documents\Gaby\emulators&amp;gt; .\NanoEdgeAI_Class_Emulator.exe neai_classification --knowledge_path .\knowledge.dat --file .\data.csv&lt;br /&gt;
{&lt;br /&gt;
        &amp;quot;status&amp;quot;: &amp;quot;classification&amp;quot;,&lt;br /&gt;
        &amp;quot;lib_id&amp;quot;: &amp;quot;6582b12625c3e0368b2c2a09&amp;quot;,&lt;br /&gt;
        &amp;quot;input&amp;quot;: &amp;quot;.\data.csv&amp;quot;,&lt;br /&gt;
        &amp;quot;results&amp;quot;: [&lt;br /&gt;
                {&amp;quot;signal&amp;quot;: 1, &amp;quot;line&amp;quot;: 1, &amp;quot;class_status&amp;quot;: 2, &amp;quot;class_name&amp;quot;: &amp;quot;dann&amp;quot;, &amp;quot;class_proba&amp;quot;: [0.01, 0.99]},&lt;br /&gt;
                {&amp;quot;signal&amp;quot;: 2, &amp;quot;line&amp;quot;: 2, &amp;quot;class_status&amp;quot;: 2, &amp;quot;class_name&amp;quot;: &amp;quot;dann&amp;quot;, &amp;quot;class_proba&amp;quot;: [0.01, 0.99]},&lt;br /&gt;
                {&amp;quot;signal&amp;quot;: 3, &amp;quot;line&amp;quot;: 3, &amp;quot;class_status&amp;quot;: 2, &amp;quot;class_name&amp;quot;: &amp;quot;dann&amp;quot;, &amp;quot;class_proba&amp;quot;: [0.37, 0.63]},&lt;br /&gt;
                {&amp;quot;signal&amp;quot;: 4, &amp;quot;line&amp;quot;: 4, &amp;quot;class_status&amp;quot;: 1, &amp;quot;class_name&amp;quot;: &amp;quot;gaby&amp;quot;, &amp;quot;class_proba&amp;quot;: [0.83, 0.17]},&lt;br /&gt;
                {&amp;quot;signal&amp;quot;: 5, &amp;quot;line&amp;quot;: 5, &amp;quot;class_status&amp;quot;: 1, &amp;quot;class_name&amp;quot;: &amp;quot;gaby&amp;quot;, &amp;quot;class_proba&amp;quot;: [0.63, 0.37]},&lt;br /&gt;
                {&amp;quot;signal&amp;quot;: 6, &amp;quot;line&amp;quot;: 6, &amp;quot;class_status&amp;quot;: 1, &amp;quot;class_name&amp;quot;: &amp;quot;gaby&amp;quot;, &amp;quot;class_proba&amp;quot;: [0.63, 0.37]},&lt;br /&gt;
                {&amp;quot;signal&amp;quot;: 7, &amp;quot;line&amp;quot;: 7, &amp;quot;class_status&amp;quot;: 1, &amp;quot;class_name&amp;quot;: &amp;quot;gaby&amp;quot;, &amp;quot;class_proba&amp;quot;: [0.50, 0.50]},&lt;br /&gt;
                {&amp;quot;signal&amp;quot;: 8, &amp;quot;line&amp;quot;: 8, &amp;quot;class_status&amp;quot;: 1, &amp;quot;class_name&amp;quot;: &amp;quot;gaby&amp;quot;, &amp;quot;class_proba&amp;quot;: [0.63, 0.37]},&lt;br /&gt;
                {&amp;quot;signal&amp;quot;: 9, &amp;quot;line&amp;quot;: 9, &amp;quot;class_status&amp;quot;: 2, &amp;quot;class_name&amp;quot;: &amp;quot;dann&amp;quot;, &amp;quot;class_proba&amp;quot;: [0.37, 0.63]},&lt;br /&gt;
                {&amp;quot;signal&amp;quot;: 10, &amp;quot;line&amp;quot;: 10, &amp;quot;class_status&amp;quot;: 2, &amp;quot;class_name&amp;quot;: &amp;quot;dann&amp;quot;, &amp;quot;class_proba&amp;quot;: [0.17, 0.83]},&lt;br /&gt;
                {&amp;quot;signal&amp;quot;: 11, &amp;quot;line&amp;quot;: 11, &amp;quot;class_status&amp;quot;: 1, &amp;quot;class_name&amp;quot;: &amp;quot;gaby&amp;quot;, &amp;quot;class_proba&amp;quot;: [0.63, 0.37]},&lt;br /&gt;
                {&amp;quot;signal&amp;quot;: 12, &amp;quot;line&amp;quot;: 12, &amp;quot;class_status&amp;quot;: 1, &amp;quot;class_name&amp;quot;: &amp;quot;gaby&amp;quot;, &amp;quot;class_proba&amp;quot;: [0.63, 0.37]},&lt;br /&gt;
                {&amp;quot;signal&amp;quot;: 13, &amp;quot;line&amp;quot;: 13, &amp;quot;class_status&amp;quot;: 2, &amp;quot;class_name&amp;quot;: &amp;quot;dann&amp;quot;, &amp;quot;class_proba&amp;quot;: [0.37, 0.63]},&lt;br /&gt;
                {&amp;quot;signal&amp;quot;: 14, &amp;quot;line&amp;quot;: 14, &amp;quot;class_status&amp;quot;: 1, &amp;quot;class_name&amp;quot;: &amp;quot;gaby&amp;quot;, &amp;quot;class_proba&amp;quot;: [0.74, 0.26]},&lt;br /&gt;
                {&amp;quot;signal&amp;quot;: 15, &amp;quot;line&amp;quot;: 15, &amp;quot;class_status&amp;quot;: 1, &amp;quot;class_name&amp;quot;: &amp;quot;gaby&amp;quot;, &amp;quot;class_proba&amp;quot;: [0.63, 0.37]},&lt;br /&gt;
                {&amp;quot;signal&amp;quot;: 16, &amp;quot;line&amp;quot;: 16, &amp;quot;class_status&amp;quot;: 1, &amp;quot;class_name&amp;quot;: &amp;quot;gaby&amp;quot;, &amp;quot;class_proba&amp;quot;: [0.74, 0.26]},&lt;br /&gt;
                {&amp;quot;signal&amp;quot;: 17, &amp;quot;line&amp;quot;: 17, &amp;quot;class_status&amp;quot;: 1, &amp;quot;class_name&amp;quot;: &amp;quot;gaby&amp;quot;, &amp;quot;class_proba&amp;quot;: [0.63, 0.37]},&lt;br /&gt;
                {&amp;quot;signal&amp;quot;: 18, &amp;quot;line&amp;quot;: 18, &amp;quot;class_status&amp;quot;: 1, &amp;quot;class_name&amp;quot;: &amp;quot;gaby&amp;quot;, &amp;quot;class_proba&amp;quot;: [0.63, 0.37]},&lt;br /&gt;
                {&amp;quot;signal&amp;quot;: 19, &amp;quot;line&amp;quot;: 19, &amp;quot;class_status&amp;quot;: 2, &amp;quot;class_name&amp;quot;: &amp;quot;dann&amp;quot;, &amp;quot;class_proba&amp;quot;: [0.37, 0.63]},&lt;br /&gt;
                {&amp;quot;signal&amp;quot;: 20, &amp;quot;line&amp;quot;: 20, &amp;quot;class_status&amp;quot;: 1, &amp;quot;class_name&amp;quot;: &amp;quot;gaby&amp;quot;, &amp;quot;class_proba&amp;quot;: [0.63, 0.37]},&lt;br /&gt;
                {&amp;quot;signal&amp;quot;: 21, &amp;quot;line&amp;quot;: 21, &amp;quot;class_status&amp;quot;: 2, &amp;quot;class_name&amp;quot;: &amp;quot;dann&amp;quot;, &amp;quot;class_proba&amp;quot;: [0.11, 0.89]},&lt;br /&gt;
                {&amp;quot;signal&amp;quot;: 22, &amp;quot;line&amp;quot;: 22, &amp;quot;class_status&amp;quot;: 1, &amp;quot;class_name&amp;quot;: &amp;quot;gaby&amp;quot;, &amp;quot;class_proba&amp;quot;: [0.74, 0.26]},&lt;br /&gt;
                {&amp;quot;signal&amp;quot;: 23, &amp;quot;line&amp;quot;: 23, &amp;quot;class_status&amp;quot;: 1, &amp;quot;class_name&amp;quot;: &amp;quot;gaby&amp;quot;, &amp;quot;class_proba&amp;quot;: [0.63, 0.37]},&lt;br /&gt;
                {&amp;quot;signal&amp;quot;: 24, &amp;quot;line&amp;quot;: 24, &amp;quot;class_status&amp;quot;: 1, &amp;quot;class_name&amp;quot;: &amp;quot;gaby&amp;quot;, &amp;quot;class_proba&amp;quot;: [0.74, 0.26]},&lt;br /&gt;
                {&amp;quot;signal&amp;quot;: 25, &amp;quot;line&amp;quot;: 25, &amp;quot;class_status&amp;quot;: 1, &amp;quot;class_name&amp;quot;: &amp;quot;gaby&amp;quot;, &amp;quot;class_proba&amp;quot;: [0.50, 0.50]},&lt;br /&gt;
                {&amp;quot;signal&amp;quot;: 26, &amp;quot;line&amp;quot;: 26, &amp;quot;class_status&amp;quot;: 2, &amp;quot;class_name&amp;quot;: &amp;quot;dann&amp;quot;, &amp;quot;class_proba&amp;quot;: [0.06, 0.94]},&lt;br /&gt;
                {&amp;quot;signal&amp;quot;: 27, &amp;quot;line&amp;quot;: 27, &amp;quot;class_status&amp;quot;: 2, &amp;quot;class_name&amp;quot;: &amp;quot;dann&amp;quot;, &amp;quot;class_proba&amp;quot;: [0.37, 0.63]},&lt;br /&gt;
                {&amp;quot;signal&amp;quot;: 28, &amp;quot;line&amp;quot;: 28, &amp;quot;class_status&amp;quot;: 1, &amp;quot;class_name&amp;quot;: &amp;quot;gaby&amp;quot;, &amp;quot;class_proba&amp;quot;: [0.63, 0.37]},&lt;br /&gt;
                {&amp;quot;signal&amp;quot;: 29, &amp;quot;line&amp;quot;: 29, &amp;quot;class_status&amp;quot;: 1, &amp;quot;class_name&amp;quot;: &amp;quot;gaby&amp;quot;, &amp;quot;class_proba&amp;quot;: [0.63, 0.37]}&lt;br /&gt;
        ],&lt;br /&gt;
        &amp;quot;classification_summary&amp;quot;: {&amp;quot;signals&amp;quot;: 29, &amp;quot;classified&amp;quot;: [19, 10], &amp;quot;unclassified&amp;quot;: 0}&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Visualisation des données sur le serveur===&lt;/div&gt;</summary>
		<author><name>Gthomas</name></author>
	</entry>
	<entry>
		<id>https://wiki-se.plil.fr/mediawiki/index.php?title=RodenburgThomas&amp;diff=3638</id>
		<title>RodenburgThomas</title>
		<link rel="alternate" type="text/html" href="https://wiki-se.plil.fr/mediawiki/index.php?title=RodenburgThomas&amp;diff=3638"/>
		<updated>2023-12-20T16:12:03Z</updated>

		<summary type="html">&lt;p&gt;Gthomas : /* Le binôme */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;=Le binôme=&lt;br /&gt;
&lt;br /&gt;
Le binôme est constitué de 2 élèves de SE5-SC :&lt;br /&gt;
* Dann RODENBURG&lt;br /&gt;
* Gabriel THOMAS&lt;br /&gt;
=Objectifs= &lt;br /&gt;
&lt;br /&gt;
Le but de ce TP est de créer un réseau de systèmes communicants en partant d'un capteur XNucléo 53L5A1 pour finir sur une machine virtuelle Xen.&lt;br /&gt;
La particularité est d'intégrer une composante de Machine Learning  &lt;br /&gt;
&lt;br /&gt;
[[Fichier:Capture d'écran 2023-12-19 151237.png|néant|vignette|800x800px]]&lt;br /&gt;
&lt;br /&gt;
=Compte rendu des séances=&lt;br /&gt;
&lt;br /&gt;
===Création de la machine virtuelle===&lt;br /&gt;
Création d'une machine virtuelle '''gabidann''' sur le serveur chassiron :&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;xen-create-image --hostname=gabidann --force --dist=bookworm --size=10G --memory=10G --dir=/usr/local/xen --password=glopglop --dhcp --bridge=bridgeStudents&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
La machine virtuelle est à présent connectée au WiFi.&lt;br /&gt;
&lt;br /&gt;
Après cela, nous avons configuré la machine virtuelle selon l'énoncé du TP en faisant un xen console gabidann. Nous avons ensuite participé à la mise en place du point d'accès WiFi.&lt;br /&gt;
&lt;br /&gt;
===Premières observations du capteur===&lt;br /&gt;
De plus nous avons observé le retour du capteur de distance Nucleo-53L5A1 avec l'outil minicom. Le contenu envoyé par le capteur était compréhensible avec une fréquence de 460 800 bauds ; sur minicom, on a pu constater que le capteur nous envoie des valeurs qui dépendent de la distance entre celui-ci et un obstacle.&lt;br /&gt;
&lt;br /&gt;
===Raspberry===&lt;br /&gt;
D'un autre côté, nous avons branché la Raspberry Pi à l'ordinateur selon le pinout fourni dans la documentation.&lt;br /&gt;
&lt;br /&gt;
[[Fichier:20231218 085218.jpg|vignette|néant]]&lt;br /&gt;
&lt;br /&gt;
Enfin, nous avons activé la communication UART de la Raspberry Pi afin de pouvoir communiquer avec. En fin de séance, nous étions en train de vérifier que la Raspberry Pi répondait bien, même en ayant ajouté la ligne enable_uart=1 dans le fichier config.txt de la Raspberry.&lt;br /&gt;
&lt;br /&gt;
===Configuration de la Raspberry===&lt;br /&gt;
Nous avons résolu le problème de la Raspberry qui ne répondait pas. Cela était dû à l'alimentation : brancher la carte en USBC résoud le problème. Cependant, nous recevons une erreur l'erreur EXT4-fs error (device mmcblk0p2).&lt;br /&gt;
Le problème venait des arguments saisis lors du lancement de Minicom. Avec la commande suivante, il est à présent possible de se connecter sur la Raspberry : &amp;lt;code&amp;gt;minicom -D /dev/ttyUSB0 -b 115200&amp;lt;/code&amp;gt;&lt;br /&gt;
Dans la Raspberry, nous avons configuré une interface réseau wlan0 pour se connecter à WiFi_IE_1 :&lt;br /&gt;
    auto wlan0&lt;br /&gt;
    iface wlan0 inet dhcp&lt;br /&gt;
    wpa-conf /etc/wpa_supplicant/wpa_supplicant.conf&lt;br /&gt;
A présent à partir de la Raspberry, on peut ping la machine virtuelle sur chassiron avec son IPv6.&lt;br /&gt;
&lt;br /&gt;
===Configuration du capteur de distance===&lt;br /&gt;
Un programme était déjà présent sur le capteur. On a téléchargé le logiciel STM32CubeIDE pour pouvoir éditer du code et le téléverser sur le capteur. Nous avons testé de téléverser un programme d'exemple dont voici le résultat :&lt;br /&gt;
[[Fichier:Screenshot 2023-12-18 13-12-19.jpg|vignette|néant|700x700px]]&lt;br /&gt;
&lt;br /&gt;
Nous avons modifié ce programme afin d'effectuer un formatage des données transmises par le capteur sous le format ''&amp;lt;distance&amp;gt;,'' pour chaque valeur. Grâce à ce formatage, il est à présent possible d'utiliser les données reçues par le logiciel NanoEdgeStudio AI pour la partie Machine Learning.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Pour recevoir les valeurs de manière exploitable, il faut modifier le code Exemple dans le logiciel STM Cube IDE&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Capture d'écran 2023-12-20 084719.png|néant|vignette|800x800px]]&lt;br /&gt;
&lt;br /&gt;
L'objectif est d'obtenir une liste séparée par des virgules, il a donc fallu supprimer les espaces et les barres verticales de la fonction d'affichage ainsi que les statuts de chacun des capteurs :&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
static void print_result(RANGING_SENSOR_Result_t *Result)&lt;br /&gt;
{&lt;br /&gt;
  int8_t j;&lt;br /&gt;
  int8_t k;&lt;br /&gt;
  int8_t l;&lt;br /&gt;
  uint8_t zones_per_line;&lt;br /&gt;
  zones_per_line = ((Profile.RangingProfile == RS_PROFILE_8x8_AUTONOMOUS) ||&lt;br /&gt;
         (Profile.RangingProfile == RS_PROFILE_8x8_CONTINUOUS)) ? 8 : 4;&lt;br /&gt;
  for (j = 0; j &amp;lt; Result-&amp;gt;NumberOfZones; j += zones_per_line)&lt;br /&gt;
  {&lt;br /&gt;
    for (l = 0; l &amp;lt; RANGING_SENSOR_NB_TARGET_PER_ZONE; l++)&lt;br /&gt;
    {&lt;br /&gt;
      /* Print distance and status */&lt;br /&gt;
      for (k = (zones_per_line - 1); k &amp;gt;= 0; k--)&lt;br /&gt;
      {&lt;br /&gt;
        if (Result-&amp;gt;ZoneResult[j+k].NumberOfTargets &amp;gt; 0)&lt;br /&gt;
          printf(&amp;quot;%ld,&amp;quot;,(long)Result-&amp;gt;ZoneResult[j+k].Distance[l]);&lt;br /&gt;
      }&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
  printf(&amp;quot;\n&amp;quot;);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;On passe ensuite sur Nano Edge Studio pour définir les signaux dans l'onglet &amp;quot;Signals&amp;quot; et entraîner le modèle dans l'onglet &amp;quot;Benchmark&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Capture d'écran 2023-12-18 172047.png|néant|vignette|800x800px]]&lt;br /&gt;
&lt;br /&gt;
Une fois le modèle entraîné, on peut le tester avec l'onglet &amp;quot;Emulator&amp;quot; &lt;br /&gt;
&lt;br /&gt;
[[Fichier:Capture d'écran 2023-12-18 173255.png|néant|vignette|800x800px]]&lt;br /&gt;
&lt;br /&gt;
===Emulation avec NanoEdgeStudio AI===&lt;br /&gt;
&lt;br /&gt;
Dans un premier temps, nous avons essayé d'entraîner le programme à reconnaître les chiffres 1, 2, 3, 4 et 5 sur les doigts d'une main. Les résultats n'étaient pas concluant, il semblerait que le capteur détecte avant tout le volume de la main à la place de détecter le nombre de doigts.&lt;br /&gt;
&lt;br /&gt;
Nous avons ensuite choisi de faire un détecteur de visages capable de faire la différence entre Gabriel et Dann. L'émulation donne des résultats très satisfaisant proche de 100% de réussite&lt;br /&gt;
&lt;br /&gt;
===Configuration du serveur===&lt;br /&gt;
Configuration d'un serveur HTTP sur la machine virtuelle gabidann :&amp;lt;syntaxhighlight lang=&amp;quot;python3&amp;quot;&amp;gt;&lt;br /&gt;
import socket&lt;br /&gt;
from http.server import HTTPServer, SimpleHTTPRequestHandler&lt;br /&gt;
&lt;br /&gt;
class MyHandler(SimpleHTTPRequestHandler):&lt;br /&gt;
  def do_GET(self):&lt;br /&gt;
    if self.path == '/ip':&lt;br /&gt;
      self.send_response(200)&lt;br /&gt;
      self.send_header('Content-type', 'text/html')&lt;br /&gt;
      self.end_headers()&lt;br /&gt;
      self.wfile.write(f'Your IP address is {self.client_address[0]}'.encode())&lt;br /&gt;
      return&lt;br /&gt;
    else:&lt;br /&gt;
      return SimpleHTTPRequestHandler.do_GET(self)&lt;br /&gt;
&lt;br /&gt;
class HTTPServerV6(HTTPServer):&lt;br /&gt;
  address_family = socket.AF_INET6&lt;br /&gt;
&lt;br /&gt;
def main():&lt;br /&gt;
  server = HTTPServerV6(('::', 8080), MyHandler)&lt;br /&gt;
  server.serve_forever()&lt;br /&gt;
&lt;br /&gt;
if __name__ == '__main__':&lt;br /&gt;
  main()&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Pour se connecter au serveur depuis un navigateur, on peut ouvrir un navigateur depuis la zabeth et y accéder avec l'adresse : ''[&amp;lt;ipv6_VM&amp;gt;]:&amp;lt;port&amp;gt;''. Dans notre cas, le serveur écoute le port '''8080'''.&lt;br /&gt;
&lt;br /&gt;
La page index.html s'affiche par défaut lorsque l'on se connecte au serveur HTTP :&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;html&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;!DOCTYPE html&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;html lang=&amp;quot;fr&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;head&amp;gt;&lt;br /&gt;
	&amp;lt;meta charset=&amp;quot;UTF-8&amp;quot;&amp;gt;&lt;br /&gt;
	&amp;lt;title&amp;gt;Gabidann&amp;lt;/title&amp;gt;&lt;br /&gt;
&amp;lt;/head&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;body&amp;gt;&lt;br /&gt;
	&amp;lt;h1&amp;gt;Bienvenue sur Gabidann !&amp;lt;h1&amp;gt;&lt;br /&gt;
	&amp;lt;div id=&amp;quot;data&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/body&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/html&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;Nous avons également testé la communication en TCP avec l'utilitaire socat&lt;br /&gt;
&lt;br /&gt;
Nous avons créé un serveur python en TCP. Nous pouvons maintenant envoyer des messages du client ( raspberry ) au serveur (VM Xen). Nous nous servirons de cette architecture pour envoyer les données du Nucleo à la Vm Xen &lt;br /&gt;
&lt;br /&gt;
Une fois le modèle entrainé et les tests concluants, on peut déployer notre modèle sur n'importe quel appareils linux ou windows. Pour cela, on va dans l'onglet deployment et on télécharge notre librairie personnalisée.  &lt;br /&gt;
&lt;br /&gt;
===Déploiement du modèle===&lt;br /&gt;
&lt;br /&gt;
On peut lui passer un fichier CSV contenant les données brutes du capteur et grâce au fichier knowledge.dat, l'émulateur est capable de faire la différence entre les situations&amp;lt;syntaxhighlight lang=&amp;quot;bat&amp;quot;&amp;gt;&lt;br /&gt;
PS C:\Users\gabyt\Documents\Gaby\emulators&amp;gt; .\NanoEdgeAI_Class_Emulator.exe neai_classification --knowledge_path .\knowledge.dat --file .\data.csv&lt;br /&gt;
{&lt;br /&gt;
        &amp;quot;status&amp;quot;: &amp;quot;classification&amp;quot;,&lt;br /&gt;
        &amp;quot;lib_id&amp;quot;: &amp;quot;6582b12625c3e0368b2c2a09&amp;quot;,&lt;br /&gt;
        &amp;quot;input&amp;quot;: &amp;quot;.\data.csv&amp;quot;,&lt;br /&gt;
        &amp;quot;results&amp;quot;: [&lt;br /&gt;
                {&amp;quot;signal&amp;quot;: 1, &amp;quot;line&amp;quot;: 1, &amp;quot;class_status&amp;quot;: 2, &amp;quot;class_name&amp;quot;: &amp;quot;dann&amp;quot;, &amp;quot;class_proba&amp;quot;: [0.01, 0.99]},&lt;br /&gt;
                {&amp;quot;signal&amp;quot;: 2, &amp;quot;line&amp;quot;: 2, &amp;quot;class_status&amp;quot;: 2, &amp;quot;class_name&amp;quot;: &amp;quot;dann&amp;quot;, &amp;quot;class_proba&amp;quot;: [0.01, 0.99]},&lt;br /&gt;
                {&amp;quot;signal&amp;quot;: 3, &amp;quot;line&amp;quot;: 3, &amp;quot;class_status&amp;quot;: 2, &amp;quot;class_name&amp;quot;: &amp;quot;dann&amp;quot;, &amp;quot;class_proba&amp;quot;: [0.37, 0.63]},&lt;br /&gt;
                {&amp;quot;signal&amp;quot;: 4, &amp;quot;line&amp;quot;: 4, &amp;quot;class_status&amp;quot;: 1, &amp;quot;class_name&amp;quot;: &amp;quot;gaby&amp;quot;, &amp;quot;class_proba&amp;quot;: [0.83, 0.17]},&lt;br /&gt;
                {&amp;quot;signal&amp;quot;: 5, &amp;quot;line&amp;quot;: 5, &amp;quot;class_status&amp;quot;: 1, &amp;quot;class_name&amp;quot;: &amp;quot;gaby&amp;quot;, &amp;quot;class_proba&amp;quot;: [0.63, 0.37]},&lt;br /&gt;
                {&amp;quot;signal&amp;quot;: 6, &amp;quot;line&amp;quot;: 6, &amp;quot;class_status&amp;quot;: 1, &amp;quot;class_name&amp;quot;: &amp;quot;gaby&amp;quot;, &amp;quot;class_proba&amp;quot;: [0.63, 0.37]},&lt;br /&gt;
                {&amp;quot;signal&amp;quot;: 7, &amp;quot;line&amp;quot;: 7, &amp;quot;class_status&amp;quot;: 1, &amp;quot;class_name&amp;quot;: &amp;quot;gaby&amp;quot;, &amp;quot;class_proba&amp;quot;: [0.50, 0.50]},&lt;br /&gt;
                {&amp;quot;signal&amp;quot;: 8, &amp;quot;line&amp;quot;: 8, &amp;quot;class_status&amp;quot;: 1, &amp;quot;class_name&amp;quot;: &amp;quot;gaby&amp;quot;, &amp;quot;class_proba&amp;quot;: [0.63, 0.37]},&lt;br /&gt;
                {&amp;quot;signal&amp;quot;: 9, &amp;quot;line&amp;quot;: 9, &amp;quot;class_status&amp;quot;: 2, &amp;quot;class_name&amp;quot;: &amp;quot;dann&amp;quot;, &amp;quot;class_proba&amp;quot;: [0.37, 0.63]},&lt;br /&gt;
                {&amp;quot;signal&amp;quot;: 10, &amp;quot;line&amp;quot;: 10, &amp;quot;class_status&amp;quot;: 2, &amp;quot;class_name&amp;quot;: &amp;quot;dann&amp;quot;, &amp;quot;class_proba&amp;quot;: [0.17, 0.83]},&lt;br /&gt;
                {&amp;quot;signal&amp;quot;: 11, &amp;quot;line&amp;quot;: 11, &amp;quot;class_status&amp;quot;: 1, &amp;quot;class_name&amp;quot;: &amp;quot;gaby&amp;quot;, &amp;quot;class_proba&amp;quot;: [0.63, 0.37]},&lt;br /&gt;
                {&amp;quot;signal&amp;quot;: 12, &amp;quot;line&amp;quot;: 12, &amp;quot;class_status&amp;quot;: 1, &amp;quot;class_name&amp;quot;: &amp;quot;gaby&amp;quot;, &amp;quot;class_proba&amp;quot;: [0.63, 0.37]},&lt;br /&gt;
                {&amp;quot;signal&amp;quot;: 13, &amp;quot;line&amp;quot;: 13, &amp;quot;class_status&amp;quot;: 2, &amp;quot;class_name&amp;quot;: &amp;quot;dann&amp;quot;, &amp;quot;class_proba&amp;quot;: [0.37, 0.63]},&lt;br /&gt;
                {&amp;quot;signal&amp;quot;: 14, &amp;quot;line&amp;quot;: 14, &amp;quot;class_status&amp;quot;: 1, &amp;quot;class_name&amp;quot;: &amp;quot;gaby&amp;quot;, &amp;quot;class_proba&amp;quot;: [0.74, 0.26]},&lt;br /&gt;
                {&amp;quot;signal&amp;quot;: 15, &amp;quot;line&amp;quot;: 15, &amp;quot;class_status&amp;quot;: 1, &amp;quot;class_name&amp;quot;: &amp;quot;gaby&amp;quot;, &amp;quot;class_proba&amp;quot;: [0.63, 0.37]},&lt;br /&gt;
                {&amp;quot;signal&amp;quot;: 16, &amp;quot;line&amp;quot;: 16, &amp;quot;class_status&amp;quot;: 1, &amp;quot;class_name&amp;quot;: &amp;quot;gaby&amp;quot;, &amp;quot;class_proba&amp;quot;: [0.74, 0.26]},&lt;br /&gt;
                {&amp;quot;signal&amp;quot;: 17, &amp;quot;line&amp;quot;: 17, &amp;quot;class_status&amp;quot;: 1, &amp;quot;class_name&amp;quot;: &amp;quot;gaby&amp;quot;, &amp;quot;class_proba&amp;quot;: [0.63, 0.37]},&lt;br /&gt;
                {&amp;quot;signal&amp;quot;: 18, &amp;quot;line&amp;quot;: 18, &amp;quot;class_status&amp;quot;: 1, &amp;quot;class_name&amp;quot;: &amp;quot;gaby&amp;quot;, &amp;quot;class_proba&amp;quot;: [0.63, 0.37]},&lt;br /&gt;
                {&amp;quot;signal&amp;quot;: 19, &amp;quot;line&amp;quot;: 19, &amp;quot;class_status&amp;quot;: 2, &amp;quot;class_name&amp;quot;: &amp;quot;dann&amp;quot;, &amp;quot;class_proba&amp;quot;: [0.37, 0.63]},&lt;br /&gt;
                {&amp;quot;signal&amp;quot;: 20, &amp;quot;line&amp;quot;: 20, &amp;quot;class_status&amp;quot;: 1, &amp;quot;class_name&amp;quot;: &amp;quot;gaby&amp;quot;, &amp;quot;class_proba&amp;quot;: [0.63, 0.37]},&lt;br /&gt;
                {&amp;quot;signal&amp;quot;: 21, &amp;quot;line&amp;quot;: 21, &amp;quot;class_status&amp;quot;: 2, &amp;quot;class_name&amp;quot;: &amp;quot;dann&amp;quot;, &amp;quot;class_proba&amp;quot;: [0.11, 0.89]},&lt;br /&gt;
                {&amp;quot;signal&amp;quot;: 22, &amp;quot;line&amp;quot;: 22, &amp;quot;class_status&amp;quot;: 1, &amp;quot;class_name&amp;quot;: &amp;quot;gaby&amp;quot;, &amp;quot;class_proba&amp;quot;: [0.74, 0.26]},&lt;br /&gt;
                {&amp;quot;signal&amp;quot;: 23, &amp;quot;line&amp;quot;: 23, &amp;quot;class_status&amp;quot;: 1, &amp;quot;class_name&amp;quot;: &amp;quot;gaby&amp;quot;, &amp;quot;class_proba&amp;quot;: [0.63, 0.37]},&lt;br /&gt;
                {&amp;quot;signal&amp;quot;: 24, &amp;quot;line&amp;quot;: 24, &amp;quot;class_status&amp;quot;: 1, &amp;quot;class_name&amp;quot;: &amp;quot;gaby&amp;quot;, &amp;quot;class_proba&amp;quot;: [0.74, 0.26]},&lt;br /&gt;
                {&amp;quot;signal&amp;quot;: 25, &amp;quot;line&amp;quot;: 25, &amp;quot;class_status&amp;quot;: 1, &amp;quot;class_name&amp;quot;: &amp;quot;gaby&amp;quot;, &amp;quot;class_proba&amp;quot;: [0.50, 0.50]},&lt;br /&gt;
                {&amp;quot;signal&amp;quot;: 26, &amp;quot;line&amp;quot;: 26, &amp;quot;class_status&amp;quot;: 2, &amp;quot;class_name&amp;quot;: &amp;quot;dann&amp;quot;, &amp;quot;class_proba&amp;quot;: [0.06, 0.94]},&lt;br /&gt;
                {&amp;quot;signal&amp;quot;: 27, &amp;quot;line&amp;quot;: 27, &amp;quot;class_status&amp;quot;: 2, &amp;quot;class_name&amp;quot;: &amp;quot;dann&amp;quot;, &amp;quot;class_proba&amp;quot;: [0.37, 0.63]},&lt;br /&gt;
                {&amp;quot;signal&amp;quot;: 28, &amp;quot;line&amp;quot;: 28, &amp;quot;class_status&amp;quot;: 1, &amp;quot;class_name&amp;quot;: &amp;quot;gaby&amp;quot;, &amp;quot;class_proba&amp;quot;: [0.63, 0.37]},&lt;br /&gt;
                {&amp;quot;signal&amp;quot;: 29, &amp;quot;line&amp;quot;: 29, &amp;quot;class_status&amp;quot;: 1, &amp;quot;class_name&amp;quot;: &amp;quot;gaby&amp;quot;, &amp;quot;class_proba&amp;quot;: [0.63, 0.37]}&lt;br /&gt;
        ],&lt;br /&gt;
        &amp;quot;classification_summary&amp;quot;: {&amp;quot;signals&amp;quot;: 29, &amp;quot;classified&amp;quot;: [19, 10], &amp;quot;unclassified&amp;quot;: 0}&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Visualisation des données sur le serveur===&lt;/div&gt;</summary>
		<author><name>Gthomas</name></author>
	</entry>
	<entry>
		<id>https://wiki-se.plil.fr/mediawiki/index.php?title=RodenburgThomas&amp;diff=3637</id>
		<title>RodenburgThomas</title>
		<link rel="alternate" type="text/html" href="https://wiki-se.plil.fr/mediawiki/index.php?title=RodenburgThomas&amp;diff=3637"/>
		<updated>2023-12-20T16:11:38Z</updated>

		<summary type="html">&lt;p&gt;Gthomas : &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;=Le binôme=&lt;br /&gt;
&lt;br /&gt;
Le binôme est constitué de 2 élèves de SE5-SC :&lt;br /&gt;
* Dann RODENBURG&lt;br /&gt;
* Gabriel THOMAS&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=Objectifs= &lt;br /&gt;
&lt;br /&gt;
Le but de ce TP est de créer un réseau de systèmes communicants en partant d'un capteur XNucléo 53L5A1 pour finir sur une machine virtuelle Xen.&lt;br /&gt;
La particularité est d'intégrer une composante de Machine Learning  &lt;br /&gt;
&lt;br /&gt;
[[Fichier:Capture d'écran 2023-12-19 151237.png|néant|vignette|800x800px]]&lt;br /&gt;
&lt;br /&gt;
=Compte rendu des séances=&lt;br /&gt;
&lt;br /&gt;
===Création de la machine virtuelle===&lt;br /&gt;
Création d'une machine virtuelle '''gabidann''' sur le serveur chassiron :&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;xen-create-image --hostname=gabidann --force --dist=bookworm --size=10G --memory=10G --dir=/usr/local/xen --password=glopglop --dhcp --bridge=bridgeStudents&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
La machine virtuelle est à présent connectée au WiFi.&lt;br /&gt;
&lt;br /&gt;
Après cela, nous avons configuré la machine virtuelle selon l'énoncé du TP en faisant un xen console gabidann. Nous avons ensuite participé à la mise en place du point d'accès WiFi.&lt;br /&gt;
&lt;br /&gt;
===Premières observations du capteur===&lt;br /&gt;
De plus nous avons observé le retour du capteur de distance Nucleo-53L5A1 avec l'outil minicom. Le contenu envoyé par le capteur était compréhensible avec une fréquence de 460 800 bauds ; sur minicom, on a pu constater que le capteur nous envoie des valeurs qui dépendent de la distance entre celui-ci et un obstacle.&lt;br /&gt;
&lt;br /&gt;
===Raspberry===&lt;br /&gt;
D'un autre côté, nous avons branché la Raspberry Pi à l'ordinateur selon le pinout fourni dans la documentation.&lt;br /&gt;
&lt;br /&gt;
[[Fichier:20231218 085218.jpg|vignette|néant]]&lt;br /&gt;
&lt;br /&gt;
Enfin, nous avons activé la communication UART de la Raspberry Pi afin de pouvoir communiquer avec. En fin de séance, nous étions en train de vérifier que la Raspberry Pi répondait bien, même en ayant ajouté la ligne enable_uart=1 dans le fichier config.txt de la Raspberry.&lt;br /&gt;
&lt;br /&gt;
===Configuration de la Raspberry===&lt;br /&gt;
Nous avons résolu le problème de la Raspberry qui ne répondait pas. Cela était dû à l'alimentation : brancher la carte en USBC résoud le problème. Cependant, nous recevons une erreur l'erreur EXT4-fs error (device mmcblk0p2).&lt;br /&gt;
Le problème venait des arguments saisis lors du lancement de Minicom. Avec la commande suivante, il est à présent possible de se connecter sur la Raspberry : &amp;lt;code&amp;gt;minicom -D /dev/ttyUSB0 -b 115200&amp;lt;/code&amp;gt;&lt;br /&gt;
Dans la Raspberry, nous avons configuré une interface réseau wlan0 pour se connecter à WiFi_IE_1 :&lt;br /&gt;
    auto wlan0&lt;br /&gt;
    iface wlan0 inet dhcp&lt;br /&gt;
    wpa-conf /etc/wpa_supplicant/wpa_supplicant.conf&lt;br /&gt;
A présent à partir de la Raspberry, on peut ping la machine virtuelle sur chassiron avec son IPv6.&lt;br /&gt;
&lt;br /&gt;
===Configuration du capteur de distance===&lt;br /&gt;
Un programme était déjà présent sur le capteur. On a téléchargé le logiciel STM32CubeIDE pour pouvoir éditer du code et le téléverser sur le capteur. Nous avons testé de téléverser un programme d'exemple dont voici le résultat :&lt;br /&gt;
[[Fichier:Screenshot 2023-12-18 13-12-19.jpg|vignette|néant|700x700px]]&lt;br /&gt;
&lt;br /&gt;
Nous avons modifié ce programme afin d'effectuer un formatage des données transmises par le capteur sous le format ''&amp;lt;distance&amp;gt;,'' pour chaque valeur. Grâce à ce formatage, il est à présent possible d'utiliser les données reçues par le logiciel NanoEdgeStudio AI pour la partie Machine Learning.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Pour recevoir les valeurs de manière exploitable, il faut modifier le code Exemple dans le logiciel STM Cube IDE&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Capture d'écran 2023-12-20 084719.png|néant|vignette|800x800px]]&lt;br /&gt;
&lt;br /&gt;
L'objectif est d'obtenir une liste séparée par des virgules, il a donc fallu supprimer les espaces et les barres verticales de la fonction d'affichage ainsi que les statuts de chacun des capteurs :&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
static void print_result(RANGING_SENSOR_Result_t *Result)&lt;br /&gt;
{&lt;br /&gt;
  int8_t j;&lt;br /&gt;
  int8_t k;&lt;br /&gt;
  int8_t l;&lt;br /&gt;
  uint8_t zones_per_line;&lt;br /&gt;
  zones_per_line = ((Profile.RangingProfile == RS_PROFILE_8x8_AUTONOMOUS) ||&lt;br /&gt;
         (Profile.RangingProfile == RS_PROFILE_8x8_CONTINUOUS)) ? 8 : 4;&lt;br /&gt;
  for (j = 0; j &amp;lt; Result-&amp;gt;NumberOfZones; j += zones_per_line)&lt;br /&gt;
  {&lt;br /&gt;
    for (l = 0; l &amp;lt; RANGING_SENSOR_NB_TARGET_PER_ZONE; l++)&lt;br /&gt;
    {&lt;br /&gt;
      /* Print distance and status */&lt;br /&gt;
      for (k = (zones_per_line - 1); k &amp;gt;= 0; k--)&lt;br /&gt;
      {&lt;br /&gt;
        if (Result-&amp;gt;ZoneResult[j+k].NumberOfTargets &amp;gt; 0)&lt;br /&gt;
          printf(&amp;quot;%ld,&amp;quot;,(long)Result-&amp;gt;ZoneResult[j+k].Distance[l]);&lt;br /&gt;
      }&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
  printf(&amp;quot;\n&amp;quot;);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;On passe ensuite sur Nano Edge Studio pour définir les signaux dans l'onglet &amp;quot;Signals&amp;quot; et entraîner le modèle dans l'onglet &amp;quot;Benchmark&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Capture d'écran 2023-12-18 172047.png|néant|vignette|800x800px]]&lt;br /&gt;
&lt;br /&gt;
Une fois le modèle entraîné, on peut le tester avec l'onglet &amp;quot;Emulator&amp;quot; &lt;br /&gt;
&lt;br /&gt;
[[Fichier:Capture d'écran 2023-12-18 173255.png|néant|vignette|800x800px]]&lt;br /&gt;
&lt;br /&gt;
===Emulation avec NanoEdgeStudio AI===&lt;br /&gt;
&lt;br /&gt;
Dans un premier temps, nous avons essayé d'entraîner le programme à reconnaître les chiffres 1, 2, 3, 4 et 5 sur les doigts d'une main. Les résultats n'étaient pas concluant, il semblerait que le capteur détecte avant tout le volume de la main à la place de détecter le nombre de doigts.&lt;br /&gt;
&lt;br /&gt;
Nous avons ensuite choisi de faire un détecteur de visages capable de faire la différence entre Gabriel et Dann. L'émulation donne des résultats très satisfaisant proche de 100% de réussite&lt;br /&gt;
&lt;br /&gt;
===Configuration du serveur===&lt;br /&gt;
Configuration d'un serveur HTTP sur la machine virtuelle gabidann :&amp;lt;syntaxhighlight lang=&amp;quot;python3&amp;quot;&amp;gt;&lt;br /&gt;
import socket&lt;br /&gt;
from http.server import HTTPServer, SimpleHTTPRequestHandler&lt;br /&gt;
&lt;br /&gt;
class MyHandler(SimpleHTTPRequestHandler):&lt;br /&gt;
  def do_GET(self):&lt;br /&gt;
    if self.path == '/ip':&lt;br /&gt;
      self.send_response(200)&lt;br /&gt;
      self.send_header('Content-type', 'text/html')&lt;br /&gt;
      self.end_headers()&lt;br /&gt;
      self.wfile.write(f'Your IP address is {self.client_address[0]}'.encode())&lt;br /&gt;
      return&lt;br /&gt;
    else:&lt;br /&gt;
      return SimpleHTTPRequestHandler.do_GET(self)&lt;br /&gt;
&lt;br /&gt;
class HTTPServerV6(HTTPServer):&lt;br /&gt;
  address_family = socket.AF_INET6&lt;br /&gt;
&lt;br /&gt;
def main():&lt;br /&gt;
  server = HTTPServerV6(('::', 8080), MyHandler)&lt;br /&gt;
  server.serve_forever()&lt;br /&gt;
&lt;br /&gt;
if __name__ == '__main__':&lt;br /&gt;
  main()&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Pour se connecter au serveur depuis un navigateur, on peut ouvrir un navigateur depuis la zabeth et y accéder avec l'adresse : ''[&amp;lt;ipv6_VM&amp;gt;]:&amp;lt;port&amp;gt;''. Dans notre cas, le serveur écoute le port '''8080'''.&lt;br /&gt;
&lt;br /&gt;
La page index.html s'affiche par défaut lorsque l'on se connecte au serveur HTTP :&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;html&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;!DOCTYPE html&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;html lang=&amp;quot;fr&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;head&amp;gt;&lt;br /&gt;
	&amp;lt;meta charset=&amp;quot;UTF-8&amp;quot;&amp;gt;&lt;br /&gt;
	&amp;lt;title&amp;gt;Gabidann&amp;lt;/title&amp;gt;&lt;br /&gt;
&amp;lt;/head&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;body&amp;gt;&lt;br /&gt;
	&amp;lt;h1&amp;gt;Bienvenue sur Gabidann !&amp;lt;h1&amp;gt;&lt;br /&gt;
	&amp;lt;div id=&amp;quot;data&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/body&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/html&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;Nous avons également testé la communication en TCP avec l'utilitaire socat&lt;br /&gt;
&lt;br /&gt;
Nous avons créé un serveur python en TCP. Nous pouvons maintenant envoyer des messages du client ( raspberry ) au serveur (VM Xen). Nous nous servirons de cette architecture pour envoyer les données du Nucleo à la Vm Xen &lt;br /&gt;
&lt;br /&gt;
Une fois le modèle entrainé et les tests concluants, on peut déployer notre modèle sur n'importe quel appareils linux ou windows. Pour cela, on va dans l'onglet deployment et on télécharge notre librairie personnalisée.  &lt;br /&gt;
&lt;br /&gt;
===Déploiement du modèle===&lt;br /&gt;
&lt;br /&gt;
On peut lui passer un fichier CSV contenant les données brutes du capteur et grâce au fichier knowledge.dat, l'émulateur est capable de faire la différence entre les situations&amp;lt;syntaxhighlight lang=&amp;quot;bat&amp;quot;&amp;gt;&lt;br /&gt;
PS C:\Users\gabyt\Documents\Gaby\emulators&amp;gt; .\NanoEdgeAI_Class_Emulator.exe neai_classification --knowledge_path .\knowledge.dat --file .\data.csv&lt;br /&gt;
{&lt;br /&gt;
        &amp;quot;status&amp;quot;: &amp;quot;classification&amp;quot;,&lt;br /&gt;
        &amp;quot;lib_id&amp;quot;: &amp;quot;6582b12625c3e0368b2c2a09&amp;quot;,&lt;br /&gt;
        &amp;quot;input&amp;quot;: &amp;quot;.\data.csv&amp;quot;,&lt;br /&gt;
        &amp;quot;results&amp;quot;: [&lt;br /&gt;
                {&amp;quot;signal&amp;quot;: 1, &amp;quot;line&amp;quot;: 1, &amp;quot;class_status&amp;quot;: 2, &amp;quot;class_name&amp;quot;: &amp;quot;dann&amp;quot;, &amp;quot;class_proba&amp;quot;: [0.01, 0.99]},&lt;br /&gt;
                {&amp;quot;signal&amp;quot;: 2, &amp;quot;line&amp;quot;: 2, &amp;quot;class_status&amp;quot;: 2, &amp;quot;class_name&amp;quot;: &amp;quot;dann&amp;quot;, &amp;quot;class_proba&amp;quot;: [0.01, 0.99]},&lt;br /&gt;
                {&amp;quot;signal&amp;quot;: 3, &amp;quot;line&amp;quot;: 3, &amp;quot;class_status&amp;quot;: 2, &amp;quot;class_name&amp;quot;: &amp;quot;dann&amp;quot;, &amp;quot;class_proba&amp;quot;: [0.37, 0.63]},&lt;br /&gt;
                {&amp;quot;signal&amp;quot;: 4, &amp;quot;line&amp;quot;: 4, &amp;quot;class_status&amp;quot;: 1, &amp;quot;class_name&amp;quot;: &amp;quot;gaby&amp;quot;, &amp;quot;class_proba&amp;quot;: [0.83, 0.17]},&lt;br /&gt;
                {&amp;quot;signal&amp;quot;: 5, &amp;quot;line&amp;quot;: 5, &amp;quot;class_status&amp;quot;: 1, &amp;quot;class_name&amp;quot;: &amp;quot;gaby&amp;quot;, &amp;quot;class_proba&amp;quot;: [0.63, 0.37]},&lt;br /&gt;
                {&amp;quot;signal&amp;quot;: 6, &amp;quot;line&amp;quot;: 6, &amp;quot;class_status&amp;quot;: 1, &amp;quot;class_name&amp;quot;: &amp;quot;gaby&amp;quot;, &amp;quot;class_proba&amp;quot;: [0.63, 0.37]},&lt;br /&gt;
                {&amp;quot;signal&amp;quot;: 7, &amp;quot;line&amp;quot;: 7, &amp;quot;class_status&amp;quot;: 1, &amp;quot;class_name&amp;quot;: &amp;quot;gaby&amp;quot;, &amp;quot;class_proba&amp;quot;: [0.50, 0.50]},&lt;br /&gt;
                {&amp;quot;signal&amp;quot;: 8, &amp;quot;line&amp;quot;: 8, &amp;quot;class_status&amp;quot;: 1, &amp;quot;class_name&amp;quot;: &amp;quot;gaby&amp;quot;, &amp;quot;class_proba&amp;quot;: [0.63, 0.37]},&lt;br /&gt;
                {&amp;quot;signal&amp;quot;: 9, &amp;quot;line&amp;quot;: 9, &amp;quot;class_status&amp;quot;: 2, &amp;quot;class_name&amp;quot;: &amp;quot;dann&amp;quot;, &amp;quot;class_proba&amp;quot;: [0.37, 0.63]},&lt;br /&gt;
                {&amp;quot;signal&amp;quot;: 10, &amp;quot;line&amp;quot;: 10, &amp;quot;class_status&amp;quot;: 2, &amp;quot;class_name&amp;quot;: &amp;quot;dann&amp;quot;, &amp;quot;class_proba&amp;quot;: [0.17, 0.83]},&lt;br /&gt;
                {&amp;quot;signal&amp;quot;: 11, &amp;quot;line&amp;quot;: 11, &amp;quot;class_status&amp;quot;: 1, &amp;quot;class_name&amp;quot;: &amp;quot;gaby&amp;quot;, &amp;quot;class_proba&amp;quot;: [0.63, 0.37]},&lt;br /&gt;
                {&amp;quot;signal&amp;quot;: 12, &amp;quot;line&amp;quot;: 12, &amp;quot;class_status&amp;quot;: 1, &amp;quot;class_name&amp;quot;: &amp;quot;gaby&amp;quot;, &amp;quot;class_proba&amp;quot;: [0.63, 0.37]},&lt;br /&gt;
                {&amp;quot;signal&amp;quot;: 13, &amp;quot;line&amp;quot;: 13, &amp;quot;class_status&amp;quot;: 2, &amp;quot;class_name&amp;quot;: &amp;quot;dann&amp;quot;, &amp;quot;class_proba&amp;quot;: [0.37, 0.63]},&lt;br /&gt;
                {&amp;quot;signal&amp;quot;: 14, &amp;quot;line&amp;quot;: 14, &amp;quot;class_status&amp;quot;: 1, &amp;quot;class_name&amp;quot;: &amp;quot;gaby&amp;quot;, &amp;quot;class_proba&amp;quot;: [0.74, 0.26]},&lt;br /&gt;
                {&amp;quot;signal&amp;quot;: 15, &amp;quot;line&amp;quot;: 15, &amp;quot;class_status&amp;quot;: 1, &amp;quot;class_name&amp;quot;: &amp;quot;gaby&amp;quot;, &amp;quot;class_proba&amp;quot;: [0.63, 0.37]},&lt;br /&gt;
                {&amp;quot;signal&amp;quot;: 16, &amp;quot;line&amp;quot;: 16, &amp;quot;class_status&amp;quot;: 1, &amp;quot;class_name&amp;quot;: &amp;quot;gaby&amp;quot;, &amp;quot;class_proba&amp;quot;: [0.74, 0.26]},&lt;br /&gt;
                {&amp;quot;signal&amp;quot;: 17, &amp;quot;line&amp;quot;: 17, &amp;quot;class_status&amp;quot;: 1, &amp;quot;class_name&amp;quot;: &amp;quot;gaby&amp;quot;, &amp;quot;class_proba&amp;quot;: [0.63, 0.37]},&lt;br /&gt;
                {&amp;quot;signal&amp;quot;: 18, &amp;quot;line&amp;quot;: 18, &amp;quot;class_status&amp;quot;: 1, &amp;quot;class_name&amp;quot;: &amp;quot;gaby&amp;quot;, &amp;quot;class_proba&amp;quot;: [0.63, 0.37]},&lt;br /&gt;
                {&amp;quot;signal&amp;quot;: 19, &amp;quot;line&amp;quot;: 19, &amp;quot;class_status&amp;quot;: 2, &amp;quot;class_name&amp;quot;: &amp;quot;dann&amp;quot;, &amp;quot;class_proba&amp;quot;: [0.37, 0.63]},&lt;br /&gt;
                {&amp;quot;signal&amp;quot;: 20, &amp;quot;line&amp;quot;: 20, &amp;quot;class_status&amp;quot;: 1, &amp;quot;class_name&amp;quot;: &amp;quot;gaby&amp;quot;, &amp;quot;class_proba&amp;quot;: [0.63, 0.37]},&lt;br /&gt;
                {&amp;quot;signal&amp;quot;: 21, &amp;quot;line&amp;quot;: 21, &amp;quot;class_status&amp;quot;: 2, &amp;quot;class_name&amp;quot;: &amp;quot;dann&amp;quot;, &amp;quot;class_proba&amp;quot;: [0.11, 0.89]},&lt;br /&gt;
                {&amp;quot;signal&amp;quot;: 22, &amp;quot;line&amp;quot;: 22, &amp;quot;class_status&amp;quot;: 1, &amp;quot;class_name&amp;quot;: &amp;quot;gaby&amp;quot;, &amp;quot;class_proba&amp;quot;: [0.74, 0.26]},&lt;br /&gt;
                {&amp;quot;signal&amp;quot;: 23, &amp;quot;line&amp;quot;: 23, &amp;quot;class_status&amp;quot;: 1, &amp;quot;class_name&amp;quot;: &amp;quot;gaby&amp;quot;, &amp;quot;class_proba&amp;quot;: [0.63, 0.37]},&lt;br /&gt;
                {&amp;quot;signal&amp;quot;: 24, &amp;quot;line&amp;quot;: 24, &amp;quot;class_status&amp;quot;: 1, &amp;quot;class_name&amp;quot;: &amp;quot;gaby&amp;quot;, &amp;quot;class_proba&amp;quot;: [0.74, 0.26]},&lt;br /&gt;
                {&amp;quot;signal&amp;quot;: 25, &amp;quot;line&amp;quot;: 25, &amp;quot;class_status&amp;quot;: 1, &amp;quot;class_name&amp;quot;: &amp;quot;gaby&amp;quot;, &amp;quot;class_proba&amp;quot;: [0.50, 0.50]},&lt;br /&gt;
                {&amp;quot;signal&amp;quot;: 26, &amp;quot;line&amp;quot;: 26, &amp;quot;class_status&amp;quot;: 2, &amp;quot;class_name&amp;quot;: &amp;quot;dann&amp;quot;, &amp;quot;class_proba&amp;quot;: [0.06, 0.94]},&lt;br /&gt;
                {&amp;quot;signal&amp;quot;: 27, &amp;quot;line&amp;quot;: 27, &amp;quot;class_status&amp;quot;: 2, &amp;quot;class_name&amp;quot;: &amp;quot;dann&amp;quot;, &amp;quot;class_proba&amp;quot;: [0.37, 0.63]},&lt;br /&gt;
                {&amp;quot;signal&amp;quot;: 28, &amp;quot;line&amp;quot;: 28, &amp;quot;class_status&amp;quot;: 1, &amp;quot;class_name&amp;quot;: &amp;quot;gaby&amp;quot;, &amp;quot;class_proba&amp;quot;: [0.63, 0.37]},&lt;br /&gt;
                {&amp;quot;signal&amp;quot;: 29, &amp;quot;line&amp;quot;: 29, &amp;quot;class_status&amp;quot;: 1, &amp;quot;class_name&amp;quot;: &amp;quot;gaby&amp;quot;, &amp;quot;class_proba&amp;quot;: [0.63, 0.37]}&lt;br /&gt;
        ],&lt;br /&gt;
        &amp;quot;classification_summary&amp;quot;: {&amp;quot;signals&amp;quot;: 29, &amp;quot;classified&amp;quot;: [19, 10], &amp;quot;unclassified&amp;quot;: 0}&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Visualisation des données sur le serveur===&lt;/div&gt;</summary>
		<author><name>Gthomas</name></author>
	</entry>
	<entry>
		<id>https://wiki-se.plil.fr/mediawiki/index.php?title=RodenburgThomas&amp;diff=3636</id>
		<title>RodenburgThomas</title>
		<link rel="alternate" type="text/html" href="https://wiki-se.plil.fr/mediawiki/index.php?title=RodenburgThomas&amp;diff=3636"/>
		<updated>2023-12-20T16:11:27Z</updated>

		<summary type="html">&lt;p&gt;Gthomas : &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;=Le binôme=&lt;br /&gt;
&lt;br /&gt;
Le binôme est constitué de 2 élèves de SE5-SC :&lt;br /&gt;
* Dann RODENBURG&lt;br /&gt;
* Gabriel THOMAS&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=Objectifs= &lt;br /&gt;
&lt;br /&gt;
Le but de ce TP est de créer un réseau de systèmes communicants en partant d'un capteur XNucléo 53L5A1 pour finir sur une machine virtuelle Xen.&lt;br /&gt;
La particularité est d'intégrer une composante de Machine Learning  &lt;br /&gt;
&lt;br /&gt;
[[Fichier:Capture d'écran 2023-12-19 151237.png|néant|vignette|800x800px]]&lt;br /&gt;
&lt;br /&gt;
=Compte rendu des séances=&lt;br /&gt;
&lt;br /&gt;
==Séance du 04/12/2023==&lt;br /&gt;
===Création de la machine virtuelle===&lt;br /&gt;
Création d'une machine virtuelle '''gabidann''' sur le serveur chassiron :&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;xen-create-image --hostname=gabidann --force --dist=bookworm --size=10G --memory=10G --dir=/usr/local/xen --password=glopglop --dhcp --bridge=bridgeStudents&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
La machine virtuelle est à présent connectée au WiFi.&lt;br /&gt;
&lt;br /&gt;
Après cela, nous avons configuré la machine virtuelle selon l'énoncé du TP en faisant un xen console gabidann. Nous avons ensuite participé à la mise en place du point d'accès WiFi.&lt;br /&gt;
&lt;br /&gt;
===Premières observations du capteur===&lt;br /&gt;
De plus nous avons observé le retour du capteur de distance Nucleo-53L5A1 avec l'outil minicom. Le contenu envoyé par le capteur était compréhensible avec une fréquence de 460 800 bauds ; sur minicom, on a pu constater que le capteur nous envoie des valeurs qui dépendent de la distance entre celui-ci et un obstacle.&lt;br /&gt;
&lt;br /&gt;
===Raspberry===&lt;br /&gt;
D'un autre côté, nous avons branché la Raspberry Pi à l'ordinateur selon le pinout fourni dans la documentation.&lt;br /&gt;
&lt;br /&gt;
[[Fichier:20231218 085218.jpg|vignette|néant]]&lt;br /&gt;
&lt;br /&gt;
Enfin, nous avons activé la communication UART de la Raspberry Pi afin de pouvoir communiquer avec. En fin de séance, nous étions en train de vérifier que la Raspberry Pi répondait bien, même en ayant ajouté la ligne enable_uart=1 dans le fichier config.txt de la Raspberry.&lt;br /&gt;
&lt;br /&gt;
===Configuration de la Raspberry===&lt;br /&gt;
Nous avons résolu le problème de la Raspberry qui ne répondait pas. Cela était dû à l'alimentation : brancher la carte en USBC résoud le problème. Cependant, nous recevons une erreur l'erreur EXT4-fs error (device mmcblk0p2).&lt;br /&gt;
Le problème venait des arguments saisis lors du lancement de Minicom. Avec la commande suivante, il est à présent possible de se connecter sur la Raspberry : &amp;lt;code&amp;gt;minicom -D /dev/ttyUSB0 -b 115200&amp;lt;/code&amp;gt;&lt;br /&gt;
Dans la Raspberry, nous avons configuré une interface réseau wlan0 pour se connecter à WiFi_IE_1 :&lt;br /&gt;
    auto wlan0&lt;br /&gt;
    iface wlan0 inet dhcp&lt;br /&gt;
    wpa-conf /etc/wpa_supplicant/wpa_supplicant.conf&lt;br /&gt;
A présent à partir de la Raspberry, on peut ping la machine virtuelle sur chassiron avec son IPv6.&lt;br /&gt;
&lt;br /&gt;
===Configuration du capteur de distance===&lt;br /&gt;
Un programme était déjà présent sur le capteur. On a téléchargé le logiciel STM32CubeIDE pour pouvoir éditer du code et le téléverser sur le capteur. Nous avons testé de téléverser un programme d'exemple dont voici le résultat :&lt;br /&gt;
[[Fichier:Screenshot 2023-12-18 13-12-19.jpg|vignette|néant|700x700px]]&lt;br /&gt;
&lt;br /&gt;
Nous avons modifié ce programme afin d'effectuer un formatage des données transmises par le capteur sous le format ''&amp;lt;distance&amp;gt;,'' pour chaque valeur. Grâce à ce formatage, il est à présent possible d'utiliser les données reçues par le logiciel NanoEdgeStudio AI pour la partie Machine Learning.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Pour recevoir les valeurs de manière exploitable, il faut modifier le code Exemple dans le logiciel STM Cube IDE&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Capture d'écran 2023-12-20 084719.png|néant|vignette|800x800px]]&lt;br /&gt;
&lt;br /&gt;
L'objectif est d'obtenir une liste séparée par des virgules, il a donc fallu supprimer les espaces et les barres verticales de la fonction d'affichage ainsi que les statuts de chacun des capteurs :&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
static void print_result(RANGING_SENSOR_Result_t *Result)&lt;br /&gt;
{&lt;br /&gt;
  int8_t j;&lt;br /&gt;
  int8_t k;&lt;br /&gt;
  int8_t l;&lt;br /&gt;
  uint8_t zones_per_line;&lt;br /&gt;
  zones_per_line = ((Profile.RangingProfile == RS_PROFILE_8x8_AUTONOMOUS) ||&lt;br /&gt;
         (Profile.RangingProfile == RS_PROFILE_8x8_CONTINUOUS)) ? 8 : 4;&lt;br /&gt;
  for (j = 0; j &amp;lt; Result-&amp;gt;NumberOfZones; j += zones_per_line)&lt;br /&gt;
  {&lt;br /&gt;
    for (l = 0; l &amp;lt; RANGING_SENSOR_NB_TARGET_PER_ZONE; l++)&lt;br /&gt;
    {&lt;br /&gt;
      /* Print distance and status */&lt;br /&gt;
      for (k = (zones_per_line - 1); k &amp;gt;= 0; k--)&lt;br /&gt;
      {&lt;br /&gt;
        if (Result-&amp;gt;ZoneResult[j+k].NumberOfTargets &amp;gt; 0)&lt;br /&gt;
          printf(&amp;quot;%ld,&amp;quot;,(long)Result-&amp;gt;ZoneResult[j+k].Distance[l]);&lt;br /&gt;
      }&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
  printf(&amp;quot;\n&amp;quot;);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;On passe ensuite sur Nano Edge Studio pour définir les signaux dans l'onglet &amp;quot;Signals&amp;quot; et entraîner le modèle dans l'onglet &amp;quot;Benchmark&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Capture d'écran 2023-12-18 172047.png|néant|vignette|800x800px]]&lt;br /&gt;
&lt;br /&gt;
Une fois le modèle entraîné, on peut le tester avec l'onglet &amp;quot;Emulator&amp;quot; &lt;br /&gt;
&lt;br /&gt;
[[Fichier:Capture d'écran 2023-12-18 173255.png|néant|vignette|800x800px]]&lt;br /&gt;
&lt;br /&gt;
===Emulation avec NanoEdgeStudio AI===&lt;br /&gt;
&lt;br /&gt;
Dans un premier temps, nous avons essayé d'entraîner le programme à reconnaître les chiffres 1, 2, 3, 4 et 5 sur les doigts d'une main. Les résultats n'étaient pas concluant, il semblerait que le capteur détecte avant tout le volume de la main à la place de détecter le nombre de doigts.&lt;br /&gt;
&lt;br /&gt;
Nous avons ensuite choisi de faire un détecteur de visages capable de faire la différence entre Gabriel et Dann. L'émulation donne des résultats très satisfaisant proche de 100% de réussite&lt;br /&gt;
&lt;br /&gt;
===Configuration du serveur===&lt;br /&gt;
Configuration d'un serveur HTTP sur la machine virtuelle gabidann :&amp;lt;syntaxhighlight lang=&amp;quot;python3&amp;quot;&amp;gt;&lt;br /&gt;
import socket&lt;br /&gt;
from http.server import HTTPServer, SimpleHTTPRequestHandler&lt;br /&gt;
&lt;br /&gt;
class MyHandler(SimpleHTTPRequestHandler):&lt;br /&gt;
  def do_GET(self):&lt;br /&gt;
    if self.path == '/ip':&lt;br /&gt;
      self.send_response(200)&lt;br /&gt;
      self.send_header('Content-type', 'text/html')&lt;br /&gt;
      self.end_headers()&lt;br /&gt;
      self.wfile.write(f'Your IP address is {self.client_address[0]}'.encode())&lt;br /&gt;
      return&lt;br /&gt;
    else:&lt;br /&gt;
      return SimpleHTTPRequestHandler.do_GET(self)&lt;br /&gt;
&lt;br /&gt;
class HTTPServerV6(HTTPServer):&lt;br /&gt;
  address_family = socket.AF_INET6&lt;br /&gt;
&lt;br /&gt;
def main():&lt;br /&gt;
  server = HTTPServerV6(('::', 8080), MyHandler)&lt;br /&gt;
  server.serve_forever()&lt;br /&gt;
&lt;br /&gt;
if __name__ == '__main__':&lt;br /&gt;
  main()&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Pour se connecter au serveur depuis un navigateur, on peut ouvrir un navigateur depuis la zabeth et y accéder avec l'adresse : ''[&amp;lt;ipv6_VM&amp;gt;]:&amp;lt;port&amp;gt;''. Dans notre cas, le serveur écoute le port '''8080'''.&lt;br /&gt;
&lt;br /&gt;
La page index.html s'affiche par défaut lorsque l'on se connecte au serveur HTTP :&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;html&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;!DOCTYPE html&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;html lang=&amp;quot;fr&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;head&amp;gt;&lt;br /&gt;
	&amp;lt;meta charset=&amp;quot;UTF-8&amp;quot;&amp;gt;&lt;br /&gt;
	&amp;lt;title&amp;gt;Gabidann&amp;lt;/title&amp;gt;&lt;br /&gt;
&amp;lt;/head&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;body&amp;gt;&lt;br /&gt;
	&amp;lt;h1&amp;gt;Bienvenue sur Gabidann !&amp;lt;h1&amp;gt;&lt;br /&gt;
	&amp;lt;div id=&amp;quot;data&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/body&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/html&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;Nous avons également testé la communication en TCP avec l'utilitaire socat&lt;br /&gt;
&lt;br /&gt;
Nous avons créé un serveur python en TCP. Nous pouvons maintenant envoyer des messages du client ( raspberry ) au serveur (VM Xen). Nous nous servirons de cette architecture pour envoyer les données du Nucleo à la Vm Xen &lt;br /&gt;
&lt;br /&gt;
Une fois le modèle entrainé et les tests concluants, on peut déployer notre modèle sur n'importe quel appareils linux ou windows. Pour cela, on va dans l'onglet deployment et on télécharge notre librairie personnalisée.  &lt;br /&gt;
&lt;br /&gt;
===Déploiement du modèle===&lt;br /&gt;
&lt;br /&gt;
On peut lui passer un fichier CSV contenant les données brutes du capteur et grâce au fichier knowledge.dat, l'émulateur est capable de faire la différence entre les situations&amp;lt;syntaxhighlight lang=&amp;quot;bat&amp;quot;&amp;gt;&lt;br /&gt;
PS C:\Users\gabyt\Documents\Gaby\emulators&amp;gt; .\NanoEdgeAI_Class_Emulator.exe neai_classification --knowledge_path .\knowledge.dat --file .\data.csv&lt;br /&gt;
{&lt;br /&gt;
        &amp;quot;status&amp;quot;: &amp;quot;classification&amp;quot;,&lt;br /&gt;
        &amp;quot;lib_id&amp;quot;: &amp;quot;6582b12625c3e0368b2c2a09&amp;quot;,&lt;br /&gt;
        &amp;quot;input&amp;quot;: &amp;quot;.\data.csv&amp;quot;,&lt;br /&gt;
        &amp;quot;results&amp;quot;: [&lt;br /&gt;
                {&amp;quot;signal&amp;quot;: 1, &amp;quot;line&amp;quot;: 1, &amp;quot;class_status&amp;quot;: 2, &amp;quot;class_name&amp;quot;: &amp;quot;dann&amp;quot;, &amp;quot;class_proba&amp;quot;: [0.01, 0.99]},&lt;br /&gt;
                {&amp;quot;signal&amp;quot;: 2, &amp;quot;line&amp;quot;: 2, &amp;quot;class_status&amp;quot;: 2, &amp;quot;class_name&amp;quot;: &amp;quot;dann&amp;quot;, &amp;quot;class_proba&amp;quot;: [0.01, 0.99]},&lt;br /&gt;
                {&amp;quot;signal&amp;quot;: 3, &amp;quot;line&amp;quot;: 3, &amp;quot;class_status&amp;quot;: 2, &amp;quot;class_name&amp;quot;: &amp;quot;dann&amp;quot;, &amp;quot;class_proba&amp;quot;: [0.37, 0.63]},&lt;br /&gt;
                {&amp;quot;signal&amp;quot;: 4, &amp;quot;line&amp;quot;: 4, &amp;quot;class_status&amp;quot;: 1, &amp;quot;class_name&amp;quot;: &amp;quot;gaby&amp;quot;, &amp;quot;class_proba&amp;quot;: [0.83, 0.17]},&lt;br /&gt;
                {&amp;quot;signal&amp;quot;: 5, &amp;quot;line&amp;quot;: 5, &amp;quot;class_status&amp;quot;: 1, &amp;quot;class_name&amp;quot;: &amp;quot;gaby&amp;quot;, &amp;quot;class_proba&amp;quot;: [0.63, 0.37]},&lt;br /&gt;
                {&amp;quot;signal&amp;quot;: 6, &amp;quot;line&amp;quot;: 6, &amp;quot;class_status&amp;quot;: 1, &amp;quot;class_name&amp;quot;: &amp;quot;gaby&amp;quot;, &amp;quot;class_proba&amp;quot;: [0.63, 0.37]},&lt;br /&gt;
                {&amp;quot;signal&amp;quot;: 7, &amp;quot;line&amp;quot;: 7, &amp;quot;class_status&amp;quot;: 1, &amp;quot;class_name&amp;quot;: &amp;quot;gaby&amp;quot;, &amp;quot;class_proba&amp;quot;: [0.50, 0.50]},&lt;br /&gt;
                {&amp;quot;signal&amp;quot;: 8, &amp;quot;line&amp;quot;: 8, &amp;quot;class_status&amp;quot;: 1, &amp;quot;class_name&amp;quot;: &amp;quot;gaby&amp;quot;, &amp;quot;class_proba&amp;quot;: [0.63, 0.37]},&lt;br /&gt;
                {&amp;quot;signal&amp;quot;: 9, &amp;quot;line&amp;quot;: 9, &amp;quot;class_status&amp;quot;: 2, &amp;quot;class_name&amp;quot;: &amp;quot;dann&amp;quot;, &amp;quot;class_proba&amp;quot;: [0.37, 0.63]},&lt;br /&gt;
                {&amp;quot;signal&amp;quot;: 10, &amp;quot;line&amp;quot;: 10, &amp;quot;class_status&amp;quot;: 2, &amp;quot;class_name&amp;quot;: &amp;quot;dann&amp;quot;, &amp;quot;class_proba&amp;quot;: [0.17, 0.83]},&lt;br /&gt;
                {&amp;quot;signal&amp;quot;: 11, &amp;quot;line&amp;quot;: 11, &amp;quot;class_status&amp;quot;: 1, &amp;quot;class_name&amp;quot;: &amp;quot;gaby&amp;quot;, &amp;quot;class_proba&amp;quot;: [0.63, 0.37]},&lt;br /&gt;
                {&amp;quot;signal&amp;quot;: 12, &amp;quot;line&amp;quot;: 12, &amp;quot;class_status&amp;quot;: 1, &amp;quot;class_name&amp;quot;: &amp;quot;gaby&amp;quot;, &amp;quot;class_proba&amp;quot;: [0.63, 0.37]},&lt;br /&gt;
                {&amp;quot;signal&amp;quot;: 13, &amp;quot;line&amp;quot;: 13, &amp;quot;class_status&amp;quot;: 2, &amp;quot;class_name&amp;quot;: &amp;quot;dann&amp;quot;, &amp;quot;class_proba&amp;quot;: [0.37, 0.63]},&lt;br /&gt;
                {&amp;quot;signal&amp;quot;: 14, &amp;quot;line&amp;quot;: 14, &amp;quot;class_status&amp;quot;: 1, &amp;quot;class_name&amp;quot;: &amp;quot;gaby&amp;quot;, &amp;quot;class_proba&amp;quot;: [0.74, 0.26]},&lt;br /&gt;
                {&amp;quot;signal&amp;quot;: 15, &amp;quot;line&amp;quot;: 15, &amp;quot;class_status&amp;quot;: 1, &amp;quot;class_name&amp;quot;: &amp;quot;gaby&amp;quot;, &amp;quot;class_proba&amp;quot;: [0.63, 0.37]},&lt;br /&gt;
                {&amp;quot;signal&amp;quot;: 16, &amp;quot;line&amp;quot;: 16, &amp;quot;class_status&amp;quot;: 1, &amp;quot;class_name&amp;quot;: &amp;quot;gaby&amp;quot;, &amp;quot;class_proba&amp;quot;: [0.74, 0.26]},&lt;br /&gt;
                {&amp;quot;signal&amp;quot;: 17, &amp;quot;line&amp;quot;: 17, &amp;quot;class_status&amp;quot;: 1, &amp;quot;class_name&amp;quot;: &amp;quot;gaby&amp;quot;, &amp;quot;class_proba&amp;quot;: [0.63, 0.37]},&lt;br /&gt;
                {&amp;quot;signal&amp;quot;: 18, &amp;quot;line&amp;quot;: 18, &amp;quot;class_status&amp;quot;: 1, &amp;quot;class_name&amp;quot;: &amp;quot;gaby&amp;quot;, &amp;quot;class_proba&amp;quot;: [0.63, 0.37]},&lt;br /&gt;
                {&amp;quot;signal&amp;quot;: 19, &amp;quot;line&amp;quot;: 19, &amp;quot;class_status&amp;quot;: 2, &amp;quot;class_name&amp;quot;: &amp;quot;dann&amp;quot;, &amp;quot;class_proba&amp;quot;: [0.37, 0.63]},&lt;br /&gt;
                {&amp;quot;signal&amp;quot;: 20, &amp;quot;line&amp;quot;: 20, &amp;quot;class_status&amp;quot;: 1, &amp;quot;class_name&amp;quot;: &amp;quot;gaby&amp;quot;, &amp;quot;class_proba&amp;quot;: [0.63, 0.37]},&lt;br /&gt;
                {&amp;quot;signal&amp;quot;: 21, &amp;quot;line&amp;quot;: 21, &amp;quot;class_status&amp;quot;: 2, &amp;quot;class_name&amp;quot;: &amp;quot;dann&amp;quot;, &amp;quot;class_proba&amp;quot;: [0.11, 0.89]},&lt;br /&gt;
                {&amp;quot;signal&amp;quot;: 22, &amp;quot;line&amp;quot;: 22, &amp;quot;class_status&amp;quot;: 1, &amp;quot;class_name&amp;quot;: &amp;quot;gaby&amp;quot;, &amp;quot;class_proba&amp;quot;: [0.74, 0.26]},&lt;br /&gt;
                {&amp;quot;signal&amp;quot;: 23, &amp;quot;line&amp;quot;: 23, &amp;quot;class_status&amp;quot;: 1, &amp;quot;class_name&amp;quot;: &amp;quot;gaby&amp;quot;, &amp;quot;class_proba&amp;quot;: [0.63, 0.37]},&lt;br /&gt;
                {&amp;quot;signal&amp;quot;: 24, &amp;quot;line&amp;quot;: 24, &amp;quot;class_status&amp;quot;: 1, &amp;quot;class_name&amp;quot;: &amp;quot;gaby&amp;quot;, &amp;quot;class_proba&amp;quot;: [0.74, 0.26]},&lt;br /&gt;
                {&amp;quot;signal&amp;quot;: 25, &amp;quot;line&amp;quot;: 25, &amp;quot;class_status&amp;quot;: 1, &amp;quot;class_name&amp;quot;: &amp;quot;gaby&amp;quot;, &amp;quot;class_proba&amp;quot;: [0.50, 0.50]},&lt;br /&gt;
                {&amp;quot;signal&amp;quot;: 26, &amp;quot;line&amp;quot;: 26, &amp;quot;class_status&amp;quot;: 2, &amp;quot;class_name&amp;quot;: &amp;quot;dann&amp;quot;, &amp;quot;class_proba&amp;quot;: [0.06, 0.94]},&lt;br /&gt;
                {&amp;quot;signal&amp;quot;: 27, &amp;quot;line&amp;quot;: 27, &amp;quot;class_status&amp;quot;: 2, &amp;quot;class_name&amp;quot;: &amp;quot;dann&amp;quot;, &amp;quot;class_proba&amp;quot;: [0.37, 0.63]},&lt;br /&gt;
                {&amp;quot;signal&amp;quot;: 28, &amp;quot;line&amp;quot;: 28, &amp;quot;class_status&amp;quot;: 1, &amp;quot;class_name&amp;quot;: &amp;quot;gaby&amp;quot;, &amp;quot;class_proba&amp;quot;: [0.63, 0.37]},&lt;br /&gt;
                {&amp;quot;signal&amp;quot;: 29, &amp;quot;line&amp;quot;: 29, &amp;quot;class_status&amp;quot;: 1, &amp;quot;class_name&amp;quot;: &amp;quot;gaby&amp;quot;, &amp;quot;class_proba&amp;quot;: [0.63, 0.37]}&lt;br /&gt;
        ],&lt;br /&gt;
        &amp;quot;classification_summary&amp;quot;: {&amp;quot;signals&amp;quot;: 29, &amp;quot;classified&amp;quot;: [19, 10], &amp;quot;unclassified&amp;quot;: 0}&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Visualisation des données sur le serveur===&lt;/div&gt;</summary>
		<author><name>Gthomas</name></author>
	</entry>
	<entry>
		<id>https://wiki-se.plil.fr/mediawiki/index.php?title=RodenburgThomas&amp;diff=3635</id>
		<title>RodenburgThomas</title>
		<link rel="alternate" type="text/html" href="https://wiki-se.plil.fr/mediawiki/index.php?title=RodenburgThomas&amp;diff=3635"/>
		<updated>2023-12-20T16:10:58Z</updated>

		<summary type="html">&lt;p&gt;Gthomas : Annulation des modifications 3631 de Gthomas (discussion)&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;=Le binôme=&lt;br /&gt;
&lt;br /&gt;
Le binôme est constitué de 2 élèves de SE5-SC :&lt;br /&gt;
* Dann RODENBURG&lt;br /&gt;
* Gabriel THOMAS&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=Objectifs= &lt;br /&gt;
&lt;br /&gt;
Le but de ce TP est de créer un réseau de systèmes communicants en partant d'un capteur XNucléo 53L5A1 pour finir sur une machine virtuelle Xen.&lt;br /&gt;
La particularité est d'intégrer une composante de Machine Learning  &lt;br /&gt;
&lt;br /&gt;
[[Fichier:Capture d'écran 2023-12-19 151237.png|néant|vignette|800x800px]]&lt;br /&gt;
&lt;br /&gt;
=Compte rendu des séances=&lt;br /&gt;
&lt;br /&gt;
==Séance du 04/12/2023==&lt;br /&gt;
===Création de la machine virtuelle===&lt;br /&gt;
Création d'une machine virtuelle '''gabidann''' sur le serveur chassiron :&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;xen-create-image --hostname=gabidann --force --dist=bookworm --size=10G --memory=10G --dir=/usr/local/xen --password=glopglop --dhcp --bridge=bridgeStudents&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
La machine virtuelle est à présent connectée au WiFi.&lt;br /&gt;
&lt;br /&gt;
Après cela, nous avons configuré la machine virtuelle selon l'énoncé du TP en faisant un xen console gabidann. Nous avons ensuite participé à la mise en place du point d'accès WiFi.&lt;br /&gt;
&lt;br /&gt;
===Premières observations du capteur===&lt;br /&gt;
De plus nous avons observé le retour du capteur de distance Nucleo-53L5A1 avec l'outil minicom. Le contenu envoyé par le capteur était compréhensible avec une fréquence de 460 800 bauds ; sur minicom, on a pu constater que le capteur nous envoie des valeurs qui dépendent de la distance entre celui-ci et un obstacle.&lt;br /&gt;
&lt;br /&gt;
===Raspberry===&lt;br /&gt;
D'un autre côté, nous avons branché la Raspberry Pi à l'ordinateur selon le pinout fourni dans la documentation.&lt;br /&gt;
&lt;br /&gt;
[[Fichier:20231218 085218.jpg|vignette|néant]]&lt;br /&gt;
&lt;br /&gt;
Enfin, nous avons activé la communication UART de la Raspberry Pi afin de pouvoir communiquer avec. En fin de séance, nous étions en train de vérifier que la Raspberry Pi répondait bien, même en ayant ajouté la ligne enable_uart=1 dans le fichier config.txt de la Raspberry.&lt;br /&gt;
&lt;br /&gt;
==Séance du 18/12/2023==&lt;br /&gt;
===Configuration de la Raspberry===&lt;br /&gt;
Nous avons résolu le problème de la Raspberry qui ne répondait pas. Cela était dû à l'alimentation : brancher la carte en USBC résoud le problème. Cependant, nous recevons une erreur l'erreur EXT4-fs error (device mmcblk0p2).&lt;br /&gt;
Le problème venait des arguments saisis lors du lancement de Minicom. Avec la commande suivante, il est à présent possible de se connecter sur la Raspberry : &amp;lt;code&amp;gt;minicom -D /dev/ttyUSB0 -b 115200&amp;lt;/code&amp;gt;&lt;br /&gt;
Dans la Raspberry, nous avons configuré une interface réseau wlan0 pour se connecter à WiFi_IE_1 :&lt;br /&gt;
    auto wlan0&lt;br /&gt;
    iface wlan0 inet dhcp&lt;br /&gt;
    wpa-conf /etc/wpa_supplicant/wpa_supplicant.conf&lt;br /&gt;
A présent à partir de la Raspberry, on peut ping la machine virtuelle sur chassiron avec son IPv6.&lt;br /&gt;
&lt;br /&gt;
===Configuration du capteur de distance===&lt;br /&gt;
Un programme était déjà présent sur le capteur. On a téléchargé le logiciel STM32CubeIDE pour pouvoir éditer du code et le téléverser sur le capteur. Nous avons testé de téléverser un programme d'exemple dont voici le résultat :&lt;br /&gt;
[[Fichier:Screenshot 2023-12-18 13-12-19.jpg|vignette|néant|700x700px]]&lt;br /&gt;
&lt;br /&gt;
Nous avons modifié ce programme afin d'effectuer un formatage des données transmises par le capteur sous le format ''&amp;lt;distance&amp;gt;,'' pour chaque valeur. Grâce à ce formatage, il est à présent possible d'utiliser les données reçues par le logiciel NanoEdgeStudio AI pour la partie Machine Learning.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Pour recevoir les valeurs de manière exploitable, il faut modifier le code Exemple dans le logiciel STM Cube IDE&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Capture d'écran 2023-12-20 084719.png|néant|vignette|800x800px]]&lt;br /&gt;
&lt;br /&gt;
L'objectif est d'obtenir une liste séparée par des virgules, il a donc fallu supprimer les espaces et les barres verticales de la fonction d'affichage ainsi que les statuts de chacun des capteurs :&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
static void print_result(RANGING_SENSOR_Result_t *Result)&lt;br /&gt;
{&lt;br /&gt;
  int8_t j;&lt;br /&gt;
  int8_t k;&lt;br /&gt;
  int8_t l;&lt;br /&gt;
  uint8_t zones_per_line;&lt;br /&gt;
  zones_per_line = ((Profile.RangingProfile == RS_PROFILE_8x8_AUTONOMOUS) ||&lt;br /&gt;
         (Profile.RangingProfile == RS_PROFILE_8x8_CONTINUOUS)) ? 8 : 4;&lt;br /&gt;
  for (j = 0; j &amp;lt; Result-&amp;gt;NumberOfZones; j += zones_per_line)&lt;br /&gt;
  {&lt;br /&gt;
    for (l = 0; l &amp;lt; RANGING_SENSOR_NB_TARGET_PER_ZONE; l++)&lt;br /&gt;
    {&lt;br /&gt;
      /* Print distance and status */&lt;br /&gt;
      for (k = (zones_per_line - 1); k &amp;gt;= 0; k--)&lt;br /&gt;
      {&lt;br /&gt;
        if (Result-&amp;gt;ZoneResult[j+k].NumberOfTargets &amp;gt; 0)&lt;br /&gt;
          printf(&amp;quot;%ld,&amp;quot;,(long)Result-&amp;gt;ZoneResult[j+k].Distance[l]);&lt;br /&gt;
      }&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
  printf(&amp;quot;\n&amp;quot;);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;On passe ensuite sur Nano Edge Studio pour définir les signaux dans l'onglet &amp;quot;Signals&amp;quot; et entraîner le modèle dans l'onglet &amp;quot;Benchmark&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Capture d'écran 2023-12-18 172047.png|néant|vignette|800x800px]]&lt;br /&gt;
&lt;br /&gt;
Une fois le modèle entraîné, on peut le tester avec l'onglet &amp;quot;Emulator&amp;quot; &lt;br /&gt;
&lt;br /&gt;
[[Fichier:Capture d'écran 2023-12-18 173255.png|néant|vignette|800x800px]]&lt;br /&gt;
&lt;br /&gt;
===Emulation avec NanoEdgeStudio AI===&lt;br /&gt;
&lt;br /&gt;
Dans un premier temps, nous avons essayé d'entraîner le programme à reconnaître les chiffres 1, 2, 3, 4 et 5 sur les doigts d'une main. Les résultats n'étaient pas concluant, il semblerait que le capteur détecte avant tout le volume de la main à la place de détecter le nombre de doigts.&lt;br /&gt;
&lt;br /&gt;
Nous avons ensuite choisi de faire un détecteur de visages capable de faire la différence entre Gabriel et Dann. L'émulation donne des résultats très satisfaisant proche de 100% de réussite&lt;br /&gt;
&lt;br /&gt;
===Configuration du serveur===&lt;br /&gt;
Configuration d'un serveur HTTP sur la machine virtuelle gabidann :&amp;lt;syntaxhighlight lang=&amp;quot;python3&amp;quot;&amp;gt;&lt;br /&gt;
import socket&lt;br /&gt;
from http.server import HTTPServer, SimpleHTTPRequestHandler&lt;br /&gt;
&lt;br /&gt;
class MyHandler(SimpleHTTPRequestHandler):&lt;br /&gt;
  def do_GET(self):&lt;br /&gt;
    if self.path == '/ip':&lt;br /&gt;
      self.send_response(200)&lt;br /&gt;
      self.send_header('Content-type', 'text/html')&lt;br /&gt;
      self.end_headers()&lt;br /&gt;
      self.wfile.write(f'Your IP address is {self.client_address[0]}'.encode())&lt;br /&gt;
      return&lt;br /&gt;
    else:&lt;br /&gt;
      return SimpleHTTPRequestHandler.do_GET(self)&lt;br /&gt;
&lt;br /&gt;
class HTTPServerV6(HTTPServer):&lt;br /&gt;
  address_family = socket.AF_INET6&lt;br /&gt;
&lt;br /&gt;
def main():&lt;br /&gt;
  server = HTTPServerV6(('::', 8080), MyHandler)&lt;br /&gt;
  server.serve_forever()&lt;br /&gt;
&lt;br /&gt;
if __name__ == '__main__':&lt;br /&gt;
  main()&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Pour se connecter au serveur depuis un navigateur, on peut ouvrir un navigateur depuis la zabeth et y accéder avec l'adresse : ''[&amp;lt;ipv6_VM&amp;gt;]:&amp;lt;port&amp;gt;''. Dans notre cas, le serveur écoute le port '''8080'''.&lt;br /&gt;
&lt;br /&gt;
La page index.html s'affiche par défaut lorsque l'on se connecte au serveur HTTP :&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;html&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;!DOCTYPE html&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;html lang=&amp;quot;fr&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;head&amp;gt;&lt;br /&gt;
	&amp;lt;meta charset=&amp;quot;UTF-8&amp;quot;&amp;gt;&lt;br /&gt;
	&amp;lt;title&amp;gt;Gabidann&amp;lt;/title&amp;gt;&lt;br /&gt;
&amp;lt;/head&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;body&amp;gt;&lt;br /&gt;
	&amp;lt;h1&amp;gt;Bienvenue sur Gabidann !&amp;lt;h1&amp;gt;&lt;br /&gt;
	&amp;lt;div id=&amp;quot;data&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/body&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/html&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;Nous avons également testé la communication en TCP avec l'utilitaire socat&lt;br /&gt;
&lt;br /&gt;
Nous avons créé un serveur python en TCP. Nous pouvons maintenant envoyer des messages du client ( raspberry ) au serveur (VM Xen). Nous nous servirons de cette architecture pour envoyer les données du Nucleo à la Vm Xen &lt;br /&gt;
&lt;br /&gt;
Une fois le modèle entrainé et les tests concluants, on peut déployer notre modèle sur n'importe quel appareils linux ou windows. Pour cela, on va dans l'onglet deployment et on télécharge notre librairie personnalisée.  &lt;br /&gt;
&lt;br /&gt;
===Déploiement du modèle===&lt;br /&gt;
&lt;br /&gt;
On peut lui passer un fichier CSV contenant les données brutes du capteur et grâce au fichier knowledge.dat, l'émulateur est capable de faire la différence entre les situations&amp;lt;syntaxhighlight lang=&amp;quot;bat&amp;quot;&amp;gt;&lt;br /&gt;
PS C:\Users\gabyt\Documents\Gaby\emulators&amp;gt; .\NanoEdgeAI_Class_Emulator.exe neai_classification --knowledge_path .\knowledge.dat --file .\data.csv&lt;br /&gt;
{&lt;br /&gt;
        &amp;quot;status&amp;quot;: &amp;quot;classification&amp;quot;,&lt;br /&gt;
        &amp;quot;lib_id&amp;quot;: &amp;quot;6582b12625c3e0368b2c2a09&amp;quot;,&lt;br /&gt;
        &amp;quot;input&amp;quot;: &amp;quot;.\data.csv&amp;quot;,&lt;br /&gt;
        &amp;quot;results&amp;quot;: [&lt;br /&gt;
                {&amp;quot;signal&amp;quot;: 1, &amp;quot;line&amp;quot;: 1, &amp;quot;class_status&amp;quot;: 2, &amp;quot;class_name&amp;quot;: &amp;quot;dann&amp;quot;, &amp;quot;class_proba&amp;quot;: [0.01, 0.99]},&lt;br /&gt;
                {&amp;quot;signal&amp;quot;: 2, &amp;quot;line&amp;quot;: 2, &amp;quot;class_status&amp;quot;: 2, &amp;quot;class_name&amp;quot;: &amp;quot;dann&amp;quot;, &amp;quot;class_proba&amp;quot;: [0.01, 0.99]},&lt;br /&gt;
                {&amp;quot;signal&amp;quot;: 3, &amp;quot;line&amp;quot;: 3, &amp;quot;class_status&amp;quot;: 2, &amp;quot;class_name&amp;quot;: &amp;quot;dann&amp;quot;, &amp;quot;class_proba&amp;quot;: [0.37, 0.63]},&lt;br /&gt;
                {&amp;quot;signal&amp;quot;: 4, &amp;quot;line&amp;quot;: 4, &amp;quot;class_status&amp;quot;: 1, &amp;quot;class_name&amp;quot;: &amp;quot;gaby&amp;quot;, &amp;quot;class_proba&amp;quot;: [0.83, 0.17]},&lt;br /&gt;
                {&amp;quot;signal&amp;quot;: 5, &amp;quot;line&amp;quot;: 5, &amp;quot;class_status&amp;quot;: 1, &amp;quot;class_name&amp;quot;: &amp;quot;gaby&amp;quot;, &amp;quot;class_proba&amp;quot;: [0.63, 0.37]},&lt;br /&gt;
                {&amp;quot;signal&amp;quot;: 6, &amp;quot;line&amp;quot;: 6, &amp;quot;class_status&amp;quot;: 1, &amp;quot;class_name&amp;quot;: &amp;quot;gaby&amp;quot;, &amp;quot;class_proba&amp;quot;: [0.63, 0.37]},&lt;br /&gt;
                {&amp;quot;signal&amp;quot;: 7, &amp;quot;line&amp;quot;: 7, &amp;quot;class_status&amp;quot;: 1, &amp;quot;class_name&amp;quot;: &amp;quot;gaby&amp;quot;, &amp;quot;class_proba&amp;quot;: [0.50, 0.50]},&lt;br /&gt;
                {&amp;quot;signal&amp;quot;: 8, &amp;quot;line&amp;quot;: 8, &amp;quot;class_status&amp;quot;: 1, &amp;quot;class_name&amp;quot;: &amp;quot;gaby&amp;quot;, &amp;quot;class_proba&amp;quot;: [0.63, 0.37]},&lt;br /&gt;
                {&amp;quot;signal&amp;quot;: 9, &amp;quot;line&amp;quot;: 9, &amp;quot;class_status&amp;quot;: 2, &amp;quot;class_name&amp;quot;: &amp;quot;dann&amp;quot;, &amp;quot;class_proba&amp;quot;: [0.37, 0.63]},&lt;br /&gt;
                {&amp;quot;signal&amp;quot;: 10, &amp;quot;line&amp;quot;: 10, &amp;quot;class_status&amp;quot;: 2, &amp;quot;class_name&amp;quot;: &amp;quot;dann&amp;quot;, &amp;quot;class_proba&amp;quot;: [0.17, 0.83]},&lt;br /&gt;
                {&amp;quot;signal&amp;quot;: 11, &amp;quot;line&amp;quot;: 11, &amp;quot;class_status&amp;quot;: 1, &amp;quot;class_name&amp;quot;: &amp;quot;gaby&amp;quot;, &amp;quot;class_proba&amp;quot;: [0.63, 0.37]},&lt;br /&gt;
                {&amp;quot;signal&amp;quot;: 12, &amp;quot;line&amp;quot;: 12, &amp;quot;class_status&amp;quot;: 1, &amp;quot;class_name&amp;quot;: &amp;quot;gaby&amp;quot;, &amp;quot;class_proba&amp;quot;: [0.63, 0.37]},&lt;br /&gt;
                {&amp;quot;signal&amp;quot;: 13, &amp;quot;line&amp;quot;: 13, &amp;quot;class_status&amp;quot;: 2, &amp;quot;class_name&amp;quot;: &amp;quot;dann&amp;quot;, &amp;quot;class_proba&amp;quot;: [0.37, 0.63]},&lt;br /&gt;
                {&amp;quot;signal&amp;quot;: 14, &amp;quot;line&amp;quot;: 14, &amp;quot;class_status&amp;quot;: 1, &amp;quot;class_name&amp;quot;: &amp;quot;gaby&amp;quot;, &amp;quot;class_proba&amp;quot;: [0.74, 0.26]},&lt;br /&gt;
                {&amp;quot;signal&amp;quot;: 15, &amp;quot;line&amp;quot;: 15, &amp;quot;class_status&amp;quot;: 1, &amp;quot;class_name&amp;quot;: &amp;quot;gaby&amp;quot;, &amp;quot;class_proba&amp;quot;: [0.63, 0.37]},&lt;br /&gt;
                {&amp;quot;signal&amp;quot;: 16, &amp;quot;line&amp;quot;: 16, &amp;quot;class_status&amp;quot;: 1, &amp;quot;class_name&amp;quot;: &amp;quot;gaby&amp;quot;, &amp;quot;class_proba&amp;quot;: [0.74, 0.26]},&lt;br /&gt;
                {&amp;quot;signal&amp;quot;: 17, &amp;quot;line&amp;quot;: 17, &amp;quot;class_status&amp;quot;: 1, &amp;quot;class_name&amp;quot;: &amp;quot;gaby&amp;quot;, &amp;quot;class_proba&amp;quot;: [0.63, 0.37]},&lt;br /&gt;
                {&amp;quot;signal&amp;quot;: 18, &amp;quot;line&amp;quot;: 18, &amp;quot;class_status&amp;quot;: 1, &amp;quot;class_name&amp;quot;: &amp;quot;gaby&amp;quot;, &amp;quot;class_proba&amp;quot;: [0.63, 0.37]},&lt;br /&gt;
                {&amp;quot;signal&amp;quot;: 19, &amp;quot;line&amp;quot;: 19, &amp;quot;class_status&amp;quot;: 2, &amp;quot;class_name&amp;quot;: &amp;quot;dann&amp;quot;, &amp;quot;class_proba&amp;quot;: [0.37, 0.63]},&lt;br /&gt;
                {&amp;quot;signal&amp;quot;: 20, &amp;quot;line&amp;quot;: 20, &amp;quot;class_status&amp;quot;: 1, &amp;quot;class_name&amp;quot;: &amp;quot;gaby&amp;quot;, &amp;quot;class_proba&amp;quot;: [0.63, 0.37]},&lt;br /&gt;
                {&amp;quot;signal&amp;quot;: 21, &amp;quot;line&amp;quot;: 21, &amp;quot;class_status&amp;quot;: 2, &amp;quot;class_name&amp;quot;: &amp;quot;dann&amp;quot;, &amp;quot;class_proba&amp;quot;: [0.11, 0.89]},&lt;br /&gt;
                {&amp;quot;signal&amp;quot;: 22, &amp;quot;line&amp;quot;: 22, &amp;quot;class_status&amp;quot;: 1, &amp;quot;class_name&amp;quot;: &amp;quot;gaby&amp;quot;, &amp;quot;class_proba&amp;quot;: [0.74, 0.26]},&lt;br /&gt;
                {&amp;quot;signal&amp;quot;: 23, &amp;quot;line&amp;quot;: 23, &amp;quot;class_status&amp;quot;: 1, &amp;quot;class_name&amp;quot;: &amp;quot;gaby&amp;quot;, &amp;quot;class_proba&amp;quot;: [0.63, 0.37]},&lt;br /&gt;
                {&amp;quot;signal&amp;quot;: 24, &amp;quot;line&amp;quot;: 24, &amp;quot;class_status&amp;quot;: 1, &amp;quot;class_name&amp;quot;: &amp;quot;gaby&amp;quot;, &amp;quot;class_proba&amp;quot;: [0.74, 0.26]},&lt;br /&gt;
                {&amp;quot;signal&amp;quot;: 25, &amp;quot;line&amp;quot;: 25, &amp;quot;class_status&amp;quot;: 1, &amp;quot;class_name&amp;quot;: &amp;quot;gaby&amp;quot;, &amp;quot;class_proba&amp;quot;: [0.50, 0.50]},&lt;br /&gt;
                {&amp;quot;signal&amp;quot;: 26, &amp;quot;line&amp;quot;: 26, &amp;quot;class_status&amp;quot;: 2, &amp;quot;class_name&amp;quot;: &amp;quot;dann&amp;quot;, &amp;quot;class_proba&amp;quot;: [0.06, 0.94]},&lt;br /&gt;
                {&amp;quot;signal&amp;quot;: 27, &amp;quot;line&amp;quot;: 27, &amp;quot;class_status&amp;quot;: 2, &amp;quot;class_name&amp;quot;: &amp;quot;dann&amp;quot;, &amp;quot;class_proba&amp;quot;: [0.37, 0.63]},&lt;br /&gt;
                {&amp;quot;signal&amp;quot;: 28, &amp;quot;line&amp;quot;: 28, &amp;quot;class_status&amp;quot;: 1, &amp;quot;class_name&amp;quot;: &amp;quot;gaby&amp;quot;, &amp;quot;class_proba&amp;quot;: [0.63, 0.37]},&lt;br /&gt;
                {&amp;quot;signal&amp;quot;: 29, &amp;quot;line&amp;quot;: 29, &amp;quot;class_status&amp;quot;: 1, &amp;quot;class_name&amp;quot;: &amp;quot;gaby&amp;quot;, &amp;quot;class_proba&amp;quot;: [0.63, 0.37]}&lt;br /&gt;
        ],&lt;br /&gt;
        &amp;quot;classification_summary&amp;quot;: {&amp;quot;signals&amp;quot;: 29, &amp;quot;classified&amp;quot;: [19, 10], &amp;quot;unclassified&amp;quot;: 0}&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Visualisation des données sur le serveur===&lt;/div&gt;</summary>
		<author><name>Gthomas</name></author>
	</entry>
	<entry>
		<id>https://wiki-se.plil.fr/mediawiki/index.php?title=RodenburgThomas&amp;diff=3634</id>
		<title>RodenburgThomas</title>
		<link rel="alternate" type="text/html" href="https://wiki-se.plil.fr/mediawiki/index.php?title=RodenburgThomas&amp;diff=3634"/>
		<updated>2023-12-20T16:10:41Z</updated>

		<summary type="html">&lt;p&gt;Gthomas : Annulation des modifications 3632 de Gthomas (discussion)&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;=Création de la machine virtuelle=&lt;br /&gt;
Création d'une machine virtuelle '''gabidann''' sur le serveur chassiron :&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;xen-create-image --hostname=gabidann --force --dist=bookworm --size=10G --memory=10G --dir=/usr/local/xen --password=glopglop --dhcp --bridge=bridgeStudents&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
La machine virtuelle est à présent connectée au WiFi.&lt;br /&gt;
&lt;br /&gt;
Après cela, nous avons configuré la machine virtuelle selon l'énoncé du TP en faisant un xen console gabidann. Nous avons ensuite participé à la mise en place du point d'accès WiFi.&lt;br /&gt;
&lt;br /&gt;
===Premières observations du capteur===&lt;br /&gt;
De plus nous avons observé le retour du capteur de distance Nucleo-53L5A1 avec l'outil minicom. Le contenu envoyé par le capteur était compréhensible avec une fréquence de 460 800 bauds ; sur minicom, on a pu constater que le capteur nous envoie des valeurs qui dépendent de la distance entre celui-ci et un obstacle.&lt;br /&gt;
&lt;br /&gt;
===Raspberry===&lt;br /&gt;
D'un autre côté, nous avons branché la Raspberry Pi à l'ordinateur selon le pinout fourni dans la documentation.&lt;br /&gt;
&lt;br /&gt;
[[Fichier:20231218 085218.jpg|vignette|néant]]&lt;br /&gt;
&lt;br /&gt;
Enfin, nous avons activé la communication UART de la Raspberry Pi afin de pouvoir communiquer avec. En fin de séance, nous étions en train de vérifier que la Raspberry Pi répondait bien, même en ayant ajouté la ligne enable_uart=1 dans le fichier config.txt de la Raspberry.&lt;br /&gt;
&lt;br /&gt;
==Séance du 18/12/2023==&lt;br /&gt;
===Configuration de la Raspberry===&lt;br /&gt;
Nous avons résolu le problème de la Raspberry qui ne répondait pas. Cela était dû à l'alimentation : brancher la carte en USBC résoud le problème. Cependant, nous recevons une erreur l'erreur EXT4-fs error (device mmcblk0p2).&lt;br /&gt;
Le problème venait des arguments saisis lors du lancement de Minicom. Avec la commande suivante, il est à présent possible de se connecter sur la Raspberry : &amp;lt;code&amp;gt;minicom -D /dev/ttyUSB0 -b 115200&amp;lt;/code&amp;gt;&lt;br /&gt;
Dans la Raspberry, nous avons configuré une interface réseau wlan0 pour se connecter à WiFi_IE_1 :&lt;br /&gt;
    auto wlan0&lt;br /&gt;
    iface wlan0 inet dhcp&lt;br /&gt;
    wpa-conf /etc/wpa_supplicant/wpa_supplicant.conf&lt;br /&gt;
A présent à partir de la Raspberry, on peut ping la machine virtuelle sur chassiron avec son IPv6.&lt;br /&gt;
&lt;br /&gt;
===Configuration du capteur de distance===&lt;br /&gt;
Un programme était déjà présent sur le capteur. On a téléchargé le logiciel STM32CubeIDE pour pouvoir éditer du code et le téléverser sur le capteur. Nous avons testé de téléverser un programme d'exemple dont voici le résultat :&lt;br /&gt;
[[Fichier:Screenshot 2023-12-18 13-12-19.jpg|vignette|néant|700x700px]]&lt;br /&gt;
&lt;br /&gt;
Nous avons modifié ce programme afin d'effectuer un formatage des données transmises par le capteur sous le format ''&amp;lt;distance&amp;gt;,'' pour chaque valeur. Grâce à ce formatage, il est à présent possible d'utiliser les données reçues par le logiciel NanoEdgeStudio AI pour la partie Machine Learning.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Pour recevoir les valeurs de manière exploitable, il faut modifier le code Exemple dans le logiciel STM Cube IDE&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Capture d'écran 2023-12-20 084719.png|néant|vignette|800x800px]]&lt;br /&gt;
&lt;br /&gt;
L'objectif est d'obtenir une liste séparée par des virgules, il a donc fallu supprimer les espaces et les barres verticales de la fonction d'affichage ainsi que les statuts de chacun des capteurs :&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
static void print_result(RANGING_SENSOR_Result_t *Result)&lt;br /&gt;
{&lt;br /&gt;
  int8_t j;&lt;br /&gt;
  int8_t k;&lt;br /&gt;
  int8_t l;&lt;br /&gt;
  uint8_t zones_per_line;&lt;br /&gt;
  zones_per_line = ((Profile.RangingProfile == RS_PROFILE_8x8_AUTONOMOUS) ||&lt;br /&gt;
         (Profile.RangingProfile == RS_PROFILE_8x8_CONTINUOUS)) ? 8 : 4;&lt;br /&gt;
  for (j = 0; j &amp;lt; Result-&amp;gt;NumberOfZones; j += zones_per_line)&lt;br /&gt;
  {&lt;br /&gt;
    for (l = 0; l &amp;lt; RANGING_SENSOR_NB_TARGET_PER_ZONE; l++)&lt;br /&gt;
    {&lt;br /&gt;
      /* Print distance and status */&lt;br /&gt;
      for (k = (zones_per_line - 1); k &amp;gt;= 0; k--)&lt;br /&gt;
      {&lt;br /&gt;
        if (Result-&amp;gt;ZoneResult[j+k].NumberOfTargets &amp;gt; 0)&lt;br /&gt;
          printf(&amp;quot;%ld,&amp;quot;,(long)Result-&amp;gt;ZoneResult[j+k].Distance[l]);&lt;br /&gt;
      }&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
  printf(&amp;quot;\n&amp;quot;);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;On passe ensuite sur Nano Edge Studio pour définir les signaux dans l'onglet &amp;quot;Signals&amp;quot; et entraîner le modèle dans l'onglet &amp;quot;Benchmark&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Capture d'écran 2023-12-18 172047.png|néant|vignette|800x800px]]&lt;br /&gt;
&lt;br /&gt;
Une fois le modèle entraîné, on peut le tester avec l'onglet &amp;quot;Emulator&amp;quot; &lt;br /&gt;
&lt;br /&gt;
[[Fichier:Capture d'écran 2023-12-18 173255.png|néant|vignette|800x800px]]&lt;br /&gt;
&lt;br /&gt;
===Emulation avec NanoEdgeStudio AI===&lt;br /&gt;
&lt;br /&gt;
Dans un premier temps, nous avons essayé d'entraîner le programme à reconnaître les chiffres 1, 2, 3, 4 et 5 sur les doigts d'une main. Les résultats n'étaient pas concluant, il semblerait que le capteur détecte avant tout le volume de la main à la place de détecter le nombre de doigts.&lt;br /&gt;
&lt;br /&gt;
Nous avons ensuite choisi de faire un détecteur de visages capable de faire la différence entre Gabriel et Dann. L'émulation donne des résultats très satisfaisant proche de 100% de réussite&lt;br /&gt;
&lt;br /&gt;
===Configuration du serveur===&lt;br /&gt;
Configuration d'un serveur HTTP sur la machine virtuelle gabidann :&amp;lt;syntaxhighlight lang=&amp;quot;python3&amp;quot;&amp;gt;&lt;br /&gt;
import socket&lt;br /&gt;
from http.server import HTTPServer, SimpleHTTPRequestHandler&lt;br /&gt;
&lt;br /&gt;
class MyHandler(SimpleHTTPRequestHandler):&lt;br /&gt;
  def do_GET(self):&lt;br /&gt;
    if self.path == '/ip':&lt;br /&gt;
      self.send_response(200)&lt;br /&gt;
      self.send_header('Content-type', 'text/html')&lt;br /&gt;
      self.end_headers()&lt;br /&gt;
      self.wfile.write(f'Your IP address is {self.client_address[0]}'.encode())&lt;br /&gt;
      return&lt;br /&gt;
    else:&lt;br /&gt;
      return SimpleHTTPRequestHandler.do_GET(self)&lt;br /&gt;
&lt;br /&gt;
class HTTPServerV6(HTTPServer):&lt;br /&gt;
  address_family = socket.AF_INET6&lt;br /&gt;
&lt;br /&gt;
def main():&lt;br /&gt;
  server = HTTPServerV6(('::', 8080), MyHandler)&lt;br /&gt;
  server.serve_forever()&lt;br /&gt;
&lt;br /&gt;
if __name__ == '__main__':&lt;br /&gt;
  main()&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Pour se connecter au serveur depuis un navigateur, on peut ouvrir un navigateur depuis la zabeth et y accéder avec l'adresse : ''[&amp;lt;ipv6_VM&amp;gt;]:&amp;lt;port&amp;gt;''. Dans notre cas, le serveur écoute le port '''8080'''.&lt;br /&gt;
&lt;br /&gt;
La page index.html s'affiche par défaut lorsque l'on se connecte au serveur HTTP :&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;html&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;!DOCTYPE html&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;html lang=&amp;quot;fr&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;head&amp;gt;&lt;br /&gt;
	&amp;lt;meta charset=&amp;quot;UTF-8&amp;quot;&amp;gt;&lt;br /&gt;
	&amp;lt;title&amp;gt;Gabidann&amp;lt;/title&amp;gt;&lt;br /&gt;
&amp;lt;/head&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;body&amp;gt;&lt;br /&gt;
	&amp;lt;h1&amp;gt;Bienvenue sur Gabidann !&amp;lt;h1&amp;gt;&lt;br /&gt;
	&amp;lt;div id=&amp;quot;data&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/body&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/html&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;Nous avons également testé la communication en TCP avec l'utilitaire socat&lt;br /&gt;
&lt;br /&gt;
Nous avons créé un serveur python en TCP. Nous pouvons maintenant envoyer des messages du client ( raspberry ) au serveur (VM Xen). Nous nous servirons de cette architecture pour envoyer les données du Nucleo à la Vm Xen &lt;br /&gt;
&lt;br /&gt;
Une fois le modèle entrainé et les tests concluants, on peut déployer notre modèle sur n'importe quel appareils linux ou windows. Pour cela, on va dans l'onglet deployment et on télécharge notre librairie personnalisée.  &lt;br /&gt;
&lt;br /&gt;
===Déploiement du modèle===&lt;br /&gt;
&lt;br /&gt;
On peut lui passer un fichier CSV contenant les données brutes du capteur et grâce au fichier knowledge.dat, l'émulateur est capable de faire la différence entre les situations&amp;lt;syntaxhighlight lang=&amp;quot;bat&amp;quot;&amp;gt;&lt;br /&gt;
PS C:\Users\gabyt\Documents\Gaby\emulators&amp;gt; .\NanoEdgeAI_Class_Emulator.exe neai_classification --knowledge_path .\knowledge.dat --file .\data.csv&lt;br /&gt;
{&lt;br /&gt;
        &amp;quot;status&amp;quot;: &amp;quot;classification&amp;quot;,&lt;br /&gt;
        &amp;quot;lib_id&amp;quot;: &amp;quot;6582b12625c3e0368b2c2a09&amp;quot;,&lt;br /&gt;
        &amp;quot;input&amp;quot;: &amp;quot;.\data.csv&amp;quot;,&lt;br /&gt;
        &amp;quot;results&amp;quot;: [&lt;br /&gt;
                {&amp;quot;signal&amp;quot;: 1, &amp;quot;line&amp;quot;: 1, &amp;quot;class_status&amp;quot;: 2, &amp;quot;class_name&amp;quot;: &amp;quot;dann&amp;quot;, &amp;quot;class_proba&amp;quot;: [0.01, 0.99]},&lt;br /&gt;
                {&amp;quot;signal&amp;quot;: 2, &amp;quot;line&amp;quot;: 2, &amp;quot;class_status&amp;quot;: 2, &amp;quot;class_name&amp;quot;: &amp;quot;dann&amp;quot;, &amp;quot;class_proba&amp;quot;: [0.01, 0.99]},&lt;br /&gt;
                {&amp;quot;signal&amp;quot;: 3, &amp;quot;line&amp;quot;: 3, &amp;quot;class_status&amp;quot;: 2, &amp;quot;class_name&amp;quot;: &amp;quot;dann&amp;quot;, &amp;quot;class_proba&amp;quot;: [0.37, 0.63]},&lt;br /&gt;
                {&amp;quot;signal&amp;quot;: 4, &amp;quot;line&amp;quot;: 4, &amp;quot;class_status&amp;quot;: 1, &amp;quot;class_name&amp;quot;: &amp;quot;gaby&amp;quot;, &amp;quot;class_proba&amp;quot;: [0.83, 0.17]},&lt;br /&gt;
                {&amp;quot;signal&amp;quot;: 5, &amp;quot;line&amp;quot;: 5, &amp;quot;class_status&amp;quot;: 1, &amp;quot;class_name&amp;quot;: &amp;quot;gaby&amp;quot;, &amp;quot;class_proba&amp;quot;: [0.63, 0.37]},&lt;br /&gt;
                {&amp;quot;signal&amp;quot;: 6, &amp;quot;line&amp;quot;: 6, &amp;quot;class_status&amp;quot;: 1, &amp;quot;class_name&amp;quot;: &amp;quot;gaby&amp;quot;, &amp;quot;class_proba&amp;quot;: [0.63, 0.37]},&lt;br /&gt;
                {&amp;quot;signal&amp;quot;: 7, &amp;quot;line&amp;quot;: 7, &amp;quot;class_status&amp;quot;: 1, &amp;quot;class_name&amp;quot;: &amp;quot;gaby&amp;quot;, &amp;quot;class_proba&amp;quot;: [0.50, 0.50]},&lt;br /&gt;
                {&amp;quot;signal&amp;quot;: 8, &amp;quot;line&amp;quot;: 8, &amp;quot;class_status&amp;quot;: 1, &amp;quot;class_name&amp;quot;: &amp;quot;gaby&amp;quot;, &amp;quot;class_proba&amp;quot;: [0.63, 0.37]},&lt;br /&gt;
                {&amp;quot;signal&amp;quot;: 9, &amp;quot;line&amp;quot;: 9, &amp;quot;class_status&amp;quot;: 2, &amp;quot;class_name&amp;quot;: &amp;quot;dann&amp;quot;, &amp;quot;class_proba&amp;quot;: [0.37, 0.63]},&lt;br /&gt;
                {&amp;quot;signal&amp;quot;: 10, &amp;quot;line&amp;quot;: 10, &amp;quot;class_status&amp;quot;: 2, &amp;quot;class_name&amp;quot;: &amp;quot;dann&amp;quot;, &amp;quot;class_proba&amp;quot;: [0.17, 0.83]},&lt;br /&gt;
                {&amp;quot;signal&amp;quot;: 11, &amp;quot;line&amp;quot;: 11, &amp;quot;class_status&amp;quot;: 1, &amp;quot;class_name&amp;quot;: &amp;quot;gaby&amp;quot;, &amp;quot;class_proba&amp;quot;: [0.63, 0.37]},&lt;br /&gt;
                {&amp;quot;signal&amp;quot;: 12, &amp;quot;line&amp;quot;: 12, &amp;quot;class_status&amp;quot;: 1, &amp;quot;class_name&amp;quot;: &amp;quot;gaby&amp;quot;, &amp;quot;class_proba&amp;quot;: [0.63, 0.37]},&lt;br /&gt;
                {&amp;quot;signal&amp;quot;: 13, &amp;quot;line&amp;quot;: 13, &amp;quot;class_status&amp;quot;: 2, &amp;quot;class_name&amp;quot;: &amp;quot;dann&amp;quot;, &amp;quot;class_proba&amp;quot;: [0.37, 0.63]},&lt;br /&gt;
                {&amp;quot;signal&amp;quot;: 14, &amp;quot;line&amp;quot;: 14, &amp;quot;class_status&amp;quot;: 1, &amp;quot;class_name&amp;quot;: &amp;quot;gaby&amp;quot;, &amp;quot;class_proba&amp;quot;: [0.74, 0.26]},&lt;br /&gt;
                {&amp;quot;signal&amp;quot;: 15, &amp;quot;line&amp;quot;: 15, &amp;quot;class_status&amp;quot;: 1, &amp;quot;class_name&amp;quot;: &amp;quot;gaby&amp;quot;, &amp;quot;class_proba&amp;quot;: [0.63, 0.37]},&lt;br /&gt;
                {&amp;quot;signal&amp;quot;: 16, &amp;quot;line&amp;quot;: 16, &amp;quot;class_status&amp;quot;: 1, &amp;quot;class_name&amp;quot;: &amp;quot;gaby&amp;quot;, &amp;quot;class_proba&amp;quot;: [0.74, 0.26]},&lt;br /&gt;
                {&amp;quot;signal&amp;quot;: 17, &amp;quot;line&amp;quot;: 17, &amp;quot;class_status&amp;quot;: 1, &amp;quot;class_name&amp;quot;: &amp;quot;gaby&amp;quot;, &amp;quot;class_proba&amp;quot;: [0.63, 0.37]},&lt;br /&gt;
                {&amp;quot;signal&amp;quot;: 18, &amp;quot;line&amp;quot;: 18, &amp;quot;class_status&amp;quot;: 1, &amp;quot;class_name&amp;quot;: &amp;quot;gaby&amp;quot;, &amp;quot;class_proba&amp;quot;: [0.63, 0.37]},&lt;br /&gt;
                {&amp;quot;signal&amp;quot;: 19, &amp;quot;line&amp;quot;: 19, &amp;quot;class_status&amp;quot;: 2, &amp;quot;class_name&amp;quot;: &amp;quot;dann&amp;quot;, &amp;quot;class_proba&amp;quot;: [0.37, 0.63]},&lt;br /&gt;
                {&amp;quot;signal&amp;quot;: 20, &amp;quot;line&amp;quot;: 20, &amp;quot;class_status&amp;quot;: 1, &amp;quot;class_name&amp;quot;: &amp;quot;gaby&amp;quot;, &amp;quot;class_proba&amp;quot;: [0.63, 0.37]},&lt;br /&gt;
                {&amp;quot;signal&amp;quot;: 21, &amp;quot;line&amp;quot;: 21, &amp;quot;class_status&amp;quot;: 2, &amp;quot;class_name&amp;quot;: &amp;quot;dann&amp;quot;, &amp;quot;class_proba&amp;quot;: [0.11, 0.89]},&lt;br /&gt;
                {&amp;quot;signal&amp;quot;: 22, &amp;quot;line&amp;quot;: 22, &amp;quot;class_status&amp;quot;: 1, &amp;quot;class_name&amp;quot;: &amp;quot;gaby&amp;quot;, &amp;quot;class_proba&amp;quot;: [0.74, 0.26]},&lt;br /&gt;
                {&amp;quot;signal&amp;quot;: 23, &amp;quot;line&amp;quot;: 23, &amp;quot;class_status&amp;quot;: 1, &amp;quot;class_name&amp;quot;: &amp;quot;gaby&amp;quot;, &amp;quot;class_proba&amp;quot;: [0.63, 0.37]},&lt;br /&gt;
                {&amp;quot;signal&amp;quot;: 24, &amp;quot;line&amp;quot;: 24, &amp;quot;class_status&amp;quot;: 1, &amp;quot;class_name&amp;quot;: &amp;quot;gaby&amp;quot;, &amp;quot;class_proba&amp;quot;: [0.74, 0.26]},&lt;br /&gt;
                {&amp;quot;signal&amp;quot;: 25, &amp;quot;line&amp;quot;: 25, &amp;quot;class_status&amp;quot;: 1, &amp;quot;class_name&amp;quot;: &amp;quot;gaby&amp;quot;, &amp;quot;class_proba&amp;quot;: [0.50, 0.50]},&lt;br /&gt;
                {&amp;quot;signal&amp;quot;: 26, &amp;quot;line&amp;quot;: 26, &amp;quot;class_status&amp;quot;: 2, &amp;quot;class_name&amp;quot;: &amp;quot;dann&amp;quot;, &amp;quot;class_proba&amp;quot;: [0.06, 0.94]},&lt;br /&gt;
                {&amp;quot;signal&amp;quot;: 27, &amp;quot;line&amp;quot;: 27, &amp;quot;class_status&amp;quot;: 2, &amp;quot;class_name&amp;quot;: &amp;quot;dann&amp;quot;, &amp;quot;class_proba&amp;quot;: [0.37, 0.63]},&lt;br /&gt;
                {&amp;quot;signal&amp;quot;: 28, &amp;quot;line&amp;quot;: 28, &amp;quot;class_status&amp;quot;: 1, &amp;quot;class_name&amp;quot;: &amp;quot;gaby&amp;quot;, &amp;quot;class_proba&amp;quot;: [0.63, 0.37]},&lt;br /&gt;
                {&amp;quot;signal&amp;quot;: 29, &amp;quot;line&amp;quot;: 29, &amp;quot;class_status&amp;quot;: 1, &amp;quot;class_name&amp;quot;: &amp;quot;gaby&amp;quot;, &amp;quot;class_proba&amp;quot;: [0.63, 0.37]}&lt;br /&gt;
        ],&lt;br /&gt;
        &amp;quot;classification_summary&amp;quot;: {&amp;quot;signals&amp;quot;: 29, &amp;quot;classified&amp;quot;: [19, 10], &amp;quot;unclassified&amp;quot;: 0}&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Visualisation des données sur le serveur===&lt;/div&gt;</summary>
		<author><name>Gthomas</name></author>
	</entry>
	<entry>
		<id>https://wiki-se.plil.fr/mediawiki/index.php?title=RodenburgThomas&amp;diff=3632</id>
		<title>RodenburgThomas</title>
		<link rel="alternate" type="text/html" href="https://wiki-se.plil.fr/mediawiki/index.php?title=RodenburgThomas&amp;diff=3632"/>
		<updated>2023-12-20T16:09:59Z</updated>

		<summary type="html">&lt;p&gt;Gthomas : /* Séance du 18/12/2023 */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;=Création de la machine virtuelle=&lt;br /&gt;
Création d'une machine virtuelle '''gabidann''' sur le serveur chassiron :&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;xen-create-image --hostname=gabidann --force --dist=bookworm --size=10G --memory=10G --dir=/usr/local/xen --password=glopglop --dhcp --bridge=bridgeStudents&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
La machine virtuelle est à présent connectée au WiFi.&lt;br /&gt;
&lt;br /&gt;
Après cela, nous avons configuré la machine virtuelle selon l'énoncé du TP en faisant un xen console gabidann. Nous avons ensuite participé à la mise en place du point d'accès WiFi.&lt;br /&gt;
&lt;br /&gt;
===Premières observations du capteur===&lt;br /&gt;
De plus nous avons observé le retour du capteur de distance Nucleo-53L5A1 avec l'outil minicom. Le contenu envoyé par le capteur était compréhensible avec une fréquence de 460 800 bauds ; sur minicom, on a pu constater que le capteur nous envoie des valeurs qui dépendent de la distance entre celui-ci et un obstacle.&lt;br /&gt;
&lt;br /&gt;
===Raspberry===&lt;br /&gt;
D'un autre côté, nous avons branché la Raspberry Pi à l'ordinateur selon le pinout fourni dans la documentation.&lt;br /&gt;
&lt;br /&gt;
[[Fichier:20231218 085218.jpg|vignette|néant]]&lt;br /&gt;
&lt;br /&gt;
Enfin, nous avons activé la communication UART de la Raspberry Pi afin de pouvoir communiquer avec. En fin de séance, nous étions en train de vérifier que la Raspberry Pi répondait bien, même en ayant ajouté la ligne enable_uart=1 dans le fichier config.txt de la Raspberry.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===Configuration de la Raspberry===&lt;br /&gt;
Nous avons résolu le problème de la Raspberry qui ne répondait pas. Cela était dû à l'alimentation : brancher la carte en USBC résoud le problème. Cependant, nous recevons une erreur l'erreur EXT4-fs error (device mmcblk0p2).&lt;br /&gt;
Le problème venait des arguments saisis lors du lancement de Minicom. Avec la commande suivante, il est à présent possible de se connecter sur la Raspberry : &amp;lt;code&amp;gt;minicom -D /dev/ttyUSB0 -b 115200&amp;lt;/code&amp;gt;&lt;br /&gt;
Dans la Raspberry, nous avons configuré une interface réseau wlan0 pour se connecter à WiFi_IE_1 :&lt;br /&gt;
    auto wlan0&lt;br /&gt;
    iface wlan0 inet dhcp&lt;br /&gt;
    wpa-conf /etc/wpa_supplicant/wpa_supplicant.conf&lt;br /&gt;
A présent à partir de la Raspberry, on peut ping la machine virtuelle sur chassiron avec son IPv6.&lt;br /&gt;
&lt;br /&gt;
===Configuration du capteur de distance===&lt;br /&gt;
Un programme était déjà présent sur le capteur. On a téléchargé le logiciel STM32CubeIDE pour pouvoir éditer du code et le téléverser sur le capteur. Nous avons testé de téléverser un programme d'exemple dont voici le résultat :&lt;br /&gt;
[[Fichier:Screenshot 2023-12-18 13-12-19.jpg|vignette|néant|700x700px]]&lt;br /&gt;
&lt;br /&gt;
Nous avons modifié ce programme afin d'effectuer un formatage des données transmises par le capteur sous le format ''&amp;lt;distance&amp;gt;,'' pour chaque valeur. Grâce à ce formatage, il est à présent possible d'utiliser les données reçues par le logiciel NanoEdgeStudio AI pour la partie Machine Learning.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Pour recevoir les valeurs de manière exploitable, il faut modifier le code Exemple dans le logiciel STM Cube IDE&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Capture d'écran 2023-12-20 084719.png|néant|vignette|800x800px]]&lt;br /&gt;
&lt;br /&gt;
L'objectif est d'obtenir une liste séparée par des virgules, il a donc fallu supprimer les espaces et les barres verticales de la fonction d'affichage ainsi que les statuts de chacun des capteurs :&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
static void print_result(RANGING_SENSOR_Result_t *Result)&lt;br /&gt;
{&lt;br /&gt;
  int8_t j;&lt;br /&gt;
  int8_t k;&lt;br /&gt;
  int8_t l;&lt;br /&gt;
  uint8_t zones_per_line;&lt;br /&gt;
  zones_per_line = ((Profile.RangingProfile == RS_PROFILE_8x8_AUTONOMOUS) ||&lt;br /&gt;
         (Profile.RangingProfile == RS_PROFILE_8x8_CONTINUOUS)) ? 8 : 4;&lt;br /&gt;
  for (j = 0; j &amp;lt; Result-&amp;gt;NumberOfZones; j += zones_per_line)&lt;br /&gt;
  {&lt;br /&gt;
    for (l = 0; l &amp;lt; RANGING_SENSOR_NB_TARGET_PER_ZONE; l++)&lt;br /&gt;
    {&lt;br /&gt;
      /* Print distance and status */&lt;br /&gt;
      for (k = (zones_per_line - 1); k &amp;gt;= 0; k--)&lt;br /&gt;
      {&lt;br /&gt;
        if (Result-&amp;gt;ZoneResult[j+k].NumberOfTargets &amp;gt; 0)&lt;br /&gt;
          printf(&amp;quot;%ld,&amp;quot;,(long)Result-&amp;gt;ZoneResult[j+k].Distance[l]);&lt;br /&gt;
      }&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
  printf(&amp;quot;\n&amp;quot;);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;On passe ensuite sur Nano Edge Studio pour définir les signaux dans l'onglet &amp;quot;Signals&amp;quot; et entraîner le modèle dans l'onglet &amp;quot;Benchmark&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Capture d'écran 2023-12-18 172047.png|néant|vignette|800x800px]]&lt;br /&gt;
&lt;br /&gt;
Une fois le modèle entraîné, on peut le tester avec l'onglet &amp;quot;Emulator&amp;quot; &lt;br /&gt;
&lt;br /&gt;
[[Fichier:Capture d'écran 2023-12-18 173255.png|néant|vignette|800x800px]]&lt;br /&gt;
&lt;br /&gt;
===Emulation avec NanoEdgeStudio AI===&lt;br /&gt;
&lt;br /&gt;
Dans un premier temps, nous avons essayé d'entraîner le programme à reconnaître les chiffres 1, 2, 3, 4 et 5 sur les doigts d'une main. Les résultats n'étaient pas concluant, il semblerait que le capteur détecte avant tout le volume de la main à la place de détecter le nombre de doigts.&lt;br /&gt;
&lt;br /&gt;
Nous avons ensuite choisi de faire un détecteur de visages capable de faire la différence entre Gabriel et Dann. L'émulation donne des résultats très satisfaisant proche de 100% de réussite&lt;br /&gt;
&lt;br /&gt;
===Configuration du serveur===&lt;br /&gt;
Configuration d'un serveur HTTP sur la machine virtuelle gabidann :&amp;lt;syntaxhighlight lang=&amp;quot;python3&amp;quot;&amp;gt;&lt;br /&gt;
import socket&lt;br /&gt;
from http.server import HTTPServer, SimpleHTTPRequestHandler&lt;br /&gt;
&lt;br /&gt;
class MyHandler(SimpleHTTPRequestHandler):&lt;br /&gt;
  def do_GET(self):&lt;br /&gt;
    if self.path == '/ip':&lt;br /&gt;
      self.send_response(200)&lt;br /&gt;
      self.send_header('Content-type', 'text/html')&lt;br /&gt;
      self.end_headers()&lt;br /&gt;
      self.wfile.write(f'Your IP address is {self.client_address[0]}'.encode())&lt;br /&gt;
      return&lt;br /&gt;
    else:&lt;br /&gt;
      return SimpleHTTPRequestHandler.do_GET(self)&lt;br /&gt;
&lt;br /&gt;
class HTTPServerV6(HTTPServer):&lt;br /&gt;
  address_family = socket.AF_INET6&lt;br /&gt;
&lt;br /&gt;
def main():&lt;br /&gt;
  server = HTTPServerV6(('::', 8080), MyHandler)&lt;br /&gt;
  server.serve_forever()&lt;br /&gt;
&lt;br /&gt;
if __name__ == '__main__':&lt;br /&gt;
  main()&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Pour se connecter au serveur depuis un navigateur, on peut ouvrir un navigateur depuis la zabeth et y accéder avec l'adresse : ''[&amp;lt;ipv6_VM&amp;gt;]:&amp;lt;port&amp;gt;''. Dans notre cas, le serveur écoute le port '''8080'''.&lt;br /&gt;
&lt;br /&gt;
La page index.html s'affiche par défaut lorsque l'on se connecte au serveur HTTP :&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;html&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;!DOCTYPE html&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;html lang=&amp;quot;fr&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;head&amp;gt;&lt;br /&gt;
	&amp;lt;meta charset=&amp;quot;UTF-8&amp;quot;&amp;gt;&lt;br /&gt;
	&amp;lt;title&amp;gt;Gabidann&amp;lt;/title&amp;gt;&lt;br /&gt;
&amp;lt;/head&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;body&amp;gt;&lt;br /&gt;
	&amp;lt;h1&amp;gt;Bienvenue sur Gabidann !&amp;lt;h1&amp;gt;&lt;br /&gt;
	&amp;lt;div id=&amp;quot;data&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/body&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/html&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;Nous avons également testé la communication en TCP avec l'utilitaire socat&lt;br /&gt;
&lt;br /&gt;
Nous avons créé un serveur python en TCP. Nous pouvons maintenant envoyer des messages du client ( raspberry ) au serveur (VM Xen). Nous nous servirons de cette architecture pour envoyer les données du Nucleo à la Vm Xen &lt;br /&gt;
&lt;br /&gt;
Une fois le modèle entrainé et les tests concluants, on peut déployer notre modèle sur n'importe quel appareils linux ou windows. Pour cela, on va dans l'onglet deployment et on télécharge notre librairie personnalisée.  &lt;br /&gt;
&lt;br /&gt;
===Déploiement du modèle===&lt;br /&gt;
&lt;br /&gt;
On peut lui passer un fichier CSV contenant les données brutes du capteur et grâce au fichier knowledge.dat, l'émulateur est capable de faire la différence entre les situations&amp;lt;syntaxhighlight lang=&amp;quot;bat&amp;quot;&amp;gt;&lt;br /&gt;
PS C:\Users\gabyt\Documents\Gaby\emulators&amp;gt; .\NanoEdgeAI_Class_Emulator.exe neai_classification --knowledge_path .\knowledge.dat --file .\data.csv&lt;br /&gt;
{&lt;br /&gt;
        &amp;quot;status&amp;quot;: &amp;quot;classification&amp;quot;,&lt;br /&gt;
        &amp;quot;lib_id&amp;quot;: &amp;quot;6582b12625c3e0368b2c2a09&amp;quot;,&lt;br /&gt;
        &amp;quot;input&amp;quot;: &amp;quot;.\data.csv&amp;quot;,&lt;br /&gt;
        &amp;quot;results&amp;quot;: [&lt;br /&gt;
                {&amp;quot;signal&amp;quot;: 1, &amp;quot;line&amp;quot;: 1, &amp;quot;class_status&amp;quot;: 2, &amp;quot;class_name&amp;quot;: &amp;quot;dann&amp;quot;, &amp;quot;class_proba&amp;quot;: [0.01, 0.99]},&lt;br /&gt;
                {&amp;quot;signal&amp;quot;: 2, &amp;quot;line&amp;quot;: 2, &amp;quot;class_status&amp;quot;: 2, &amp;quot;class_name&amp;quot;: &amp;quot;dann&amp;quot;, &amp;quot;class_proba&amp;quot;: [0.01, 0.99]},&lt;br /&gt;
                {&amp;quot;signal&amp;quot;: 3, &amp;quot;line&amp;quot;: 3, &amp;quot;class_status&amp;quot;: 2, &amp;quot;class_name&amp;quot;: &amp;quot;dann&amp;quot;, &amp;quot;class_proba&amp;quot;: [0.37, 0.63]},&lt;br /&gt;
                {&amp;quot;signal&amp;quot;: 4, &amp;quot;line&amp;quot;: 4, &amp;quot;class_status&amp;quot;: 1, &amp;quot;class_name&amp;quot;: &amp;quot;gaby&amp;quot;, &amp;quot;class_proba&amp;quot;: [0.83, 0.17]},&lt;br /&gt;
                {&amp;quot;signal&amp;quot;: 5, &amp;quot;line&amp;quot;: 5, &amp;quot;class_status&amp;quot;: 1, &amp;quot;class_name&amp;quot;: &amp;quot;gaby&amp;quot;, &amp;quot;class_proba&amp;quot;: [0.63, 0.37]},&lt;br /&gt;
                {&amp;quot;signal&amp;quot;: 6, &amp;quot;line&amp;quot;: 6, &amp;quot;class_status&amp;quot;: 1, &amp;quot;class_name&amp;quot;: &amp;quot;gaby&amp;quot;, &amp;quot;class_proba&amp;quot;: [0.63, 0.37]},&lt;br /&gt;
                {&amp;quot;signal&amp;quot;: 7, &amp;quot;line&amp;quot;: 7, &amp;quot;class_status&amp;quot;: 1, &amp;quot;class_name&amp;quot;: &amp;quot;gaby&amp;quot;, &amp;quot;class_proba&amp;quot;: [0.50, 0.50]},&lt;br /&gt;
                {&amp;quot;signal&amp;quot;: 8, &amp;quot;line&amp;quot;: 8, &amp;quot;class_status&amp;quot;: 1, &amp;quot;class_name&amp;quot;: &amp;quot;gaby&amp;quot;, &amp;quot;class_proba&amp;quot;: [0.63, 0.37]},&lt;br /&gt;
                {&amp;quot;signal&amp;quot;: 9, &amp;quot;line&amp;quot;: 9, &amp;quot;class_status&amp;quot;: 2, &amp;quot;class_name&amp;quot;: &amp;quot;dann&amp;quot;, &amp;quot;class_proba&amp;quot;: [0.37, 0.63]},&lt;br /&gt;
                {&amp;quot;signal&amp;quot;: 10, &amp;quot;line&amp;quot;: 10, &amp;quot;class_status&amp;quot;: 2, &amp;quot;class_name&amp;quot;: &amp;quot;dann&amp;quot;, &amp;quot;class_proba&amp;quot;: [0.17, 0.83]},&lt;br /&gt;
                {&amp;quot;signal&amp;quot;: 11, &amp;quot;line&amp;quot;: 11, &amp;quot;class_status&amp;quot;: 1, &amp;quot;class_name&amp;quot;: &amp;quot;gaby&amp;quot;, &amp;quot;class_proba&amp;quot;: [0.63, 0.37]},&lt;br /&gt;
                {&amp;quot;signal&amp;quot;: 12, &amp;quot;line&amp;quot;: 12, &amp;quot;class_status&amp;quot;: 1, &amp;quot;class_name&amp;quot;: &amp;quot;gaby&amp;quot;, &amp;quot;class_proba&amp;quot;: [0.63, 0.37]},&lt;br /&gt;
                {&amp;quot;signal&amp;quot;: 13, &amp;quot;line&amp;quot;: 13, &amp;quot;class_status&amp;quot;: 2, &amp;quot;class_name&amp;quot;: &amp;quot;dann&amp;quot;, &amp;quot;class_proba&amp;quot;: [0.37, 0.63]},&lt;br /&gt;
                {&amp;quot;signal&amp;quot;: 14, &amp;quot;line&amp;quot;: 14, &amp;quot;class_status&amp;quot;: 1, &amp;quot;class_name&amp;quot;: &amp;quot;gaby&amp;quot;, &amp;quot;class_proba&amp;quot;: [0.74, 0.26]},&lt;br /&gt;
                {&amp;quot;signal&amp;quot;: 15, &amp;quot;line&amp;quot;: 15, &amp;quot;class_status&amp;quot;: 1, &amp;quot;class_name&amp;quot;: &amp;quot;gaby&amp;quot;, &amp;quot;class_proba&amp;quot;: [0.63, 0.37]},&lt;br /&gt;
                {&amp;quot;signal&amp;quot;: 16, &amp;quot;line&amp;quot;: 16, &amp;quot;class_status&amp;quot;: 1, &amp;quot;class_name&amp;quot;: &amp;quot;gaby&amp;quot;, &amp;quot;class_proba&amp;quot;: [0.74, 0.26]},&lt;br /&gt;
                {&amp;quot;signal&amp;quot;: 17, &amp;quot;line&amp;quot;: 17, &amp;quot;class_status&amp;quot;: 1, &amp;quot;class_name&amp;quot;: &amp;quot;gaby&amp;quot;, &amp;quot;class_proba&amp;quot;: [0.63, 0.37]},&lt;br /&gt;
                {&amp;quot;signal&amp;quot;: 18, &amp;quot;line&amp;quot;: 18, &amp;quot;class_status&amp;quot;: 1, &amp;quot;class_name&amp;quot;: &amp;quot;gaby&amp;quot;, &amp;quot;class_proba&amp;quot;: [0.63, 0.37]},&lt;br /&gt;
                {&amp;quot;signal&amp;quot;: 19, &amp;quot;line&amp;quot;: 19, &amp;quot;class_status&amp;quot;: 2, &amp;quot;class_name&amp;quot;: &amp;quot;dann&amp;quot;, &amp;quot;class_proba&amp;quot;: [0.37, 0.63]},&lt;br /&gt;
                {&amp;quot;signal&amp;quot;: 20, &amp;quot;line&amp;quot;: 20, &amp;quot;class_status&amp;quot;: 1, &amp;quot;class_name&amp;quot;: &amp;quot;gaby&amp;quot;, &amp;quot;class_proba&amp;quot;: [0.63, 0.37]},&lt;br /&gt;
                {&amp;quot;signal&amp;quot;: 21, &amp;quot;line&amp;quot;: 21, &amp;quot;class_status&amp;quot;: 2, &amp;quot;class_name&amp;quot;: &amp;quot;dann&amp;quot;, &amp;quot;class_proba&amp;quot;: [0.11, 0.89]},&lt;br /&gt;
                {&amp;quot;signal&amp;quot;: 22, &amp;quot;line&amp;quot;: 22, &amp;quot;class_status&amp;quot;: 1, &amp;quot;class_name&amp;quot;: &amp;quot;gaby&amp;quot;, &amp;quot;class_proba&amp;quot;: [0.74, 0.26]},&lt;br /&gt;
                {&amp;quot;signal&amp;quot;: 23, &amp;quot;line&amp;quot;: 23, &amp;quot;class_status&amp;quot;: 1, &amp;quot;class_name&amp;quot;: &amp;quot;gaby&amp;quot;, &amp;quot;class_proba&amp;quot;: [0.63, 0.37]},&lt;br /&gt;
                {&amp;quot;signal&amp;quot;: 24, &amp;quot;line&amp;quot;: 24, &amp;quot;class_status&amp;quot;: 1, &amp;quot;class_name&amp;quot;: &amp;quot;gaby&amp;quot;, &amp;quot;class_proba&amp;quot;: [0.74, 0.26]},&lt;br /&gt;
                {&amp;quot;signal&amp;quot;: 25, &amp;quot;line&amp;quot;: 25, &amp;quot;class_status&amp;quot;: 1, &amp;quot;class_name&amp;quot;: &amp;quot;gaby&amp;quot;, &amp;quot;class_proba&amp;quot;: [0.50, 0.50]},&lt;br /&gt;
                {&amp;quot;signal&amp;quot;: 26, &amp;quot;line&amp;quot;: 26, &amp;quot;class_status&amp;quot;: 2, &amp;quot;class_name&amp;quot;: &amp;quot;dann&amp;quot;, &amp;quot;class_proba&amp;quot;: [0.06, 0.94]},&lt;br /&gt;
                {&amp;quot;signal&amp;quot;: 27, &amp;quot;line&amp;quot;: 27, &amp;quot;class_status&amp;quot;: 2, &amp;quot;class_name&amp;quot;: &amp;quot;dann&amp;quot;, &amp;quot;class_proba&amp;quot;: [0.37, 0.63]},&lt;br /&gt;
                {&amp;quot;signal&amp;quot;: 28, &amp;quot;line&amp;quot;: 28, &amp;quot;class_status&amp;quot;: 1, &amp;quot;class_name&amp;quot;: &amp;quot;gaby&amp;quot;, &amp;quot;class_proba&amp;quot;: [0.63, 0.37]},&lt;br /&gt;
                {&amp;quot;signal&amp;quot;: 29, &amp;quot;line&amp;quot;: 29, &amp;quot;class_status&amp;quot;: 1, &amp;quot;class_name&amp;quot;: &amp;quot;gaby&amp;quot;, &amp;quot;class_proba&amp;quot;: [0.63, 0.37]}&lt;br /&gt;
        ],&lt;br /&gt;
        &amp;quot;classification_summary&amp;quot;: {&amp;quot;signals&amp;quot;: 29, &amp;quot;classified&amp;quot;: [19, 10], &amp;quot;unclassified&amp;quot;: 0}&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Visualisation des données sur le serveur===&lt;/div&gt;</summary>
		<author><name>Gthomas</name></author>
	</entry>
	<entry>
		<id>https://wiki-se.plil.fr/mediawiki/index.php?title=RodenburgThomas&amp;diff=3631</id>
		<title>RodenburgThomas</title>
		<link rel="alternate" type="text/html" href="https://wiki-se.plil.fr/mediawiki/index.php?title=RodenburgThomas&amp;diff=3631"/>
		<updated>2023-12-20T16:09:48Z</updated>

		<summary type="html">&lt;p&gt;Gthomas : /* Séance du 04/12/2023 */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;=Création de la machine virtuelle=&lt;br /&gt;
Création d'une machine virtuelle '''gabidann''' sur le serveur chassiron :&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;xen-create-image --hostname=gabidann --force --dist=bookworm --size=10G --memory=10G --dir=/usr/local/xen --password=glopglop --dhcp --bridge=bridgeStudents&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
La machine virtuelle est à présent connectée au WiFi.&lt;br /&gt;
&lt;br /&gt;
Après cela, nous avons configuré la machine virtuelle selon l'énoncé du TP en faisant un xen console gabidann. Nous avons ensuite participé à la mise en place du point d'accès WiFi.&lt;br /&gt;
&lt;br /&gt;
===Premières observations du capteur===&lt;br /&gt;
De plus nous avons observé le retour du capteur de distance Nucleo-53L5A1 avec l'outil minicom. Le contenu envoyé par le capteur était compréhensible avec une fréquence de 460 800 bauds ; sur minicom, on a pu constater que le capteur nous envoie des valeurs qui dépendent de la distance entre celui-ci et un obstacle.&lt;br /&gt;
&lt;br /&gt;
===Raspberry===&lt;br /&gt;
D'un autre côté, nous avons branché la Raspberry Pi à l'ordinateur selon le pinout fourni dans la documentation.&lt;br /&gt;
&lt;br /&gt;
[[Fichier:20231218 085218.jpg|vignette|néant]]&lt;br /&gt;
&lt;br /&gt;
Enfin, nous avons activé la communication UART de la Raspberry Pi afin de pouvoir communiquer avec. En fin de séance, nous étions en train de vérifier que la Raspberry Pi répondait bien, même en ayant ajouté la ligne enable_uart=1 dans le fichier config.txt de la Raspberry.&lt;br /&gt;
&lt;br /&gt;
==Séance du 18/12/2023==&lt;br /&gt;
===Configuration de la Raspberry===&lt;br /&gt;
Nous avons résolu le problème de la Raspberry qui ne répondait pas. Cela était dû à l'alimentation : brancher la carte en USBC résoud le problème. Cependant, nous recevons une erreur l'erreur EXT4-fs error (device mmcblk0p2).&lt;br /&gt;
Le problème venait des arguments saisis lors du lancement de Minicom. Avec la commande suivante, il est à présent possible de se connecter sur la Raspberry : &amp;lt;code&amp;gt;minicom -D /dev/ttyUSB0 -b 115200&amp;lt;/code&amp;gt;&lt;br /&gt;
Dans la Raspberry, nous avons configuré une interface réseau wlan0 pour se connecter à WiFi_IE_1 :&lt;br /&gt;
    auto wlan0&lt;br /&gt;
    iface wlan0 inet dhcp&lt;br /&gt;
    wpa-conf /etc/wpa_supplicant/wpa_supplicant.conf&lt;br /&gt;
A présent à partir de la Raspberry, on peut ping la machine virtuelle sur chassiron avec son IPv6.&lt;br /&gt;
&lt;br /&gt;
===Configuration du capteur de distance===&lt;br /&gt;
Un programme était déjà présent sur le capteur. On a téléchargé le logiciel STM32CubeIDE pour pouvoir éditer du code et le téléverser sur le capteur. Nous avons testé de téléverser un programme d'exemple dont voici le résultat :&lt;br /&gt;
[[Fichier:Screenshot 2023-12-18 13-12-19.jpg|vignette|néant|700x700px]]&lt;br /&gt;
&lt;br /&gt;
Nous avons modifié ce programme afin d'effectuer un formatage des données transmises par le capteur sous le format ''&amp;lt;distance&amp;gt;,'' pour chaque valeur. Grâce à ce formatage, il est à présent possible d'utiliser les données reçues par le logiciel NanoEdgeStudio AI pour la partie Machine Learning.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Pour recevoir les valeurs de manière exploitable, il faut modifier le code Exemple dans le logiciel STM Cube IDE&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Capture d'écran 2023-12-20 084719.png|néant|vignette|800x800px]]&lt;br /&gt;
&lt;br /&gt;
L'objectif est d'obtenir une liste séparée par des virgules, il a donc fallu supprimer les espaces et les barres verticales de la fonction d'affichage ainsi que les statuts de chacun des capteurs :&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
static void print_result(RANGING_SENSOR_Result_t *Result)&lt;br /&gt;
{&lt;br /&gt;
  int8_t j;&lt;br /&gt;
  int8_t k;&lt;br /&gt;
  int8_t l;&lt;br /&gt;
  uint8_t zones_per_line;&lt;br /&gt;
  zones_per_line = ((Profile.RangingProfile == RS_PROFILE_8x8_AUTONOMOUS) ||&lt;br /&gt;
         (Profile.RangingProfile == RS_PROFILE_8x8_CONTINUOUS)) ? 8 : 4;&lt;br /&gt;
  for (j = 0; j &amp;lt; Result-&amp;gt;NumberOfZones; j += zones_per_line)&lt;br /&gt;
  {&lt;br /&gt;
    for (l = 0; l &amp;lt; RANGING_SENSOR_NB_TARGET_PER_ZONE; l++)&lt;br /&gt;
    {&lt;br /&gt;
      /* Print distance and status */&lt;br /&gt;
      for (k = (zones_per_line - 1); k &amp;gt;= 0; k--)&lt;br /&gt;
      {&lt;br /&gt;
        if (Result-&amp;gt;ZoneResult[j+k].NumberOfTargets &amp;gt; 0)&lt;br /&gt;
          printf(&amp;quot;%ld,&amp;quot;,(long)Result-&amp;gt;ZoneResult[j+k].Distance[l]);&lt;br /&gt;
      }&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
  printf(&amp;quot;\n&amp;quot;);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;On passe ensuite sur Nano Edge Studio pour définir les signaux dans l'onglet &amp;quot;Signals&amp;quot; et entraîner le modèle dans l'onglet &amp;quot;Benchmark&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Capture d'écran 2023-12-18 172047.png|néant|vignette|800x800px]]&lt;br /&gt;
&lt;br /&gt;
Une fois le modèle entraîné, on peut le tester avec l'onglet &amp;quot;Emulator&amp;quot; &lt;br /&gt;
&lt;br /&gt;
[[Fichier:Capture d'écran 2023-12-18 173255.png|néant|vignette|800x800px]]&lt;br /&gt;
&lt;br /&gt;
===Emulation avec NanoEdgeStudio AI===&lt;br /&gt;
&lt;br /&gt;
Dans un premier temps, nous avons essayé d'entraîner le programme à reconnaître les chiffres 1, 2, 3, 4 et 5 sur les doigts d'une main. Les résultats n'étaient pas concluant, il semblerait que le capteur détecte avant tout le volume de la main à la place de détecter le nombre de doigts.&lt;br /&gt;
&lt;br /&gt;
Nous avons ensuite choisi de faire un détecteur de visages capable de faire la différence entre Gabriel et Dann. L'émulation donne des résultats très satisfaisant proche de 100% de réussite&lt;br /&gt;
&lt;br /&gt;
===Configuration du serveur===&lt;br /&gt;
Configuration d'un serveur HTTP sur la machine virtuelle gabidann :&amp;lt;syntaxhighlight lang=&amp;quot;python3&amp;quot;&amp;gt;&lt;br /&gt;
import socket&lt;br /&gt;
from http.server import HTTPServer, SimpleHTTPRequestHandler&lt;br /&gt;
&lt;br /&gt;
class MyHandler(SimpleHTTPRequestHandler):&lt;br /&gt;
  def do_GET(self):&lt;br /&gt;
    if self.path == '/ip':&lt;br /&gt;
      self.send_response(200)&lt;br /&gt;
      self.send_header('Content-type', 'text/html')&lt;br /&gt;
      self.end_headers()&lt;br /&gt;
      self.wfile.write(f'Your IP address is {self.client_address[0]}'.encode())&lt;br /&gt;
      return&lt;br /&gt;
    else:&lt;br /&gt;
      return SimpleHTTPRequestHandler.do_GET(self)&lt;br /&gt;
&lt;br /&gt;
class HTTPServerV6(HTTPServer):&lt;br /&gt;
  address_family = socket.AF_INET6&lt;br /&gt;
&lt;br /&gt;
def main():&lt;br /&gt;
  server = HTTPServerV6(('::', 8080), MyHandler)&lt;br /&gt;
  server.serve_forever()&lt;br /&gt;
&lt;br /&gt;
if __name__ == '__main__':&lt;br /&gt;
  main()&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Pour se connecter au serveur depuis un navigateur, on peut ouvrir un navigateur depuis la zabeth et y accéder avec l'adresse : ''[&amp;lt;ipv6_VM&amp;gt;]:&amp;lt;port&amp;gt;''. Dans notre cas, le serveur écoute le port '''8080'''.&lt;br /&gt;
&lt;br /&gt;
La page index.html s'affiche par défaut lorsque l'on se connecte au serveur HTTP :&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;html&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;!DOCTYPE html&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;html lang=&amp;quot;fr&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;head&amp;gt;&lt;br /&gt;
	&amp;lt;meta charset=&amp;quot;UTF-8&amp;quot;&amp;gt;&lt;br /&gt;
	&amp;lt;title&amp;gt;Gabidann&amp;lt;/title&amp;gt;&lt;br /&gt;
&amp;lt;/head&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;body&amp;gt;&lt;br /&gt;
	&amp;lt;h1&amp;gt;Bienvenue sur Gabidann !&amp;lt;h1&amp;gt;&lt;br /&gt;
	&amp;lt;div id=&amp;quot;data&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/body&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/html&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;Nous avons également testé la communication en TCP avec l'utilitaire socat&lt;br /&gt;
&lt;br /&gt;
Nous avons créé un serveur python en TCP. Nous pouvons maintenant envoyer des messages du client ( raspberry ) au serveur (VM Xen). Nous nous servirons de cette architecture pour envoyer les données du Nucleo à la Vm Xen &lt;br /&gt;
&lt;br /&gt;
Une fois le modèle entrainé et les tests concluants, on peut déployer notre modèle sur n'importe quel appareils linux ou windows. Pour cela, on va dans l'onglet deployment et on télécharge notre librairie personnalisée.  &lt;br /&gt;
&lt;br /&gt;
===Déploiement du modèle===&lt;br /&gt;
&lt;br /&gt;
On peut lui passer un fichier CSV contenant les données brutes du capteur et grâce au fichier knowledge.dat, l'émulateur est capable de faire la différence entre les situations&amp;lt;syntaxhighlight lang=&amp;quot;bat&amp;quot;&amp;gt;&lt;br /&gt;
PS C:\Users\gabyt\Documents\Gaby\emulators&amp;gt; .\NanoEdgeAI_Class_Emulator.exe neai_classification --knowledge_path .\knowledge.dat --file .\data.csv&lt;br /&gt;
{&lt;br /&gt;
        &amp;quot;status&amp;quot;: &amp;quot;classification&amp;quot;,&lt;br /&gt;
        &amp;quot;lib_id&amp;quot;: &amp;quot;6582b12625c3e0368b2c2a09&amp;quot;,&lt;br /&gt;
        &amp;quot;input&amp;quot;: &amp;quot;.\data.csv&amp;quot;,&lt;br /&gt;
        &amp;quot;results&amp;quot;: [&lt;br /&gt;
                {&amp;quot;signal&amp;quot;: 1, &amp;quot;line&amp;quot;: 1, &amp;quot;class_status&amp;quot;: 2, &amp;quot;class_name&amp;quot;: &amp;quot;dann&amp;quot;, &amp;quot;class_proba&amp;quot;: [0.01, 0.99]},&lt;br /&gt;
                {&amp;quot;signal&amp;quot;: 2, &amp;quot;line&amp;quot;: 2, &amp;quot;class_status&amp;quot;: 2, &amp;quot;class_name&amp;quot;: &amp;quot;dann&amp;quot;, &amp;quot;class_proba&amp;quot;: [0.01, 0.99]},&lt;br /&gt;
                {&amp;quot;signal&amp;quot;: 3, &amp;quot;line&amp;quot;: 3, &amp;quot;class_status&amp;quot;: 2, &amp;quot;class_name&amp;quot;: &amp;quot;dann&amp;quot;, &amp;quot;class_proba&amp;quot;: [0.37, 0.63]},&lt;br /&gt;
                {&amp;quot;signal&amp;quot;: 4, &amp;quot;line&amp;quot;: 4, &amp;quot;class_status&amp;quot;: 1, &amp;quot;class_name&amp;quot;: &amp;quot;gaby&amp;quot;, &amp;quot;class_proba&amp;quot;: [0.83, 0.17]},&lt;br /&gt;
                {&amp;quot;signal&amp;quot;: 5, &amp;quot;line&amp;quot;: 5, &amp;quot;class_status&amp;quot;: 1, &amp;quot;class_name&amp;quot;: &amp;quot;gaby&amp;quot;, &amp;quot;class_proba&amp;quot;: [0.63, 0.37]},&lt;br /&gt;
                {&amp;quot;signal&amp;quot;: 6, &amp;quot;line&amp;quot;: 6, &amp;quot;class_status&amp;quot;: 1, &amp;quot;class_name&amp;quot;: &amp;quot;gaby&amp;quot;, &amp;quot;class_proba&amp;quot;: [0.63, 0.37]},&lt;br /&gt;
                {&amp;quot;signal&amp;quot;: 7, &amp;quot;line&amp;quot;: 7, &amp;quot;class_status&amp;quot;: 1, &amp;quot;class_name&amp;quot;: &amp;quot;gaby&amp;quot;, &amp;quot;class_proba&amp;quot;: [0.50, 0.50]},&lt;br /&gt;
                {&amp;quot;signal&amp;quot;: 8, &amp;quot;line&amp;quot;: 8, &amp;quot;class_status&amp;quot;: 1, &amp;quot;class_name&amp;quot;: &amp;quot;gaby&amp;quot;, &amp;quot;class_proba&amp;quot;: [0.63, 0.37]},&lt;br /&gt;
                {&amp;quot;signal&amp;quot;: 9, &amp;quot;line&amp;quot;: 9, &amp;quot;class_status&amp;quot;: 2, &amp;quot;class_name&amp;quot;: &amp;quot;dann&amp;quot;, &amp;quot;class_proba&amp;quot;: [0.37, 0.63]},&lt;br /&gt;
                {&amp;quot;signal&amp;quot;: 10, &amp;quot;line&amp;quot;: 10, &amp;quot;class_status&amp;quot;: 2, &amp;quot;class_name&amp;quot;: &amp;quot;dann&amp;quot;, &amp;quot;class_proba&amp;quot;: [0.17, 0.83]},&lt;br /&gt;
                {&amp;quot;signal&amp;quot;: 11, &amp;quot;line&amp;quot;: 11, &amp;quot;class_status&amp;quot;: 1, &amp;quot;class_name&amp;quot;: &amp;quot;gaby&amp;quot;, &amp;quot;class_proba&amp;quot;: [0.63, 0.37]},&lt;br /&gt;
                {&amp;quot;signal&amp;quot;: 12, &amp;quot;line&amp;quot;: 12, &amp;quot;class_status&amp;quot;: 1, &amp;quot;class_name&amp;quot;: &amp;quot;gaby&amp;quot;, &amp;quot;class_proba&amp;quot;: [0.63, 0.37]},&lt;br /&gt;
                {&amp;quot;signal&amp;quot;: 13, &amp;quot;line&amp;quot;: 13, &amp;quot;class_status&amp;quot;: 2, &amp;quot;class_name&amp;quot;: &amp;quot;dann&amp;quot;, &amp;quot;class_proba&amp;quot;: [0.37, 0.63]},&lt;br /&gt;
                {&amp;quot;signal&amp;quot;: 14, &amp;quot;line&amp;quot;: 14, &amp;quot;class_status&amp;quot;: 1, &amp;quot;class_name&amp;quot;: &amp;quot;gaby&amp;quot;, &amp;quot;class_proba&amp;quot;: [0.74, 0.26]},&lt;br /&gt;
                {&amp;quot;signal&amp;quot;: 15, &amp;quot;line&amp;quot;: 15, &amp;quot;class_status&amp;quot;: 1, &amp;quot;class_name&amp;quot;: &amp;quot;gaby&amp;quot;, &amp;quot;class_proba&amp;quot;: [0.63, 0.37]},&lt;br /&gt;
                {&amp;quot;signal&amp;quot;: 16, &amp;quot;line&amp;quot;: 16, &amp;quot;class_status&amp;quot;: 1, &amp;quot;class_name&amp;quot;: &amp;quot;gaby&amp;quot;, &amp;quot;class_proba&amp;quot;: [0.74, 0.26]},&lt;br /&gt;
                {&amp;quot;signal&amp;quot;: 17, &amp;quot;line&amp;quot;: 17, &amp;quot;class_status&amp;quot;: 1, &amp;quot;class_name&amp;quot;: &amp;quot;gaby&amp;quot;, &amp;quot;class_proba&amp;quot;: [0.63, 0.37]},&lt;br /&gt;
                {&amp;quot;signal&amp;quot;: 18, &amp;quot;line&amp;quot;: 18, &amp;quot;class_status&amp;quot;: 1, &amp;quot;class_name&amp;quot;: &amp;quot;gaby&amp;quot;, &amp;quot;class_proba&amp;quot;: [0.63, 0.37]},&lt;br /&gt;
                {&amp;quot;signal&amp;quot;: 19, &amp;quot;line&amp;quot;: 19, &amp;quot;class_status&amp;quot;: 2, &amp;quot;class_name&amp;quot;: &amp;quot;dann&amp;quot;, &amp;quot;class_proba&amp;quot;: [0.37, 0.63]},&lt;br /&gt;
                {&amp;quot;signal&amp;quot;: 20, &amp;quot;line&amp;quot;: 20, &amp;quot;class_status&amp;quot;: 1, &amp;quot;class_name&amp;quot;: &amp;quot;gaby&amp;quot;, &amp;quot;class_proba&amp;quot;: [0.63, 0.37]},&lt;br /&gt;
                {&amp;quot;signal&amp;quot;: 21, &amp;quot;line&amp;quot;: 21, &amp;quot;class_status&amp;quot;: 2, &amp;quot;class_name&amp;quot;: &amp;quot;dann&amp;quot;, &amp;quot;class_proba&amp;quot;: [0.11, 0.89]},&lt;br /&gt;
                {&amp;quot;signal&amp;quot;: 22, &amp;quot;line&amp;quot;: 22, &amp;quot;class_status&amp;quot;: 1, &amp;quot;class_name&amp;quot;: &amp;quot;gaby&amp;quot;, &amp;quot;class_proba&amp;quot;: [0.74, 0.26]},&lt;br /&gt;
                {&amp;quot;signal&amp;quot;: 23, &amp;quot;line&amp;quot;: 23, &amp;quot;class_status&amp;quot;: 1, &amp;quot;class_name&amp;quot;: &amp;quot;gaby&amp;quot;, &amp;quot;class_proba&amp;quot;: [0.63, 0.37]},&lt;br /&gt;
                {&amp;quot;signal&amp;quot;: 24, &amp;quot;line&amp;quot;: 24, &amp;quot;class_status&amp;quot;: 1, &amp;quot;class_name&amp;quot;: &amp;quot;gaby&amp;quot;, &amp;quot;class_proba&amp;quot;: [0.74, 0.26]},&lt;br /&gt;
                {&amp;quot;signal&amp;quot;: 25, &amp;quot;line&amp;quot;: 25, &amp;quot;class_status&amp;quot;: 1, &amp;quot;class_name&amp;quot;: &amp;quot;gaby&amp;quot;, &amp;quot;class_proba&amp;quot;: [0.50, 0.50]},&lt;br /&gt;
                {&amp;quot;signal&amp;quot;: 26, &amp;quot;line&amp;quot;: 26, &amp;quot;class_status&amp;quot;: 2, &amp;quot;class_name&amp;quot;: &amp;quot;dann&amp;quot;, &amp;quot;class_proba&amp;quot;: [0.06, 0.94]},&lt;br /&gt;
                {&amp;quot;signal&amp;quot;: 27, &amp;quot;line&amp;quot;: 27, &amp;quot;class_status&amp;quot;: 2, &amp;quot;class_name&amp;quot;: &amp;quot;dann&amp;quot;, &amp;quot;class_proba&amp;quot;: [0.37, 0.63]},&lt;br /&gt;
                {&amp;quot;signal&amp;quot;: 28, &amp;quot;line&amp;quot;: 28, &amp;quot;class_status&amp;quot;: 1, &amp;quot;class_name&amp;quot;: &amp;quot;gaby&amp;quot;, &amp;quot;class_proba&amp;quot;: [0.63, 0.37]},&lt;br /&gt;
                {&amp;quot;signal&amp;quot;: 29, &amp;quot;line&amp;quot;: 29, &amp;quot;class_status&amp;quot;: 1, &amp;quot;class_name&amp;quot;: &amp;quot;gaby&amp;quot;, &amp;quot;class_proba&amp;quot;: [0.63, 0.37]}&lt;br /&gt;
        ],&lt;br /&gt;
        &amp;quot;classification_summary&amp;quot;: {&amp;quot;signals&amp;quot;: 29, &amp;quot;classified&amp;quot;: [19, 10], &amp;quot;unclassified&amp;quot;: 0}&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Visualisation des données sur le serveur===&lt;/div&gt;</summary>
		<author><name>Gthomas</name></author>
	</entry>
	<entry>
		<id>https://wiki-se.plil.fr/mediawiki/index.php?title=RodenburgThomas&amp;diff=3626</id>
		<title>RodenburgThomas</title>
		<link rel="alternate" type="text/html" href="https://wiki-se.plil.fr/mediawiki/index.php?title=RodenburgThomas&amp;diff=3626"/>
		<updated>2023-12-20T15:55:49Z</updated>

		<summary type="html">&lt;p&gt;Gthomas : /* Déploiement du modèle */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;=Le binôme=&lt;br /&gt;
&lt;br /&gt;
Le binôme est constitué de 2 élèves de SE5-SC :&lt;br /&gt;
* Dann RODENBURG&lt;br /&gt;
* Gabriel THOMAS&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=Objectifs= &lt;br /&gt;
&lt;br /&gt;
Le but de ce TP est de créer un réseau de systèmes communicants en partant d'un capteur XNucléo 53L5A1 pour finir sur une machine virtuelle Xen.&lt;br /&gt;
La particularité est d'intégrer une composante de Machine Learning  &lt;br /&gt;
&lt;br /&gt;
[[Fichier:Capture d'écran 2023-12-19 151237.png|néant|vignette|800x800px]]&lt;br /&gt;
&lt;br /&gt;
=Compte rendu des séances=&lt;br /&gt;
&lt;br /&gt;
==Séance du 04/12/2023==&lt;br /&gt;
===Création de la machine virtuelle===&lt;br /&gt;
Création d'une machine virtuelle '''gabidann''' sur le serveur chassiron :&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;xen-create-image --hostname=gabidann --force --dist=bookworm --size=10G --memory=10G --dir=/usr/local/xen --password=glopglop --dhcp --bridge=bridgeStudents&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
La machine virtuelle est à présent connectée au WiFi.&lt;br /&gt;
&lt;br /&gt;
Après cela, nous avons configuré la machine virtuelle selon l'énoncé du TP en faisant un xen console gabidann. Nous avons ensuite participé à la mise en place du point d'accès WiFi.&lt;br /&gt;
&lt;br /&gt;
===Premières observations du capteur===&lt;br /&gt;
De plus nous avons observé le retour du capteur de distance Nucleo-53L5A1 avec l'outil minicom. Le contenu envoyé par le capteur était compréhensible avec une fréquence de 460 800 bauds ; sur minicom, on a pu constater que le capteur nous envoie des valeurs qui dépendent de la distance entre celui-ci et un obstacle.&lt;br /&gt;
&lt;br /&gt;
===Raspberry===&lt;br /&gt;
D'un autre côté, nous avons branché la Raspberry Pi à l'ordinateur selon le pinout fourni dans la documentation.&lt;br /&gt;
&lt;br /&gt;
[[Fichier:20231218 085218.jpg|vignette|néant]]&lt;br /&gt;
&lt;br /&gt;
Enfin, nous avons activé la communication UART de la Raspberry Pi afin de pouvoir communiquer avec. En fin de séance, nous étions en train de vérifier que la Raspberry Pi répondait bien, même en ayant ajouté la ligne enable_uart=1 dans le fichier config.txt de la Raspberry.&lt;br /&gt;
&lt;br /&gt;
==Séance du 18/12/2023==&lt;br /&gt;
===Configuration de la Raspberry===&lt;br /&gt;
Nous avons résolu le problème de la Raspberry qui ne répondait pas. Cela était dû à l'alimentation : brancher la carte en USBC résoud le problème. Cependant, nous recevons une erreur l'erreur EXT4-fs error (device mmcblk0p2).&lt;br /&gt;
Le problème venait des arguments saisis lors du lancement de Minicom. Avec la commande suivante, il est à présent possible de se connecter sur la Raspberry : &amp;lt;code&amp;gt;minicom -D /dev/ttyUSB0 -b 115200&amp;lt;/code&amp;gt;&lt;br /&gt;
Dans la Raspberry, nous avons configuré une interface réseau wlan0 pour se connecter à WiFi_IE_1 :&lt;br /&gt;
    auto wlan0&lt;br /&gt;
    iface wlan0 inet dhcp&lt;br /&gt;
    wpa-conf /etc/wpa_supplicant/wpa_supplicant.conf&lt;br /&gt;
A présent à partir de la Raspberry, on peut ping la machine virtuelle sur chassiron avec son IPv6.&lt;br /&gt;
&lt;br /&gt;
===Configuration du capteur de distance===&lt;br /&gt;
Un programme était déjà présent sur le capteur. On a téléchargé le logiciel STM32CubeIDE pour pouvoir éditer du code et le téléverser sur le capteur. Nous avons testé de téléverser un programme d'exemple dont voici le résultat :&lt;br /&gt;
[[Fichier:Screenshot 2023-12-18 13-12-19.jpg|vignette|néant|700x700px]]&lt;br /&gt;
&lt;br /&gt;
Nous avons modifié ce programme afin d'effectuer un formatage des données transmises par le capteur sous le format ''&amp;lt;distance&amp;gt;,'' pour chaque valeur. Grâce à ce formatage, il est à présent possible d'utiliser les données reçues par le logiciel NanoEdgeStudio AI pour la partie Machine Learning.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Pour recevoir les valeurs de manière exploitable, il faut modifier le code Exemple dans le logiciel STM Cube IDE&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Capture d'écran 2023-12-20 084719.png|néant|vignette|800x800px]]&lt;br /&gt;
&lt;br /&gt;
L'objectif est d'obtenir une liste séparée par des virgules, il a donc fallu supprimer les espaces et les barres verticales de la fonction d'affichage ainsi que les statuts de chacun des capteurs :&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
static void print_result(RANGING_SENSOR_Result_t *Result)&lt;br /&gt;
{&lt;br /&gt;
  int8_t j;&lt;br /&gt;
  int8_t k;&lt;br /&gt;
  int8_t l;&lt;br /&gt;
  uint8_t zones_per_line;&lt;br /&gt;
  zones_per_line = ((Profile.RangingProfile == RS_PROFILE_8x8_AUTONOMOUS) ||&lt;br /&gt;
         (Profile.RangingProfile == RS_PROFILE_8x8_CONTINUOUS)) ? 8 : 4;&lt;br /&gt;
  for (j = 0; j &amp;lt; Result-&amp;gt;NumberOfZones; j += zones_per_line)&lt;br /&gt;
  {&lt;br /&gt;
    for (l = 0; l &amp;lt; RANGING_SENSOR_NB_TARGET_PER_ZONE; l++)&lt;br /&gt;
    {&lt;br /&gt;
      /* Print distance and status */&lt;br /&gt;
      for (k = (zones_per_line - 1); k &amp;gt;= 0; k--)&lt;br /&gt;
      {&lt;br /&gt;
        if (Result-&amp;gt;ZoneResult[j+k].NumberOfTargets &amp;gt; 0)&lt;br /&gt;
          printf(&amp;quot;%ld,&amp;quot;,(long)Result-&amp;gt;ZoneResult[j+k].Distance[l]);&lt;br /&gt;
      }&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
  printf(&amp;quot;\n&amp;quot;);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;On passe ensuite sur Nano Edge Studio pour définir les signaux dans l'onglet &amp;quot;Signals&amp;quot; et entraîner le modèle dans l'onglet &amp;quot;Benchmark&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Capture d'écran 2023-12-18 172047.png|néant|vignette|800x800px]]&lt;br /&gt;
&lt;br /&gt;
Une fois le modèle entraîné, on peut le tester avec l'onglet &amp;quot;Emulator&amp;quot; &lt;br /&gt;
&lt;br /&gt;
[[Fichier:Capture d'écran 2023-12-18 173255.png|néant|vignette|800x800px]]&lt;br /&gt;
&lt;br /&gt;
===Emulation avec NanoEdgeStudio AI===&lt;br /&gt;
&lt;br /&gt;
Dans un premier temps, nous avons essayé d'entraîner le programme à reconnaître les chiffres 1, 2, 3, 4 et 5 sur les doigts d'une main. Les résultats n'étaient pas concluant, il semblerait que le capteur détecte avant tout le volume de la main à la place de détecter le nombre de doigts.&lt;br /&gt;
&lt;br /&gt;
Nous avons ensuite choisi de faire un détecteur de visages capable de faire la différence entre Gabriel et Dann. L'émulation donne des résultats très satisfaisant proche de 100% de réussite&lt;br /&gt;
&lt;br /&gt;
===Configuration du serveur===&lt;br /&gt;
Configuration d'un serveur HTTP sur la machine virtuelle gabidann :&amp;lt;syntaxhighlight lang=&amp;quot;python3&amp;quot;&amp;gt;&lt;br /&gt;
import socket&lt;br /&gt;
from http.server import HTTPServer, SimpleHTTPRequestHandler&lt;br /&gt;
&lt;br /&gt;
class MyHandler(SimpleHTTPRequestHandler):&lt;br /&gt;
  def do_GET(self):&lt;br /&gt;
    if self.path == '/ip':&lt;br /&gt;
      self.send_response(200)&lt;br /&gt;
      self.send_header('Content-type', 'text/html')&lt;br /&gt;
      self.end_headers()&lt;br /&gt;
      self.wfile.write(f'Your IP address is {self.client_address[0]}'.encode())&lt;br /&gt;
      return&lt;br /&gt;
    else:&lt;br /&gt;
      return SimpleHTTPRequestHandler.do_GET(self)&lt;br /&gt;
&lt;br /&gt;
class HTTPServerV6(HTTPServer):&lt;br /&gt;
  address_family = socket.AF_INET6&lt;br /&gt;
&lt;br /&gt;
def main():&lt;br /&gt;
  server = HTTPServerV6(('::', 8080), MyHandler)&lt;br /&gt;
  server.serve_forever()&lt;br /&gt;
&lt;br /&gt;
if __name__ == '__main__':&lt;br /&gt;
  main()&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Pour se connecter au serveur depuis un navigateur, on peut ouvrir un navigateur depuis la zabeth et y accéder avec l'adresse : ''[&amp;lt;ipv6_VM&amp;gt;]:&amp;lt;port&amp;gt;''. Dans notre cas, le serveur écoute le port '''8080'''.&lt;br /&gt;
&lt;br /&gt;
La page index.html s'affiche par défaut lorsque l'on se connecte au serveur HTTP :&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;html&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;!DOCTYPE html&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;html lang=&amp;quot;fr&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;head&amp;gt;&lt;br /&gt;
	&amp;lt;meta charset=&amp;quot;UTF-8&amp;quot;&amp;gt;&lt;br /&gt;
	&amp;lt;title&amp;gt;Gabidann&amp;lt;/title&amp;gt;&lt;br /&gt;
&amp;lt;/head&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;body&amp;gt;&lt;br /&gt;
	&amp;lt;h1&amp;gt;Bienvenue sur Gabidann !&amp;lt;h1&amp;gt;&lt;br /&gt;
	&amp;lt;div id=&amp;quot;data&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/body&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/html&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;Nous avons également testé la communication en TCP avec l'utilitaire socat&lt;br /&gt;
&lt;br /&gt;
Nous avons créé un serveur python en TCP. Nous pouvons maintenant envoyer des messages du client ( raspberry ) au serveur (VM Xen). Nous nous servirons de cette architecture pour envoyer les données du Nucleo à la Vm Xen &lt;br /&gt;
&lt;br /&gt;
Une fois le modèle entrainé et les tests concluants, on peut déployer notre modèle sur n'importe quel appareils linux ou windows. Pour cela, on va dans l'onglet deployment et on télécharge notre librairie personnalisée.  &lt;br /&gt;
&lt;br /&gt;
===Déploiement du modèle===&lt;br /&gt;
&lt;br /&gt;
On peut lui passer un fichier CSV contenant les données brutes du capteur et grâce au fichier knowledge.dat, l'émulateur est capable de faire la différence entre les situations&amp;lt;syntaxhighlight lang=&amp;quot;bat&amp;quot;&amp;gt;&lt;br /&gt;
PS C:\Users\gabyt\Documents\Gaby\emulators&amp;gt; .\NanoEdgeAI_Class_Emulator.exe neai_classification --knowledge_path .\knowledge.dat --file .\data.csv&lt;br /&gt;
{&lt;br /&gt;
        &amp;quot;status&amp;quot;: &amp;quot;classification&amp;quot;,&lt;br /&gt;
        &amp;quot;lib_id&amp;quot;: &amp;quot;6582b12625c3e0368b2c2a09&amp;quot;,&lt;br /&gt;
        &amp;quot;input&amp;quot;: &amp;quot;.\data.csv&amp;quot;,&lt;br /&gt;
        &amp;quot;results&amp;quot;: [&lt;br /&gt;
                {&amp;quot;signal&amp;quot;: 1, &amp;quot;line&amp;quot;: 1, &amp;quot;class_status&amp;quot;: 2, &amp;quot;class_name&amp;quot;: &amp;quot;dann&amp;quot;, &amp;quot;class_proba&amp;quot;: [0.01, 0.99]},&lt;br /&gt;
                {&amp;quot;signal&amp;quot;: 2, &amp;quot;line&amp;quot;: 2, &amp;quot;class_status&amp;quot;: 2, &amp;quot;class_name&amp;quot;: &amp;quot;dann&amp;quot;, &amp;quot;class_proba&amp;quot;: [0.01, 0.99]},&lt;br /&gt;
                {&amp;quot;signal&amp;quot;: 3, &amp;quot;line&amp;quot;: 3, &amp;quot;class_status&amp;quot;: 2, &amp;quot;class_name&amp;quot;: &amp;quot;dann&amp;quot;, &amp;quot;class_proba&amp;quot;: [0.37, 0.63]},&lt;br /&gt;
                {&amp;quot;signal&amp;quot;: 4, &amp;quot;line&amp;quot;: 4, &amp;quot;class_status&amp;quot;: 1, &amp;quot;class_name&amp;quot;: &amp;quot;gaby&amp;quot;, &amp;quot;class_proba&amp;quot;: [0.83, 0.17]},&lt;br /&gt;
                {&amp;quot;signal&amp;quot;: 5, &amp;quot;line&amp;quot;: 5, &amp;quot;class_status&amp;quot;: 1, &amp;quot;class_name&amp;quot;: &amp;quot;gaby&amp;quot;, &amp;quot;class_proba&amp;quot;: [0.63, 0.37]},&lt;br /&gt;
                {&amp;quot;signal&amp;quot;: 6, &amp;quot;line&amp;quot;: 6, &amp;quot;class_status&amp;quot;: 1, &amp;quot;class_name&amp;quot;: &amp;quot;gaby&amp;quot;, &amp;quot;class_proba&amp;quot;: [0.63, 0.37]},&lt;br /&gt;
                {&amp;quot;signal&amp;quot;: 7, &amp;quot;line&amp;quot;: 7, &amp;quot;class_status&amp;quot;: 1, &amp;quot;class_name&amp;quot;: &amp;quot;gaby&amp;quot;, &amp;quot;class_proba&amp;quot;: [0.50, 0.50]},&lt;br /&gt;
                {&amp;quot;signal&amp;quot;: 8, &amp;quot;line&amp;quot;: 8, &amp;quot;class_status&amp;quot;: 1, &amp;quot;class_name&amp;quot;: &amp;quot;gaby&amp;quot;, &amp;quot;class_proba&amp;quot;: [0.63, 0.37]},&lt;br /&gt;
                {&amp;quot;signal&amp;quot;: 9, &amp;quot;line&amp;quot;: 9, &amp;quot;class_status&amp;quot;: 2, &amp;quot;class_name&amp;quot;: &amp;quot;dann&amp;quot;, &amp;quot;class_proba&amp;quot;: [0.37, 0.63]},&lt;br /&gt;
                {&amp;quot;signal&amp;quot;: 10, &amp;quot;line&amp;quot;: 10, &amp;quot;class_status&amp;quot;: 2, &amp;quot;class_name&amp;quot;: &amp;quot;dann&amp;quot;, &amp;quot;class_proba&amp;quot;: [0.17, 0.83]},&lt;br /&gt;
                {&amp;quot;signal&amp;quot;: 11, &amp;quot;line&amp;quot;: 11, &amp;quot;class_status&amp;quot;: 1, &amp;quot;class_name&amp;quot;: &amp;quot;gaby&amp;quot;, &amp;quot;class_proba&amp;quot;: [0.63, 0.37]},&lt;br /&gt;
                {&amp;quot;signal&amp;quot;: 12, &amp;quot;line&amp;quot;: 12, &amp;quot;class_status&amp;quot;: 1, &amp;quot;class_name&amp;quot;: &amp;quot;gaby&amp;quot;, &amp;quot;class_proba&amp;quot;: [0.63, 0.37]},&lt;br /&gt;
                {&amp;quot;signal&amp;quot;: 13, &amp;quot;line&amp;quot;: 13, &amp;quot;class_status&amp;quot;: 2, &amp;quot;class_name&amp;quot;: &amp;quot;dann&amp;quot;, &amp;quot;class_proba&amp;quot;: [0.37, 0.63]},&lt;br /&gt;
                {&amp;quot;signal&amp;quot;: 14, &amp;quot;line&amp;quot;: 14, &amp;quot;class_status&amp;quot;: 1, &amp;quot;class_name&amp;quot;: &amp;quot;gaby&amp;quot;, &amp;quot;class_proba&amp;quot;: [0.74, 0.26]},&lt;br /&gt;
                {&amp;quot;signal&amp;quot;: 15, &amp;quot;line&amp;quot;: 15, &amp;quot;class_status&amp;quot;: 1, &amp;quot;class_name&amp;quot;: &amp;quot;gaby&amp;quot;, &amp;quot;class_proba&amp;quot;: [0.63, 0.37]},&lt;br /&gt;
                {&amp;quot;signal&amp;quot;: 16, &amp;quot;line&amp;quot;: 16, &amp;quot;class_status&amp;quot;: 1, &amp;quot;class_name&amp;quot;: &amp;quot;gaby&amp;quot;, &amp;quot;class_proba&amp;quot;: [0.74, 0.26]},&lt;br /&gt;
                {&amp;quot;signal&amp;quot;: 17, &amp;quot;line&amp;quot;: 17, &amp;quot;class_status&amp;quot;: 1, &amp;quot;class_name&amp;quot;: &amp;quot;gaby&amp;quot;, &amp;quot;class_proba&amp;quot;: [0.63, 0.37]},&lt;br /&gt;
                {&amp;quot;signal&amp;quot;: 18, &amp;quot;line&amp;quot;: 18, &amp;quot;class_status&amp;quot;: 1, &amp;quot;class_name&amp;quot;: &amp;quot;gaby&amp;quot;, &amp;quot;class_proba&amp;quot;: [0.63, 0.37]},&lt;br /&gt;
                {&amp;quot;signal&amp;quot;: 19, &amp;quot;line&amp;quot;: 19, &amp;quot;class_status&amp;quot;: 2, &amp;quot;class_name&amp;quot;: &amp;quot;dann&amp;quot;, &amp;quot;class_proba&amp;quot;: [0.37, 0.63]},&lt;br /&gt;
                {&amp;quot;signal&amp;quot;: 20, &amp;quot;line&amp;quot;: 20, &amp;quot;class_status&amp;quot;: 1, &amp;quot;class_name&amp;quot;: &amp;quot;gaby&amp;quot;, &amp;quot;class_proba&amp;quot;: [0.63, 0.37]},&lt;br /&gt;
                {&amp;quot;signal&amp;quot;: 21, &amp;quot;line&amp;quot;: 21, &amp;quot;class_status&amp;quot;: 2, &amp;quot;class_name&amp;quot;: &amp;quot;dann&amp;quot;, &amp;quot;class_proba&amp;quot;: [0.11, 0.89]},&lt;br /&gt;
                {&amp;quot;signal&amp;quot;: 22, &amp;quot;line&amp;quot;: 22, &amp;quot;class_status&amp;quot;: 1, &amp;quot;class_name&amp;quot;: &amp;quot;gaby&amp;quot;, &amp;quot;class_proba&amp;quot;: [0.74, 0.26]},&lt;br /&gt;
                {&amp;quot;signal&amp;quot;: 23, &amp;quot;line&amp;quot;: 23, &amp;quot;class_status&amp;quot;: 1, &amp;quot;class_name&amp;quot;: &amp;quot;gaby&amp;quot;, &amp;quot;class_proba&amp;quot;: [0.63, 0.37]},&lt;br /&gt;
                {&amp;quot;signal&amp;quot;: 24, &amp;quot;line&amp;quot;: 24, &amp;quot;class_status&amp;quot;: 1, &amp;quot;class_name&amp;quot;: &amp;quot;gaby&amp;quot;, &amp;quot;class_proba&amp;quot;: [0.74, 0.26]},&lt;br /&gt;
                {&amp;quot;signal&amp;quot;: 25, &amp;quot;line&amp;quot;: 25, &amp;quot;class_status&amp;quot;: 1, &amp;quot;class_name&amp;quot;: &amp;quot;gaby&amp;quot;, &amp;quot;class_proba&amp;quot;: [0.50, 0.50]},&lt;br /&gt;
                {&amp;quot;signal&amp;quot;: 26, &amp;quot;line&amp;quot;: 26, &amp;quot;class_status&amp;quot;: 2, &amp;quot;class_name&amp;quot;: &amp;quot;dann&amp;quot;, &amp;quot;class_proba&amp;quot;: [0.06, 0.94]},&lt;br /&gt;
                {&amp;quot;signal&amp;quot;: 27, &amp;quot;line&amp;quot;: 27, &amp;quot;class_status&amp;quot;: 2, &amp;quot;class_name&amp;quot;: &amp;quot;dann&amp;quot;, &amp;quot;class_proba&amp;quot;: [0.37, 0.63]},&lt;br /&gt;
                {&amp;quot;signal&amp;quot;: 28, &amp;quot;line&amp;quot;: 28, &amp;quot;class_status&amp;quot;: 1, &amp;quot;class_name&amp;quot;: &amp;quot;gaby&amp;quot;, &amp;quot;class_proba&amp;quot;: [0.63, 0.37]},&lt;br /&gt;
                {&amp;quot;signal&amp;quot;: 29, &amp;quot;line&amp;quot;: 29, &amp;quot;class_status&amp;quot;: 1, &amp;quot;class_name&amp;quot;: &amp;quot;gaby&amp;quot;, &amp;quot;class_proba&amp;quot;: [0.63, 0.37]}&lt;br /&gt;
        ],&lt;br /&gt;
        &amp;quot;classification_summary&amp;quot;: {&amp;quot;signals&amp;quot;: 29, &amp;quot;classified&amp;quot;: [19, 10], &amp;quot;unclassified&amp;quot;: 0}&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Visualisation des données sur le serveur===&lt;/div&gt;</summary>
		<author><name>Gthomas</name></author>
	</entry>
	<entry>
		<id>https://wiki-se.plil.fr/mediawiki/index.php?title=RodenburgThomas&amp;diff=3600</id>
		<title>RodenburgThomas</title>
		<link rel="alternate" type="text/html" href="https://wiki-se.plil.fr/mediawiki/index.php?title=RodenburgThomas&amp;diff=3600"/>
		<updated>2023-12-20T11:06:30Z</updated>

		<summary type="html">&lt;p&gt;Gthomas : /* Déploiement du modèle */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;=Le binôme=&lt;br /&gt;
&lt;br /&gt;
Le binôme est constitué de 2 élèves de SE5-SC :&lt;br /&gt;
* Dann RODENBURG&lt;br /&gt;
* Gabriel THOMAS&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=Objectifs= &lt;br /&gt;
&lt;br /&gt;
Le but de ce TP est de créer un réseau de systèmes communicants en partant d'un capteur XNucléo 53L5A1 pour finir sur une machine virtuelle Xen.&lt;br /&gt;
La particularité est d'intégrer une composante de Machine Learning  &lt;br /&gt;
&lt;br /&gt;
[[Fichier:Capture d'écran 2023-12-19 151237.png|néant|vignette|800x800px]]&lt;br /&gt;
&lt;br /&gt;
=Compte rendu des séances=&lt;br /&gt;
&lt;br /&gt;
==Séance du 04/12/2023==&lt;br /&gt;
===Création de la machine virtuelle===&lt;br /&gt;
Création d'une machine virtuelle '''gabidann''' sur le serveur chassiron :&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;xen-create-image --hostname=gabidann --force --dist=bookworm --size=10G --memory=10G --dir=/usr/local/xen --password=glopglop --dhcp --bridge=bridgeStudents&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
La machine virtuelle est à présent connectée au WiFi.&lt;br /&gt;
&lt;br /&gt;
Après cela, nous avons configuré la machine virtuelle selon l'énoncé du TP en faisant un xen console gabidann. Nous avons ensuite participé à la mise en place du point d'accès WiFi.&lt;br /&gt;
&lt;br /&gt;
===Premières observations du capteur===&lt;br /&gt;
De plus nous avons observé le retour du capteur de distance Nucleo-53L5A1 avec l'outil minicom. Le contenu envoyé par le capteur était compréhensible avec une fréquence de 460 800 bauds ; sur minicom, on a pu constater que le capteur nous envoie des valeurs qui dépendent de la distance entre celui-ci et un obstacle.&lt;br /&gt;
&lt;br /&gt;
===Raspberry===&lt;br /&gt;
D'un autre côté, nous avons branché la Raspberry Pi à l'ordinateur selon le pinout fourni dans la documentation.&lt;br /&gt;
&lt;br /&gt;
[[Fichier:20231218 085218.jpg|vignette|néant]]&lt;br /&gt;
&lt;br /&gt;
Enfin, nous avons activé la communication UART de la Raspberry Pi afin de pouvoir communiquer avec. En fin de séance, nous étions en train de vérifier que la Raspberry Pi répondait bien, même en ayant ajouté la ligne enable_uart=1 dans le fichier config.txt de la Raspberry.&lt;br /&gt;
&lt;br /&gt;
==Séance du 18/12/2023==&lt;br /&gt;
===Configuration de la Raspberry===&lt;br /&gt;
Nous avons résolu le problème de la Raspberry qui ne répondait pas. Cela était dû à l'alimentation : brancher la carte en USBC résoud le problème. Cependant, nous recevons une erreur l'erreur EXT4-fs error (device mmcblk0p2).&lt;br /&gt;
Le problème venait des arguments saisis lors du lancement de Minicom. Avec la commande suivante, il est à présent possible de se connecter sur la Raspberry : &amp;lt;code&amp;gt;minicom -D /dev/ttyUSB0 -b 115200&amp;lt;/code&amp;gt;&lt;br /&gt;
Dans la Raspberry, nous avons configuré une interface réseau wlan0 pour se connecter à WiFi_IE_1 :&lt;br /&gt;
    auto wlan0&lt;br /&gt;
    iface wlan0 inet dhcp&lt;br /&gt;
    wpa-conf /etc/wpa_supplicant/wpa_supplicant.conf&lt;br /&gt;
A présent à partir de la Raspberry, on peut ping la machine virtuelle sur chassiron avec son IPv6.&lt;br /&gt;
&lt;br /&gt;
===Configuration du capteur de distance===&lt;br /&gt;
Un programme était déjà présent sur le capteur. On a téléchargé le logiciel STM32CubeIDE pour pouvoir éditer du code et le téléverser sur le capteur. Nous avons testé de téléverser un programme d'exemple dont voici le résultat :&lt;br /&gt;
[[Fichier:Screenshot 2023-12-18 13-12-19.jpg|vignette|néant|700x700px]]&lt;br /&gt;
&lt;br /&gt;
Nous avons modifié ce programme afin d'effectuer un formatage des données transmises par le capteur sous le format ''&amp;lt;distance&amp;gt;,'' pour chaque valeur. Grâce à ce formatage, il est à présent possible d'utiliser les données reçues par le logiciel NanoEdgeStudio AI pour la partie Machine Learning.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Pour recevoir les valeurs de manière exploitable, il faut modifier le code Exemple dans le logiciel STM Cube IDE&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Capture d'écran 2023-12-20 084719.png|néant|vignette|800x800px]]&lt;br /&gt;
&lt;br /&gt;
L'objectif est d'obtenir une liste séparée par des virgules, il a donc fallu supprimer les espaces et les barres verticales de la fonction d'affichage ainsi que les statuts de chacun des capteurs :&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
static void print_result(RANGING_SENSOR_Result_t *Result)&lt;br /&gt;
{&lt;br /&gt;
  int8_t j;&lt;br /&gt;
  int8_t k;&lt;br /&gt;
  int8_t l;&lt;br /&gt;
  uint8_t zones_per_line;&lt;br /&gt;
  zones_per_line = ((Profile.RangingProfile == RS_PROFILE_8x8_AUTONOMOUS) ||&lt;br /&gt;
         (Profile.RangingProfile == RS_PROFILE_8x8_CONTINUOUS)) ? 8 : 4;&lt;br /&gt;
  for (j = 0; j &amp;lt; Result-&amp;gt;NumberOfZones; j += zones_per_line)&lt;br /&gt;
  {&lt;br /&gt;
    for (l = 0; l &amp;lt; RANGING_SENSOR_NB_TARGET_PER_ZONE; l++)&lt;br /&gt;
    {&lt;br /&gt;
      /* Print distance and status */&lt;br /&gt;
      for (k = (zones_per_line - 1); k &amp;gt;= 0; k--)&lt;br /&gt;
      {&lt;br /&gt;
        if (Result-&amp;gt;ZoneResult[j+k].NumberOfTargets &amp;gt; 0)&lt;br /&gt;
          printf(&amp;quot;%ld,&amp;quot;,(long)Result-&amp;gt;ZoneResult[j+k].Distance[l]);&lt;br /&gt;
      }&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
  printf(&amp;quot;\n&amp;quot;);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;On passe ensuite sur Nano Edge Studio pour définir les signaux dans l'onglet &amp;quot;Signals&amp;quot; et entraîner le modèle dans l'onglet &amp;quot;Benchmark&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Capture d'écran 2023-12-18 172047.png|néant|vignette|800x800px]]&lt;br /&gt;
&lt;br /&gt;
Une fois le modèle entraîné, on peut le tester avec l'onglet &amp;quot;Emulator&amp;quot; &lt;br /&gt;
&lt;br /&gt;
[[Fichier:Capture d'écran 2023-12-18 173255.png|néant|vignette|800x800px]]&lt;br /&gt;
&lt;br /&gt;
===Emulation avec NanoEdgeStudio AI===&lt;br /&gt;
&lt;br /&gt;
Dans un premier temps, nous avons essayé d'entraîner le programme à reconnaître les chiffres 1, 2, 3, 4 et 5 sur les doigts d'une main. Les résultats n'étaient pas concluant, il semblerait que le capteur détecte avant tout le volume de la main à la place de détecter le nombre de doigts.&lt;br /&gt;
&lt;br /&gt;
Nous avons ensuite choisi de faire un détecteur de visages capable de faire la différence entre Gabriel et Dann. L'émulation donne des résultats très satisfaisant proche de 100% de réussite&lt;br /&gt;
&lt;br /&gt;
===Configuration du serveur===&lt;br /&gt;
Configuration d'un serveur HTTP sur la machine virtuelle gabidann :&amp;lt;syntaxhighlight lang=&amp;quot;python3&amp;quot;&amp;gt;&lt;br /&gt;
import socket&lt;br /&gt;
from http.server import HTTPServer, SimpleHTTPRequestHandler&lt;br /&gt;
&lt;br /&gt;
class MyHandler(SimpleHTTPRequestHandler):&lt;br /&gt;
  def do_GET(self):&lt;br /&gt;
    if self.path == '/ip':&lt;br /&gt;
      self.send_response(200)&lt;br /&gt;
      self.send_header('Content-type', 'text/html')&lt;br /&gt;
      self.end_headers()&lt;br /&gt;
      self.wfile.write(f'Your IP address is {self.client_address[0]}'.encode())&lt;br /&gt;
      return&lt;br /&gt;
    else:&lt;br /&gt;
      return SimpleHTTPRequestHandler.do_GET(self)&lt;br /&gt;
&lt;br /&gt;
class HTTPServerV6(HTTPServer):&lt;br /&gt;
  address_family = socket.AF_INET6&lt;br /&gt;
&lt;br /&gt;
def main():&lt;br /&gt;
  server = HTTPServerV6(('::', 8080), MyHandler)&lt;br /&gt;
  server.serve_forever()&lt;br /&gt;
&lt;br /&gt;
if __name__ == '__main__':&lt;br /&gt;
  main()&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Pour se connecter au serveur depuis un navigateur, on peut ouvrir un navigateur depuis la zabeth et y accéder avec l'adresse : ''[&amp;lt;ipv6_VM&amp;gt;]:&amp;lt;port&amp;gt;''. Dans notre cas, le serveur écoute le port '''8080'''.&lt;br /&gt;
&lt;br /&gt;
La page index.html s'affiche par défaut lorsque l'on se connecte au serveur HTTP :&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;html&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;!DOCTYPE html&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;html lang=&amp;quot;fr&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;head&amp;gt;&lt;br /&gt;
	&amp;lt;meta charset=&amp;quot;UTF-8&amp;quot;&amp;gt;&lt;br /&gt;
	&amp;lt;title&amp;gt;Gabidann&amp;lt;/title&amp;gt;&lt;br /&gt;
&amp;lt;/head&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;body&amp;gt;&lt;br /&gt;
	&amp;lt;h1&amp;gt;Bienvenue sur Gabidann !&amp;lt;h1&amp;gt;&lt;br /&gt;
	&amp;lt;div id=&amp;quot;data&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/body&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/html&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;Nous avons également testé la communication en TCP avec l'utilitaire socat&lt;br /&gt;
&lt;br /&gt;
Nous avons créé un serveur python en TCP. Nous pouvons maintenant envoyer des messages du client ( raspberry ) au serveur (VM Xen). Nous nous servirons de cette architecture pour envoyer les données du Nucleo à la Vm Xen &lt;br /&gt;
&lt;br /&gt;
Une fois le modèle entrainé et les tests concluants, on peut déployer notre modèle sur n'importe quel appareils linux ou windows. Pour cela, on va dans l'onglet deployment et on télécharge notre librairie personnalisée.  &lt;br /&gt;
&lt;br /&gt;
===Déploiement du modèle===&lt;br /&gt;
&lt;br /&gt;
On peut lui passer un fichier CSV contenant les données brutes du capteur et grâce au fichier knowledge.dat, l'émulateur est capable de faire la différence entre les situations&amp;lt;syntaxhighlight lang=&amp;quot;bat&amp;quot;&amp;gt;&lt;br /&gt;
PS C:\Users\gabyt\Documents\Gaby\emulators&amp;gt; .\NanoEdgeAI_Class_Emulator.exe neai_classification --knowledge_path .\knowledge.dat --file .\data.csv&lt;br /&gt;
{&lt;br /&gt;
        &amp;quot;status&amp;quot;: &amp;quot;classification&amp;quot;,&lt;br /&gt;
        &amp;quot;lib_id&amp;quot;: &amp;quot;6582b12625c3e0368b2c2a09&amp;quot;,&lt;br /&gt;
        &amp;quot;input&amp;quot;: &amp;quot;.\data.csv&amp;quot;,&lt;br /&gt;
        &amp;quot;results&amp;quot;: [&lt;br /&gt;
                {&amp;quot;signal&amp;quot;: 1, &amp;quot;line&amp;quot;: 1, &amp;quot;class_status&amp;quot;: 2, &amp;quot;class_name&amp;quot;: &amp;quot;dann&amp;quot;, &amp;quot;class_proba&amp;quot;: [0.01, 0.99]},&lt;br /&gt;
                {&amp;quot;signal&amp;quot;: 2, &amp;quot;line&amp;quot;: 2, &amp;quot;class_status&amp;quot;: 2, &amp;quot;class_name&amp;quot;: &amp;quot;dann&amp;quot;, &amp;quot;class_proba&amp;quot;: [0.01, 0.99]},&lt;br /&gt;
                {&amp;quot;signal&amp;quot;: 3, &amp;quot;line&amp;quot;: 3, &amp;quot;class_status&amp;quot;: 2, &amp;quot;class_name&amp;quot;: &amp;quot;dann&amp;quot;, &amp;quot;class_proba&amp;quot;: [0.37, 0.63]},&lt;br /&gt;
                {&amp;quot;signal&amp;quot;: 4, &amp;quot;line&amp;quot;: 4, &amp;quot;class_status&amp;quot;: 1, &amp;quot;class_name&amp;quot;: &amp;quot;gaby&amp;quot;, &amp;quot;class_proba&amp;quot;: [0.83, 0.17]},&lt;br /&gt;
                {&amp;quot;signal&amp;quot;: 5, &amp;quot;line&amp;quot;: 5, &amp;quot;class_status&amp;quot;: 1, &amp;quot;class_name&amp;quot;: &amp;quot;gaby&amp;quot;, &amp;quot;class_proba&amp;quot;: [0.63, 0.37]},&lt;br /&gt;
                {&amp;quot;signal&amp;quot;: 6, &amp;quot;line&amp;quot;: 6, &amp;quot;class_status&amp;quot;: 1, &amp;quot;class_name&amp;quot;: &amp;quot;gaby&amp;quot;, &amp;quot;class_proba&amp;quot;: [0.63, 0.37]},&lt;br /&gt;
                {&amp;quot;signal&amp;quot;: 7, &amp;quot;line&amp;quot;: 7, &amp;quot;class_status&amp;quot;: 1, &amp;quot;class_name&amp;quot;: &amp;quot;gaby&amp;quot;, &amp;quot;class_proba&amp;quot;: [0.50, 0.50]},&lt;br /&gt;
                {&amp;quot;signal&amp;quot;: 8, &amp;quot;line&amp;quot;: 8, &amp;quot;class_status&amp;quot;: 1, &amp;quot;class_name&amp;quot;: &amp;quot;gaby&amp;quot;, &amp;quot;class_proba&amp;quot;: [0.63, 0.37]},&lt;br /&gt;
                {&amp;quot;signal&amp;quot;: 9, &amp;quot;line&amp;quot;: 9, &amp;quot;class_status&amp;quot;: 2, &amp;quot;class_name&amp;quot;: &amp;quot;dann&amp;quot;, &amp;quot;class_proba&amp;quot;: [0.37, 0.63]},&lt;br /&gt;
                {&amp;quot;signal&amp;quot;: 10, &amp;quot;line&amp;quot;: 10, &amp;quot;class_status&amp;quot;: 2, &amp;quot;class_name&amp;quot;: &amp;quot;dann&amp;quot;, &amp;quot;class_proba&amp;quot;: [0.17, 0.83]},&lt;br /&gt;
                {&amp;quot;signal&amp;quot;: 11, &amp;quot;line&amp;quot;: 11, &amp;quot;class_status&amp;quot;: 1, &amp;quot;class_name&amp;quot;: &amp;quot;gaby&amp;quot;, &amp;quot;class_proba&amp;quot;: [0.63, 0.37]},&lt;br /&gt;
                {&amp;quot;signal&amp;quot;: 12, &amp;quot;line&amp;quot;: 12, &amp;quot;class_status&amp;quot;: 1, &amp;quot;class_name&amp;quot;: &amp;quot;gaby&amp;quot;, &amp;quot;class_proba&amp;quot;: [0.63, 0.37]},&lt;br /&gt;
                {&amp;quot;signal&amp;quot;: 13, &amp;quot;line&amp;quot;: 13, &amp;quot;class_status&amp;quot;: 2, &amp;quot;class_name&amp;quot;: &amp;quot;dann&amp;quot;, &amp;quot;class_proba&amp;quot;: [0.37, 0.63]},&lt;br /&gt;
                {&amp;quot;signal&amp;quot;: 14, &amp;quot;line&amp;quot;: 14, &amp;quot;class_status&amp;quot;: 1, &amp;quot;class_name&amp;quot;: &amp;quot;gaby&amp;quot;, &amp;quot;class_proba&amp;quot;: [0.74, 0.26]},&lt;br /&gt;
                {&amp;quot;signal&amp;quot;: 15, &amp;quot;line&amp;quot;: 15, &amp;quot;class_status&amp;quot;: 1, &amp;quot;class_name&amp;quot;: &amp;quot;gaby&amp;quot;, &amp;quot;class_proba&amp;quot;: [0.63, 0.37]},&lt;br /&gt;
                {&amp;quot;signal&amp;quot;: 16, &amp;quot;line&amp;quot;: 16, &amp;quot;class_status&amp;quot;: 1, &amp;quot;class_name&amp;quot;: &amp;quot;gaby&amp;quot;, &amp;quot;class_proba&amp;quot;: [0.74, 0.26]},&lt;br /&gt;
                {&amp;quot;signal&amp;quot;: 17, &amp;quot;line&amp;quot;: 17, &amp;quot;class_status&amp;quot;: 1, &amp;quot;class_name&amp;quot;: &amp;quot;gaby&amp;quot;, &amp;quot;class_proba&amp;quot;: [0.63, 0.37]},&lt;br /&gt;
                {&amp;quot;signal&amp;quot;: 18, &amp;quot;line&amp;quot;: 18, &amp;quot;class_status&amp;quot;: 1, &amp;quot;class_name&amp;quot;: &amp;quot;gaby&amp;quot;, &amp;quot;class_proba&amp;quot;: [0.63, 0.37]},&lt;br /&gt;
                {&amp;quot;signal&amp;quot;: 19, &amp;quot;line&amp;quot;: 19, &amp;quot;class_status&amp;quot;: 2, &amp;quot;class_name&amp;quot;: &amp;quot;dann&amp;quot;, &amp;quot;class_proba&amp;quot;: [0.37, 0.63]},&lt;br /&gt;
                {&amp;quot;signal&amp;quot;: 20, &amp;quot;line&amp;quot;: 20, &amp;quot;class_status&amp;quot;: 1, &amp;quot;class_name&amp;quot;: &amp;quot;gaby&amp;quot;, &amp;quot;class_proba&amp;quot;: [0.63, 0.37]},&lt;br /&gt;
                {&amp;quot;signal&amp;quot;: 21, &amp;quot;line&amp;quot;: 21, &amp;quot;class_status&amp;quot;: 2, &amp;quot;class_name&amp;quot;: &amp;quot;dann&amp;quot;, &amp;quot;class_proba&amp;quot;: [0.11, 0.89]},&lt;br /&gt;
                {&amp;quot;signal&amp;quot;: 22, &amp;quot;line&amp;quot;: 22, &amp;quot;class_status&amp;quot;: 1, &amp;quot;class_name&amp;quot;: &amp;quot;gaby&amp;quot;, &amp;quot;class_proba&amp;quot;: [0.74, 0.26]},&lt;br /&gt;
                {&amp;quot;signal&amp;quot;: 23, &amp;quot;line&amp;quot;: 23, &amp;quot;class_status&amp;quot;: 1, &amp;quot;class_name&amp;quot;: &amp;quot;gaby&amp;quot;, &amp;quot;class_proba&amp;quot;: [0.63, 0.37]},&lt;br /&gt;
                {&amp;quot;signal&amp;quot;: 24, &amp;quot;line&amp;quot;: 24, &amp;quot;class_status&amp;quot;: 1, &amp;quot;class_name&amp;quot;: &amp;quot;gaby&amp;quot;, &amp;quot;class_proba&amp;quot;: [0.74, 0.26]},&lt;br /&gt;
                {&amp;quot;signal&amp;quot;: 25, &amp;quot;line&amp;quot;: 25, &amp;quot;class_status&amp;quot;: 1, &amp;quot;class_name&amp;quot;: &amp;quot;gaby&amp;quot;, &amp;quot;class_proba&amp;quot;: [0.50, 0.50]},&lt;br /&gt;
                {&amp;quot;signal&amp;quot;: 26, &amp;quot;line&amp;quot;: 26, &amp;quot;class_status&amp;quot;: 2, &amp;quot;class_name&amp;quot;: &amp;quot;dann&amp;quot;, &amp;quot;class_proba&amp;quot;: [0.06, 0.94]},&lt;br /&gt;
                {&amp;quot;signal&amp;quot;: 27, &amp;quot;line&amp;quot;: 27, &amp;quot;class_status&amp;quot;: 2, &amp;quot;class_name&amp;quot;: &amp;quot;dann&amp;quot;, &amp;quot;class_proba&amp;quot;: [0.37, 0.63]},&lt;br /&gt;
                {&amp;quot;signal&amp;quot;: 28, &amp;quot;line&amp;quot;: 28, &amp;quot;class_status&amp;quot;: 1, &amp;quot;class_name&amp;quot;: &amp;quot;gaby&amp;quot;, &amp;quot;class_proba&amp;quot;: [0.63, 0.37]},&lt;br /&gt;
                {&amp;quot;signal&amp;quot;: 29, &amp;quot;line&amp;quot;: 29, &amp;quot;class_status&amp;quot;: 1, &amp;quot;class_name&amp;quot;: &amp;quot;gaby&amp;quot;, &amp;quot;class_proba&amp;quot;: [0.63, 0.37]}&lt;br /&gt;
        ],&lt;br /&gt;
        &amp;quot;classification_summary&amp;quot;: {&amp;quot;signals&amp;quot;: 29, &amp;quot;classified&amp;quot;: [19, 10], &amp;quot;unclassified&amp;quot;: 0}&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;/div&gt;</summary>
		<author><name>Gthomas</name></author>
	</entry>
	<entry>
		<id>https://wiki-se.plil.fr/mediawiki/index.php?title=RodenburgThomas&amp;diff=3572</id>
		<title>RodenburgThomas</title>
		<link rel="alternate" type="text/html" href="https://wiki-se.plil.fr/mediawiki/index.php?title=RodenburgThomas&amp;diff=3572"/>
		<updated>2023-12-20T09:11:57Z</updated>

		<summary type="html">&lt;p&gt;Gthomas : /* Déployement du modèle */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;=Le binôme=&lt;br /&gt;
&lt;br /&gt;
Le binôme est constitué de 2 élèves de SE5-SC :&lt;br /&gt;
* Dann RODENBURG&lt;br /&gt;
* Gabriel THOMAS&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=Objectifs= &lt;br /&gt;
&lt;br /&gt;
Le but de ce TP est de créer un réseau de systèmes communicants en partant d'un capteur XNucléo 53L5A1 pour finir sur une machine virtuelle Xen.&lt;br /&gt;
La particularité est d'intégrer une composante de Machine Learning  &lt;br /&gt;
&lt;br /&gt;
[[Fichier:Capture d'écran 2023-12-19 151237.png|néant|vignette|800x800px]]&lt;br /&gt;
&lt;br /&gt;
=Compte rendu des séances=&lt;br /&gt;
&lt;br /&gt;
==Séance du 04/12/2023==&lt;br /&gt;
===Création de la machine virtuelle===&lt;br /&gt;
Création d'une machine virtuelle '''gabidann''' sur le serveur chassiron :&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;xen-create-image --hostname=gabidann --force --dist=bookworm --size=10G --memory=10G --dir=/usr/local/xen --password=glopglop --dhcp --bridge=bridgeStudents&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
La machine virtuelle est à présent connectée au WiFi.&lt;br /&gt;
&lt;br /&gt;
Après cela, nous avons configuré la machine virtuelle selon l'énoncé du TP en faisant un xen console gabidann. Nous avons ensuite participé à la mise en place du point d'accès WiFi.&lt;br /&gt;
&lt;br /&gt;
===Premières observations du capteur===&lt;br /&gt;
De plus nous avons observé le retour du capteur de distance Nucleo-53L5A1 avec l'outil minicom. Le contenu envoyé par le capteur était compréhensible avec une fréquence de 460 800 bauds ; sur minicom, on a pu constater que le capteur nous envoie des valeurs qui dépendent de la distance entre celui-ci et un obstacle.&lt;br /&gt;
&lt;br /&gt;
===Raspberry===&lt;br /&gt;
D'un autre côté, nous avons branché la Raspberry Pi à l'ordinateur selon le pinout fourni dans la documentation.&lt;br /&gt;
&lt;br /&gt;
[[Fichier:20231218 085218.jpg|vignette|néant]]&lt;br /&gt;
&lt;br /&gt;
Enfin, nous avons activé la communication UART de la Raspberry Pi afin de pouvoir communiquer avec. En fin de séance, nous étions en train de vérifier que la Raspberry Pi répondait bien, même en ayant ajouté la ligne enable_uart=1 dans le fichier config.txt de la Raspberry.&lt;br /&gt;
&lt;br /&gt;
==Séance du 18/12/2023==&lt;br /&gt;
===Configuration de la Raspberry===&lt;br /&gt;
Nous avons résolu le problème de la Raspberry qui ne répondait pas. Cela était dû à l'alimentation : brancher la carte en USBC résoud le problème. Cependant, nous recevons une erreur l'erreur EXT4-fs error (device mmcblk0p2).&lt;br /&gt;
Le problème venait des arguments saisis lors du lancement de Minicom. Avec la commande suivante, il est à présent possible de se connecter sur la Raspberry : &amp;lt;code&amp;gt;minicom -D /dev/ttyUSB0 -b 115200&amp;lt;/code&amp;gt;&lt;br /&gt;
Dans la Raspberry, nous avons configuré une interface réseau wlan0 pour se connecter à WiFi_IE_1 :&lt;br /&gt;
    auto wlan0&lt;br /&gt;
    iface wlan0 inet dhcp&lt;br /&gt;
    wpa-conf /etc/wpa_supplicant/wpa_supplicant.conf&lt;br /&gt;
A présent à partir de la Raspberry, on peut ping la machine virtuelle sur chassiron avec son IPv6.&lt;br /&gt;
&lt;br /&gt;
===Configuration du capteur de distance===&lt;br /&gt;
Un programme était déjà présent sur le capteur. On a téléchargé le logiciel STM32CubeIDE pour pouvoir éditer du code et le téléverser sur le capteur. Nous avons testé de téléverser un programme d'exemple dont voici le résultat :&lt;br /&gt;
[[Fichier:Screenshot 2023-12-18 13-12-19.jpg|vignette|néant|700x700px]]&lt;br /&gt;
&lt;br /&gt;
Nous avons modifié ce programme afin d'effectuer un formatage des données transmises par le capteur sous le format ''&amp;lt;distance&amp;gt;,'' pour chaque valeur. Grâce à ce formatage, il est à présent possible d'utiliser les données reçues par le logiciel NanoEdgeStudio AI pour la partie Machine Learning.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Pour recevoir les valeurs de manière exploitable, il faut modifier le code Exemple dans le logiciel STM Cube IDE&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Capture d'écran 2023-12-20 084719.png|néant|vignette|800x800px]]&lt;br /&gt;
&lt;br /&gt;
L'objectif est d'obtenir une liste séparée par des virgules, il a donc fallu supprimer les espaces et les barres verticales de la fonction d'affichage ainsi que les statuts de chacun des capteurs :&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
static void print_result(RANGING_SENSOR_Result_t *Result)&lt;br /&gt;
{&lt;br /&gt;
  int8_t j;&lt;br /&gt;
  int8_t k;&lt;br /&gt;
  int8_t l;&lt;br /&gt;
  uint8_t zones_per_line;&lt;br /&gt;
  zones_per_line = ((Profile.RangingProfile == RS_PROFILE_8x8_AUTONOMOUS) ||&lt;br /&gt;
         (Profile.RangingProfile == RS_PROFILE_8x8_CONTINUOUS)) ? 8 : 4;&lt;br /&gt;
  for (j = 0; j &amp;lt; Result-&amp;gt;NumberOfZones; j += zones_per_line)&lt;br /&gt;
  {&lt;br /&gt;
    for (l = 0; l &amp;lt; RANGING_SENSOR_NB_TARGET_PER_ZONE; l++)&lt;br /&gt;
    {&lt;br /&gt;
      /* Print distance and status */&lt;br /&gt;
      for (k = (zones_per_line - 1); k &amp;gt;= 0; k--)&lt;br /&gt;
      {&lt;br /&gt;
        if (Result-&amp;gt;ZoneResult[j+k].NumberOfTargets &amp;gt; 0)&lt;br /&gt;
          printf(&amp;quot;%ld,&amp;quot;,(long)Result-&amp;gt;ZoneResult[j+k].Distance[l]);&lt;br /&gt;
      }&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
  printf(&amp;quot;\n&amp;quot;);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;On passe ensuite sur Nano Edge Studio pour définir les signaux dans l'onglet &amp;quot;Signals&amp;quot; et entraîner le modèle dans l'onglet &amp;quot;Benchmark&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Capture d'écran 2023-12-18 172047.png|néant|vignette|800x800px]]&lt;br /&gt;
&lt;br /&gt;
Une fois le modèle entraîné, on peut le tester avec l'onglet &amp;quot;Emulator&amp;quot; &lt;br /&gt;
&lt;br /&gt;
[[Fichier:Capture d'écran 2023-12-18 173255.png|néant|vignette|800x800px]]&lt;br /&gt;
&lt;br /&gt;
===Emulation avec NanoEdgeStudio AI===&lt;br /&gt;
&lt;br /&gt;
Dans un premier temps, nous avons essayé d'entraîner le programme à reconnaître les chiffres 1, 2, 3, 4 et 5 sur les doigts d'une main. Les résultats n'étaient pas concluant, il semblerait que le capteur détecte avant tout le volume de la main à la place de détecter le nombre de doigts.&lt;br /&gt;
&lt;br /&gt;
Nous avons ensuite choisi de faire un détecteur de visages capable de faire la différence entre Gabriel et Dann. L'émulation donne des résultats très satisfaisant proche de 100% de réussite&lt;br /&gt;
&lt;br /&gt;
===Configuration du serveur===&lt;br /&gt;
Configuration d'un serveur HTTP sur la machine virtuelle gabidann :&amp;lt;syntaxhighlight lang=&amp;quot;python3&amp;quot;&amp;gt;&lt;br /&gt;
import socket&lt;br /&gt;
from http.server import HTTPServer, SimpleHTTPRequestHandler&lt;br /&gt;
&lt;br /&gt;
class MyHandler(SimpleHTTPRequestHandler):&lt;br /&gt;
  def do_GET(self):&lt;br /&gt;
    if self.path == '/ip':&lt;br /&gt;
      self.send_response(200)&lt;br /&gt;
      self.send_header('Content-type', 'text/html')&lt;br /&gt;
      self.end_headers()&lt;br /&gt;
      self.wfile.write(f'Your IP address is {self.client_address[0]}'.encode())&lt;br /&gt;
      return&lt;br /&gt;
    else:&lt;br /&gt;
      return SimpleHTTPRequestHandler.do_GET(self)&lt;br /&gt;
&lt;br /&gt;
class HTTPServerV6(HTTPServer):&lt;br /&gt;
  address_family = socket.AF_INET6&lt;br /&gt;
&lt;br /&gt;
def main():&lt;br /&gt;
  server = HTTPServerV6(('::', 8080), MyHandler)&lt;br /&gt;
  server.serve_forever()&lt;br /&gt;
&lt;br /&gt;
if __name__ == '__main__':&lt;br /&gt;
  main()&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Pour se connecter au serveur depuis un navigateur, on peut ouvrir un navigateur depuis la zabeth et y accéder avec l'adresse : ''[&amp;lt;ipv6_VM&amp;gt;]:&amp;lt;port&amp;gt;''. Dans notre cas, le serveur écoute le port '''8080'''.&lt;br /&gt;
&lt;br /&gt;
La page index.html s'affiche par défaut lorsque l'on se connecte au serveur HTTP :&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;html&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;!DOCTYPE html&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;html lang=&amp;quot;fr&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;head&amp;gt;&lt;br /&gt;
	&amp;lt;meta charset=&amp;quot;UTF-8&amp;quot;&amp;gt;&lt;br /&gt;
	&amp;lt;title&amp;gt;Gabidann&amp;lt;/title&amp;gt;&lt;br /&gt;
&amp;lt;/head&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;body&amp;gt;&lt;br /&gt;
	&amp;lt;h1&amp;gt;Bienvenue sur Gabidann !&amp;lt;h1&amp;gt;&lt;br /&gt;
	&amp;lt;div id=&amp;quot;data&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/body&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/html&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;Nous avons également testé la communication en TCP avec l'utilitaire socat&lt;br /&gt;
&lt;br /&gt;
Nous avons créé un serveur python en TCP. Nous pouvons maintenant envoyer des messages du client ( raspberry ) au serveur (VM Xen). Nous nous servirons de cette architecture pour envoyer les données du Nucleo à la Vm Xen &lt;br /&gt;
&lt;br /&gt;
Une fois le modèle entrainé et les tests concluants, on peut déployer notre modèle sur n'importe quel appareils linux ou windows. Pour cela, on va dans l'onglet deployment et on télécharge notre librairie personnalisée.  &lt;br /&gt;
&lt;br /&gt;
===Déploiement du modèle===&lt;br /&gt;
&lt;br /&gt;
On peut lui passer un fichier CSV contenant les données brutes du capteur et grâce au fichier knowledge.dat, l'émulateur est capable de faire la différence entre les situations&amp;lt;syntaxhighlight lang=&amp;quot;bat&amp;quot;&amp;gt;&lt;br /&gt;
PS C:\Users\gabyt\Documents\Gaby\emulators&amp;gt; .\NanoEdgeAI_Class_Emulator.exe neai_classification --knowledge_path .\knowledge.dat --file class_file.csv&lt;br /&gt;
{&lt;br /&gt;
        &amp;quot;status&amp;quot;: &amp;quot;classification&amp;quot;,&lt;br /&gt;
        &amp;quot;lib_id&amp;quot;: &amp;quot;6581a85925c3e0368b2c1e60&amp;quot;,&lt;br /&gt;
        &amp;quot;input&amp;quot;: &amp;quot;class_file.csv&amp;quot;,&lt;br /&gt;
        &amp;quot;results&amp;quot;: [&lt;br /&gt;
                {&amp;quot;signal&amp;quot;: 1, &amp;quot;line&amp;quot;: 1, &amp;quot;class_status&amp;quot;: 1, &amp;quot;class_name&amp;quot;: &amp;quot;plat&amp;quot;, &amp;quot;class_proba&amp;quot;: [0.98, 0.02]},&lt;br /&gt;
                {&amp;quot;signal&amp;quot;: 2, &amp;quot;line&amp;quot;: 2, &amp;quot;class_status&amp;quot;: 1, &amp;quot;class_name&amp;quot;: &amp;quot;boule&amp;quot;, &amp;quot;class_proba&amp;quot;: [0.94, 0.06]},&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;/div&gt;</summary>
		<author><name>Gthomas</name></author>
	</entry>
	<entry>
		<id>https://wiki-se.plil.fr/mediawiki/index.php?title=RodenburgThomas&amp;diff=3571</id>
		<title>RodenburgThomas</title>
		<link rel="alternate" type="text/html" href="https://wiki-se.plil.fr/mediawiki/index.php?title=RodenburgThomas&amp;diff=3571"/>
		<updated>2023-12-20T09:11:45Z</updated>

		<summary type="html">&lt;p&gt;Gthomas : /* Configuration du serveur */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;=Le binôme=&lt;br /&gt;
&lt;br /&gt;
Le binôme est constitué de 2 élèves de SE5-SC :&lt;br /&gt;
* Dann RODENBURG&lt;br /&gt;
* Gabriel THOMAS&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=Objectifs= &lt;br /&gt;
&lt;br /&gt;
Le but de ce TP est de créer un réseau de systèmes communicants en partant d'un capteur XNucléo 53L5A1 pour finir sur une machine virtuelle Xen.&lt;br /&gt;
La particularité est d'intégrer une composante de Machine Learning  &lt;br /&gt;
&lt;br /&gt;
[[Fichier:Capture d'écran 2023-12-19 151237.png|néant|vignette|800x800px]]&lt;br /&gt;
&lt;br /&gt;
=Compte rendu des séances=&lt;br /&gt;
&lt;br /&gt;
==Séance du 04/12/2023==&lt;br /&gt;
===Création de la machine virtuelle===&lt;br /&gt;
Création d'une machine virtuelle '''gabidann''' sur le serveur chassiron :&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;xen-create-image --hostname=gabidann --force --dist=bookworm --size=10G --memory=10G --dir=/usr/local/xen --password=glopglop --dhcp --bridge=bridgeStudents&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
La machine virtuelle est à présent connectée au WiFi.&lt;br /&gt;
&lt;br /&gt;
Après cela, nous avons configuré la machine virtuelle selon l'énoncé du TP en faisant un xen console gabidann. Nous avons ensuite participé à la mise en place du point d'accès WiFi.&lt;br /&gt;
&lt;br /&gt;
===Premières observations du capteur===&lt;br /&gt;
De plus nous avons observé le retour du capteur de distance Nucleo-53L5A1 avec l'outil minicom. Le contenu envoyé par le capteur était compréhensible avec une fréquence de 460 800 bauds ; sur minicom, on a pu constater que le capteur nous envoie des valeurs qui dépendent de la distance entre celui-ci et un obstacle.&lt;br /&gt;
&lt;br /&gt;
===Raspberry===&lt;br /&gt;
D'un autre côté, nous avons branché la Raspberry Pi à l'ordinateur selon le pinout fourni dans la documentation.&lt;br /&gt;
&lt;br /&gt;
[[Fichier:20231218 085218.jpg|vignette|néant]]&lt;br /&gt;
&lt;br /&gt;
Enfin, nous avons activé la communication UART de la Raspberry Pi afin de pouvoir communiquer avec. En fin de séance, nous étions en train de vérifier que la Raspberry Pi répondait bien, même en ayant ajouté la ligne enable_uart=1 dans le fichier config.txt de la Raspberry.&lt;br /&gt;
&lt;br /&gt;
==Séance du 18/12/2023==&lt;br /&gt;
===Configuration de la Raspberry===&lt;br /&gt;
Nous avons résolu le problème de la Raspberry qui ne répondait pas. Cela était dû à l'alimentation : brancher la carte en USBC résoud le problème. Cependant, nous recevons une erreur l'erreur EXT4-fs error (device mmcblk0p2).&lt;br /&gt;
Le problème venait des arguments saisis lors du lancement de Minicom. Avec la commande suivante, il est à présent possible de se connecter sur la Raspberry : &amp;lt;code&amp;gt;minicom -D /dev/ttyUSB0 -b 115200&amp;lt;/code&amp;gt;&lt;br /&gt;
Dans la Raspberry, nous avons configuré une interface réseau wlan0 pour se connecter à WiFi_IE_1 :&lt;br /&gt;
    auto wlan0&lt;br /&gt;
    iface wlan0 inet dhcp&lt;br /&gt;
    wpa-conf /etc/wpa_supplicant/wpa_supplicant.conf&lt;br /&gt;
A présent à partir de la Raspberry, on peut ping la machine virtuelle sur chassiron avec son IPv6.&lt;br /&gt;
&lt;br /&gt;
===Configuration du capteur de distance===&lt;br /&gt;
Un programme était déjà présent sur le capteur. On a téléchargé le logiciel STM32CubeIDE pour pouvoir éditer du code et le téléverser sur le capteur. Nous avons testé de téléverser un programme d'exemple dont voici le résultat :&lt;br /&gt;
[[Fichier:Screenshot 2023-12-18 13-12-19.jpg|vignette|néant|700x700px]]&lt;br /&gt;
&lt;br /&gt;
Nous avons modifié ce programme afin d'effectuer un formatage des données transmises par le capteur sous le format ''&amp;lt;distance&amp;gt;,'' pour chaque valeur. Grâce à ce formatage, il est à présent possible d'utiliser les données reçues par le logiciel NanoEdgeStudio AI pour la partie Machine Learning.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Pour recevoir les valeurs de manière exploitable, il faut modifier le code Exemple dans le logiciel STM Cube IDE&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Capture d'écran 2023-12-20 084719.png|néant|vignette|800x800px]]&lt;br /&gt;
&lt;br /&gt;
L'objectif est d'obtenir une liste séparée par des virgules, il a donc fallu supprimer les espaces et les barres verticales de la fonction d'affichage ainsi que les statuts de chacun des capteurs :&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
static void print_result(RANGING_SENSOR_Result_t *Result)&lt;br /&gt;
{&lt;br /&gt;
  int8_t j;&lt;br /&gt;
  int8_t k;&lt;br /&gt;
  int8_t l;&lt;br /&gt;
  uint8_t zones_per_line;&lt;br /&gt;
  zones_per_line = ((Profile.RangingProfile == RS_PROFILE_8x8_AUTONOMOUS) ||&lt;br /&gt;
         (Profile.RangingProfile == RS_PROFILE_8x8_CONTINUOUS)) ? 8 : 4;&lt;br /&gt;
  for (j = 0; j &amp;lt; Result-&amp;gt;NumberOfZones; j += zones_per_line)&lt;br /&gt;
  {&lt;br /&gt;
    for (l = 0; l &amp;lt; RANGING_SENSOR_NB_TARGET_PER_ZONE; l++)&lt;br /&gt;
    {&lt;br /&gt;
      /* Print distance and status */&lt;br /&gt;
      for (k = (zones_per_line - 1); k &amp;gt;= 0; k--)&lt;br /&gt;
      {&lt;br /&gt;
        if (Result-&amp;gt;ZoneResult[j+k].NumberOfTargets &amp;gt; 0)&lt;br /&gt;
          printf(&amp;quot;%ld,&amp;quot;,(long)Result-&amp;gt;ZoneResult[j+k].Distance[l]);&lt;br /&gt;
      }&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
  printf(&amp;quot;\n&amp;quot;);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;On passe ensuite sur Nano Edge Studio pour définir les signaux dans l'onglet &amp;quot;Signals&amp;quot; et entraîner le modèle dans l'onglet &amp;quot;Benchmark&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Capture d'écran 2023-12-18 172047.png|néant|vignette|800x800px]]&lt;br /&gt;
&lt;br /&gt;
Une fois le modèle entraîné, on peut le tester avec l'onglet &amp;quot;Emulator&amp;quot; &lt;br /&gt;
&lt;br /&gt;
[[Fichier:Capture d'écran 2023-12-18 173255.png|néant|vignette|800x800px]]&lt;br /&gt;
&lt;br /&gt;
===Emulation avec NanoEdgeStudio AI===&lt;br /&gt;
&lt;br /&gt;
Dans un premier temps, nous avons essayé d'entraîner le programme à reconnaître les chiffres 1, 2, 3, 4 et 5 sur les doigts d'une main. Les résultats n'étaient pas concluant, il semblerait que le capteur détecte avant tout le volume de la main à la place de détecter le nombre de doigts.&lt;br /&gt;
&lt;br /&gt;
Nous avons ensuite choisi de faire un détecteur de visages capable de faire la différence entre Gabriel et Dann. L'émulation donne des résultats très satisfaisant proche de 100% de réussite&lt;br /&gt;
&lt;br /&gt;
===Configuration du serveur===&lt;br /&gt;
Configuration d'un serveur HTTP sur la machine virtuelle gabidann :&amp;lt;syntaxhighlight lang=&amp;quot;python3&amp;quot;&amp;gt;&lt;br /&gt;
import socket&lt;br /&gt;
from http.server import HTTPServer, SimpleHTTPRequestHandler&lt;br /&gt;
&lt;br /&gt;
class MyHandler(SimpleHTTPRequestHandler):&lt;br /&gt;
  def do_GET(self):&lt;br /&gt;
    if self.path == '/ip':&lt;br /&gt;
      self.send_response(200)&lt;br /&gt;
      self.send_header('Content-type', 'text/html')&lt;br /&gt;
      self.end_headers()&lt;br /&gt;
      self.wfile.write(f'Your IP address is {self.client_address[0]}'.encode())&lt;br /&gt;
      return&lt;br /&gt;
    else:&lt;br /&gt;
      return SimpleHTTPRequestHandler.do_GET(self)&lt;br /&gt;
&lt;br /&gt;
class HTTPServerV6(HTTPServer):&lt;br /&gt;
  address_family = socket.AF_INET6&lt;br /&gt;
&lt;br /&gt;
def main():&lt;br /&gt;
  server = HTTPServerV6(('::', 8080), MyHandler)&lt;br /&gt;
  server.serve_forever()&lt;br /&gt;
&lt;br /&gt;
if __name__ == '__main__':&lt;br /&gt;
  main()&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Pour se connecter au serveur depuis un navigateur, on peut ouvrir un navigateur depuis la zabeth et y accéder avec l'adresse : ''[&amp;lt;ipv6_VM&amp;gt;]:&amp;lt;port&amp;gt;''. Dans notre cas, le serveur écoute le port '''8080'''.&lt;br /&gt;
&lt;br /&gt;
La page index.html s'affiche par défaut lorsque l'on se connecte au serveur HTTP :&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;html&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;!DOCTYPE html&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;html lang=&amp;quot;fr&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;head&amp;gt;&lt;br /&gt;
	&amp;lt;meta charset=&amp;quot;UTF-8&amp;quot;&amp;gt;&lt;br /&gt;
	&amp;lt;title&amp;gt;Gabidann&amp;lt;/title&amp;gt;&lt;br /&gt;
&amp;lt;/head&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;body&amp;gt;&lt;br /&gt;
	&amp;lt;h1&amp;gt;Bienvenue sur Gabidann !&amp;lt;h1&amp;gt;&lt;br /&gt;
	&amp;lt;div id=&amp;quot;data&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/body&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/html&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;Nous avons également testé la communication en TCP avec l'utilitaire socat&lt;br /&gt;
&lt;br /&gt;
Nous avons créé un serveur python en TCP. Nous pouvons maintenant envoyer des messages du client ( raspberry ) au serveur (VM Xen). Nous nous servirons de cette architecture pour envoyer les données du Nucleo à la Vm Xen &lt;br /&gt;
&lt;br /&gt;
Une fois le modèle entrainé et les tests concluants, on peut déployer notre modèle sur n'importe quel appareils linux ou windows. Pour cela, on va dans l'onglet deployment et on télécharge notre librairie personnalisée.  &lt;br /&gt;
&lt;br /&gt;
===Déployement du modèle===&lt;br /&gt;
&lt;br /&gt;
On peut lui passer un fichier CSV contenant les données brutes du capteur et grâce au fichier knowledge.dat, l'émulateur est capable de faire la différence entre les situations&amp;lt;syntaxhighlight lang=&amp;quot;bat&amp;quot;&amp;gt;&lt;br /&gt;
PS C:\Users\gabyt\Documents\Gaby\emulators&amp;gt; .\NanoEdgeAI_Class_Emulator.exe neai_classification --knowledge_path .\knowledge.dat --file class_file.csv&lt;br /&gt;
{&lt;br /&gt;
        &amp;quot;status&amp;quot;: &amp;quot;classification&amp;quot;,&lt;br /&gt;
        &amp;quot;lib_id&amp;quot;: &amp;quot;6581a85925c3e0368b2c1e60&amp;quot;,&lt;br /&gt;
        &amp;quot;input&amp;quot;: &amp;quot;class_file.csv&amp;quot;,&lt;br /&gt;
        &amp;quot;results&amp;quot;: [&lt;br /&gt;
                {&amp;quot;signal&amp;quot;: 1, &amp;quot;line&amp;quot;: 1, &amp;quot;class_status&amp;quot;: 1, &amp;quot;class_name&amp;quot;: &amp;quot;plat&amp;quot;, &amp;quot;class_proba&amp;quot;: [0.98, 0.02]},&lt;br /&gt;
                {&amp;quot;signal&amp;quot;: 2, &amp;quot;line&amp;quot;: 2, &amp;quot;class_status&amp;quot;: 1, &amp;quot;class_name&amp;quot;: &amp;quot;boule&amp;quot;, &amp;quot;class_proba&amp;quot;: [0.94, 0.06]},&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;/div&gt;</summary>
		<author><name>Gthomas</name></author>
	</entry>
	<entry>
		<id>https://wiki-se.plil.fr/mediawiki/index.php?title=RodenburgThomas&amp;diff=3570</id>
		<title>RodenburgThomas</title>
		<link rel="alternate" type="text/html" href="https://wiki-se.plil.fr/mediawiki/index.php?title=RodenburgThomas&amp;diff=3570"/>
		<updated>2023-12-20T09:11:15Z</updated>

		<summary type="html">&lt;p&gt;Gthomas : /* Séance du 20/12/2023 */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;=Le binôme=&lt;br /&gt;
&lt;br /&gt;
Le binôme est constitué de 2 élèves de SE5-SC :&lt;br /&gt;
* Dann RODENBURG&lt;br /&gt;
* Gabriel THOMAS&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=Objectifs= &lt;br /&gt;
&lt;br /&gt;
Le but de ce TP est de créer un réseau de systèmes communicants en partant d'un capteur XNucléo 53L5A1 pour finir sur une machine virtuelle Xen.&lt;br /&gt;
La particularité est d'intégrer une composante de Machine Learning  &lt;br /&gt;
&lt;br /&gt;
[[Fichier:Capture d'écran 2023-12-19 151237.png|néant|vignette|800x800px]]&lt;br /&gt;
&lt;br /&gt;
=Compte rendu des séances=&lt;br /&gt;
&lt;br /&gt;
==Séance du 04/12/2023==&lt;br /&gt;
===Création de la machine virtuelle===&lt;br /&gt;
Création d'une machine virtuelle '''gabidann''' sur le serveur chassiron :&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;xen-create-image --hostname=gabidann --force --dist=bookworm --size=10G --memory=10G --dir=/usr/local/xen --password=glopglop --dhcp --bridge=bridgeStudents&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
La machine virtuelle est à présent connectée au WiFi.&lt;br /&gt;
&lt;br /&gt;
Après cela, nous avons configuré la machine virtuelle selon l'énoncé du TP en faisant un xen console gabidann. Nous avons ensuite participé à la mise en place du point d'accès WiFi.&lt;br /&gt;
&lt;br /&gt;
===Premières observations du capteur===&lt;br /&gt;
De plus nous avons observé le retour du capteur de distance Nucleo-53L5A1 avec l'outil minicom. Le contenu envoyé par le capteur était compréhensible avec une fréquence de 460 800 bauds ; sur minicom, on a pu constater que le capteur nous envoie des valeurs qui dépendent de la distance entre celui-ci et un obstacle.&lt;br /&gt;
&lt;br /&gt;
===Raspberry===&lt;br /&gt;
D'un autre côté, nous avons branché la Raspberry Pi à l'ordinateur selon le pinout fourni dans la documentation.&lt;br /&gt;
&lt;br /&gt;
[[Fichier:20231218 085218.jpg|vignette|néant]]&lt;br /&gt;
&lt;br /&gt;
Enfin, nous avons activé la communication UART de la Raspberry Pi afin de pouvoir communiquer avec. En fin de séance, nous étions en train de vérifier que la Raspberry Pi répondait bien, même en ayant ajouté la ligne enable_uart=1 dans le fichier config.txt de la Raspberry.&lt;br /&gt;
&lt;br /&gt;
==Séance du 18/12/2023==&lt;br /&gt;
===Configuration de la Raspberry===&lt;br /&gt;
Nous avons résolu le problème de la Raspberry qui ne répondait pas. Cela était dû à l'alimentation : brancher la carte en USBC résoud le problème. Cependant, nous recevons une erreur l'erreur EXT4-fs error (device mmcblk0p2).&lt;br /&gt;
Le problème venait des arguments saisis lors du lancement de Minicom. Avec la commande suivante, il est à présent possible de se connecter sur la Raspberry : &amp;lt;code&amp;gt;minicom -D /dev/ttyUSB0 -b 115200&amp;lt;/code&amp;gt;&lt;br /&gt;
Dans la Raspberry, nous avons configuré une interface réseau wlan0 pour se connecter à WiFi_IE_1 :&lt;br /&gt;
    auto wlan0&lt;br /&gt;
    iface wlan0 inet dhcp&lt;br /&gt;
    wpa-conf /etc/wpa_supplicant/wpa_supplicant.conf&lt;br /&gt;
A présent à partir de la Raspberry, on peut ping la machine virtuelle sur chassiron avec son IPv6.&lt;br /&gt;
&lt;br /&gt;
===Configuration du capteur de distance===&lt;br /&gt;
Un programme était déjà présent sur le capteur. On a téléchargé le logiciel STM32CubeIDE pour pouvoir éditer du code et le téléverser sur le capteur. Nous avons testé de téléverser un programme d'exemple dont voici le résultat :&lt;br /&gt;
[[Fichier:Screenshot 2023-12-18 13-12-19.jpg|vignette|néant|700x700px]]&lt;br /&gt;
&lt;br /&gt;
Nous avons modifié ce programme afin d'effectuer un formatage des données transmises par le capteur sous le format ''&amp;lt;distance&amp;gt;,'' pour chaque valeur. Grâce à ce formatage, il est à présent possible d'utiliser les données reçues par le logiciel NanoEdgeStudio AI pour la partie Machine Learning.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Pour recevoir les valeurs de manière exploitable, il faut modifier le code Exemple dans le logiciel STM Cube IDE&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Capture d'écran 2023-12-20 084719.png|néant|vignette|800x800px]]&lt;br /&gt;
&lt;br /&gt;
L'objectif est d'obtenir une liste séparée par des virgules, il a donc fallu supprimer les espaces et les barres verticales de la fonction d'affichage ainsi que les statuts de chacun des capteurs :&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
static void print_result(RANGING_SENSOR_Result_t *Result)&lt;br /&gt;
{&lt;br /&gt;
  int8_t j;&lt;br /&gt;
  int8_t k;&lt;br /&gt;
  int8_t l;&lt;br /&gt;
  uint8_t zones_per_line;&lt;br /&gt;
  zones_per_line = ((Profile.RangingProfile == RS_PROFILE_8x8_AUTONOMOUS) ||&lt;br /&gt;
         (Profile.RangingProfile == RS_PROFILE_8x8_CONTINUOUS)) ? 8 : 4;&lt;br /&gt;
  for (j = 0; j &amp;lt; Result-&amp;gt;NumberOfZones; j += zones_per_line)&lt;br /&gt;
  {&lt;br /&gt;
    for (l = 0; l &amp;lt; RANGING_SENSOR_NB_TARGET_PER_ZONE; l++)&lt;br /&gt;
    {&lt;br /&gt;
      /* Print distance and status */&lt;br /&gt;
      for (k = (zones_per_line - 1); k &amp;gt;= 0; k--)&lt;br /&gt;
      {&lt;br /&gt;
        if (Result-&amp;gt;ZoneResult[j+k].NumberOfTargets &amp;gt; 0)&lt;br /&gt;
          printf(&amp;quot;%ld,&amp;quot;,(long)Result-&amp;gt;ZoneResult[j+k].Distance[l]);&lt;br /&gt;
      }&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
  printf(&amp;quot;\n&amp;quot;);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;On passe ensuite sur Nano Edge Studio pour définir les signaux dans l'onglet &amp;quot;Signals&amp;quot; et entraîner le modèle dans l'onglet &amp;quot;Benchmark&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Capture d'écran 2023-12-18 172047.png|néant|vignette|800x800px]]&lt;br /&gt;
&lt;br /&gt;
Une fois le modèle entraîné, on peut le tester avec l'onglet &amp;quot;Emulator&amp;quot; &lt;br /&gt;
&lt;br /&gt;
[[Fichier:Capture d'écran 2023-12-18 173255.png|néant|vignette|800x800px]]&lt;br /&gt;
&lt;br /&gt;
===Emulation avec NanoEdgeStudio AI===&lt;br /&gt;
&lt;br /&gt;
Dans un premier temps, nous avons essayé d'entraîner le programme à reconnaître les chiffres 1, 2, 3, 4 et 5 sur les doigts d'une main. Les résultats n'étaient pas concluant, il semblerait que le capteur détecte avant tout le volume de la main à la place de détecter le nombre de doigts.&lt;br /&gt;
&lt;br /&gt;
Nous avons ensuite choisi de faire un détecteur de visages capable de faire la différence entre Gabriel et Dann. L'émulation donne des résultats très satisfaisant proche de 100% de réussite&lt;br /&gt;
&lt;br /&gt;
===Configuration du serveur===&lt;br /&gt;
Configuration d'un serveur HTTP sur la machine virtuelle gabidann :&amp;lt;syntaxhighlight lang=&amp;quot;python3&amp;quot;&amp;gt;&lt;br /&gt;
import socket&lt;br /&gt;
from http.server import HTTPServer, SimpleHTTPRequestHandler&lt;br /&gt;
&lt;br /&gt;
class MyHandler(SimpleHTTPRequestHandler):&lt;br /&gt;
  def do_GET(self):&lt;br /&gt;
    if self.path == '/ip':&lt;br /&gt;
      self.send_response(200)&lt;br /&gt;
      self.send_header('Content-type', 'text/html')&lt;br /&gt;
      self.end_headers()&lt;br /&gt;
      self.wfile.write(f'Your IP address is {self.client_address[0]}'.encode())&lt;br /&gt;
      return&lt;br /&gt;
    else:&lt;br /&gt;
      return SimpleHTTPRequestHandler.do_GET(self)&lt;br /&gt;
&lt;br /&gt;
class HTTPServerV6(HTTPServer):&lt;br /&gt;
  address_family = socket.AF_INET6&lt;br /&gt;
&lt;br /&gt;
def main():&lt;br /&gt;
  server = HTTPServerV6(('::', 8080), MyHandler)&lt;br /&gt;
  server.serve_forever()&lt;br /&gt;
&lt;br /&gt;
if __name__ == '__main__':&lt;br /&gt;
  main()&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Pour se connecter au serveur depuis un navigateur, on peut ouvrir un navigateur depuis la zabeth et y accéder avec l'adresse : ''[&amp;lt;ipv6_VM&amp;gt;]:&amp;lt;port&amp;gt;''. Dans notre cas, le serveur écoute le port '''8080'''.&lt;br /&gt;
&lt;br /&gt;
La page index.html s'affiche par défaut lorsque l'on se connecte au serveur HTTP :&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;html&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;!DOCTYPE html&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;html lang=&amp;quot;fr&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;head&amp;gt;&lt;br /&gt;
	&amp;lt;meta charset=&amp;quot;UTF-8&amp;quot;&amp;gt;&lt;br /&gt;
	&amp;lt;title&amp;gt;Gabidann&amp;lt;/title&amp;gt;&lt;br /&gt;
&amp;lt;/head&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;body&amp;gt;&lt;br /&gt;
	&amp;lt;h1&amp;gt;Bienvenue sur Gabidann !&amp;lt;h1&amp;gt;&lt;br /&gt;
	&amp;lt;div id=&amp;quot;data&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/body&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/html&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;Nous avons également testé la communication en TCP avec l'utilitaire socat&lt;br /&gt;
&lt;br /&gt;
Nous avons créé un serveur python en TCP. Nous pouvons maintenant envoyer des messages du client ( raspberry ) au serveur (VM Xen). Nous nous servirons de cette architecture pour envoyer les données du Nucleo à la Vm Xen &lt;br /&gt;
&lt;br /&gt;
Une fois le modèle entrainé et les tests concluants, on peut déployer notre modèle sur n'importe quel appareils linux ou windows. Pour cela, on va dans l'onglet deployment et on télécharge notre librairie personnalisée.  &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
On peut lui passer un fichier CSV contenant les données brutes du capteur et grâce au fichier knowledge.dat, l'émulateur est capable de faire la différence entre les situations&amp;lt;syntaxhighlight lang=&amp;quot;bat&amp;quot;&amp;gt;&lt;br /&gt;
PS C:\Users\gabyt\Documents\Gaby\emulators&amp;gt; .\NanoEdgeAI_Class_Emulator.exe neai_classification --knowledge_path .\knowledge.dat --file class_file.csv&lt;br /&gt;
{&lt;br /&gt;
        &amp;quot;status&amp;quot;: &amp;quot;classification&amp;quot;,&lt;br /&gt;
        &amp;quot;lib_id&amp;quot;: &amp;quot;6581a85925c3e0368b2c1e60&amp;quot;,&lt;br /&gt;
        &amp;quot;input&amp;quot;: &amp;quot;class_file.csv&amp;quot;,&lt;br /&gt;
        &amp;quot;results&amp;quot;: [&lt;br /&gt;
                {&amp;quot;signal&amp;quot;: 1, &amp;quot;line&amp;quot;: 1, &amp;quot;class_status&amp;quot;: 1, &amp;quot;class_name&amp;quot;: &amp;quot;plat&amp;quot;, &amp;quot;class_proba&amp;quot;: [0.98, 0.02]},&lt;br /&gt;
                {&amp;quot;signal&amp;quot;: 2, &amp;quot;line&amp;quot;: 2, &amp;quot;class_status&amp;quot;: 1, &amp;quot;class_name&amp;quot;: &amp;quot;boule&amp;quot;, &amp;quot;class_proba&amp;quot;: [0.94, 0.06]},&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;/div&gt;</summary>
		<author><name>Gthomas</name></author>
	</entry>
	<entry>
		<id>https://wiki-se.plil.fr/mediawiki/index.php?title=RodenburgThomas&amp;diff=3550</id>
		<title>RodenburgThomas</title>
		<link rel="alternate" type="text/html" href="https://wiki-se.plil.fr/mediawiki/index.php?title=RodenburgThomas&amp;diff=3550"/>
		<updated>2023-12-20T07:58:36Z</updated>

		<summary type="html">&lt;p&gt;Gthomas : /* Configuration du capteur de distance */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;=Le binôme=&lt;br /&gt;
&lt;br /&gt;
Le binôme est constitué de 2 élèves de SE5-SC :&lt;br /&gt;
* Dann RODENBURG&lt;br /&gt;
* Gabriel THOMAS&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=Objectifs= &lt;br /&gt;
&lt;br /&gt;
Le but de ce TP est de créer un réseau de systèmes communicants en partant d'un capteur XNucléo 53L5A1 pour finir sur une machine virtuelle Xen.&lt;br /&gt;
La particularité est d'intégrer une composante de Machine Learning  &lt;br /&gt;
&lt;br /&gt;
[[Fichier:Capture d'écran 2023-12-19 151237.png|néant|vignette|800x800px]]&lt;br /&gt;
&lt;br /&gt;
=Compte rendu des séances=&lt;br /&gt;
&lt;br /&gt;
==Séance du 04/12/2023==&lt;br /&gt;
===Création de la machine virtuelle===&lt;br /&gt;
Création d'une machine virtuelle '''gabidann''' sur le serveur chassiron :&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;xen-create-image --hostname=gabidann --force --dist=bookworm --size=10G --memory=10G --dir=/usr/local/xen --password=glopglop --dhcp --bridge=bridgeStudents&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
La machine virtuelle est à présent connectée au WiFi.&lt;br /&gt;
&lt;br /&gt;
Après cela, nous avons configuré la machine virtuelle selon l'énoncé du TP en faisant un xen console gabidann. Nous avons ensuite participé à la mise en place du point d'accès WiFi.&lt;br /&gt;
&lt;br /&gt;
===Premières observations du capteur===&lt;br /&gt;
De plus nous avons observé le retour du capteur de distance Nucleo-53L5A1 avec l'outil minicom. Le contenu envoyé par le capteur était compréhensible avec une fréquence de 460 800 bauds ; sur minicom, on a pu constater que le capteur nous envoie des valeurs qui dépendent de la distance entre celui-ci et un obstacle.&lt;br /&gt;
&lt;br /&gt;
===Raspberry===&lt;br /&gt;
D'un autre côté, nous avons branché la Raspberry Pi à l'ordinateur selon le pinout fourni dans la documentation.&lt;br /&gt;
&lt;br /&gt;
[[Fichier:20231218 085218.jpg|vignette|néant]]&lt;br /&gt;
&lt;br /&gt;
Enfin, nous avons activé la communication UART de la Raspberry Pi afin de pouvoir communiquer avec. En fin de séance, nous étions en train de vérifier que la Raspberry Pi répondait bien, même en ayant ajouté la ligne enable_uart=1 dans le fichier config.txt de la Raspberry.&lt;br /&gt;
&lt;br /&gt;
==Séance du 18/12/2023==&lt;br /&gt;
===Configuration de la Raspberry===&lt;br /&gt;
Nous avons résolu le problème de la Raspberry qui ne répondait pas. Cela était dû à l'alimentation : brancher la carte en USBC résoud le problème. Cependant, nous recevons une erreur l'erreur EXT4-fs error (device mmcblk0p2).&lt;br /&gt;
Le problème venait des arguments saisis lors du lancement de Minicom. Avec la commande suivante, il est à présent possible de se connecter sur la Raspberry : &amp;lt;code&amp;gt;minicom -D /dev/ttyUSB0 -b 115200&amp;lt;/code&amp;gt;&lt;br /&gt;
Dans la Raspberry, nous avons configuré une interface réseau wlan0 pour se connecter à WiFi_IE_1 :&lt;br /&gt;
    auto wlan0&lt;br /&gt;
    iface wlan0 inet dhcp&lt;br /&gt;
    wpa-conf /etc/wpa_supplicant/wpa_supplicant.conf&lt;br /&gt;
A présent à partir de la Raspberry, on peut ping la machine virtuelle sur chassiron avec son IPv6.&lt;br /&gt;
&lt;br /&gt;
===Configuration du capteur de distance===&lt;br /&gt;
Un programme était déjà présent sur le capteur. On a téléchargé le logiciel STM32CubeIDE pour pouvoir éditer du code et le téléverser sur le capteur. Nous avons testé de téléverser un programme d'exemple dont voici le résultat :&lt;br /&gt;
[[Fichier:Screenshot 2023-12-18 13-12-19.jpg|vignette|néant|700x700px]]&lt;br /&gt;
&lt;br /&gt;
Nous avons modifié ce programme afin d'effectuer un formatage des données transmises par le capteur sous le format ''&amp;lt;distance&amp;gt;,'' pour chaque valeur. Grâce à ce formatage, il est à présent possible d'utiliser les données reçues par le logiciel NanoEdgeStudio AI pour la partie Machine Learning.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Pour recevoir les valeurs de manière exploitable, il faut modifier le code Exemple dans le logiciel STM Cube IDE&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Capture d'écran 2023-12-20 084719.png|néant|vignette|800x800px]]&lt;br /&gt;
&lt;br /&gt;
L'objectif est d'obtenir une liste séparée par des virgules, il a donc fallu supprimer les espaces et les barres verticales de la fonction d'affichage ainsi que les statuts de chacun des capteurs :&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
static void print_result(RANGING_SENSOR_Result_t *Result)&lt;br /&gt;
{&lt;br /&gt;
  int8_t j;&lt;br /&gt;
  int8_t k;&lt;br /&gt;
  int8_t l;&lt;br /&gt;
  uint8_t zones_per_line;&lt;br /&gt;
  zones_per_line = ((Profile.RangingProfile == RS_PROFILE_8x8_AUTONOMOUS) ||&lt;br /&gt;
         (Profile.RangingProfile == RS_PROFILE_8x8_CONTINUOUS)) ? 8 : 4;&lt;br /&gt;
  for (j = 0; j &amp;lt; Result-&amp;gt;NumberOfZones; j += zones_per_line)&lt;br /&gt;
  {&lt;br /&gt;
    for (l = 0; l &amp;lt; RANGING_SENSOR_NB_TARGET_PER_ZONE; l++)&lt;br /&gt;
    {&lt;br /&gt;
      /* Print distance and status */&lt;br /&gt;
      for (k = (zones_per_line - 1); k &amp;gt;= 0; k--)&lt;br /&gt;
      {&lt;br /&gt;
        if (Result-&amp;gt;ZoneResult[j+k].NumberOfTargets &amp;gt; 0)&lt;br /&gt;
          printf(&amp;quot;%ld,&amp;quot;,(long)Result-&amp;gt;ZoneResult[j+k].Distance[l]);&lt;br /&gt;
      }&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
  printf(&amp;quot;\n&amp;quot;);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;On passe ensuite sur Nano Edge Studio pour définir les signaux dans l'onglet &amp;quot;Signals&amp;quot; et entraîner le modèle dans l'onglet &amp;quot;Benchmark&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Capture d'écran 2023-12-18 172047.png|néant|vignette|800x800px]]&lt;br /&gt;
&lt;br /&gt;
Une fois le modèle entraîné, on peut le tester avec l'onglet &amp;quot;Emulator&amp;quot; &lt;br /&gt;
&lt;br /&gt;
[[Fichier:Capture d'écran 2023-12-18 173255.png|néant|vignette|800x800px]]&lt;br /&gt;
&lt;br /&gt;
===Emulation avec NanoEdgeStudio AI===&lt;br /&gt;
&lt;br /&gt;
Dans un premier temps, nous avons essayé d'entraîner le programme à reconnaître les chiffres 1, 2, 3, 4 et 5 sur les doigts d'une main. Les résultats n'étaient pas concluant, il semblerait que le capteur détecte avant tout le volume de la main à la place de détecter le nombre de doigts.&lt;br /&gt;
&lt;br /&gt;
===Configuration du serveur===&lt;br /&gt;
Configuration d'un serveur HTTP sur la machine virtuelle gabidann :&amp;lt;syntaxhighlight lang=&amp;quot;python3&amp;quot;&amp;gt;&lt;br /&gt;
import socket&lt;br /&gt;
from http.server import HTTPServer, SimpleHTTPRequestHandler&lt;br /&gt;
&lt;br /&gt;
class MyHandler(SimpleHTTPRequestHandler):&lt;br /&gt;
  def do_GET(self):&lt;br /&gt;
    if self.path == '/ip':&lt;br /&gt;
      self.send_response(200)&lt;br /&gt;
      self.send_header('Content-type', 'text/html')&lt;br /&gt;
      self.end_headers()&lt;br /&gt;
      self.wfile.write(f'Your IP address is {self.client_address[0]}'.encode())&lt;br /&gt;
      return&lt;br /&gt;
    else:&lt;br /&gt;
      return SimpleHTTPRequestHandler.do_GET(self)&lt;br /&gt;
&lt;br /&gt;
class HTTPServerV6(HTTPServer):&lt;br /&gt;
  address_family = socket.AF_INET6&lt;br /&gt;
&lt;br /&gt;
def main():&lt;br /&gt;
  server = HTTPServerV6(('::', 8080), MyHandler)&lt;br /&gt;
  server.serve_forever()&lt;br /&gt;
&lt;br /&gt;
if __name__ == '__main__':&lt;br /&gt;
  main()&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Pour se connecter au serveur depuis un navigateur, on peut ouvrir un navigateur depuis la zabeth et y accéder avec l'adresse : ''[&amp;lt;ipv6_VM&amp;gt;]:&amp;lt;port&amp;gt;''. Dans notre cas, le serveur écoute le port '''8080'''.&lt;br /&gt;
&lt;br /&gt;
La page index.html s'affiche par défaut lorsque l'on se connecte au serveur HTTP :&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;html&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;!DOCTYPE html&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;html lang=&amp;quot;fr&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;head&amp;gt;&lt;br /&gt;
	&amp;lt;meta charset=&amp;quot;UTF-8&amp;quot;&amp;gt;&lt;br /&gt;
	&amp;lt;title&amp;gt;Gabidann&amp;lt;/title&amp;gt;&lt;br /&gt;
&amp;lt;/head&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;body&amp;gt;&lt;br /&gt;
	&amp;lt;h1&amp;gt;Bienvenue sur Gabidann !&amp;lt;h1&amp;gt;&lt;br /&gt;
	&amp;lt;div id=&amp;quot;data&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/body&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/html&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;Nous avons également testé la communication en TCP avec l'utilitaire socat&lt;br /&gt;
&lt;br /&gt;
==Séance du 19/12/2023==&lt;br /&gt;
&lt;br /&gt;
Nous avons créé un serveur python en TCP. Nous pouvons maintenant envoyer des messages du client ( raspberry ) au serveur (VM Xen). Nous nous servirons de cette architecture pour envoyer les données du Nucleo à la Vm Xen &lt;br /&gt;
&lt;br /&gt;
==Séance du 20/12/2023==&lt;br /&gt;
Une fois le modèle entrainé et les tests concluants, on peut déployer notre modèle sur n'importe quel appareils linux ou windows. Pour cela, on va dans l'onglet deployment et on télécharge notre librairie personnalisée. &lt;br /&gt;
&lt;br /&gt;
On peut lui passer un fichier CSV contenant les données brutes du capteur et grâce au fichier knowledge.dat, l'émulateur est capable de faire la différence entre les situations&amp;lt;syntaxhighlight lang=&amp;quot;bat&amp;quot;&amp;gt;&lt;br /&gt;
PS C:\Users\gabyt\Documents\Gaby\emulators&amp;gt; .\NanoEdgeAI_Class_Emulator.exe neai_classification --knowledge_path .\knowledge.dat --file class_file.csv&lt;br /&gt;
{&lt;br /&gt;
        &amp;quot;status&amp;quot;: &amp;quot;classification&amp;quot;,&lt;br /&gt;
        &amp;quot;lib_id&amp;quot;: &amp;quot;6581a85925c3e0368b2c1e60&amp;quot;,&lt;br /&gt;
        &amp;quot;input&amp;quot;: &amp;quot;class_file.csv&amp;quot;,&lt;br /&gt;
        &amp;quot;results&amp;quot;: [&lt;br /&gt;
                {&amp;quot;signal&amp;quot;: 1, &amp;quot;line&amp;quot;: 1, &amp;quot;class_status&amp;quot;: 1, &amp;quot;class_name&amp;quot;: &amp;quot;plat&amp;quot;, &amp;quot;class_proba&amp;quot;: [0.98, 0.02]},&lt;br /&gt;
                {&amp;quot;signal&amp;quot;: 2, &amp;quot;line&amp;quot;: 2, &amp;quot;class_status&amp;quot;: 1, &amp;quot;class_name&amp;quot;: &amp;quot;boule&amp;quot;, &amp;quot;class_proba&amp;quot;: [0.94, 0.06]},&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;/div&gt;</summary>
		<author><name>Gthomas</name></author>
	</entry>
	<entry>
		<id>https://wiki-se.plil.fr/mediawiki/index.php?title=RodenburgThomas&amp;diff=3547</id>
		<title>RodenburgThomas</title>
		<link rel="alternate" type="text/html" href="https://wiki-se.plil.fr/mediawiki/index.php?title=RodenburgThomas&amp;diff=3547"/>
		<updated>2023-12-20T07:53:17Z</updated>

		<summary type="html">&lt;p&gt;Gthomas : /* Configuration du capteur de distance */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;=Le binôme=&lt;br /&gt;
&lt;br /&gt;
Le binôme est constitué de 2 élèves de SE5-SC :&lt;br /&gt;
* Dann RODENBURG&lt;br /&gt;
* Gabriel THOMAS&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=Objectifs= &lt;br /&gt;
&lt;br /&gt;
Le but de ce TP est de créer un réseau de systèmes communicants en partant d'un capteur XNucléo 53L5A1 pour finir sur une machine virtuelle Xen.&lt;br /&gt;
La particularité est d'intégrer une composante de Machine Learning  &lt;br /&gt;
&lt;br /&gt;
[[Fichier:Capture d'écran 2023-12-19 151237.png|néant|vignette|800x800px]]&lt;br /&gt;
&lt;br /&gt;
=Compte rendu des séances=&lt;br /&gt;
&lt;br /&gt;
==Séance du 04/12/2023==&lt;br /&gt;
===Création de la machine virtuelle===&lt;br /&gt;
Création d'une machine virtuelle '''gabidann''' sur le serveur chassiron :&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;xen-create-image --hostname=gabidann --force --dist=bookworm --size=10G --memory=10G --dir=/usr/local/xen --password=glopglop --dhcp --bridge=bridgeStudents&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
La machine virtuelle est à présent connectée au WiFi.&lt;br /&gt;
&lt;br /&gt;
Après cela, nous avons configuré la machine virtuelle selon l'énoncé du TP en faisant un xen console gabidann. Nous avons ensuite participé à la mise en place du point d'accès WiFi.&lt;br /&gt;
&lt;br /&gt;
===Premières observations du capteur===&lt;br /&gt;
De plus nous avons observé le retour du capteur de distance Nucleo-53L5A1 avec l'outil minicom. Le contenu envoyé par le capteur était compréhensible avec une fréquence de 460 800 bauds ; sur minicom, on a pu constater que le capteur nous envoie des valeurs qui dépendent de la distance entre celui-ci et un obstacle.&lt;br /&gt;
&lt;br /&gt;
===Raspberry===&lt;br /&gt;
D'un autre côté, nous avons branché la Raspberry Pi à l'ordinateur selon le pinout fourni dans la documentation.&lt;br /&gt;
&lt;br /&gt;
[[Fichier:20231218 085218.jpg|vignette|néant]]&lt;br /&gt;
&lt;br /&gt;
Enfin, nous avons activé la communication UART de la Raspberry Pi afin de pouvoir communiquer avec. En fin de séance, nous étions en train de vérifier que la Raspberry Pi répondait bien, même en ayant ajouté la ligne enable_uart=1 dans le fichier config.txt de la Raspberry.&lt;br /&gt;
&lt;br /&gt;
==Séance du 18/12/2023==&lt;br /&gt;
===Configuration de la Raspberry===&lt;br /&gt;
Nous avons résolu le problème de la Raspberry qui ne répondait pas. Cela était dû à l'alimentation : brancher la carte en USBC résoud le problème. Cependant, nous recevons une erreur l'erreur EXT4-fs error (device mmcblk0p2).&lt;br /&gt;
Le problème venait des arguments saisis lors du lancement de Minicom. Avec la commande suivante, il est à présent possible de se connecter sur la Raspberry : &amp;lt;code&amp;gt;minicom -D /dev/ttyUSB0 -b 115200&amp;lt;/code&amp;gt;&lt;br /&gt;
Dans la Raspberry, nous avons configuré une interface réseau wlan0 pour se connecter à WiFi_IE_1 :&lt;br /&gt;
    auto wlan0&lt;br /&gt;
    iface wlan0 inet dhcp&lt;br /&gt;
    wpa-conf /etc/wpa_supplicant/wpa_supplicant.conf&lt;br /&gt;
A présent à partir de la Raspberry, on peut ping la machine virtuelle sur chassiron avec son IPv6.&lt;br /&gt;
&lt;br /&gt;
===Configuration du capteur de distance===&lt;br /&gt;
Un programme était déjà présent sur le capteur. On a téléchargé le logiciel STM32CubeIDE pour pouvoir éditer du code et le téléverser sur le capteur. Nous avons testé de téléverser un programme d'exemple dont voici le résultat :&lt;br /&gt;
[[Fichier:Screenshot 2023-12-18 13-12-19.jpg|vignette|néant|600x600px]]&lt;br /&gt;
&lt;br /&gt;
Nous avons modifié ce programme afin d'effectuer un formatage des données transmises par le capteur sous le format ''&amp;lt;distance&amp;gt;,'' pour chaque valeur. Grâce à ce formatage, il est à présent possible d'utiliser les données reçues par le logiciel NanoEdgeStudio AI pour la partie Machine Learning.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Pour recevoir les valeurs de manière exploitable, il faut modifier le code Exemple dans le logiciel STM Cube IDE&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Capture d'écran 2023-12-20 084719.png|néant|vignette|800x800px]]&lt;br /&gt;
&lt;br /&gt;
L'objectif est d'obtenir une liste séparée par des virgules, il a donc fallu supprimer les espaces et les barres verticales de la fonction d'affichage:&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
static void print_result(RANGING_SENSOR_Result_t *Result)&lt;br /&gt;
{&lt;br /&gt;
  int8_t j;&lt;br /&gt;
  int8_t k;&lt;br /&gt;
  int8_t l;&lt;br /&gt;
  uint8_t zones_per_line;&lt;br /&gt;
  zones_per_line = ((Profile.RangingProfile == RS_PROFILE_8x8_AUTONOMOUS) ||&lt;br /&gt;
         (Profile.RangingProfile == RS_PROFILE_8x8_CONTINUOUS)) ? 8 : 4;&lt;br /&gt;
  for (j = 0; j &amp;lt; Result-&amp;gt;NumberOfZones; j += zones_per_line)&lt;br /&gt;
  {&lt;br /&gt;
    for (l = 0; l &amp;lt; RANGING_SENSOR_NB_TARGET_PER_ZONE; l++)&lt;br /&gt;
    {&lt;br /&gt;
      /* Print distance and status */&lt;br /&gt;
      for (k = (zones_per_line - 1); k &amp;gt;= 0; k--)&lt;br /&gt;
      {&lt;br /&gt;
        if (Result-&amp;gt;ZoneResult[j+k].NumberOfTargets &amp;gt; 0)&lt;br /&gt;
          printf(&amp;quot;%ld,&amp;quot;,(long)Result-&amp;gt;ZoneResult[j+k].Distance[l]);&lt;br /&gt;
      }&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
  printf(&amp;quot;\n&amp;quot;);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;On passe ensuite sur Nano Edge Studio pour définir les signaux et entraîner le modèle.&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Capture d'écran 2023-12-18 172047.png|néant|vignette|800x800px]]&lt;br /&gt;
&lt;br /&gt;
Une fois le modèle entraîné, on peut le tester avec l'onglet Emulator &lt;br /&gt;
&lt;br /&gt;
[[Fichier:Capture d'écran 2023-12-18 173255.png|néant|vignette|800x800px]]&lt;br /&gt;
&lt;br /&gt;
===Emulation avec NanoEdgeStudio AI===&lt;br /&gt;
&lt;br /&gt;
Dans un premier temps, nous avons essayé d'entraîner le programme à reconnaître les chiffres 1, 2, 3, 4 et 5 sur les doigts d'une main. Les résultats n'étaient pas concluant, il semblerait que le capteur détecte avant tout le volume de la main à la place de détecter le nombre de doigts.&lt;br /&gt;
&lt;br /&gt;
===Configuration du serveur===&lt;br /&gt;
Configuration d'un serveur HTTP sur la machine virtuelle gabidann :&amp;lt;syntaxhighlight lang=&amp;quot;python3&amp;quot;&amp;gt;&lt;br /&gt;
import socket&lt;br /&gt;
from http.server import HTTPServer, SimpleHTTPRequestHandler&lt;br /&gt;
&lt;br /&gt;
class MyHandler(SimpleHTTPRequestHandler):&lt;br /&gt;
  def do_GET(self):&lt;br /&gt;
    if self.path == '/ip':&lt;br /&gt;
      self.send_response(200)&lt;br /&gt;
      self.send_header('Content-type', 'text/html')&lt;br /&gt;
      self.end_headers()&lt;br /&gt;
      self.wfile.write(f'Your IP address is {self.client_address[0]}'.encode())&lt;br /&gt;
      return&lt;br /&gt;
    else:&lt;br /&gt;
      return SimpleHTTPRequestHandler.do_GET(self)&lt;br /&gt;
&lt;br /&gt;
class HTTPServerV6(HTTPServer):&lt;br /&gt;
  address_family = socket.AF_INET6&lt;br /&gt;
&lt;br /&gt;
def main():&lt;br /&gt;
  server = HTTPServerV6(('::', 8080), MyHandler)&lt;br /&gt;
  server.serve_forever()&lt;br /&gt;
&lt;br /&gt;
if __name__ == '__main__':&lt;br /&gt;
  main()&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Pour se connecter au serveur depuis un navigateur, on peut ouvrir un navigateur depuis la zabeth et y accéder avec l'adresse : ''[&amp;lt;ipv6_VM&amp;gt;]:&amp;lt;port&amp;gt;''. Dans notre cas, le serveur écoute le port '''8080'''.&lt;br /&gt;
&lt;br /&gt;
La page index.html s'affiche par défaut lorsque l'on se connecte au serveur HTTP :&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;html&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;!DOCTYPE html&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;html lang=&amp;quot;fr&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;head&amp;gt;&lt;br /&gt;
	&amp;lt;meta charset=&amp;quot;UTF-8&amp;quot;&amp;gt;&lt;br /&gt;
	&amp;lt;title&amp;gt;Gabidann&amp;lt;/title&amp;gt;&lt;br /&gt;
&amp;lt;/head&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;body&amp;gt;&lt;br /&gt;
	&amp;lt;h1&amp;gt;Bienvenue sur Gabidann !&amp;lt;h1&amp;gt;&lt;br /&gt;
	&amp;lt;div id=&amp;quot;data&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/body&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/html&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;Nous avons également testé la communication en TCP avec l'utilitaire socat&lt;br /&gt;
&lt;br /&gt;
==Séance du 19/12/2023==&lt;br /&gt;
&lt;br /&gt;
Nous avons créé un serveur python en TCP. Nous pouvons maintenant envoyer des messages du client ( raspberry ) au serveur (VM Xen). Nous nous servirons de cette architecture pour envoyer les données du Nucleo à la Vm Xen &lt;br /&gt;
&lt;br /&gt;
==Séance du 20/12/2023==&lt;br /&gt;
Une fois le modèle entrainé et les tests concluants, on peut déployer notre modèle sur n'importe quel appareils linux ou windows. Pour cela, on va dans l'onglet deployment et on télécharge notre librairie personnalisée. &lt;br /&gt;
&lt;br /&gt;
On peut lui passer un fichier CSV contenant les données brutes du capteur et grâce au fichier knowledge.dat, l'émulateur est capable de faire la différence entre les situations&amp;lt;syntaxhighlight lang=&amp;quot;bat&amp;quot;&amp;gt;&lt;br /&gt;
PS C:\Users\gabyt\Documents\Gaby\emulators&amp;gt; .\NanoEdgeAI_Class_Emulator.exe neai_classification --knowledge_path .\knowledge.dat --file class_file.csv&lt;br /&gt;
{&lt;br /&gt;
        &amp;quot;status&amp;quot;: &amp;quot;classification&amp;quot;,&lt;br /&gt;
        &amp;quot;lib_id&amp;quot;: &amp;quot;6581a85925c3e0368b2c1e60&amp;quot;,&lt;br /&gt;
        &amp;quot;input&amp;quot;: &amp;quot;class_file.csv&amp;quot;,&lt;br /&gt;
        &amp;quot;results&amp;quot;: [&lt;br /&gt;
                {&amp;quot;signal&amp;quot;: 1, &amp;quot;line&amp;quot;: 1, &amp;quot;class_status&amp;quot;: 1, &amp;quot;class_name&amp;quot;: &amp;quot;plat&amp;quot;, &amp;quot;class_proba&amp;quot;: [0.98, 0.02]},&lt;br /&gt;
                {&amp;quot;signal&amp;quot;: 2, &amp;quot;line&amp;quot;: 2, &amp;quot;class_status&amp;quot;: 1, &amp;quot;class_name&amp;quot;: &amp;quot;boule&amp;quot;, &amp;quot;class_proba&amp;quot;: [0.94, 0.06]},&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;/div&gt;</summary>
		<author><name>Gthomas</name></author>
	</entry>
	<entry>
		<id>https://wiki-se.plil.fr/mediawiki/index.php?title=Fichier:Capture_d%27%C3%A9cran_2023-12-20_084719.png&amp;diff=3546</id>
		<title>Fichier:Capture d'écran 2023-12-20 084719.png</title>
		<link rel="alternate" type="text/html" href="https://wiki-se.plil.fr/mediawiki/index.php?title=Fichier:Capture_d%27%C3%A9cran_2023-12-20_084719.png&amp;diff=3546"/>
		<updated>2023-12-20T07:52:08Z</updated>

		<summary type="html">&lt;p&gt;Gthomas : &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;glopglop&lt;/div&gt;</summary>
		<author><name>Gthomas</name></author>
	</entry>
	<entry>
		<id>https://wiki-se.plil.fr/mediawiki/index.php?title=RodenburgThomas&amp;diff=3544</id>
		<title>RodenburgThomas</title>
		<link rel="alternate" type="text/html" href="https://wiki-se.plil.fr/mediawiki/index.php?title=RodenburgThomas&amp;diff=3544"/>
		<updated>2023-12-20T07:46:31Z</updated>

		<summary type="html">&lt;p&gt;Gthomas : /* Séance du 20/12/2023 */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;=Le binôme=&lt;br /&gt;
&lt;br /&gt;
Le binôme est constitué de 2 élèves de SE5-SC :&lt;br /&gt;
* Dann RODENBURG&lt;br /&gt;
* Gabriel THOMAS&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=Objectifs= &lt;br /&gt;
&lt;br /&gt;
Le but de ce TP est de créer un réseau de systèmes communicants en partant d'un capteur XNucléo 53L5A1 pour finir sur une machine virtuelle Xen.&lt;br /&gt;
La particularité est d'intégrer une composante de Machine Learning  &lt;br /&gt;
&lt;br /&gt;
[[Fichier:Capture d'écran 2023-12-19 151237.png|néant|vignette|800x800px]]&lt;br /&gt;
&lt;br /&gt;
=Compte rendu des séances=&lt;br /&gt;
&lt;br /&gt;
==Séance du 04/12/2023==&lt;br /&gt;
===Création de la machine virtuelle===&lt;br /&gt;
Création d'une machine virtuelle '''gabidann''' sur le serveur chassiron :&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;xen-create-image --hostname=gabidann --force --dist=bookworm --size=10G --memory=10G --dir=/usr/local/xen --password=glopglop --dhcp --bridge=bridgeStudents&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
La machine virtuelle est à présent connectée au WiFi.&lt;br /&gt;
&lt;br /&gt;
Après cela, nous avons configuré la machine virtuelle selon l'énoncé du TP en faisant un xen console gabidann. Nous avons ensuite participé à la mise en place du point d'accès WiFi.&lt;br /&gt;
&lt;br /&gt;
===Premières observations du capteur===&lt;br /&gt;
De plus nous avons observé le retour du capteur de distance Nucleo-53L5A1 avec l'outil minicom. Le contenu envoyé par le capteur était compréhensible avec une fréquence de 460 800 bauds ; sur minicom, on a pu constater que le capteur nous envoie des valeurs qui dépendent de la distance entre celui-ci et un obstacle.&lt;br /&gt;
&lt;br /&gt;
===Raspberry===&lt;br /&gt;
D'un autre côté, nous avons branché la Raspberry Pi à l'ordinateur selon le pinout fourni dans la documentation.&lt;br /&gt;
&lt;br /&gt;
[[Fichier:20231218 085218.jpg|vignette|néant]]&lt;br /&gt;
&lt;br /&gt;
Enfin, nous avons activé la communication UART de la Raspberry Pi afin de pouvoir communiquer avec. En fin de séance, nous étions en train de vérifier que la Raspberry Pi répondait bien, même en ayant ajouté la ligne enable_uart=1 dans le fichier config.txt de la Raspberry.&lt;br /&gt;
&lt;br /&gt;
==Séance du 18/12/2023==&lt;br /&gt;
===Configuration de la Raspberry===&lt;br /&gt;
Nous avons résolu le problème de la Raspberry qui ne répondait pas. Cela était dû à l'alimentation : brancher la carte en USBC résoud le problème. Cependant, nous recevons une erreur l'erreur EXT4-fs error (device mmcblk0p2).&lt;br /&gt;
Le problème venait des arguments saisis lors du lancement de Minicom. Avec la commande suivante, il est à présent possible de se connecter sur la Raspberry : &amp;lt;code&amp;gt;minicom -D /dev/ttyUSB0 -b 115200&amp;lt;/code&amp;gt;&lt;br /&gt;
Dans la Raspberry, nous avons configuré une interface réseau wlan0 pour se connecter à WiFi_IE_1 :&lt;br /&gt;
    auto wlan0&lt;br /&gt;
    iface wlan0 inet dhcp&lt;br /&gt;
    wpa-conf /etc/wpa_supplicant/wpa_supplicant.conf&lt;br /&gt;
A présent à partir de la Raspberry, on peut ping la machine virtuelle sur chassiron avec son IPv6.&lt;br /&gt;
&lt;br /&gt;
===Configuration du capteur de distance===&lt;br /&gt;
Un programme était déjà présent sur le capteur. On a téléchargé le logiciel STM32CubeIDE pour pouvoir éditer du code et le téléverser sur le capteur. Nous avons testé de téléverser un programme d'exemple dont voici le résultat :&lt;br /&gt;
[[Fichier:Screenshot 2023-12-18 13-12-19.jpg|vignette|néant|600x600px]]&lt;br /&gt;
&lt;br /&gt;
Nous avons modifié ce programme afin d'effectuer un formatage des données transmises par le capteur sous le format ''&amp;lt;distance&amp;gt;,'' pour chaque valeur. Grâce à ce formatage, il est à présent possible d'utiliser les données reçues par le logiciel NanoEdgeStudio AI pour la partie Machine Learning.&lt;br /&gt;
&lt;br /&gt;
Pour recevoir les valeurs de manière exploitable, il faut modifier le code Exemple pour obtenir une liste séparée par des virgules, il a donc fallu supprimer les espaces et les barres verticales :&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
static void print_result(RANGING_SENSOR_Result_t *Result)&lt;br /&gt;
{&lt;br /&gt;
  int8_t j;&lt;br /&gt;
  int8_t k;&lt;br /&gt;
  int8_t l;&lt;br /&gt;
  uint8_t zones_per_line;&lt;br /&gt;
  zones_per_line = ((Profile.RangingProfile == RS_PROFILE_8x8_AUTONOMOUS) ||&lt;br /&gt;
         (Profile.RangingProfile == RS_PROFILE_8x8_CONTINUOUS)) ? 8 : 4;&lt;br /&gt;
  for (j = 0; j &amp;lt; Result-&amp;gt;NumberOfZones; j += zones_per_line)&lt;br /&gt;
  {&lt;br /&gt;
    for (l = 0; l &amp;lt; RANGING_SENSOR_NB_TARGET_PER_ZONE; l++)&lt;br /&gt;
    {&lt;br /&gt;
      /* Print distance and status */&lt;br /&gt;
      for (k = (zones_per_line - 1); k &amp;gt;= 0; k--)&lt;br /&gt;
      {&lt;br /&gt;
        if (Result-&amp;gt;ZoneResult[j+k].NumberOfTargets &amp;gt; 0)&lt;br /&gt;
          printf(&amp;quot;%ld,&amp;quot;,(long)Result-&amp;gt;ZoneResult[j+k].Distance[l]);&lt;br /&gt;
      }&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
  printf(&amp;quot;\n&amp;quot;);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;On passe ensuite sur Nano Edge Studio pour définir les signaux et entraîner le modèle.&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Capture d'écran 2023-12-18 172047.png|néant|vignette|800x800px]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Une fois le modèle entraîné, on peut le tester avec l'onglet Emulator &lt;br /&gt;
&lt;br /&gt;
[[Fichier:Capture d'écran 2023-12-18 173255.png|néant|vignette|800x800px]]&lt;br /&gt;
&lt;br /&gt;
===Emulation avec NanoEdgeStudio AI===&lt;br /&gt;
&lt;br /&gt;
Dans un premier temps, nous avons essayé d'entraîner le programme à reconnaître les chiffres 1, 2, 3, 4 et 5 sur les doigts d'une main. Les résultats n'étaient pas concluant, il semblerait que le capteur détecte avant tout le volume de la main à la place de détecter le nombre de doigts.&lt;br /&gt;
&lt;br /&gt;
===Configuration du serveur===&lt;br /&gt;
Configuration d'un serveur HTTP sur la machine virtuelle gabidann :&amp;lt;syntaxhighlight lang=&amp;quot;python3&amp;quot;&amp;gt;&lt;br /&gt;
import socket&lt;br /&gt;
from http.server import HTTPServer, SimpleHTTPRequestHandler&lt;br /&gt;
&lt;br /&gt;
class MyHandler(SimpleHTTPRequestHandler):&lt;br /&gt;
  def do_GET(self):&lt;br /&gt;
    if self.path == '/ip':&lt;br /&gt;
      self.send_response(200)&lt;br /&gt;
      self.send_header('Content-type', 'text/html')&lt;br /&gt;
      self.end_headers()&lt;br /&gt;
      self.wfile.write(f'Your IP address is {self.client_address[0]}'.encode())&lt;br /&gt;
      return&lt;br /&gt;
    else:&lt;br /&gt;
      return SimpleHTTPRequestHandler.do_GET(self)&lt;br /&gt;
&lt;br /&gt;
class HTTPServerV6(HTTPServer):&lt;br /&gt;
  address_family = socket.AF_INET6&lt;br /&gt;
&lt;br /&gt;
def main():&lt;br /&gt;
  server = HTTPServerV6(('::', 8080), MyHandler)&lt;br /&gt;
  server.serve_forever()&lt;br /&gt;
&lt;br /&gt;
if __name__ == '__main__':&lt;br /&gt;
  main()&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Pour se connecter au serveur depuis un navigateur, on peut ouvrir un navigateur depuis la zabeth et y accéder avec l'adresse : ''[&amp;lt;ipv6_VM&amp;gt;]:&amp;lt;port&amp;gt;''. Dans notre cas, le serveur écoute le port '''8080'''.&lt;br /&gt;
&lt;br /&gt;
La page index.html s'affiche par défaut lorsque l'on se connecte au serveur HTTP :&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;html&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;!DOCTYPE html&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;html lang=&amp;quot;fr&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;head&amp;gt;&lt;br /&gt;
	&amp;lt;meta charset=&amp;quot;UTF-8&amp;quot;&amp;gt;&lt;br /&gt;
	&amp;lt;title&amp;gt;Gabidann&amp;lt;/title&amp;gt;&lt;br /&gt;
&amp;lt;/head&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;body&amp;gt;&lt;br /&gt;
	&amp;lt;h1&amp;gt;Bienvenue sur Gabidann !&amp;lt;h1&amp;gt;&lt;br /&gt;
	&amp;lt;div id=&amp;quot;data&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/body&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/html&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;Nous avons également testé la communication en TCP avec l'utilitaire socat&lt;br /&gt;
&lt;br /&gt;
==Séance du 19/12/2023==&lt;br /&gt;
&lt;br /&gt;
Nous avons créé un serveur python en TCP. Nous pouvons maintenant envoyer des messages du client ( raspberry ) au serveur (VM Xen). Nous nous servirons de cette architecture pour envoyer les données du Nucleo à la Vm Xen &lt;br /&gt;
&lt;br /&gt;
==Séance du 20/12/2023==&lt;br /&gt;
Une fois le modèle entrainé et les tests concluants, on peut déployer notre modèle sur n'importe quel appareils linux ou windows. Pour cela, on va dans l'onglet deployment et on télécharge notre librairie personnalisée. &lt;br /&gt;
&lt;br /&gt;
On peut lui passer un fichier CSV contenant les données brutes du capteur et grâce au fichier knowledge.dat, l'émulateur est capable de faire la différence entre les situations&amp;lt;syntaxhighlight lang=&amp;quot;bat&amp;quot;&amp;gt;&lt;br /&gt;
PS C:\Users\gabyt\Documents\Gaby\emulators&amp;gt; .\NanoEdgeAI_Class_Emulator.exe neai_classification --knowledge_path .\knowledge.dat --file class_file.csv&lt;br /&gt;
{&lt;br /&gt;
        &amp;quot;status&amp;quot;: &amp;quot;classification&amp;quot;,&lt;br /&gt;
        &amp;quot;lib_id&amp;quot;: &amp;quot;6581a85925c3e0368b2c1e60&amp;quot;,&lt;br /&gt;
        &amp;quot;input&amp;quot;: &amp;quot;class_file.csv&amp;quot;,&lt;br /&gt;
        &amp;quot;results&amp;quot;: [&lt;br /&gt;
                {&amp;quot;signal&amp;quot;: 1, &amp;quot;line&amp;quot;: 1, &amp;quot;class_status&amp;quot;: 1, &amp;quot;class_name&amp;quot;: &amp;quot;plat&amp;quot;, &amp;quot;class_proba&amp;quot;: [0.98, 0.02]},&lt;br /&gt;
                {&amp;quot;signal&amp;quot;: 2, &amp;quot;line&amp;quot;: 2, &amp;quot;class_status&amp;quot;: 1, &amp;quot;class_name&amp;quot;: &amp;quot;boule&amp;quot;, &amp;quot;class_proba&amp;quot;: [0.94, 0.06]},&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;/div&gt;</summary>
		<author><name>Gthomas</name></author>
	</entry>
	<entry>
		<id>https://wiki-se.plil.fr/mediawiki/index.php?title=RodenburgThomas&amp;diff=3533</id>
		<title>RodenburgThomas</title>
		<link rel="alternate" type="text/html" href="https://wiki-se.plil.fr/mediawiki/index.php?title=RodenburgThomas&amp;diff=3533"/>
		<updated>2023-12-19T14:50:15Z</updated>

		<summary type="html">&lt;p&gt;Gthomas : /* Séance du 19/12/2023 */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;=Le binôme=&lt;br /&gt;
&lt;br /&gt;
Le binôme est constitué de 2 élèves de SE5-SC :&lt;br /&gt;
* Dann RODENBURG&lt;br /&gt;
* Gabriel THOMAS&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=Objectifs= &lt;br /&gt;
&lt;br /&gt;
Le but de ce TP est de créer un réseau de systèmes communicants en partant d'un capteur XNucléo 53L5A1 pour finir sur une machine virtuelle Xen.&lt;br /&gt;
La particularité est d'intégrer une composante de Machine Learning  &lt;br /&gt;
&lt;br /&gt;
[[Fichier:Capture d'écran 2023-12-19 151237.png|néant|vignette|800x800px]]&lt;br /&gt;
&lt;br /&gt;
=Compte rendu des séances=&lt;br /&gt;
&lt;br /&gt;
==Séance du 04/12/2023==&lt;br /&gt;
===Création de la machine virtuelle===&lt;br /&gt;
Création d'une machine virtuelle '''gabidann''' sur le serveur chassiron :&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;xen-create-image --hostname=gabidann --force --dist=bookworm --size=10G --memory=10G --dir=/usr/local/xen --password=glopglop --dhcp --bridge=bridgeStudents&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
La machine virtuelle est à présent connectée au WiFi.&lt;br /&gt;
&lt;br /&gt;
Après cela, nous avons configuré la machine virtuelle selon l'énoncé du TP en faisant un xen console gabidann. Nous avons ensuite participé à la mise en place du point d'accès WiFi.&lt;br /&gt;
&lt;br /&gt;
===Premières observations du capteur===&lt;br /&gt;
De plus nous avons observé le retour du capteur de distance Nucleo-53L5A1 avec l'outil minicom. Le contenu envoyé par le capteur était compréhensible avec une fréquence de 460 800 bauds ; sur minicom, on a pu constater que le capteur nous envoie des valeurs qui dépendent de la distance entre celui-ci et un obstacle.&lt;br /&gt;
&lt;br /&gt;
===Raspberry===&lt;br /&gt;
D'un autre côté, nous avons branché la Raspberry Pi à l'ordinateur selon le pinout fourni dans la documentation.&lt;br /&gt;
&lt;br /&gt;
[[Fichier:20231218 085218.jpg|vignette|néant]]&lt;br /&gt;
&lt;br /&gt;
Enfin, nous avons activé la communication UART de la Raspberry Pi afin de pouvoir communiquer avec. En fin de séance, nous étions en train de vérifier que la Raspberry Pi répondait bien, même en ayant ajouté la ligne enable_uart=1 dans le fichier config.txt de la Raspberry.&lt;br /&gt;
&lt;br /&gt;
==Séance du 18/12/2023==&lt;br /&gt;
===Configuration de la Raspberry===&lt;br /&gt;
Nous avons résolu le problème de la Raspberry qui ne répondait pas. Cela était dû à l'alimentation : brancher la carte en USBC résoud le problème. Cependant, nous recevons une erreur l'erreur EXT4-fs error (device mmcblk0p2).&lt;br /&gt;
Le problème venait des arguments saisis lors du lancement de Minicom. Avec la commande suivante, il est à présent possible de se connecter sur la Raspberry : &amp;lt;code&amp;gt;minicom -D /dev/ttyUSB0 -b 115200&amp;lt;/code&amp;gt;&lt;br /&gt;
Dans la Raspberry, nous avons configuré une interface réseau wlan0 pour se connecter à WiFi_IE_1 :&lt;br /&gt;
    auto wlan0&lt;br /&gt;
    iface wlan0 inet dhcp&lt;br /&gt;
    wpa-conf /etc/wpa_supplicant/wpa_supplicant.conf&lt;br /&gt;
A présent à partir de la Raspberry, on peut ping la machine virtuelle sur chassiron avec son IPv6.&lt;br /&gt;
&lt;br /&gt;
===Configuration du capteur de distance===&lt;br /&gt;
Un programme était déjà présent sur le capteur. On a téléchargé le logiciel STM32CubeIDE pour pouvoir éditer du code et le téléverser sur le capteur. Nous avons testé de téléverser un programme d'exemple dont voici le résultat :&lt;br /&gt;
[[Fichier:Screenshot 2023-12-18 13-12-19.jpg|vignette|néant|600x600px]]&lt;br /&gt;
&lt;br /&gt;
Nous avons modifié ce programme afin d'effectuer un formatage des données transmises par le capteur sous le format ''&amp;lt;distance&amp;gt;,'' pour chaque valeur. Grâce à ce formatage, il est à présent possible d'utiliser les données reçues par le logiciel NanoEdgeStudio AI pour la partie Machine Learning.&lt;br /&gt;
&lt;br /&gt;
Pour recevoir les valeurs de manière exploitable, il faut modifier le code Exemple pour obtenir une liste séparée par des virgules, il a donc fallu supprimer les espaces et les barres verticales :&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
static void print_result(RANGING_SENSOR_Result_t *Result)&lt;br /&gt;
{&lt;br /&gt;
  int8_t j;&lt;br /&gt;
  int8_t k;&lt;br /&gt;
  int8_t l;&lt;br /&gt;
  uint8_t zones_per_line;&lt;br /&gt;
  zones_per_line = ((Profile.RangingProfile == RS_PROFILE_8x8_AUTONOMOUS) ||&lt;br /&gt;
         (Profile.RangingProfile == RS_PROFILE_8x8_CONTINUOUS)) ? 8 : 4;&lt;br /&gt;
  for (j = 0; j &amp;lt; Result-&amp;gt;NumberOfZones; j += zones_per_line)&lt;br /&gt;
  {&lt;br /&gt;
    for (l = 0; l &amp;lt; RANGING_SENSOR_NB_TARGET_PER_ZONE; l++)&lt;br /&gt;
    {&lt;br /&gt;
      /* Print distance and status */&lt;br /&gt;
      for (k = (zones_per_line - 1); k &amp;gt;= 0; k--)&lt;br /&gt;
      {&lt;br /&gt;
        if (Result-&amp;gt;ZoneResult[j+k].NumberOfTargets &amp;gt; 0)&lt;br /&gt;
          printf(&amp;quot;%ld,&amp;quot;,(long)Result-&amp;gt;ZoneResult[j+k].Distance[l]);&lt;br /&gt;
      }&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
  printf(&amp;quot;\n&amp;quot;);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;On passe ensuite sur Nano Edge Studio pour définir les signaux et entraîner le modèle.&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Capture d'écran 2023-12-18 172047.png|néant|vignette|800x800px]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Une fois le modèle entraîné, on peut le tester avec l'onglet Emulator &lt;br /&gt;
&lt;br /&gt;
[[Fichier:Capture d'écran 2023-12-18 173255.png|néant|vignette|800x800px]]&lt;br /&gt;
&lt;br /&gt;
===Emulation avec NanoEdgeStudio AI===&lt;br /&gt;
&lt;br /&gt;
Dans un premier temps, nous avons essayé d'entraîner le programme à reconnaître les chiffres 1, 2, 3, 4 et 5 sur les doigts d'une main. Les résultats n'étaient pas concluant, il semblerait que le capteur détecte avant tout le volume de la main à la place de détecter le nombre de doigts.&lt;br /&gt;
&lt;br /&gt;
===Configuration du serveur===&lt;br /&gt;
Configuration d'un serveur HTTP sur la machine virtuelle gabidann :&amp;lt;syntaxhighlight lang=&amp;quot;python3&amp;quot;&amp;gt;&lt;br /&gt;
import socket&lt;br /&gt;
from http.server import HTTPServer, SimpleHTTPRequestHandler&lt;br /&gt;
&lt;br /&gt;
class MyHandler(SimpleHTTPRequestHandler):&lt;br /&gt;
  def do_GET(self):&lt;br /&gt;
    if self.path == '/ip':&lt;br /&gt;
      self.send_response(200)&lt;br /&gt;
      self.send_header('Content-type', 'text/html')&lt;br /&gt;
      self.end_headers()&lt;br /&gt;
      self.wfile.write(f'Your IP address is {self.client_address[0]}'.encode())&lt;br /&gt;
      return&lt;br /&gt;
    else:&lt;br /&gt;
      return SimpleHTTPRequestHandler.do_GET(self)&lt;br /&gt;
&lt;br /&gt;
class HTTPServerV6(HTTPServer):&lt;br /&gt;
  address_family = socket.AF_INET6&lt;br /&gt;
&lt;br /&gt;
def main():&lt;br /&gt;
  server = HTTPServerV6(('::', 8080), MyHandler)&lt;br /&gt;
  server.serve_forever()&lt;br /&gt;
&lt;br /&gt;
if __name__ == '__main__':&lt;br /&gt;
  main()&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Pour se connecter au serveur depuis un navigateur, on peut ouvrir un navigateur depuis la zabeth et y accéder avec l'adresse : ''[&amp;lt;ipv6_VM&amp;gt;]:&amp;lt;port&amp;gt;''. Dans notre cas, le serveur écoute le port '''8080'''.&lt;br /&gt;
&lt;br /&gt;
La page index.html s'affiche par défaut lorsque l'on se connecte au serveur HTTP :&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;html&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;!DOCTYPE html&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;html lang=&amp;quot;fr&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;head&amp;gt;&lt;br /&gt;
	&amp;lt;meta charset=&amp;quot;UTF-8&amp;quot;&amp;gt;&lt;br /&gt;
	&amp;lt;title&amp;gt;Gabidann&amp;lt;/title&amp;gt;&lt;br /&gt;
&amp;lt;/head&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;body&amp;gt;&lt;br /&gt;
	&amp;lt;h1&amp;gt;Bienvenue sur Gabidann !&amp;lt;h1&amp;gt;&lt;br /&gt;
	&amp;lt;div id=&amp;quot;data&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/body&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/html&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;Nous avons également testé la communication en TCP avec l'utilitaire socat&lt;br /&gt;
&lt;br /&gt;
==Séance du 19/12/2023==&lt;br /&gt;
&lt;br /&gt;
Nous avons créé un serveur python en TCP. Nous pouvons maintenant envoyer des messages du client ( raspberry ) au serveur (VM Xen). Nous nous servirons de cette architecture pour envoyer les données du Nucleo à la Vm Xen &lt;br /&gt;
&lt;br /&gt;
==Séance du 20/12/2023==&lt;/div&gt;</summary>
		<author><name>Gthomas</name></author>
	</entry>
	<entry>
		<id>https://wiki-se.plil.fr/mediawiki/index.php?title=RodenburgThomas&amp;diff=3532</id>
		<title>RodenburgThomas</title>
		<link rel="alternate" type="text/html" href="https://wiki-se.plil.fr/mediawiki/index.php?title=RodenburgThomas&amp;diff=3532"/>
		<updated>2023-12-19T14:20:53Z</updated>

		<summary type="html">&lt;p&gt;Gthomas : /* Objectifs */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;=Le binôme=&lt;br /&gt;
&lt;br /&gt;
Le binôme est constitué de 2 élèves de SE5-SC :&lt;br /&gt;
* Dann RODENBURG&lt;br /&gt;
* Gabriel THOMAS&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=Objectifs= &lt;br /&gt;
&lt;br /&gt;
Le but de ce TP est de créer un réseau de systèmes communicants en partant d'un capteur XNucléo 53L5A1 pour finir sur une machine virtuelle Xen.&lt;br /&gt;
La particularité est d'intégrer une composante de Machine Learning  &lt;br /&gt;
&lt;br /&gt;
[[Fichier:Capture d'écran 2023-12-19 151237.png|néant|vignette|800x800px]]&lt;br /&gt;
&lt;br /&gt;
=Compte rendu des séances=&lt;br /&gt;
&lt;br /&gt;
==Séance du 04/12/2023==&lt;br /&gt;
===Création de la machine virtuelle===&lt;br /&gt;
Création d'une machine virtuelle '''gabidann''' sur le serveur chassiron :&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;xen-create-image --hostname=gabidann --force --dist=bookworm --size=10G --memory=10G --dir=/usr/local/xen --password=glopglop --dhcp --bridge=bridgeStudents&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
La machine virtuelle est à présent connectée au WiFi.&lt;br /&gt;
&lt;br /&gt;
Après cela, nous avons configuré la machine virtuelle selon l'énoncé du TP en faisant un xen console gabidann. Nous avons ensuite participé à la mise en place du point d'accès WiFi.&lt;br /&gt;
&lt;br /&gt;
===Premières observations du capteur===&lt;br /&gt;
De plus nous avons observé le retour du capteur de distance Nucleo-53L5A1 avec l'outil minicom. Le contenu envoyé par le capteur était compréhensible avec une fréquence de 460 800 bauds ; sur minicom, on a pu constater que le capteur nous envoie des valeurs qui dépendent de la distance entre celui-ci et un obstacle.&lt;br /&gt;
&lt;br /&gt;
===Raspberry===&lt;br /&gt;
D'un autre côté, nous avons branché la Raspberry Pi à l'ordinateur selon le pinout fourni dans la documentation.&lt;br /&gt;
&lt;br /&gt;
[[Fichier:20231218 085218.jpg|vignette|néant]]&lt;br /&gt;
&lt;br /&gt;
Enfin, nous avons activé la communication UART de la Raspberry Pi afin de pouvoir communiquer avec. En fin de séance, nous étions en train de vérifier que la Raspberry Pi répondait bien, même en ayant ajouté la ligne enable_uart=1 dans le fichier config.txt de la Raspberry.&lt;br /&gt;
&lt;br /&gt;
==Séance du 18/12/2023==&lt;br /&gt;
===Configuration de la Raspberry===&lt;br /&gt;
Nous avons résolu le problème de la Raspberry qui ne répondait pas. Cela était dû à l'alimentation : brancher la carte en USBC résoud le problème. Cependant, nous recevons une erreur l'erreur EXT4-fs error (device mmcblk0p2).&lt;br /&gt;
Le problème venait des arguments saisis lors du lancement de Minicom. Avec la commande suivante, il est à présent possible de se connecter sur la Raspberry : &amp;lt;code&amp;gt;minicom -D /dev/ttyUSB0 -b 115200&amp;lt;/code&amp;gt;&lt;br /&gt;
Dans la Raspberry, nous avons configuré une interface réseau wlan0 pour se connecter à WiFi_IE_1 :&lt;br /&gt;
    auto wlan0&lt;br /&gt;
    iface wlan0 inet dhcp&lt;br /&gt;
    wpa-conf /etc/wpa_supplicant/wpa_supplicant.conf&lt;br /&gt;
A présent à partir de la Raspberry, on peut ping la machine virtuelle sur chassiron avec son IPv6.&lt;br /&gt;
&lt;br /&gt;
===Configuration du capteur de distance===&lt;br /&gt;
Un programme était déjà présent sur le capteur. On a téléchargé le logiciel STM32CubeIDE pour pouvoir éditer du code et le téléverser sur le capteur. Nous avons testé de téléverser un programme d'exemple dont voici le résultat :&lt;br /&gt;
[[Fichier:Screenshot 2023-12-18 13-12-19.jpg|vignette|néant|600x600px]]&lt;br /&gt;
&lt;br /&gt;
Nous avons modifié ce programme afin d'effectuer un formatage des données transmises par le capteur sous le format ''&amp;lt;distance&amp;gt;,'' pour chaque valeur. Grâce à ce formatage, il est à présent possible d'utiliser les données reçues par le logiciel NanoEdgeStudio AI pour la partie Machine Learning.&lt;br /&gt;
&lt;br /&gt;
Pour recevoir les valeurs de manière exploitable, il faut modifier le code Exemple pour obtenir une liste séparée par des virgules, il a donc fallu supprimer les espaces et les barres verticales :&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
static void print_result(RANGING_SENSOR_Result_t *Result)&lt;br /&gt;
{&lt;br /&gt;
  int8_t j;&lt;br /&gt;
  int8_t k;&lt;br /&gt;
  int8_t l;&lt;br /&gt;
  uint8_t zones_per_line;&lt;br /&gt;
  zones_per_line = ((Profile.RangingProfile == RS_PROFILE_8x8_AUTONOMOUS) ||&lt;br /&gt;
         (Profile.RangingProfile == RS_PROFILE_8x8_CONTINUOUS)) ? 8 : 4;&lt;br /&gt;
  for (j = 0; j &amp;lt; Result-&amp;gt;NumberOfZones; j += zones_per_line)&lt;br /&gt;
  {&lt;br /&gt;
    for (l = 0; l &amp;lt; RANGING_SENSOR_NB_TARGET_PER_ZONE; l++)&lt;br /&gt;
    {&lt;br /&gt;
      /* Print distance and status */&lt;br /&gt;
      for (k = (zones_per_line - 1); k &amp;gt;= 0; k--)&lt;br /&gt;
      {&lt;br /&gt;
        if (Result-&amp;gt;ZoneResult[j+k].NumberOfTargets &amp;gt; 0)&lt;br /&gt;
          printf(&amp;quot;%ld,&amp;quot;,(long)Result-&amp;gt;ZoneResult[j+k].Distance[l]);&lt;br /&gt;
      }&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
  printf(&amp;quot;\n&amp;quot;);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;On passe ensuite sur Nano Edge Studio pour définir les signaux et entraîner le modèle.&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Capture d'écran 2023-12-18 172047.png|néant|vignette|800x800px]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Une fois le modèle entraîné, on peut le tester avec l'onglet Emulator &lt;br /&gt;
&lt;br /&gt;
[[Fichier:Capture d'écran 2023-12-18 173255.png|néant|vignette|800x800px]]&lt;br /&gt;
&lt;br /&gt;
===Emulation avec NanoEdgeStudio AI===&lt;br /&gt;
&lt;br /&gt;
Dans un premier temps, nous avons essayé d'entraîner le programme à reconnaître les chiffres 1, 2, 3, 4 et 5 sur les doigts d'une main. Les résultats n'étaient pas concluant, il semblerait que le capteur détecte avant tout le volume de la main à la place de détecter le nombre de doigts.&lt;br /&gt;
&lt;br /&gt;
===Configuration du serveur===&lt;br /&gt;
Configuration d'un serveur HTTP sur la machine virtuelle gabidann :&amp;lt;syntaxhighlight lang=&amp;quot;python3&amp;quot;&amp;gt;&lt;br /&gt;
import socket&lt;br /&gt;
from http.server import HTTPServer, SimpleHTTPRequestHandler&lt;br /&gt;
&lt;br /&gt;
class MyHandler(SimpleHTTPRequestHandler):&lt;br /&gt;
  def do_GET(self):&lt;br /&gt;
    if self.path == '/ip':&lt;br /&gt;
      self.send_response(200)&lt;br /&gt;
      self.send_header('Content-type', 'text/html')&lt;br /&gt;
      self.end_headers()&lt;br /&gt;
      self.wfile.write(f'Your IP address is {self.client_address[0]}'.encode())&lt;br /&gt;
      return&lt;br /&gt;
    else:&lt;br /&gt;
      return SimpleHTTPRequestHandler.do_GET(self)&lt;br /&gt;
&lt;br /&gt;
class HTTPServerV6(HTTPServer):&lt;br /&gt;
  address_family = socket.AF_INET6&lt;br /&gt;
&lt;br /&gt;
def main():&lt;br /&gt;
  server = HTTPServerV6(('::', 8080), MyHandler)&lt;br /&gt;
  server.serve_forever()&lt;br /&gt;
&lt;br /&gt;
if __name__ == '__main__':&lt;br /&gt;
  main()&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Pour se connecter au serveur depuis un navigateur, on peut ouvrir un navigateur depuis la zabeth et y accéder avec l'adresse : ''[&amp;lt;ipv6_VM&amp;gt;]:&amp;lt;port&amp;gt;''. Dans notre cas, le serveur écoute le port '''8080'''.&lt;br /&gt;
&lt;br /&gt;
La page index.html s'affiche par défaut lorsque l'on se connecte au serveur HTTP :&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;html&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;!DOCTYPE html&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;html lang=&amp;quot;fr&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;head&amp;gt;&lt;br /&gt;
	&amp;lt;meta charset=&amp;quot;UTF-8&amp;quot;&amp;gt;&lt;br /&gt;
	&amp;lt;title&amp;gt;Gabidann&amp;lt;/title&amp;gt;&lt;br /&gt;
&amp;lt;/head&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;body&amp;gt;&lt;br /&gt;
	&amp;lt;h1&amp;gt;Bienvenue sur Gabidann !&amp;lt;h1&amp;gt;&lt;br /&gt;
	&amp;lt;div id=&amp;quot;data&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/body&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/html&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;Nous avons également testé la communication en TCP avec l'utilitaire socat&lt;br /&gt;
&lt;br /&gt;
==Séance du 19/12/2023==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Séance du 20/12/2023==&lt;/div&gt;</summary>
		<author><name>Gthomas</name></author>
	</entry>
	<entry>
		<id>https://wiki-se.plil.fr/mediawiki/index.php?title=RodenburgThomas&amp;diff=3531</id>
		<title>RodenburgThomas</title>
		<link rel="alternate" type="text/html" href="https://wiki-se.plil.fr/mediawiki/index.php?title=RodenburgThomas&amp;diff=3531"/>
		<updated>2023-12-19T14:20:30Z</updated>

		<summary type="html">&lt;p&gt;Gthomas : &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;=Le binôme=&lt;br /&gt;
&lt;br /&gt;
Le binôme est constitué de 2 élèves de SE5-SC :&lt;br /&gt;
* Dann RODENBURG&lt;br /&gt;
* Gabriel THOMAS&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=Objectifs= &lt;br /&gt;
&lt;br /&gt;
Le but de ce TP est de créer un réseau de systèmes communicants en partant d'un capteur XNucléo 53L5A1 pour finir sur une machine virtuelle Xen &lt;br /&gt;
La particularité est d'intégrer une composante de Machine Learning  &lt;br /&gt;
&lt;br /&gt;
[[Fichier:Capture d'écran 2023-12-19 151237.png|néant|vignette|800x800px]]&lt;br /&gt;
&lt;br /&gt;
=Compte rendu des séances=&lt;br /&gt;
&lt;br /&gt;
==Séance du 04/12/2023==&lt;br /&gt;
===Création de la machine virtuelle===&lt;br /&gt;
Création d'une machine virtuelle '''gabidann''' sur le serveur chassiron :&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;xen-create-image --hostname=gabidann --force --dist=bookworm --size=10G --memory=10G --dir=/usr/local/xen --password=glopglop --dhcp --bridge=bridgeStudents&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
La machine virtuelle est à présent connectée au WiFi.&lt;br /&gt;
&lt;br /&gt;
Après cela, nous avons configuré la machine virtuelle selon l'énoncé du TP en faisant un xen console gabidann. Nous avons ensuite participé à la mise en place du point d'accès WiFi.&lt;br /&gt;
&lt;br /&gt;
===Premières observations du capteur===&lt;br /&gt;
De plus nous avons observé le retour du capteur de distance Nucleo-53L5A1 avec l'outil minicom. Le contenu envoyé par le capteur était compréhensible avec une fréquence de 460 800 bauds ; sur minicom, on a pu constater que le capteur nous envoie des valeurs qui dépendent de la distance entre celui-ci et un obstacle.&lt;br /&gt;
&lt;br /&gt;
===Raspberry===&lt;br /&gt;
D'un autre côté, nous avons branché la Raspberry Pi à l'ordinateur selon le pinout fourni dans la documentation.&lt;br /&gt;
&lt;br /&gt;
[[Fichier:20231218 085218.jpg|vignette|néant]]&lt;br /&gt;
&lt;br /&gt;
Enfin, nous avons activé la communication UART de la Raspberry Pi afin de pouvoir communiquer avec. En fin de séance, nous étions en train de vérifier que la Raspberry Pi répondait bien, même en ayant ajouté la ligne enable_uart=1 dans le fichier config.txt de la Raspberry.&lt;br /&gt;
&lt;br /&gt;
==Séance du 18/12/2023==&lt;br /&gt;
===Configuration de la Raspberry===&lt;br /&gt;
Nous avons résolu le problème de la Raspberry qui ne répondait pas. Cela était dû à l'alimentation : brancher la carte en USBC résoud le problème. Cependant, nous recevons une erreur l'erreur EXT4-fs error (device mmcblk0p2).&lt;br /&gt;
Le problème venait des arguments saisis lors du lancement de Minicom. Avec la commande suivante, il est à présent possible de se connecter sur la Raspberry : &amp;lt;code&amp;gt;minicom -D /dev/ttyUSB0 -b 115200&amp;lt;/code&amp;gt;&lt;br /&gt;
Dans la Raspberry, nous avons configuré une interface réseau wlan0 pour se connecter à WiFi_IE_1 :&lt;br /&gt;
    auto wlan0&lt;br /&gt;
    iface wlan0 inet dhcp&lt;br /&gt;
    wpa-conf /etc/wpa_supplicant/wpa_supplicant.conf&lt;br /&gt;
A présent à partir de la Raspberry, on peut ping la machine virtuelle sur chassiron avec son IPv6.&lt;br /&gt;
&lt;br /&gt;
===Configuration du capteur de distance===&lt;br /&gt;
Un programme était déjà présent sur le capteur. On a téléchargé le logiciel STM32CubeIDE pour pouvoir éditer du code et le téléverser sur le capteur. Nous avons testé de téléverser un programme d'exemple dont voici le résultat :&lt;br /&gt;
[[Fichier:Screenshot 2023-12-18 13-12-19.jpg|vignette|néant|600x600px]]&lt;br /&gt;
&lt;br /&gt;
Nous avons modifié ce programme afin d'effectuer un formatage des données transmises par le capteur sous le format ''&amp;lt;distance&amp;gt;,'' pour chaque valeur. Grâce à ce formatage, il est à présent possible d'utiliser les données reçues par le logiciel NanoEdgeStudio AI pour la partie Machine Learning.&lt;br /&gt;
&lt;br /&gt;
Pour recevoir les valeurs de manière exploitable, il faut modifier le code Exemple pour obtenir une liste séparée par des virgules, il a donc fallu supprimer les espaces et les barres verticales :&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
static void print_result(RANGING_SENSOR_Result_t *Result)&lt;br /&gt;
{&lt;br /&gt;
  int8_t j;&lt;br /&gt;
  int8_t k;&lt;br /&gt;
  int8_t l;&lt;br /&gt;
  uint8_t zones_per_line;&lt;br /&gt;
  zones_per_line = ((Profile.RangingProfile == RS_PROFILE_8x8_AUTONOMOUS) ||&lt;br /&gt;
         (Profile.RangingProfile == RS_PROFILE_8x8_CONTINUOUS)) ? 8 : 4;&lt;br /&gt;
  for (j = 0; j &amp;lt; Result-&amp;gt;NumberOfZones; j += zones_per_line)&lt;br /&gt;
  {&lt;br /&gt;
    for (l = 0; l &amp;lt; RANGING_SENSOR_NB_TARGET_PER_ZONE; l++)&lt;br /&gt;
    {&lt;br /&gt;
      /* Print distance and status */&lt;br /&gt;
      for (k = (zones_per_line - 1); k &amp;gt;= 0; k--)&lt;br /&gt;
      {&lt;br /&gt;
        if (Result-&amp;gt;ZoneResult[j+k].NumberOfTargets &amp;gt; 0)&lt;br /&gt;
          printf(&amp;quot;%ld,&amp;quot;,(long)Result-&amp;gt;ZoneResult[j+k].Distance[l]);&lt;br /&gt;
      }&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
  printf(&amp;quot;\n&amp;quot;);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;On passe ensuite sur Nano Edge Studio pour définir les signaux et entraîner le modèle.&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Capture d'écran 2023-12-18 172047.png|néant|vignette|800x800px]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Une fois le modèle entraîné, on peut le tester avec l'onglet Emulator &lt;br /&gt;
&lt;br /&gt;
[[Fichier:Capture d'écran 2023-12-18 173255.png|néant|vignette|800x800px]]&lt;br /&gt;
&lt;br /&gt;
===Emulation avec NanoEdgeStudio AI===&lt;br /&gt;
&lt;br /&gt;
Dans un premier temps, nous avons essayé d'entraîner le programme à reconnaître les chiffres 1, 2, 3, 4 et 5 sur les doigts d'une main. Les résultats n'étaient pas concluant, il semblerait que le capteur détecte avant tout le volume de la main à la place de détecter le nombre de doigts.&lt;br /&gt;
&lt;br /&gt;
===Configuration du serveur===&lt;br /&gt;
Configuration d'un serveur HTTP sur la machine virtuelle gabidann :&amp;lt;syntaxhighlight lang=&amp;quot;python3&amp;quot;&amp;gt;&lt;br /&gt;
import socket&lt;br /&gt;
from http.server import HTTPServer, SimpleHTTPRequestHandler&lt;br /&gt;
&lt;br /&gt;
class MyHandler(SimpleHTTPRequestHandler):&lt;br /&gt;
  def do_GET(self):&lt;br /&gt;
    if self.path == '/ip':&lt;br /&gt;
      self.send_response(200)&lt;br /&gt;
      self.send_header('Content-type', 'text/html')&lt;br /&gt;
      self.end_headers()&lt;br /&gt;
      self.wfile.write(f'Your IP address is {self.client_address[0]}'.encode())&lt;br /&gt;
      return&lt;br /&gt;
    else:&lt;br /&gt;
      return SimpleHTTPRequestHandler.do_GET(self)&lt;br /&gt;
&lt;br /&gt;
class HTTPServerV6(HTTPServer):&lt;br /&gt;
  address_family = socket.AF_INET6&lt;br /&gt;
&lt;br /&gt;
def main():&lt;br /&gt;
  server = HTTPServerV6(('::', 8080), MyHandler)&lt;br /&gt;
  server.serve_forever()&lt;br /&gt;
&lt;br /&gt;
if __name__ == '__main__':&lt;br /&gt;
  main()&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Pour se connecter au serveur depuis un navigateur, on peut ouvrir un navigateur depuis la zabeth et y accéder avec l'adresse : ''[&amp;lt;ipv6_VM&amp;gt;]:&amp;lt;port&amp;gt;''. Dans notre cas, le serveur écoute le port '''8080'''.&lt;br /&gt;
&lt;br /&gt;
La page index.html s'affiche par défaut lorsque l'on se connecte au serveur HTTP :&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;html&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;!DOCTYPE html&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;html lang=&amp;quot;fr&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;head&amp;gt;&lt;br /&gt;
	&amp;lt;meta charset=&amp;quot;UTF-8&amp;quot;&amp;gt;&lt;br /&gt;
	&amp;lt;title&amp;gt;Gabidann&amp;lt;/title&amp;gt;&lt;br /&gt;
&amp;lt;/head&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;body&amp;gt;&lt;br /&gt;
	&amp;lt;h1&amp;gt;Bienvenue sur Gabidann !&amp;lt;h1&amp;gt;&lt;br /&gt;
	&amp;lt;div id=&amp;quot;data&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/body&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/html&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;Nous avons également testé la communication en TCP avec l'utilitaire socat&lt;br /&gt;
&lt;br /&gt;
==Séance du 19/12/2023==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Séance du 20/12/2023==&lt;/div&gt;</summary>
		<author><name>Gthomas</name></author>
	</entry>
	<entry>
		<id>https://wiki-se.plil.fr/mediawiki/index.php?title=RodenburgThomas&amp;diff=3530</id>
		<title>RodenburgThomas</title>
		<link rel="alternate" type="text/html" href="https://wiki-se.plil.fr/mediawiki/index.php?title=RodenburgThomas&amp;diff=3530"/>
		<updated>2023-12-19T14:16:54Z</updated>

		<summary type="html">&lt;p&gt;Gthomas : /* Séance du 19/12/2023 */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;=Le binôme=&lt;br /&gt;
&lt;br /&gt;
Le binôme est constitué de 2 élèves de SE5-SC :&lt;br /&gt;
* Dann RODENBURG&lt;br /&gt;
* Gabriel THOMAS&lt;br /&gt;
&lt;br /&gt;
=Compte rendu des séances=&lt;br /&gt;
&lt;br /&gt;
==Séance du 04/12/2023==&lt;br /&gt;
===Création de la machine virtuelle===&lt;br /&gt;
Création d'une machine virtuelle '''gabidann''' sur le serveur chassiron :&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;xen-create-image --hostname=gabidann --force --dist=bookworm --size=10G --memory=10G --dir=/usr/local/xen --password=glopglop --dhcp --bridge=bridgeStudents&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
La machine virtuelle est à présent connectée au WiFi.&lt;br /&gt;
&lt;br /&gt;
Après cela, nous avons configuré la machine virtuelle selon l'énoncé du TP en faisant un xen console gabidann. Nous avons ensuite participé à la mise en place du point d'accès WiFi.&lt;br /&gt;
&lt;br /&gt;
===Premières observations du capteur===&lt;br /&gt;
De plus nous avons observé le retour du capteur de distance Nucleo-53L5A1 avec l'outil minicom. Le contenu envoyé par le capteur était compréhensible avec une fréquence de 460 800 bauds ; sur minicom, on a pu constater que le capteur nous envoie des valeurs qui dépendent de la distance entre celui-ci et un obstacle.&lt;br /&gt;
&lt;br /&gt;
===Raspberry===&lt;br /&gt;
D'un autre côté, nous avons branché la Raspberry Pi à l'ordinateur selon le pinout fourni dans la documentation.&lt;br /&gt;
&lt;br /&gt;
[[Fichier:20231218 085218.jpg|vignette|néant]]&lt;br /&gt;
&lt;br /&gt;
Enfin, nous avons activé la communication UART de la Raspberry Pi afin de pouvoir communiquer avec. En fin de séance, nous étions en train de vérifier que la Raspberry Pi répondait bien, même en ayant ajouté la ligne enable_uart=1 dans le fichier config.txt de la Raspberry.&lt;br /&gt;
&lt;br /&gt;
==Séance du 18/12/2023==&lt;br /&gt;
===Configuration de la Raspberry===&lt;br /&gt;
Nous avons résolu le problème de la Raspberry qui ne répondait pas. Cela était dû à l'alimentation : brancher la carte en USBC résoud le problème. Cependant, nous recevons une erreur l'erreur EXT4-fs error (device mmcblk0p2).&lt;br /&gt;
Le problème venait des arguments saisis lors du lancement de Minicom. Avec la commande suivante, il est à présent possible de se connecter sur la Raspberry : &amp;lt;code&amp;gt;minicom -D /dev/ttyUSB0 -b 115200&amp;lt;/code&amp;gt;&lt;br /&gt;
Dans la Raspberry, nous avons configuré une interface réseau wlan0 pour se connecter à WiFi_IE_1 :&lt;br /&gt;
    auto wlan0&lt;br /&gt;
    iface wlan0 inet dhcp&lt;br /&gt;
    wpa-conf /etc/wpa_supplicant/wpa_supplicant.conf&lt;br /&gt;
A présent à partir de la Raspberry, on peut ping la machine virtuelle sur chassiron avec son IPv6.&lt;br /&gt;
&lt;br /&gt;
===Configuration du capteur de distance===&lt;br /&gt;
Un programme était déjà présent sur le capteur. On a téléchargé le logiciel STM32CubeIDE pour pouvoir éditer du code et le téléverser sur le capteur. Nous avons testé de téléverser un programme d'exemple dont voici le résultat :&lt;br /&gt;
[[Fichier:Screenshot 2023-12-18 13-12-19.jpg|vignette|néant|600x600px]]&lt;br /&gt;
&lt;br /&gt;
Nous avons modifié ce programme afin d'effectuer un formatage des données transmises par le capteur sous le format ''&amp;lt;distance&amp;gt;,'' pour chaque valeur. Grâce à ce formatage, il est à présent possible d'utiliser les données reçues par le logiciel NanoEdgeStudio AI pour la partie Machine Learning.&lt;br /&gt;
&lt;br /&gt;
Pour recevoir les valeurs de manière exploitable, il faut modifier le code Exemple pour obtenir une liste séparée par des virgules, il a donc fallu supprimer les espaces et les barres verticales :&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
static void print_result(RANGING_SENSOR_Result_t *Result)&lt;br /&gt;
{&lt;br /&gt;
  int8_t j;&lt;br /&gt;
  int8_t k;&lt;br /&gt;
  int8_t l;&lt;br /&gt;
  uint8_t zones_per_line;&lt;br /&gt;
  zones_per_line = ((Profile.RangingProfile == RS_PROFILE_8x8_AUTONOMOUS) ||&lt;br /&gt;
         (Profile.RangingProfile == RS_PROFILE_8x8_CONTINUOUS)) ? 8 : 4;&lt;br /&gt;
  for (j = 0; j &amp;lt; Result-&amp;gt;NumberOfZones; j += zones_per_line)&lt;br /&gt;
  {&lt;br /&gt;
    for (l = 0; l &amp;lt; RANGING_SENSOR_NB_TARGET_PER_ZONE; l++)&lt;br /&gt;
    {&lt;br /&gt;
      /* Print distance and status */&lt;br /&gt;
      for (k = (zones_per_line - 1); k &amp;gt;= 0; k--)&lt;br /&gt;
      {&lt;br /&gt;
        if (Result-&amp;gt;ZoneResult[j+k].NumberOfTargets &amp;gt; 0)&lt;br /&gt;
          printf(&amp;quot;%ld,&amp;quot;,(long)Result-&amp;gt;ZoneResult[j+k].Distance[l]);&lt;br /&gt;
      }&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
  printf(&amp;quot;\n&amp;quot;);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;On passe ensuite sur Nano Edge Studio pour définir les signaux et entraîner le modèle.&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Capture d'écran 2023-12-18 172047.png|néant|vignette|800x800px]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Une fois le modèle entraîné, on peut le tester avec l'onglet Emulator &lt;br /&gt;
&lt;br /&gt;
[[Fichier:Capture d'écran 2023-12-18 173255.png|néant|vignette|800x800px]]&lt;br /&gt;
&lt;br /&gt;
===Emulation avec NanoEdgeStudio AI===&lt;br /&gt;
&lt;br /&gt;
Dans un premier temps, nous avons essayé d'entraîner le programme à reconnaître les chiffres 1, 2, 3, 4 et 5 sur les doigts d'une main. Les résultats n'étaient pas concluant, il semblerait que le capteur détecte avant tout le volume de la main à la place de détecter le nombre de doigts.&lt;br /&gt;
&lt;br /&gt;
===Configuration du serveur===&lt;br /&gt;
Configuration d'un serveur HTTP sur la machine virtuelle gabidann :&amp;lt;syntaxhighlight lang=&amp;quot;python3&amp;quot;&amp;gt;&lt;br /&gt;
import socket&lt;br /&gt;
from http.server import HTTPServer, SimpleHTTPRequestHandler&lt;br /&gt;
&lt;br /&gt;
class MyHandler(SimpleHTTPRequestHandler):&lt;br /&gt;
  def do_GET(self):&lt;br /&gt;
    if self.path == '/ip':&lt;br /&gt;
      self.send_response(200)&lt;br /&gt;
      self.send_header('Content-type', 'text/html')&lt;br /&gt;
      self.end_headers()&lt;br /&gt;
      self.wfile.write(f'Your IP address is {self.client_address[0]}'.encode())&lt;br /&gt;
      return&lt;br /&gt;
    else:&lt;br /&gt;
      return SimpleHTTPRequestHandler.do_GET(self)&lt;br /&gt;
&lt;br /&gt;
class HTTPServerV6(HTTPServer):&lt;br /&gt;
  address_family = socket.AF_INET6&lt;br /&gt;
&lt;br /&gt;
def main():&lt;br /&gt;
  server = HTTPServerV6(('::', 8080), MyHandler)&lt;br /&gt;
  server.serve_forever()&lt;br /&gt;
&lt;br /&gt;
if __name__ == '__main__':&lt;br /&gt;
  main()&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Pour se connecter au serveur depuis un navigateur, on peut ouvrir un navigateur depuis la zabeth et y accéder avec l'adresse : ''[&amp;lt;ipv6_VM&amp;gt;]:&amp;lt;port&amp;gt;''. Dans notre cas, le serveur écoute le port '''8080'''.&lt;br /&gt;
&lt;br /&gt;
La page index.html s'affiche par défaut lorsque l'on se connecte au serveur HTTP :&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;html&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;!DOCTYPE html&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;html lang=&amp;quot;fr&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;head&amp;gt;&lt;br /&gt;
	&amp;lt;meta charset=&amp;quot;UTF-8&amp;quot;&amp;gt;&lt;br /&gt;
	&amp;lt;title&amp;gt;Gabidann&amp;lt;/title&amp;gt;&lt;br /&gt;
&amp;lt;/head&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;body&amp;gt;&lt;br /&gt;
	&amp;lt;h1&amp;gt;Bienvenue sur Gabidann !&amp;lt;h1&amp;gt;&lt;br /&gt;
	&amp;lt;div id=&amp;quot;data&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/body&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/html&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;Nous avons également testé la communication en TCP avec l'utilitaire socat&lt;br /&gt;
&lt;br /&gt;
==Séance du 19/12/2023==&lt;br /&gt;
[[Fichier:Capture d'écran 2023-12-19 151237.png|néant|vignette|800x800px]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Séance du 20/12/2023==&lt;/div&gt;</summary>
		<author><name>Gthomas</name></author>
	</entry>
	<entry>
		<id>https://wiki-se.plil.fr/mediawiki/index.php?title=Fichier:Capture_d%27%C3%A9cran_2023-12-19_151237.png&amp;diff=3529</id>
		<title>Fichier:Capture d'écran 2023-12-19 151237.png</title>
		<link rel="alternate" type="text/html" href="https://wiki-se.plil.fr/mediawiki/index.php?title=Fichier:Capture_d%27%C3%A9cran_2023-12-19_151237.png&amp;diff=3529"/>
		<updated>2023-12-19T14:16:10Z</updated>

		<summary type="html">&lt;p&gt;Gthomas : &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;glopglop&lt;/div&gt;</summary>
		<author><name>Gthomas</name></author>
	</entry>
	<entry>
		<id>https://wiki-se.plil.fr/mediawiki/index.php?title=RodenburgThomas&amp;diff=3524</id>
		<title>RodenburgThomas</title>
		<link rel="alternate" type="text/html" href="https://wiki-se.plil.fr/mediawiki/index.php?title=RodenburgThomas&amp;diff=3524"/>
		<updated>2023-12-19T13:48:04Z</updated>

		<summary type="html">&lt;p&gt;Gthomas : /* Emulation avec NanoEdgeStudio AI */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;=Le binôme=&lt;br /&gt;
&lt;br /&gt;
Le binôme est constitué de 2 élèves de SE5-SC :&lt;br /&gt;
* Dann RODENBURG&lt;br /&gt;
* Gabriel THOMAS&lt;br /&gt;
&lt;br /&gt;
=Compte rendu des séances=&lt;br /&gt;
&lt;br /&gt;
==Séance du 04/12/2023==&lt;br /&gt;
===Création de la machine virtuelle===&lt;br /&gt;
Création d'une machine virtuelle '''gabidann''' sur le serveur chassiron :&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;xen-create-image --hostname=gabidann --force --dist=bookworm --size=10G --memory=10G --dir=/usr/local/xen --password=glopglop --dhcp --bridge=bridgeStudents&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
La machine virtuelle est à présent connectée au WiFi.&lt;br /&gt;
&lt;br /&gt;
Après cela, nous avons configuré la machine virtuelle selon l'énoncé du TP en faisant un xen console gabidann. Nous avons ensuite participé à la mise en place du point d'accès WiFi.&lt;br /&gt;
&lt;br /&gt;
===Premières observations du capteur===&lt;br /&gt;
De plus nous avons observé le retour du capteur de distance Nucleo-53L5A1 avec l'outil minicom. Le contenu envoyé par le capteur était compréhensible avec une fréquence de 460 800 bauds ; sur minicom, on a pu constater que le capteur nous envoie des valeurs qui dépendent de la distance entre celui-ci et un obstacle.&lt;br /&gt;
&lt;br /&gt;
===Raspberry===&lt;br /&gt;
D'un autre côté, nous avons branché la Raspberry Pi à l'ordinateur selon le pinout fourni dans la documentation.&lt;br /&gt;
&lt;br /&gt;
[[Fichier:20231218 085218.jpg|vignette|néant]]&lt;br /&gt;
&lt;br /&gt;
Enfin, nous avons activé la communication UART de la Raspberry Pi afin de pouvoir communiquer avec. En fin de séance, nous étions en train de vérifier que la Raspberry Pi répondait bien, même en ayant ajouté la ligne enable_uart=1 dans le fichier config.txt de la Raspberry.&lt;br /&gt;
&lt;br /&gt;
==Séance du 18/12/2023==&lt;br /&gt;
===Configuration de la Raspberry===&lt;br /&gt;
Nous avons résolu le problème de la Raspberry qui ne répondait pas. Cela était dû à l'alimentation : brancher la carte en USBC résoud le problème. Cependant, nous recevons une erreur l'erreur EXT4-fs error (device mmcblk0p2).&lt;br /&gt;
Le problème venait des arguments saisis lors du lancement de Minicom. Avec la commande suivante, il est à présent possible de se connecter sur la Raspberry : &amp;lt;code&amp;gt;minicom -D /dev/ttyUSB0 -b 115200&amp;lt;/code&amp;gt;&lt;br /&gt;
Dans la Raspberry, nous avons configuré une interface réseau wlan0 pour se connecter à WiFi_IE_1 :&lt;br /&gt;
    auto wlan0&lt;br /&gt;
    iface wlan0 inet dhcp&lt;br /&gt;
    wpa-conf /etc/wpa_supplicant/wpa_supplicant.conf&lt;br /&gt;
A présent à partir de la Raspberry, on peut ping la machine virtuelle sur chassiron avec son IPv6.&lt;br /&gt;
&lt;br /&gt;
===Configuration du capteur de distance===&lt;br /&gt;
Un programme était déjà présent sur le capteur. On a téléchargé le logiciel STM32CubeIDE pour pouvoir éditer du code et le téléverser sur le capteur. Nous avons testé de téléverser un programme d'exemple dont voici le résultat :&lt;br /&gt;
[[Fichier:Screenshot 2023-12-18 13-12-19.jpg|vignette|néant|600x600px]]&lt;br /&gt;
&lt;br /&gt;
Nous avons modifié ce programme afin d'effectuer un formatage des données transmises par le capteur sous le format ''&amp;lt;distance&amp;gt;,'' pour chaque valeur. Grâce à ce formatage, il est à présent possible d'utiliser les données reçues par le logiciel NanoEdgeStudio AI pour la partie Machine Learning.&lt;br /&gt;
&lt;br /&gt;
Pour recevoir les valeurs de manière exploitable, il faut modifier le code Exemple pour obtenir une liste séparée par des virgules, il a donc fallu supprimer les espaces et les barres verticales :&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
static void print_result(RANGING_SENSOR_Result_t *Result)&lt;br /&gt;
{&lt;br /&gt;
  int8_t j;&lt;br /&gt;
  int8_t k;&lt;br /&gt;
  int8_t l;&lt;br /&gt;
  uint8_t zones_per_line;&lt;br /&gt;
  zones_per_line = ((Profile.RangingProfile == RS_PROFILE_8x8_AUTONOMOUS) ||&lt;br /&gt;
         (Profile.RangingProfile == RS_PROFILE_8x8_CONTINUOUS)) ? 8 : 4;&lt;br /&gt;
  for (j = 0; j &amp;lt; Result-&amp;gt;NumberOfZones; j += zones_per_line)&lt;br /&gt;
  {&lt;br /&gt;
    for (l = 0; l &amp;lt; RANGING_SENSOR_NB_TARGET_PER_ZONE; l++)&lt;br /&gt;
    {&lt;br /&gt;
      /* Print distance and status */&lt;br /&gt;
      for (k = (zones_per_line - 1); k &amp;gt;= 0; k--)&lt;br /&gt;
      {&lt;br /&gt;
        if (Result-&amp;gt;ZoneResult[j+k].NumberOfTargets &amp;gt; 0)&lt;br /&gt;
          printf(&amp;quot;%ld,&amp;quot;,(long)Result-&amp;gt;ZoneResult[j+k].Distance[l]);&lt;br /&gt;
      }&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
  printf(&amp;quot;\n&amp;quot;);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;On passe ensuite sur Nano Edge Studio pour définir les signaux et entraîner le modèle.&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Capture d'écran 2023-12-18 172047.png|néant|vignette|800x800px]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Une fois le modèle entraîné, on peut le tester avec l'onglet Emulator &lt;br /&gt;
&lt;br /&gt;
[[Fichier:Capture d'écran 2023-12-18 173255.png|néant|vignette|800x800px]]&lt;br /&gt;
&lt;br /&gt;
===Emulation avec NanoEdgeStudio AI===&lt;br /&gt;
&lt;br /&gt;
Dans un premier temps, nous avons essayé d'entraîner le programme à reconnaître les chiffres 1, 2, 3, 4 et 5 sur les doigts d'une main. Les résultats n'étaient pas concluant, il semblerait que le capteur détecte avant tout le volume de la main à la place de détecter le nombre de doigts.&lt;br /&gt;
&lt;br /&gt;
===Configuration du serveur===&lt;br /&gt;
Configuration d'un serveur HTTP sur la machine virtuelle gabidann :&amp;lt;syntaxhighlight lang=&amp;quot;python3&amp;quot;&amp;gt;&lt;br /&gt;
import socket&lt;br /&gt;
from http.server import HTTPServer, SimpleHTTPRequestHandler&lt;br /&gt;
&lt;br /&gt;
class MyHandler(SimpleHTTPRequestHandler):&lt;br /&gt;
  def do_GET(self):&lt;br /&gt;
    if self.path == '/ip':&lt;br /&gt;
      self.send_response(200)&lt;br /&gt;
      self.send_header('Content-type', 'text/html')&lt;br /&gt;
      self.end_headers()&lt;br /&gt;
      self.wfile.write(f'Your IP address is {self.client_address[0]}'.encode())&lt;br /&gt;
      return&lt;br /&gt;
    else:&lt;br /&gt;
      return SimpleHTTPRequestHandler.do_GET(self)&lt;br /&gt;
&lt;br /&gt;
class HTTPServerV6(HTTPServer):&lt;br /&gt;
  address_family = socket.AF_INET6&lt;br /&gt;
&lt;br /&gt;
def main():&lt;br /&gt;
  server = HTTPServerV6(('::', 8080), MyHandler)&lt;br /&gt;
  server.serve_forever()&lt;br /&gt;
&lt;br /&gt;
if __name__ == '__main__':&lt;br /&gt;
  main()&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Pour se connecter au serveur depuis un navigateur, on peut ouvrir un navigateur depuis la zabeth et y accéder avec l'adresse : ''[&amp;lt;ipv6_VM&amp;gt;]:&amp;lt;port&amp;gt;''. Dans notre cas, le serveur écoute le port '''8080'''.&lt;br /&gt;
&lt;br /&gt;
La page index.html s'affiche par défaut lorsque l'on se connecte au serveur HTTP :&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;html&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;!DOCTYPE html&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;html lang=&amp;quot;fr&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;head&amp;gt;&lt;br /&gt;
	&amp;lt;meta charset=&amp;quot;UTF-8&amp;quot;&amp;gt;&lt;br /&gt;
	&amp;lt;title&amp;gt;Gabidann&amp;lt;/title&amp;gt;&lt;br /&gt;
&amp;lt;/head&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;body&amp;gt;&lt;br /&gt;
	&amp;lt;h1&amp;gt;Bienvenue sur Gabidann !&amp;lt;h1&amp;gt;&lt;br /&gt;
	&amp;lt;div id=&amp;quot;data&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/body&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/html&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;Nous avons également testé la communication en TCP avec l'utilitaire socat&lt;br /&gt;
&lt;br /&gt;
==Séance du 19/12/2023==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Séance du 20/12/2023==&lt;/div&gt;</summary>
		<author><name>Gthomas</name></author>
	</entry>
	<entry>
		<id>https://wiki-se.plil.fr/mediawiki/index.php?title=RodenburgThomas&amp;diff=3510</id>
		<title>RodenburgThomas</title>
		<link rel="alternate" type="text/html" href="https://wiki-se.plil.fr/mediawiki/index.php?title=RodenburgThomas&amp;diff=3510"/>
		<updated>2023-12-18T16:54:45Z</updated>

		<summary type="html">&lt;p&gt;Gthomas : /* Séance du 19/12/2023 */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;=Le binôme=&lt;br /&gt;
&lt;br /&gt;
Le binôme est constitué de 2 élèves de SE5-SC :&lt;br /&gt;
* Dann RODENBURG&lt;br /&gt;
* Gabriel THOMAS&lt;br /&gt;
&lt;br /&gt;
=Compte rendu des séances=&lt;br /&gt;
&lt;br /&gt;
==Séance du 04/12/2023==&lt;br /&gt;
===Création de la machine virtuelle===&lt;br /&gt;
Création d'une machine virtuelle '''gabidann''' sur le serveur chassiron :&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;xen-create-image --hostname=gabidann --force --dist=bookworm --size=10G --memory=10G --dir=/usr/local/xen --password=glopglop --dhcp --bridge=bridgeStudents&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
La machine virtuelle est à présent connectée au WiFi.&lt;br /&gt;
&lt;br /&gt;
Après cela, nous avons configuré la machine virtuelle selon l'énoncé du TP en faisant un xen console gabidann. Nous avons ensuite participé à la mise en place du point d'accès WiFi.&lt;br /&gt;
&lt;br /&gt;
===Premières observations du capteur===&lt;br /&gt;
De plus nous avons observé le retour du capteur de distance Nucleo-53L5A1 avec l'outil minicom. Le contenu envoyé par le capteur était compréhensible avec une fréquence de 460 800 bauds ; sur minicom, on a pu constater que le capteur nous envoie des valeurs qui dépendent de la distance entre celui-ci et un obstacle.&lt;br /&gt;
&lt;br /&gt;
===Raspberry===&lt;br /&gt;
D'un autre côté, nous avons branché la Raspberry Pi à l'ordinateur selon le pinout fourni dans la documentation.&lt;br /&gt;
&lt;br /&gt;
[[Fichier:20231218 085218.jpg|vignette|néant]]&lt;br /&gt;
&lt;br /&gt;
Enfin, nous avons activé la communication UART de la Raspberry Pi afin de pouvoir communiquer avec. En fin de séance, nous étions en train de vérifier que la Raspberry Pi répondait bien, même en ayant ajouté la ligne enable_uart=1 dans le fichier config.txt de la Raspberry.&lt;br /&gt;
&lt;br /&gt;
==Séance du 18/12/2023==&lt;br /&gt;
===Configuration de la Raspberry===&lt;br /&gt;
Nous avons résolu le problème de la Raspberry qui ne répondait pas. Cela était dû à l'alimentation : brancher la carte en USBC résoud le problème. Cependant, nous recevons une erreur l'erreur EXT4-fs error (device mmcblk0p2).&lt;br /&gt;
Le problème venait des arguments saisis lors du lancement de Minicom. Avec la commande suivante, il est à présent possible de se connecter sur la Raspberry : &amp;lt;code&amp;gt;minicom -D /dev/ttyUSB0 -b 115200&amp;lt;/code&amp;gt;&lt;br /&gt;
Dans la Raspberry, nous avons configuré une interface réseau wlan0 pour se connecter à WiFi_IE_1 :&lt;br /&gt;
    auto wlan0&lt;br /&gt;
    iface wlan0 inet dhcp&lt;br /&gt;
    wpa-conf /etc/wpa_supplicant/wpa_supplicant.conf&lt;br /&gt;
A présent à partir de la Raspberry, on peut ping la machine virtuelle sur chassiron avec son IPv6.&lt;br /&gt;
&lt;br /&gt;
===Configuration du capteur de distance===&lt;br /&gt;
Un programme était déjà présent sur le capteur. On a téléchargé le logiciel STM32CubeIDE pour pouvoir éditer du code et le téléverser sur le capteur. Nous avons testé de téléverser un programme d'exemple dont voici le résultat :&lt;br /&gt;
[[Fichier:Screenshot 2023-12-18 13-12-19.jpg|vignette|néant|600x600px]]&lt;br /&gt;
&lt;br /&gt;
Nous avons modifié ce programme afin d'effectuer un formatage des données transmises par le capteur sous le format ''&amp;lt;distance&amp;gt;,'' pour chaque valeur. Grâce à ce formatage, il est à présent possible d'utiliser les données reçues par le logiciel NanoEdgeStudio AI pour la partie Machine Learning.&lt;br /&gt;
&lt;br /&gt;
Pour recevoir les valeurs de manière exploitable, il faut modifier le code Exemple pour obtenir une liste séparée par des virgules, il a donc fallu supprimer les espaces et les barres verticales :&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
static void print_result(RANGING_SENSOR_Result_t *Result)&lt;br /&gt;
{&lt;br /&gt;
  int8_t j;&lt;br /&gt;
  int8_t k;&lt;br /&gt;
  int8_t l;&lt;br /&gt;
  uint8_t zones_per_line;&lt;br /&gt;
  zones_per_line = ((Profile.RangingProfile == RS_PROFILE_8x8_AUTONOMOUS) ||&lt;br /&gt;
         (Profile.RangingProfile == RS_PROFILE_8x8_CONTINUOUS)) ? 8 : 4;&lt;br /&gt;
  for (j = 0; j &amp;lt; Result-&amp;gt;NumberOfZones; j += zones_per_line)&lt;br /&gt;
  {&lt;br /&gt;
    for (l = 0; l &amp;lt; RANGING_SENSOR_NB_TARGET_PER_ZONE; l++)&lt;br /&gt;
    {&lt;br /&gt;
      /* Print distance and status */&lt;br /&gt;
      for (k = (zones_per_line - 1); k &amp;gt;= 0; k--)&lt;br /&gt;
      {&lt;br /&gt;
        if (Result-&amp;gt;ZoneResult[j+k].NumberOfTargets &amp;gt; 0)&lt;br /&gt;
          printf(&amp;quot;%ld,&amp;quot;,(long)Result-&amp;gt;ZoneResult[j+k].Distance[l]);&lt;br /&gt;
      }&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
  printf(&amp;quot;\n&amp;quot;);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;On passe ensuite sur Nano Edge Studio pour définir les signaux et entraîner le modèle.&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Capture d'écran 2023-12-18 172047.png|néant|vignette|800x800px]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Une fois le modèle entraîné, on peut le tester avec l'onglet Emulator &lt;br /&gt;
&lt;br /&gt;
[[Fichier:Capture d'écran 2023-12-18 173255.png|néant|vignette|800x800px]]&lt;br /&gt;
&lt;br /&gt;
===Emulation avec NanoEdgeStudio AI===&lt;br /&gt;
&lt;br /&gt;
===Configuration du serveur===&lt;br /&gt;
Configuration d'un serveur HTTP sur la machine virtuelle gabidann :&amp;lt;syntaxhighlight lang=&amp;quot;python3&amp;quot;&amp;gt;&lt;br /&gt;
import socket&lt;br /&gt;
from http.server import HTTPServer, SimpleHTTPRequestHandler&lt;br /&gt;
&lt;br /&gt;
class MyHandler(SimpleHTTPRequestHandler):&lt;br /&gt;
  def do_GET(self):&lt;br /&gt;
    if self.path == '/ip':&lt;br /&gt;
      self.send_response(200)&lt;br /&gt;
      self.send_header('Content-type', 'text/html')&lt;br /&gt;
      self.end_headers()&lt;br /&gt;
      self.wfile.write(f'Your IP address is {self.client_address[0]}'.encode())&lt;br /&gt;
      return&lt;br /&gt;
    else:&lt;br /&gt;
      return SimpleHTTPRequestHandler.do_GET(self)&lt;br /&gt;
&lt;br /&gt;
class HTTPServerV6(HTTPServer):&lt;br /&gt;
  address_family = socket.AF_INET6&lt;br /&gt;
&lt;br /&gt;
def main():&lt;br /&gt;
  server = HTTPServerV6(('::', 8080), MyHandler)&lt;br /&gt;
  server.serve_forever()&lt;br /&gt;
&lt;br /&gt;
if __name__ == '__main__':&lt;br /&gt;
  main()&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Pour se connecter au serveur depuis un navigateur, on peut ouvrir un navigateur depuis la zabeth et y accéder avec l'adresse : ''[&amp;lt;ipv6_VM&amp;gt;]:&amp;lt;port&amp;gt;''. Dans notre cas, le serveur écoute le port '''8080'''.&lt;br /&gt;
&lt;br /&gt;
==Séance du 19/12/2023==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Séance du 20/12/2023==&lt;/div&gt;</summary>
		<author><name>Gthomas</name></author>
	</entry>
	<entry>
		<id>https://wiki-se.plil.fr/mediawiki/index.php?title=RodenburgThomas&amp;diff=3506</id>
		<title>RodenburgThomas</title>
		<link rel="alternate" type="text/html" href="https://wiki-se.plil.fr/mediawiki/index.php?title=RodenburgThomas&amp;diff=3506"/>
		<updated>2023-12-18T16:43:10Z</updated>

		<summary type="html">&lt;p&gt;Gthomas : /* Configuration du capteur de distance */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;=Le binôme=&lt;br /&gt;
&lt;br /&gt;
Le binôme est constitué de 2 élèves de SE5-SC :&lt;br /&gt;
* Dann RODENBURG&lt;br /&gt;
* Gabriel THOMAS&lt;br /&gt;
&lt;br /&gt;
=Compte rendu des séances=&lt;br /&gt;
&lt;br /&gt;
==Séance du 04/12/2023==&lt;br /&gt;
===Création de la machine virtuelle===&lt;br /&gt;
Création d'une machine virtuelle '''gabidann''' sur le serveur chassiron :&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;xen-create-image --hostname=gabidann --force --dist=bookworm --size=10G --memory=10G --dir=/usr/local/xen --password=glopglop --dhcp --bridge=bridgeStudents&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
La machine virtuelle est à présent connectée au WiFi.&lt;br /&gt;
&lt;br /&gt;
Après cela, nous avons configuré la machine virtuelle selon l'énoncé du TP en faisant un xen console gabidann. Nous avons ensuite participé à la mise en place du point d'accès WiFi.&lt;br /&gt;
&lt;br /&gt;
===Premières observations du capteur===&lt;br /&gt;
De plus nous avons observé le retour du capteur de distance Nucleo-53L5A1 avec l'outil minicom. Le contenu envoyé par le capteur était compréhensible avec une fréquence de 460 800 bauds ; sur minicom, on a pu constater que le capteur nous envoie des valeurs qui dépendent de la distance entre celui-ci et un obstacle.&lt;br /&gt;
&lt;br /&gt;
===Raspberry===&lt;br /&gt;
D'un autre côté, nous avons branché la Raspberry Pi à l'ordinateur selon le pinout fourni dans la documentation.&lt;br /&gt;
&lt;br /&gt;
[[Fichier:20231218 085218.jpg|vignette|néant]]&lt;br /&gt;
&lt;br /&gt;
Enfin, nous avons activé la communication UART de la Raspberry Pi afin de pouvoir communiquer avec. En fin de séance, nous étions en train de vérifier que la Raspberry Pi répondait bien, même en ayant ajouté la ligne enable_uart=1 dans le fichier config.txt de la Raspberry.&lt;br /&gt;
&lt;br /&gt;
==Séance du 18/12/2023==&lt;br /&gt;
===Configuration de la Raspberry===&lt;br /&gt;
Nous avons résolu le problème de la Raspberry qui ne répondait pas. Cela était dû à l'alimentation : brancher la carte en USBC résoud le problème. Cependant, nous recevons une erreur l'erreur EXT4-fs error (device mmcblk0p2).&lt;br /&gt;
Le problème venait des arguments saisis lors du lancement de Minicom. Avec la commande suivante, il est à présent possible de se connecter sur la Raspberry : &amp;lt;code&amp;gt;minicom -D /dev/ttyUSB0 -b 115200&amp;lt;/code&amp;gt;&lt;br /&gt;
Dans la Raspberry, nous avons configuré une interface réseau wlan0 pour se connecter à WiFi_IE_1 :&lt;br /&gt;
    auto wlan0&lt;br /&gt;
    iface wlan0 inet dhcp&lt;br /&gt;
    wpa-conf /etc/wpa_supplicant/wpa_supplicant.conf&lt;br /&gt;
A présent à partir de la Raspberry, on peut ping la machine virtuelle sur chassiron avec son IPv6.&lt;br /&gt;
&lt;br /&gt;
===Configuration du capteur de distance===&lt;br /&gt;
Un programme était déjà présent sur le capteur. On a téléchargé le logiciel STM32CubeIDE pour pouvoir éditer du code et le téléverser sur le capteur. Nous avons testé de téléverser un programme d'exemple dont voici le résultat :&lt;br /&gt;
[[Fichier:Screenshot 2023-12-18 13-12-19.jpg|vignette|néant|600x600px]]&lt;br /&gt;
&lt;br /&gt;
Nous avons modifié ce programme afin d'effectuer un formatage des données transmises par le capteur sous le format ''&amp;lt;distance&amp;gt;,'' pour chaque valeur. Grâce à ce formatage, il est à présent possible d'utiliser les données reçues par le logiciel NanoEdgeStudio AI pour la partie Machine Learning.&lt;br /&gt;
&lt;br /&gt;
Pour recevoir les valeurs de manière exploitable, il faut modifier le code Exemple pour obtenir une liste séparée par des virgules, il a donc fallu supprimer les espaces et les barres verticales :&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
static void print_result(RANGING_SENSOR_Result_t *Result)&lt;br /&gt;
{&lt;br /&gt;
  int8_t j;&lt;br /&gt;
  int8_t k;&lt;br /&gt;
  int8_t l;&lt;br /&gt;
  uint8_t zones_per_line;&lt;br /&gt;
  zones_per_line = ((Profile.RangingProfile == RS_PROFILE_8x8_AUTONOMOUS) ||&lt;br /&gt;
         (Profile.RangingProfile == RS_PROFILE_8x8_CONTINUOUS)) ? 8 : 4;&lt;br /&gt;
  for (j = 0; j &amp;lt; Result-&amp;gt;NumberOfZones; j += zones_per_line)&lt;br /&gt;
  {&lt;br /&gt;
    for (l = 0; l &amp;lt; RANGING_SENSOR_NB_TARGET_PER_ZONE; l++)&lt;br /&gt;
    {&lt;br /&gt;
      /* Print distance and status */&lt;br /&gt;
      for (k = (zones_per_line - 1); k &amp;gt;= 0; k--)&lt;br /&gt;
      {&lt;br /&gt;
        if (Result-&amp;gt;ZoneResult[j+k].NumberOfTargets &amp;gt; 0)&lt;br /&gt;
          printf(&amp;quot;%ld,&amp;quot;,(long)Result-&amp;gt;ZoneResult[j+k].Distance[l]);&lt;br /&gt;
      }&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
  printf(&amp;quot;\n&amp;quot;);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;On passe ensuite sur Nano Edge Studio pour définir les signaux et entraîner le modèle.&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Capture d'écran 2023-12-18 172047.png|néant|vignette|800x800px]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Une fois le modèle entraîné, on peut le tester avec l'onglet Emulator &lt;br /&gt;
&lt;br /&gt;
[[Fichier:Capture d'écran 2023-12-18 173255.png|néant|vignette|800x800px]]&lt;br /&gt;
&lt;br /&gt;
===Emulation avec NanoEdgeStudio AI===&lt;br /&gt;
&lt;br /&gt;
===Configuration du serveur===&lt;br /&gt;
Configuration d'un serveur HTTP sur la machine virtuelle gabidann :&amp;lt;syntaxhighlight lang=&amp;quot;python3&amp;quot;&amp;gt;&lt;br /&gt;
import socket&lt;br /&gt;
from http.server import HTTPServer, SimpleHTTPRequestHandler&lt;br /&gt;
&lt;br /&gt;
class MyHandler(SimpleHTTPRequestHandler):&lt;br /&gt;
  def do_GET(self):&lt;br /&gt;
    if self.path == '/ip':&lt;br /&gt;
      self.send_response(200)&lt;br /&gt;
      self.send_header('Content-type', 'text/html')&lt;br /&gt;
      self.end_headers()&lt;br /&gt;
      self.wfile.write(f'Your IP address is {self.client_address[0]}'.encode())&lt;br /&gt;
      return&lt;br /&gt;
    else:&lt;br /&gt;
      return SimpleHTTPRequestHandler.do_GET(self)&lt;br /&gt;
&lt;br /&gt;
class HTTPServerV6(HTTPServer):&lt;br /&gt;
  address_family = socket.AF_INET6&lt;br /&gt;
&lt;br /&gt;
def main():&lt;br /&gt;
  server = HTTPServerV6(('::', 8080), MyHandler)&lt;br /&gt;
  server.serve_forever()&lt;br /&gt;
&lt;br /&gt;
if __name__ == '__main__':&lt;br /&gt;
  main()&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Pour se connecter au serveur depuis un navigateur, on peut ouvrir un navigateur depuis la zabeth et y accéder avec l'adresse : ''[&amp;lt;ipv6_VM&amp;gt;]:&amp;lt;port&amp;gt;''. Dans notre cas, le serveur écoute le port '''8080'''.&lt;br /&gt;
&lt;br /&gt;
==Séance du 19/12/2023==&lt;/div&gt;</summary>
		<author><name>Gthomas</name></author>
	</entry>
	<entry>
		<id>https://wiki-se.plil.fr/mediawiki/index.php?title=RodenburgThomas&amp;diff=3504</id>
		<title>RodenburgThomas</title>
		<link rel="alternate" type="text/html" href="https://wiki-se.plil.fr/mediawiki/index.php?title=RodenburgThomas&amp;diff=3504"/>
		<updated>2023-12-18T16:42:15Z</updated>

		<summary type="html">&lt;p&gt;Gthomas : /* Raspberry */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;=Le binôme=&lt;br /&gt;
&lt;br /&gt;
Le binôme est constitué de 2 élèves de SE5-SC :&lt;br /&gt;
* Dann RODENBURG&lt;br /&gt;
* Gabriel THOMAS&lt;br /&gt;
&lt;br /&gt;
=Compte rendu des séances=&lt;br /&gt;
&lt;br /&gt;
==Séance du 04/12/2023==&lt;br /&gt;
===Création de la machine virtuelle===&lt;br /&gt;
Création d'une machine virtuelle '''gabidann''' sur le serveur chassiron :&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;xen-create-image --hostname=gabidann --force --dist=bookworm --size=10G --memory=10G --dir=/usr/local/xen --password=glopglop --dhcp --bridge=bridgeStudents&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
La machine virtuelle est à présent connectée au WiFi.&lt;br /&gt;
&lt;br /&gt;
Après cela, nous avons configuré la machine virtuelle selon l'énoncé du TP en faisant un xen console gabidann. Nous avons ensuite participé à la mise en place du point d'accès WiFi.&lt;br /&gt;
&lt;br /&gt;
===Premières observations du capteur===&lt;br /&gt;
De plus nous avons observé le retour du capteur de distance Nucleo-53L5A1 avec l'outil minicom. Le contenu envoyé par le capteur était compréhensible avec une fréquence de 460 800 bauds ; sur minicom, on a pu constater que le capteur nous envoie des valeurs qui dépendent de la distance entre celui-ci et un obstacle.&lt;br /&gt;
&lt;br /&gt;
===Raspberry===&lt;br /&gt;
D'un autre côté, nous avons branché la Raspberry Pi à l'ordinateur selon le pinout fourni dans la documentation.&lt;br /&gt;
&lt;br /&gt;
[[Fichier:20231218 085218.jpg|vignette|néant]]&lt;br /&gt;
&lt;br /&gt;
Enfin, nous avons activé la communication UART de la Raspberry Pi afin de pouvoir communiquer avec. En fin de séance, nous étions en train de vérifier que la Raspberry Pi répondait bien, même en ayant ajouté la ligne enable_uart=1 dans le fichier config.txt de la Raspberry.&lt;br /&gt;
&lt;br /&gt;
==Séance du 18/12/2023==&lt;br /&gt;
===Configuration de la Raspberry===&lt;br /&gt;
Nous avons résolu le problème de la Raspberry qui ne répondait pas. Cela était dû à l'alimentation : brancher la carte en USBC résoud le problème. Cependant, nous recevons une erreur l'erreur EXT4-fs error (device mmcblk0p2).&lt;br /&gt;
Le problème venait des arguments saisis lors du lancement de Minicom. Avec la commande suivante, il est à présent possible de se connecter sur la Raspberry : &amp;lt;code&amp;gt;minicom -D /dev/ttyUSB0 -b 115200&amp;lt;/code&amp;gt;&lt;br /&gt;
Dans la Raspberry, nous avons configuré une interface réseau wlan0 pour se connecter à WiFi_IE_1 :&lt;br /&gt;
    auto wlan0&lt;br /&gt;
    iface wlan0 inet dhcp&lt;br /&gt;
    wpa-conf /etc/wpa_supplicant/wpa_supplicant.conf&lt;br /&gt;
A présent à partir de la Raspberry, on peut ping la machine virtuelle sur chassiron avec son IPv6.&lt;br /&gt;
&lt;br /&gt;
===Configuration du capteur de distance===&lt;br /&gt;
Un programme était déjà présent sur le capteur. On a téléchargé le logiciel STM32CubeIDE pour pouvoir éditer du code et le téléverser sur le capteur. Nous avons testé de téléverser un programme d'exemple dont voici le résultat :&lt;br /&gt;
[[Fichier:Screenshot 2023-12-18 13-12-19.jpg]]&lt;br /&gt;
&lt;br /&gt;
Nous avons modifié ce programme afin d'effectuer un formatage des données transmises par le capteur sous le format ''&amp;lt;distance&amp;gt;,'' pour chaque valeur. Grâce à ce formatage, il est à présent possible d'utiliser les données reçues par le logiciel NanoEdgeStudio AI pour la partie Machine Learning.&lt;br /&gt;
&lt;br /&gt;
Pour recevoir les valeurs de manière exploitable, il faut modifier le code Exemple pour obtenir une liste séparée par des virgules, il a donc fallu supprimer les espaces et les barres verticales :&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
static void print_result(RANGING_SENSOR_Result_t *Result)&lt;br /&gt;
{&lt;br /&gt;
  int8_t j;&lt;br /&gt;
  int8_t k;&lt;br /&gt;
  int8_t l;&lt;br /&gt;
  uint8_t zones_per_line;&lt;br /&gt;
  zones_per_line = ((Profile.RangingProfile == RS_PROFILE_8x8_AUTONOMOUS) ||&lt;br /&gt;
         (Profile.RangingProfile == RS_PROFILE_8x8_CONTINUOUS)) ? 8 : 4;&lt;br /&gt;
  for (j = 0; j &amp;lt; Result-&amp;gt;NumberOfZones; j += zones_per_line)&lt;br /&gt;
  {&lt;br /&gt;
    for (l = 0; l &amp;lt; RANGING_SENSOR_NB_TARGET_PER_ZONE; l++)&lt;br /&gt;
    {&lt;br /&gt;
      /* Print distance and status */&lt;br /&gt;
      for (k = (zones_per_line - 1); k &amp;gt;= 0; k--)&lt;br /&gt;
      {&lt;br /&gt;
        if (Result-&amp;gt;ZoneResult[j+k].NumberOfTargets &amp;gt; 0)&lt;br /&gt;
          printf(&amp;quot;%ld,&amp;quot;,(long)Result-&amp;gt;ZoneResult[j+k].Distance[l]);&lt;br /&gt;
      }&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
  printf(&amp;quot;\n&amp;quot;);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;On passe ensuite sur Nano Edge Studio pour définir les signaux et entraîner le modèle.&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Capture d'écran 2023-12-18 172047.png|néant|vignette|800x800px]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Une fois le modèle entraîné, on peut le tester avec l'onglet Emulator &lt;br /&gt;
&lt;br /&gt;
[[Fichier:Capture d'écran 2023-12-18 173255.png|néant|vignette|800x800px]]&lt;br /&gt;
&lt;br /&gt;
===Emulation avec NanoEdgeStudio AI===&lt;br /&gt;
&lt;br /&gt;
===Configuration du serveur===&lt;br /&gt;
Configuration d'un serveur HTTP sur la machine virtuelle gabidann :&amp;lt;syntaxhighlight lang=&amp;quot;python3&amp;quot;&amp;gt;&lt;br /&gt;
import socket&lt;br /&gt;
from http.server import HTTPServer, SimpleHTTPRequestHandler&lt;br /&gt;
&lt;br /&gt;
class MyHandler(SimpleHTTPRequestHandler):&lt;br /&gt;
  def do_GET(self):&lt;br /&gt;
    if self.path == '/ip':&lt;br /&gt;
      self.send_response(200)&lt;br /&gt;
      self.send_header('Content-type', 'text/html')&lt;br /&gt;
      self.end_headers()&lt;br /&gt;
      self.wfile.write(f'Your IP address is {self.client_address[0]}'.encode())&lt;br /&gt;
      return&lt;br /&gt;
    else:&lt;br /&gt;
      return SimpleHTTPRequestHandler.do_GET(self)&lt;br /&gt;
&lt;br /&gt;
class HTTPServerV6(HTTPServer):&lt;br /&gt;
  address_family = socket.AF_INET6&lt;br /&gt;
&lt;br /&gt;
def main():&lt;br /&gt;
  server = HTTPServerV6(('::', 8080), MyHandler)&lt;br /&gt;
  server.serve_forever()&lt;br /&gt;
&lt;br /&gt;
if __name__ == '__main__':&lt;br /&gt;
  main()&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Pour se connecter au serveur depuis un navigateur, on peut ouvrir un navigateur depuis la zabeth et y accéder avec l'adresse : ''[&amp;lt;ipv6_VM&amp;gt;]:&amp;lt;port&amp;gt;''. Dans notre cas, le serveur écoute le port '''8080'''.&lt;br /&gt;
&lt;br /&gt;
==Séance du 19/12/2023==&lt;/div&gt;</summary>
		<author><name>Gthomas</name></author>
	</entry>
	<entry>
		<id>https://wiki-se.plil.fr/mediawiki/index.php?title=RodenburgThomas&amp;diff=3503</id>
		<title>RodenburgThomas</title>
		<link rel="alternate" type="text/html" href="https://wiki-se.plil.fr/mediawiki/index.php?title=RodenburgThomas&amp;diff=3503"/>
		<updated>2023-12-18T16:41:56Z</updated>

		<summary type="html">&lt;p&gt;Gthomas : /* Raspberry */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;=Le binôme=&lt;br /&gt;
&lt;br /&gt;
Le binôme est constitué de 2 élèves de SE5-SC :&lt;br /&gt;
* Dann RODENBURG&lt;br /&gt;
* Gabriel THOMAS&lt;br /&gt;
&lt;br /&gt;
=Compte rendu des séances=&lt;br /&gt;
&lt;br /&gt;
==Séance du 04/12/2023==&lt;br /&gt;
===Création de la machine virtuelle===&lt;br /&gt;
Création d'une machine virtuelle '''gabidann''' sur le serveur chassiron :&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;xen-create-image --hostname=gabidann --force --dist=bookworm --size=10G --memory=10G --dir=/usr/local/xen --password=glopglop --dhcp --bridge=bridgeStudents&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
La machine virtuelle est à présent connectée au WiFi.&lt;br /&gt;
&lt;br /&gt;
Après cela, nous avons configuré la machine virtuelle selon l'énoncé du TP en faisant un xen console gabidann. Nous avons ensuite participé à la mise en place du point d'accès WiFi.&lt;br /&gt;
&lt;br /&gt;
===Premières observations du capteur===&lt;br /&gt;
De plus nous avons observé le retour du capteur de distance Nucleo-53L5A1 avec l'outil minicom. Le contenu envoyé par le capteur était compréhensible avec une fréquence de 460 800 bauds ; sur minicom, on a pu constater que le capteur nous envoie des valeurs qui dépendent de la distance entre celui-ci et un obstacle.&lt;br /&gt;
&lt;br /&gt;
===Raspberry===&lt;br /&gt;
D'un autre côté, nous avons branché la Raspberry Pi à l'ordinateur selon le pinout fourni dans la documentation.&lt;br /&gt;
&lt;br /&gt;
[[Fichier:20231218 085218.jpg|vignette|center|néant]]&lt;br /&gt;
&lt;br /&gt;
Enfin, nous avons activé la communication UART de la Raspberry Pi afin de pouvoir communiquer avec. En fin de séance, nous étions en train de vérifier que la Raspberry Pi répondait bien, même en ayant ajouté la ligne enable_uart=1 dans le fichier config.txt de la Raspberry.&lt;br /&gt;
&lt;br /&gt;
==Séance du 18/12/2023==&lt;br /&gt;
===Configuration de la Raspberry===&lt;br /&gt;
Nous avons résolu le problème de la Raspberry qui ne répondait pas. Cela était dû à l'alimentation : brancher la carte en USBC résoud le problème. Cependant, nous recevons une erreur l'erreur EXT4-fs error (device mmcblk0p2).&lt;br /&gt;
Le problème venait des arguments saisis lors du lancement de Minicom. Avec la commande suivante, il est à présent possible de se connecter sur la Raspberry : &amp;lt;code&amp;gt;minicom -D /dev/ttyUSB0 -b 115200&amp;lt;/code&amp;gt;&lt;br /&gt;
Dans la Raspberry, nous avons configuré une interface réseau wlan0 pour se connecter à WiFi_IE_1 :&lt;br /&gt;
    auto wlan0&lt;br /&gt;
    iface wlan0 inet dhcp&lt;br /&gt;
    wpa-conf /etc/wpa_supplicant/wpa_supplicant.conf&lt;br /&gt;
A présent à partir de la Raspberry, on peut ping la machine virtuelle sur chassiron avec son IPv6.&lt;br /&gt;
&lt;br /&gt;
===Configuration du capteur de distance===&lt;br /&gt;
Un programme était déjà présent sur le capteur. On a téléchargé le logiciel STM32CubeIDE pour pouvoir éditer du code et le téléverser sur le capteur. Nous avons testé de téléverser un programme d'exemple dont voici le résultat :&lt;br /&gt;
[[Fichier:Screenshot 2023-12-18 13-12-19.jpg]]&lt;br /&gt;
&lt;br /&gt;
Nous avons modifié ce programme afin d'effectuer un formatage des données transmises par le capteur sous le format ''&amp;lt;distance&amp;gt;,'' pour chaque valeur. Grâce à ce formatage, il est à présent possible d'utiliser les données reçues par le logiciel NanoEdgeStudio AI pour la partie Machine Learning.&lt;br /&gt;
&lt;br /&gt;
Pour recevoir les valeurs de manière exploitable, il faut modifier le code Exemple pour obtenir une liste séparée par des virgules, il a donc fallu supprimer les espaces et les barres verticales :&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
static void print_result(RANGING_SENSOR_Result_t *Result)&lt;br /&gt;
{&lt;br /&gt;
  int8_t j;&lt;br /&gt;
  int8_t k;&lt;br /&gt;
  int8_t l;&lt;br /&gt;
  uint8_t zones_per_line;&lt;br /&gt;
  zones_per_line = ((Profile.RangingProfile == RS_PROFILE_8x8_AUTONOMOUS) ||&lt;br /&gt;
         (Profile.RangingProfile == RS_PROFILE_8x8_CONTINUOUS)) ? 8 : 4;&lt;br /&gt;
  for (j = 0; j &amp;lt; Result-&amp;gt;NumberOfZones; j += zones_per_line)&lt;br /&gt;
  {&lt;br /&gt;
    for (l = 0; l &amp;lt; RANGING_SENSOR_NB_TARGET_PER_ZONE; l++)&lt;br /&gt;
    {&lt;br /&gt;
      /* Print distance and status */&lt;br /&gt;
      for (k = (zones_per_line - 1); k &amp;gt;= 0; k--)&lt;br /&gt;
      {&lt;br /&gt;
        if (Result-&amp;gt;ZoneResult[j+k].NumberOfTargets &amp;gt; 0)&lt;br /&gt;
          printf(&amp;quot;%ld,&amp;quot;,(long)Result-&amp;gt;ZoneResult[j+k].Distance[l]);&lt;br /&gt;
      }&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
  printf(&amp;quot;\n&amp;quot;);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;On passe ensuite sur Nano Edge Studio pour définir les signaux et entraîner le modèle.&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Capture d'écran 2023-12-18 172047.png|néant|vignette|800x800px]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Une fois le modèle entraîné, on peut le tester avec l'onglet Emulator &lt;br /&gt;
&lt;br /&gt;
[[Fichier:Capture d'écran 2023-12-18 173255.png|néant|vignette|800x800px]]&lt;br /&gt;
&lt;br /&gt;
===Emulation avec NanoEdgeStudio AI===&lt;br /&gt;
&lt;br /&gt;
===Configuration du serveur===&lt;br /&gt;
Configuration d'un serveur HTTP sur la machine virtuelle gabidann :&amp;lt;syntaxhighlight lang=&amp;quot;python3&amp;quot;&amp;gt;&lt;br /&gt;
import socket&lt;br /&gt;
from http.server import HTTPServer, SimpleHTTPRequestHandler&lt;br /&gt;
&lt;br /&gt;
class MyHandler(SimpleHTTPRequestHandler):&lt;br /&gt;
  def do_GET(self):&lt;br /&gt;
    if self.path == '/ip':&lt;br /&gt;
      self.send_response(200)&lt;br /&gt;
      self.send_header('Content-type', 'text/html')&lt;br /&gt;
      self.end_headers()&lt;br /&gt;
      self.wfile.write(f'Your IP address is {self.client_address[0]}'.encode())&lt;br /&gt;
      return&lt;br /&gt;
    else:&lt;br /&gt;
      return SimpleHTTPRequestHandler.do_GET(self)&lt;br /&gt;
&lt;br /&gt;
class HTTPServerV6(HTTPServer):&lt;br /&gt;
  address_family = socket.AF_INET6&lt;br /&gt;
&lt;br /&gt;
def main():&lt;br /&gt;
  server = HTTPServerV6(('::', 8080), MyHandler)&lt;br /&gt;
  server.serve_forever()&lt;br /&gt;
&lt;br /&gt;
if __name__ == '__main__':&lt;br /&gt;
  main()&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Pour se connecter au serveur depuis un navigateur, on peut ouvrir un navigateur depuis la zabeth et y accéder avec l'adresse : ''[&amp;lt;ipv6_VM&amp;gt;]:&amp;lt;port&amp;gt;''. Dans notre cas, le serveur écoute le port '''8080'''.&lt;br /&gt;
&lt;br /&gt;
==Séance du 19/12/2023==&lt;/div&gt;</summary>
		<author><name>Gthomas</name></author>
	</entry>
	<entry>
		<id>https://wiki-se.plil.fr/mediawiki/index.php?title=RodenburgThomas&amp;diff=3502</id>
		<title>RodenburgThomas</title>
		<link rel="alternate" type="text/html" href="https://wiki-se.plil.fr/mediawiki/index.php?title=RodenburgThomas&amp;diff=3502"/>
		<updated>2023-12-18T16:41:43Z</updated>

		<summary type="html">&lt;p&gt;Gthomas : /* Raspberry */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;=Le binôme=&lt;br /&gt;
&lt;br /&gt;
Le binôme est constitué de 2 élèves de SE5-SC :&lt;br /&gt;
* Dann RODENBURG&lt;br /&gt;
* Gabriel THOMAS&lt;br /&gt;
&lt;br /&gt;
=Compte rendu des séances=&lt;br /&gt;
&lt;br /&gt;
==Séance du 04/12/2023==&lt;br /&gt;
===Création de la machine virtuelle===&lt;br /&gt;
Création d'une machine virtuelle '''gabidann''' sur le serveur chassiron :&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;xen-create-image --hostname=gabidann --force --dist=bookworm --size=10G --memory=10G --dir=/usr/local/xen --password=glopglop --dhcp --bridge=bridgeStudents&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
La machine virtuelle est à présent connectée au WiFi.&lt;br /&gt;
&lt;br /&gt;
Après cela, nous avons configuré la machine virtuelle selon l'énoncé du TP en faisant un xen console gabidann. Nous avons ensuite participé à la mise en place du point d'accès WiFi.&lt;br /&gt;
&lt;br /&gt;
===Premières observations du capteur===&lt;br /&gt;
De plus nous avons observé le retour du capteur de distance Nucleo-53L5A1 avec l'outil minicom. Le contenu envoyé par le capteur était compréhensible avec une fréquence de 460 800 bauds ; sur minicom, on a pu constater que le capteur nous envoie des valeurs qui dépendent de la distance entre celui-ci et un obstacle.&lt;br /&gt;
&lt;br /&gt;
===Raspberry===&lt;br /&gt;
D'un autre côté, nous avons branché la Raspberry Pi à l'ordinateur selon le pinout fourni dans la documentation.&lt;br /&gt;
&lt;br /&gt;
[[Fichier:20231218 085218.jpg|center|néant]]&lt;br /&gt;
&lt;br /&gt;
Enfin, nous avons activé la communication UART de la Raspberry Pi afin de pouvoir communiquer avec. En fin de séance, nous étions en train de vérifier que la Raspberry Pi répondait bien, même en ayant ajouté la ligne enable_uart=1 dans le fichier config.txt de la Raspberry.&lt;br /&gt;
&lt;br /&gt;
==Séance du 18/12/2023==&lt;br /&gt;
===Configuration de la Raspberry===&lt;br /&gt;
Nous avons résolu le problème de la Raspberry qui ne répondait pas. Cela était dû à l'alimentation : brancher la carte en USBC résoud le problème. Cependant, nous recevons une erreur l'erreur EXT4-fs error (device mmcblk0p2).&lt;br /&gt;
Le problème venait des arguments saisis lors du lancement de Minicom. Avec la commande suivante, il est à présent possible de se connecter sur la Raspberry : &amp;lt;code&amp;gt;minicom -D /dev/ttyUSB0 -b 115200&amp;lt;/code&amp;gt;&lt;br /&gt;
Dans la Raspberry, nous avons configuré une interface réseau wlan0 pour se connecter à WiFi_IE_1 :&lt;br /&gt;
    auto wlan0&lt;br /&gt;
    iface wlan0 inet dhcp&lt;br /&gt;
    wpa-conf /etc/wpa_supplicant/wpa_supplicant.conf&lt;br /&gt;
A présent à partir de la Raspberry, on peut ping la machine virtuelle sur chassiron avec son IPv6.&lt;br /&gt;
&lt;br /&gt;
===Configuration du capteur de distance===&lt;br /&gt;
Un programme était déjà présent sur le capteur. On a téléchargé le logiciel STM32CubeIDE pour pouvoir éditer du code et le téléverser sur le capteur. Nous avons testé de téléverser un programme d'exemple dont voici le résultat :&lt;br /&gt;
[[Fichier:Screenshot 2023-12-18 13-12-19.jpg]]&lt;br /&gt;
&lt;br /&gt;
Nous avons modifié ce programme afin d'effectuer un formatage des données transmises par le capteur sous le format ''&amp;lt;distance&amp;gt;,'' pour chaque valeur. Grâce à ce formatage, il est à présent possible d'utiliser les données reçues par le logiciel NanoEdgeStudio AI pour la partie Machine Learning.&lt;br /&gt;
&lt;br /&gt;
Pour recevoir les valeurs de manière exploitable, il faut modifier le code Exemple pour obtenir une liste séparée par des virgules, il a donc fallu supprimer les espaces et les barres verticales :&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
static void print_result(RANGING_SENSOR_Result_t *Result)&lt;br /&gt;
{&lt;br /&gt;
  int8_t j;&lt;br /&gt;
  int8_t k;&lt;br /&gt;
  int8_t l;&lt;br /&gt;
  uint8_t zones_per_line;&lt;br /&gt;
  zones_per_line = ((Profile.RangingProfile == RS_PROFILE_8x8_AUTONOMOUS) ||&lt;br /&gt;
         (Profile.RangingProfile == RS_PROFILE_8x8_CONTINUOUS)) ? 8 : 4;&lt;br /&gt;
  for (j = 0; j &amp;lt; Result-&amp;gt;NumberOfZones; j += zones_per_line)&lt;br /&gt;
  {&lt;br /&gt;
    for (l = 0; l &amp;lt; RANGING_SENSOR_NB_TARGET_PER_ZONE; l++)&lt;br /&gt;
    {&lt;br /&gt;
      /* Print distance and status */&lt;br /&gt;
      for (k = (zones_per_line - 1); k &amp;gt;= 0; k--)&lt;br /&gt;
      {&lt;br /&gt;
        if (Result-&amp;gt;ZoneResult[j+k].NumberOfTargets &amp;gt; 0)&lt;br /&gt;
          printf(&amp;quot;%ld,&amp;quot;,(long)Result-&amp;gt;ZoneResult[j+k].Distance[l]);&lt;br /&gt;
      }&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
  printf(&amp;quot;\n&amp;quot;);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;On passe ensuite sur Nano Edge Studio pour définir les signaux et entraîner le modèle.&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Capture d'écran 2023-12-18 172047.png|néant|vignette|800x800px]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Une fois le modèle entraîné, on peut le tester avec l'onglet Emulator &lt;br /&gt;
&lt;br /&gt;
[[Fichier:Capture d'écran 2023-12-18 173255.png|néant|vignette|800x800px]]&lt;br /&gt;
&lt;br /&gt;
===Emulation avec NanoEdgeStudio AI===&lt;br /&gt;
&lt;br /&gt;
===Configuration du serveur===&lt;br /&gt;
Configuration d'un serveur HTTP sur la machine virtuelle gabidann :&amp;lt;syntaxhighlight lang=&amp;quot;python3&amp;quot;&amp;gt;&lt;br /&gt;
import socket&lt;br /&gt;
from http.server import HTTPServer, SimpleHTTPRequestHandler&lt;br /&gt;
&lt;br /&gt;
class MyHandler(SimpleHTTPRequestHandler):&lt;br /&gt;
  def do_GET(self):&lt;br /&gt;
    if self.path == '/ip':&lt;br /&gt;
      self.send_response(200)&lt;br /&gt;
      self.send_header('Content-type', 'text/html')&lt;br /&gt;
      self.end_headers()&lt;br /&gt;
      self.wfile.write(f'Your IP address is {self.client_address[0]}'.encode())&lt;br /&gt;
      return&lt;br /&gt;
    else:&lt;br /&gt;
      return SimpleHTTPRequestHandler.do_GET(self)&lt;br /&gt;
&lt;br /&gt;
class HTTPServerV6(HTTPServer):&lt;br /&gt;
  address_family = socket.AF_INET6&lt;br /&gt;
&lt;br /&gt;
def main():&lt;br /&gt;
  server = HTTPServerV6(('::', 8080), MyHandler)&lt;br /&gt;
  server.serve_forever()&lt;br /&gt;
&lt;br /&gt;
if __name__ == '__main__':&lt;br /&gt;
  main()&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Pour se connecter au serveur depuis un navigateur, on peut ouvrir un navigateur depuis la zabeth et y accéder avec l'adresse : ''[&amp;lt;ipv6_VM&amp;gt;]:&amp;lt;port&amp;gt;''. Dans notre cas, le serveur écoute le port '''8080'''.&lt;br /&gt;
&lt;br /&gt;
==Séance du 19/12/2023==&lt;/div&gt;</summary>
		<author><name>Gthomas</name></author>
	</entry>
	<entry>
		<id>https://wiki-se.plil.fr/mediawiki/index.php?title=RodenburgThomas&amp;diff=3501</id>
		<title>RodenburgThomas</title>
		<link rel="alternate" type="text/html" href="https://wiki-se.plil.fr/mediawiki/index.php?title=RodenburgThomas&amp;diff=3501"/>
		<updated>2023-12-18T16:40:30Z</updated>

		<summary type="html">&lt;p&gt;Gthomas : &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;=Le binôme=&lt;br /&gt;
&lt;br /&gt;
Le binôme est constitué de 2 élèves de SE5-SC :&lt;br /&gt;
* Dann RODENBURG&lt;br /&gt;
* Gabriel THOMAS&lt;br /&gt;
&lt;br /&gt;
=Compte rendu des séances=&lt;br /&gt;
&lt;br /&gt;
==Séance du 04/12/2023==&lt;br /&gt;
===Création de la machine virtuelle===&lt;br /&gt;
Création d'une machine virtuelle '''gabidann''' sur le serveur chassiron :&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;xen-create-image --hostname=gabidann --force --dist=bookworm --size=10G --memory=10G --dir=/usr/local/xen --password=glopglop --dhcp --bridge=bridgeStudents&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
La machine virtuelle est à présent connectée au WiFi.&lt;br /&gt;
&lt;br /&gt;
Après cela, nous avons configuré la machine virtuelle selon l'énoncé du TP en faisant un xen console gabidann. Nous avons ensuite participé à la mise en place du point d'accès WiFi.&lt;br /&gt;
&lt;br /&gt;
===Premières observations du capteur===&lt;br /&gt;
De plus nous avons observé le retour du capteur de distance Nucleo-53L5A1 avec l'outil minicom. Le contenu envoyé par le capteur était compréhensible avec une fréquence de 460 800 bauds ; sur minicom, on a pu constater que le capteur nous envoie des valeurs qui dépendent de la distance entre celui-ci et un obstacle.&lt;br /&gt;
&lt;br /&gt;
===Raspberry===&lt;br /&gt;
D'un autre côté, nous avons branché la Raspberry Pi à l'ordinateur selon le pinout fourni dans la documentation.&lt;br /&gt;
&lt;br /&gt;
[[Fichier:20231218 085218.jpg|vignette|néant]]&lt;br /&gt;
&lt;br /&gt;
Enfin, nous avons activé la communication UART de la Raspberry Pi afin de pouvoir communiquer avec. En fin de séance, nous étions en train de vérifier que la Raspberry Pi répondait bien, même en ayant ajouté la ligne enable_uart=1 dans le fichier config.txt de la Raspberry.&lt;br /&gt;
&lt;br /&gt;
==Séance du 18/12/2023==&lt;br /&gt;
===Configuration de la Raspberry===&lt;br /&gt;
Nous avons résolu le problème de la Raspberry qui ne répondait pas. Cela était dû à l'alimentation : brancher la carte en USBC résoud le problème. Cependant, nous recevons une erreur l'erreur EXT4-fs error (device mmcblk0p2).&lt;br /&gt;
Le problème venait des arguments saisis lors du lancement de Minicom. Avec la commande suivante, il est à présent possible de se connecter sur la Raspberry : &amp;lt;code&amp;gt;minicom -D /dev/ttyUSB0 -b 115200&amp;lt;/code&amp;gt;&lt;br /&gt;
Dans la Raspberry, nous avons configuré une interface réseau wlan0 pour se connecter à WiFi_IE_1 :&lt;br /&gt;
    auto wlan0&lt;br /&gt;
    iface wlan0 inet dhcp&lt;br /&gt;
    wpa-conf /etc/wpa_supplicant/wpa_supplicant.conf&lt;br /&gt;
A présent à partir de la Raspberry, on peut ping la machine virtuelle sur chassiron avec son IPv6.&lt;br /&gt;
&lt;br /&gt;
===Configuration du capteur de distance===&lt;br /&gt;
Un programme était déjà présent sur le capteur. On a téléchargé le logiciel STM32CubeIDE pour pouvoir éditer du code et le téléverser sur le capteur. Nous avons testé de téléverser un programme d'exemple dont voici le résultat :&lt;br /&gt;
[[Fichier:Screenshot 2023-12-18 13-12-19.jpg]]&lt;br /&gt;
&lt;br /&gt;
Nous avons modifié ce programme afin d'effectuer un formatage des données transmises par le capteur sous le format ''&amp;lt;distance&amp;gt;,'' pour chaque valeur. Grâce à ce formatage, il est à présent possible d'utiliser les données reçues par le logiciel NanoEdgeStudio AI pour la partie Machine Learning.&lt;br /&gt;
&lt;br /&gt;
Pour recevoir les valeurs de manière exploitable, il faut modifier le code Exemple pour obtenir une liste séparée par des virgules, il a donc fallu supprimer les espaces et les barres verticales :&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
static void print_result(RANGING_SENSOR_Result_t *Result)&lt;br /&gt;
{&lt;br /&gt;
  int8_t j;&lt;br /&gt;
  int8_t k;&lt;br /&gt;
  int8_t l;&lt;br /&gt;
  uint8_t zones_per_line;&lt;br /&gt;
  zones_per_line = ((Profile.RangingProfile == RS_PROFILE_8x8_AUTONOMOUS) ||&lt;br /&gt;
         (Profile.RangingProfile == RS_PROFILE_8x8_CONTINUOUS)) ? 8 : 4;&lt;br /&gt;
  for (j = 0; j &amp;lt; Result-&amp;gt;NumberOfZones; j += zones_per_line)&lt;br /&gt;
  {&lt;br /&gt;
    for (l = 0; l &amp;lt; RANGING_SENSOR_NB_TARGET_PER_ZONE; l++)&lt;br /&gt;
    {&lt;br /&gt;
      /* Print distance and status */&lt;br /&gt;
      for (k = (zones_per_line - 1); k &amp;gt;= 0; k--)&lt;br /&gt;
      {&lt;br /&gt;
        if (Result-&amp;gt;ZoneResult[j+k].NumberOfTargets &amp;gt; 0)&lt;br /&gt;
          printf(&amp;quot;%ld,&amp;quot;,(long)Result-&amp;gt;ZoneResult[j+k].Distance[l]);&lt;br /&gt;
      }&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
  printf(&amp;quot;\n&amp;quot;);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;On passe ensuite sur Nano Edge Studio pour définir les signaux et entraîner le modèle.&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Capture d'écran 2023-12-18 172047.png|néant|vignette|800x800px]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Une fois le modèle entraîné, on peut le tester avec l'onglet Emulator &lt;br /&gt;
&lt;br /&gt;
[[Fichier:Capture d'écran 2023-12-18 173255.png|néant|vignette|800x800px]]&lt;br /&gt;
&lt;br /&gt;
===Emulation avec NanoEdgeStudio AI===&lt;br /&gt;
&lt;br /&gt;
===Configuration du serveur===&lt;br /&gt;
Configuration d'un serveur HTTP sur la machine virtuelle gabidann :&amp;lt;syntaxhighlight lang=&amp;quot;python3&amp;quot;&amp;gt;&lt;br /&gt;
import socket&lt;br /&gt;
from http.server import HTTPServer, SimpleHTTPRequestHandler&lt;br /&gt;
&lt;br /&gt;
class MyHandler(SimpleHTTPRequestHandler):&lt;br /&gt;
  def do_GET(self):&lt;br /&gt;
    if self.path == '/ip':&lt;br /&gt;
      self.send_response(200)&lt;br /&gt;
      self.send_header('Content-type', 'text/html')&lt;br /&gt;
      self.end_headers()&lt;br /&gt;
      self.wfile.write(f'Your IP address is {self.client_address[0]}'.encode())&lt;br /&gt;
      return&lt;br /&gt;
    else:&lt;br /&gt;
      return SimpleHTTPRequestHandler.do_GET(self)&lt;br /&gt;
&lt;br /&gt;
class HTTPServerV6(HTTPServer):&lt;br /&gt;
  address_family = socket.AF_INET6&lt;br /&gt;
&lt;br /&gt;
def main():&lt;br /&gt;
  server = HTTPServerV6(('::', 8080), MyHandler)&lt;br /&gt;
  server.serve_forever()&lt;br /&gt;
&lt;br /&gt;
if __name__ == '__main__':&lt;br /&gt;
  main()&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Pour se connecter au serveur depuis un navigateur, on peut ouvrir un navigateur depuis la zabeth et y accéder avec l'adresse : ''[&amp;lt;ipv6_VM&amp;gt;]:&amp;lt;port&amp;gt;''. Dans notre cas, le serveur écoute le port '''8080'''.&lt;br /&gt;
&lt;br /&gt;
==Séance du 19/12/2023==&lt;/div&gt;</summary>
		<author><name>Gthomas</name></author>
	</entry>
	<entry>
		<id>https://wiki-se.plil.fr/mediawiki/index.php?title=RodenburgThomas&amp;diff=3495</id>
		<title>RodenburgThomas</title>
		<link rel="alternate" type="text/html" href="https://wiki-se.plil.fr/mediawiki/index.php?title=RodenburgThomas&amp;diff=3495"/>
		<updated>2023-12-18T16:37:25Z</updated>

		<summary type="html">&lt;p&gt;Gthomas : /* Configuration du capteur de distance */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;=Le binôme=&lt;br /&gt;
&lt;br /&gt;
Le binôme est constitué de 2 élèves de SE5-SC :&lt;br /&gt;
* Dann RODENBURG&lt;br /&gt;
* Gabriel THOMAS&lt;br /&gt;
&lt;br /&gt;
=Compte rendu des séances=&lt;br /&gt;
&lt;br /&gt;
==Séance du 04/12/2023==&lt;br /&gt;
===Création de la machine virtuelle===&lt;br /&gt;
Création d'une machine virtuelle '''gabidann''' sur le serveur chassiron :&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;xen-create-image --hostname=gabidann --force --dist=bookworm --size=10G --memory=10G --dir=/usr/local/xen --password=glopglop --dhcp --bridge=bridgeStudents&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
La machine virtuelle est à présent connectée au WiFi.&lt;br /&gt;
&lt;br /&gt;
Après cela, nous avons configuré la machine virtuelle selon l'énoncé du TP en faisant un xen console gabidann. Nous avons ensuite participé à la mise en place du point d'accès WiFi.&lt;br /&gt;
&lt;br /&gt;
===Premières observations du capteur===&lt;br /&gt;
De plus nous avons observé le retour du capteur de distance Nucleo-53L5A1 avec l'outil minicom. Le contenu envoyé par le capteur était compréhensible avec une fréquence de 460 800 bauds ; sur minicom, on a pu constater que le capteur nous envoie des valeurs qui dépendent de la distance entre celui-ci et un obstacle.&lt;br /&gt;
&lt;br /&gt;
===Raspberry===&lt;br /&gt;
D'un autre côté, nous avons branché la Raspberry Pi à l'ordinateur selon le pinout fourni dans la documentation.&lt;br /&gt;
&lt;br /&gt;
Enfin, nous avons activé la communication UART de la Raspberry Pi afin de pouvoir communiquer avec. En fin de séance, nous étions en train de vérifier que la Raspberry Pi répondait bien, même en ayant ajouté la ligne enable_uart=1 dans le fichier config.txt de la Raspberry.&lt;br /&gt;
&lt;br /&gt;
==Séance du 18/12/2023==&lt;br /&gt;
===Configuration de la Raspberry===&lt;br /&gt;
Nous avons résolu le problème de la Raspberry qui ne répondait pas. Cela était dû à l'alimentation : brancher la carte en USBC résoud le problème. Cependant, nous recevons une erreur l'erreur EXT4-fs error (device mmcblk0p2).&lt;br /&gt;
Le problème venait des arguments saisis lors du lancement de Minicom. Avec la commande suivante, il est à présent possible de se connecter sur la Raspberry : &amp;lt;code&amp;gt;minicom -D /dev/ttyUSB0 -b 115200&amp;lt;/code&amp;gt;&lt;br /&gt;
Dans la Raspberry, nous avons configuré une interface réseau wlan0 pour se connecter à WiFi_IE_1 :&lt;br /&gt;
    auto wlan0&lt;br /&gt;
    iface wlan0 inet dhcp&lt;br /&gt;
    wpa-conf /etc/wpa_supplicant/wpa_supplicant.conf&lt;br /&gt;
A présent à partir de la Raspberry, on peut ping la machine virtuelle sur chassiron avec son IPv6.&lt;br /&gt;
&lt;br /&gt;
===Configuration du capteur de distance===&lt;br /&gt;
Un programme était déjà présent sur le capteur. On a téléchargé le logiciel STM32CubeIDE pour pouvoir éditer du code et le téléverser sur le capteur. Nous avons testé de téléverser un programme d'exemple dont voici le résultat :&lt;br /&gt;
[[Fichier:Screenshot 2023-12-18 13-12-19.jpg]]&lt;br /&gt;
&lt;br /&gt;
Nous avons modifié ce programme afin d'effectuer un formatage des données transmises par le capteur sous le format ''&amp;lt;distance&amp;gt;,'' pour chaque valeur. Grâce à ce formatage, il est à présent possible d'utiliser les données reçues par le logiciel NanoEdgeStudio AI pour la partie Machine Learning.&lt;br /&gt;
&lt;br /&gt;
Pour recevoir les valeurs de manière exploitable, il faut modifier le code Exemple pour obtenir une liste séparée par des virgules, il a donc fallu supprimer les espaces et les barres verticales :&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
static void print_result(RANGING_SENSOR_Result_t *Result)&lt;br /&gt;
{&lt;br /&gt;
  int8_t j;&lt;br /&gt;
  int8_t k;&lt;br /&gt;
  int8_t l;&lt;br /&gt;
  uint8_t zones_per_line;&lt;br /&gt;
  zones_per_line = ((Profile.RangingProfile == RS_PROFILE_8x8_AUTONOMOUS) ||&lt;br /&gt;
         (Profile.RangingProfile == RS_PROFILE_8x8_CONTINUOUS)) ? 8 : 4;&lt;br /&gt;
  for (j = 0; j &amp;lt; Result-&amp;gt;NumberOfZones; j += zones_per_line)&lt;br /&gt;
  {&lt;br /&gt;
    for (l = 0; l &amp;lt; RANGING_SENSOR_NB_TARGET_PER_ZONE; l++)&lt;br /&gt;
    {&lt;br /&gt;
      /* Print distance and status */&lt;br /&gt;
      for (k = (zones_per_line - 1); k &amp;gt;= 0; k--)&lt;br /&gt;
      {&lt;br /&gt;
        if (Result-&amp;gt;ZoneResult[j+k].NumberOfTargets &amp;gt; 0)&lt;br /&gt;
          printf(&amp;quot;%ld,&amp;quot;,(long)Result-&amp;gt;ZoneResult[j+k].Distance[l]);&lt;br /&gt;
      }&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
  printf(&amp;quot;\n&amp;quot;);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;On passe ensuite sur Nano Edge Studio pour définir les signaux et entraîner le modèle.&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Capture d'écran 2023-12-18 172047.png|néant|vignette|800x800px]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Une fois le modèle entraîné, on peut le tester avec l'onglet Emulator &lt;br /&gt;
&lt;br /&gt;
[[Fichier:Capture d'écran 2023-12-18 173255.png|néant|vignette|800x800px]]&lt;br /&gt;
&lt;br /&gt;
===Emulation avec NanoEdgeStudio AI===&lt;br /&gt;
&lt;br /&gt;
===Configuration du serveur===&lt;br /&gt;
Configuration d'un serveur HTTP sur la machine virtuelle gabidann :&amp;lt;syntaxhighlight lang=&amp;quot;python3&amp;quot;&amp;gt;&lt;br /&gt;
import socket&lt;br /&gt;
from http.server import HTTPServer, SimpleHTTPRequestHandler&lt;br /&gt;
&lt;br /&gt;
class MyHandler(SimpleHTTPRequestHandler):&lt;br /&gt;
  def do_GET(self):&lt;br /&gt;
    if self.path == '/ip':&lt;br /&gt;
      self.send_response(200)&lt;br /&gt;
      self.send_header('Content-type', 'text/html')&lt;br /&gt;
      self.end_headers()&lt;br /&gt;
      self.wfile.write(f'Your IP address is {self.client_address[0]}'.encode())&lt;br /&gt;
      return&lt;br /&gt;
    else:&lt;br /&gt;
      return SimpleHTTPRequestHandler.do_GET(self)&lt;br /&gt;
&lt;br /&gt;
class HTTPServerV6(HTTPServer):&lt;br /&gt;
  address_family = socket.AF_INET6&lt;br /&gt;
&lt;br /&gt;
def main():&lt;br /&gt;
  server = HTTPServerV6(('::', 8080), MyHandler)&lt;br /&gt;
  server.serve_forever()&lt;br /&gt;
&lt;br /&gt;
if __name__ == '__main__':&lt;br /&gt;
  main()&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Pour se connecter au serveur depuis un navigateur, on peut ouvrir un navigateur depuis la zabeth et y accéder avec l'adresse : ''[&amp;lt;ipv6_VM&amp;gt;]:&amp;lt;port&amp;gt;''. Dans notre cas, le serveur écoute le port '''8080'''.&lt;br /&gt;
&lt;br /&gt;
==Séance du 19/12/2023==&lt;/div&gt;</summary>
		<author><name>Gthomas</name></author>
	</entry>
	<entry>
		<id>https://wiki-se.plil.fr/mediawiki/index.php?title=Fichier:Capture_d%27%C3%A9cran_2023-12-18_173255.png&amp;diff=3492</id>
		<title>Fichier:Capture d'écran 2023-12-18 173255.png</title>
		<link rel="alternate" type="text/html" href="https://wiki-se.plil.fr/mediawiki/index.php?title=Fichier:Capture_d%27%C3%A9cran_2023-12-18_173255.png&amp;diff=3492"/>
		<updated>2023-12-18T16:36:27Z</updated>

		<summary type="html">&lt;p&gt;Gthomas : &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;glopglop&lt;/div&gt;</summary>
		<author><name>Gthomas</name></author>
	</entry>
	<entry>
		<id>https://wiki-se.plil.fr/mediawiki/index.php?title=RodenburgThomas&amp;diff=3482</id>
		<title>RodenburgThomas</title>
		<link rel="alternate" type="text/html" href="https://wiki-se.plil.fr/mediawiki/index.php?title=RodenburgThomas&amp;diff=3482"/>
		<updated>2023-12-18T16:27:10Z</updated>

		<summary type="html">&lt;p&gt;Gthomas : /* Configuration du capteur de distance */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;=Le binôme=&lt;br /&gt;
&lt;br /&gt;
Le binôme est constitué de 2 élèves de SE5-SC :&lt;br /&gt;
* Dann RODENBURG&lt;br /&gt;
* Gabriel THOMAS&lt;br /&gt;
&lt;br /&gt;
=Compte rendu des séances=&lt;br /&gt;
&lt;br /&gt;
==Séance du 04/12/2023==&lt;br /&gt;
===Création de la machine virtuelle===&lt;br /&gt;
Création d'une machine virtuelle '''gabidann''' sur le serveur chassiron :&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;xen-create-image --hostname=gabidann --force --dist=bookworm --size=10G --memory=10G --dir=/usr/local/xen --password=glopglop --dhcp --bridge=bridgeStudents&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
La machine virtuelle est à présent connectée au WiFi.&lt;br /&gt;
&lt;br /&gt;
Après cela, nous avons configuré la machine virtuelle selon l'énoncé du TP en faisant un xen console gabidann. Nous avons ensuite participé à la mise en place du point d'accès WiFi.&lt;br /&gt;
&lt;br /&gt;
===Premières observations du capteur===&lt;br /&gt;
De plus nous avons observé le retour du capteur de distance Nucleo-53L5A1 avec l'outil minicom. Le contenu envoyé par le capteur était compréhensible avec une fréquence de 460 800 bauds ; sur minicom, on a pu constater que le capteur nous envoie des valeurs qui dépendent de la distance entre celui-ci et un obstacle.&lt;br /&gt;
&lt;br /&gt;
===Raspberry===&lt;br /&gt;
D'un autre côté, nous avons branché la Raspberry Pi à l'ordinateur selon le pinout fourni dans la documentation.&lt;br /&gt;
&lt;br /&gt;
Enfin, nous avons activé la communication UART de la Raspberry Pi afin de pouvoir communiquer avec. En fin de séance, nous étions en train de vérifier que la Raspberry Pi répondait bien, même en ayant ajouté la ligne enable_uart=1 dans le fichier config.txt de la Raspberry.&lt;br /&gt;
&lt;br /&gt;
==Séance du 18/12/2023==&lt;br /&gt;
===Configuration de la Raspberry===&lt;br /&gt;
Nous avons résolu le problème de la Raspberry qui ne répondait pas. Cela était dû à l'alimentation : brancher la carte en USBC résoud le problème. Cependant, nous recevons une erreur l'erreur EXT4-fs error (device mmcblk0p2).&lt;br /&gt;
Le problème venait des arguments saisis lors du lancement de Minicom. Avec la commande suivante, il est à présent possible de se connecter sur la Raspberry : &amp;lt;code&amp;gt;minicom -D /dev/ttyUSB0 -b 115200&amp;lt;/code&amp;gt;&lt;br /&gt;
Dans la Raspberry, nous avons configuré une interface réseau wlan0 pour se connecter à WiFi_IE_1 :&lt;br /&gt;
    auto wlan0&lt;br /&gt;
    iface wlan0 inet dhcp&lt;br /&gt;
    wpa-conf /etc/wpa_supplicant/wpa_supplicant.conf&lt;br /&gt;
A présent à partir de la Raspberry, on peut ping la machine virtuelle sur chassiron avec son IPv6.&lt;br /&gt;
&lt;br /&gt;
===Configuration du capteur de distance===&lt;br /&gt;
Un programme était déjà présent sur le capteur. On a téléchargé le logiciel STM32CubeIDE pour pouvoir éditer du code et le téléverser sur le capteur. Nous avons testé de téléverser un programme d'exemple dont voici le résultat :&lt;br /&gt;
[[Fichier:Screenshot 2023-12-18 13-12-19.jpg]]&lt;br /&gt;
&lt;br /&gt;
Nous avons modifié ce programme afin d'effectuer un formatage des données transmises par le capteur sous le format ''&amp;lt;distance&amp;gt;,'' pour chaque valeur. Grâce à ce formatage, il est à présent possible d'utiliser les données reçues par le logiciel NanoEdgeStudio IA pour la partie Machine Learning.&lt;br /&gt;
&lt;br /&gt;
Pour recevoir les valeurs de manière exploitable, il faut modifier le code Exemple pour obtenir une liste séparée par des virgules, il a donc fallu supprimer les espaces et les barres verticales :&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
static void print_result(RANGING_SENSOR_Result_t *Result)&lt;br /&gt;
{&lt;br /&gt;
  int8_t j;&lt;br /&gt;
  int8_t k;&lt;br /&gt;
  int8_t l;&lt;br /&gt;
  uint8_t zones_per_line;&lt;br /&gt;
  zones_per_line = ((Profile.RangingProfile == RS_PROFILE_8x8_AUTONOMOUS) ||&lt;br /&gt;
         (Profile.RangingProfile == RS_PROFILE_8x8_CONTINUOUS)) ? 8 : 4;&lt;br /&gt;
  for (j = 0; j &amp;lt; Result-&amp;gt;NumberOfZones; j += zones_per_line)&lt;br /&gt;
  {&lt;br /&gt;
    for (l = 0; l &amp;lt; RANGING_SENSOR_NB_TARGET_PER_ZONE; l++)&lt;br /&gt;
    {&lt;br /&gt;
      /* Print distance and status */&lt;br /&gt;
      for (k = (zones_per_line - 1); k &amp;gt;= 0; k--)&lt;br /&gt;
      {&lt;br /&gt;
        if (Result-&amp;gt;ZoneResult[j+k].NumberOfTargets &amp;gt; 0)&lt;br /&gt;
          printf(&amp;quot;%ld,&amp;quot;,(long)Result-&amp;gt;ZoneResult[j+k].Distance[l]);&lt;br /&gt;
      }&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
  printf(&amp;quot;\n&amp;quot;);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;On passe ensuite sur Nano Edge Studio pour définir les signaux et entraîner le modèle.&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Capture d'écran 2023-12-18 172047.png|néant|vignette|800x800px]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===Configuration du serveur===&lt;br /&gt;
Configuration d'un serveur HTTP sur la machine virtuelle gabidann :&amp;lt;syntaxhighlight lang=&amp;quot;python3&amp;quot;&amp;gt;&lt;br /&gt;
import socket&lt;br /&gt;
from http.server import HTTPServer, SimpleHTTPRequestHandler&lt;br /&gt;
&lt;br /&gt;
class MyHandler(SimpleHTTPRequestHandler):&lt;br /&gt;
  def do_GET(self):&lt;br /&gt;
    if self.path == '/ip':&lt;br /&gt;
      self.send_response(200)&lt;br /&gt;
      self.send_header('Content-type', 'text/html')&lt;br /&gt;
      self.end_headers()&lt;br /&gt;
      self.wfile.write(f'Your IP address is {self.client_address[0]}'.encode())&lt;br /&gt;
      return&lt;br /&gt;
    else:&lt;br /&gt;
      return SimpleHTTPRequestHandler.do_GET(self)&lt;br /&gt;
&lt;br /&gt;
class HTTPServerV6(HTTPServer):&lt;br /&gt;
  address_family = socket.AF_INET6&lt;br /&gt;
&lt;br /&gt;
def main():&lt;br /&gt;
  server = HTTPServerV6(('::', 8080), MyHandler)&lt;br /&gt;
  server.serve_forever()&lt;br /&gt;
&lt;br /&gt;
if __name__ == '__main__':&lt;br /&gt;
  main()&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Pour se connecter au serveur depuis un navigateur, on peut ouvrir un navigateur depuis la zabeth et y accéder avec l'adresse : '''[&amp;lt;ipv6_VM&amp;gt;]:&amp;lt;port&amp;gt;'''. Dans notre cas, le serveur écoute le port 8080.&lt;br /&gt;
 &lt;br /&gt;
==Séance du 19/12/2023==&lt;/div&gt;</summary>
		<author><name>Gthomas</name></author>
	</entry>
	<entry>
		<id>https://wiki-se.plil.fr/mediawiki/index.php?title=Fichier:Capture_d%27%C3%A9cran_2023-12-18_172047.png&amp;diff=3478</id>
		<title>Fichier:Capture d'écran 2023-12-18 172047.png</title>
		<link rel="alternate" type="text/html" href="https://wiki-se.plil.fr/mediawiki/index.php?title=Fichier:Capture_d%27%C3%A9cran_2023-12-18_172047.png&amp;diff=3478"/>
		<updated>2023-12-18T16:25:34Z</updated>

		<summary type="html">&lt;p&gt;Gthomas : &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;glopglop&lt;/div&gt;</summary>
		<author><name>Gthomas</name></author>
	</entry>
	<entry>
		<id>https://wiki-se.plil.fr/mediawiki/index.php?title=RodenburgThomas&amp;diff=3475</id>
		<title>RodenburgThomas</title>
		<link rel="alternate" type="text/html" href="https://wiki-se.plil.fr/mediawiki/index.php?title=RodenburgThomas&amp;diff=3475"/>
		<updated>2023-12-18T16:23:26Z</updated>

		<summary type="html">&lt;p&gt;Gthomas : /* Configuration du capteur de distance */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;=Le binôme=&lt;br /&gt;
&lt;br /&gt;
Le binôme est constitué de 2 élèves de SE5-SC :&lt;br /&gt;
* Dann RODENBURG&lt;br /&gt;
* Gabriel THOMAS&lt;br /&gt;
&lt;br /&gt;
=Compte rendu des séances=&lt;br /&gt;
&lt;br /&gt;
==Séance du 04/12/2023==&lt;br /&gt;
===Création de la machine virtuelle===&lt;br /&gt;
Création d'une machine virtuelle '''gabidann''' sur le serveur chassiron :&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;xen-create-image --hostname=gabidann --force --dist=bookworm --size=10G --memory=10G --dir=/usr/local/xen --password=glopglop --dhcp --bridge=bridgeStudents&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
La machine virtuelle est à présent connectée au WiFi.&lt;br /&gt;
&lt;br /&gt;
Après cela, nous avons configuré la machine virtuelle selon l'énoncé du TP en faisant un xen console gabidann. Nous avons ensuite participé à la mise en place du point d'accès WiFi.&lt;br /&gt;
&lt;br /&gt;
===Premières observations du capteur===&lt;br /&gt;
De plus nous avons observé le retour du capteur de distance Nucleo-53L5A1 avec l'outil minicom. Le contenu envoyé par le capteur était compréhensible avec une fréquence de 460 800 bauds ; sur minicom, on a pu constater que le capteur nous envoie des valeurs qui dépendent de la distance entre celui-ci et un obstacle.&lt;br /&gt;
&lt;br /&gt;
===Raspberry===&lt;br /&gt;
D'un autre côté, nous avons branché la Raspberry Pi à l'ordinateur selon le pinout fourni dans la documentation.&lt;br /&gt;
&lt;br /&gt;
Enfin, nous avons activé la communication UART de la Raspberry Pi afin de pouvoir communiquer avec. En fin de séance, nous étions en train de vérifier que la Raspberry Pi répondait bien, même en ayant ajouté la ligne enable_uart=1 dans le fichier config.txt de la Raspberry.&lt;br /&gt;
&lt;br /&gt;
==Séance du 18/12/2023==&lt;br /&gt;
===Configuration de la Raspberry===&lt;br /&gt;
Nous avons résolu le problème de la Raspberry qui ne répondait pas. Cela était dû à l'alimentation : brancher la carte en USBC résoud le problème. Cependant, nous recevons une erreur l'erreur EXT4-fs error (device mmcblk0p2).&lt;br /&gt;
Le problème venait des arguments saisis lors du lancement de Minicom. Avec la commande suivante, il est à présent possible de se connecter sur la Raspberry : &amp;lt;code&amp;gt;minicom -D /dev/ttyUSB0 -b 115200&amp;lt;/code&amp;gt;&lt;br /&gt;
Dans la Raspberry, nous avons configuré une interface réseau wlan0 pour se connecter à WiFi_IE_1 :&lt;br /&gt;
    auto wlan0&lt;br /&gt;
    iface wlan0 inet dhcp&lt;br /&gt;
    wpa-conf /etc/wpa_supplicant/wpa_supplicant.conf&lt;br /&gt;
A présent à partir de la Raspberry, on peut ping la machine virtuelle sur chassiron avec son IPv6.&lt;br /&gt;
&lt;br /&gt;
===Configuration du capteur de distance===&lt;br /&gt;
Un programme était déjà présent sur le capteur. On a téléchargé le logiciel STM32CubeIDE pour pouvoir éditer du code et le téléverser sur le capteur. Nous avons testé de téléverser un programme d'exemple dont voici le résultat :&lt;br /&gt;
[[Fichier:Screenshot 2023-12-18 13-12-19.jpg]]&lt;br /&gt;
&lt;br /&gt;
Nous avons modifié ce programme afin d'effectuer un formatage des données transmises par le capteur sous le format ''&amp;lt;distance&amp;gt;,'' pour chaque valeur. Grâce à ce formatage, il est à présent possible d'utiliser les données reçues par le logiciel NanoEdgeStudio IA pour la partie Machine Learning.&lt;br /&gt;
&lt;br /&gt;
Pour recevoir les valeurs de manière exploitable, il faut modifier le code Exemple pour obtenir une liste séparé par des virgules&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
static void print_result(RANGING_SENSOR_Result_t *Result)&lt;br /&gt;
{&lt;br /&gt;
  int8_t i;&lt;br /&gt;
  int8_t j;&lt;br /&gt;
  int8_t k;&lt;br /&gt;
  int8_t l;&lt;br /&gt;
  uint8_t zones_per_line;&lt;br /&gt;
  zones_per_line = ((Profile.RangingProfile == RS_PROFILE_8x8_AUTONOMOUS) ||&lt;br /&gt;
         (Profile.RangingProfile == RS_PROFILE_8x8_CONTINUOUS)) ? 8 : 4;&lt;br /&gt;
  for (j = 0; j &amp;lt; Result-&amp;gt;NumberOfZones; j += zones_per_line)&lt;br /&gt;
  {&lt;br /&gt;
    for (l = 0; l &amp;lt; RANGING_SENSOR_NB_TARGET_PER_ZONE; l++)&lt;br /&gt;
    {&lt;br /&gt;
      /* Print distance and status */&lt;br /&gt;
      for (k = (zones_per_line - 1); k &amp;gt;= 0; k--)&lt;br /&gt;
      {&lt;br /&gt;
        if (Result-&amp;gt;ZoneResult[j+k].NumberOfTargets &amp;gt; 0)&lt;br /&gt;
          printf(&amp;quot;%ld,&amp;quot;,(long)Result-&amp;gt;ZoneResult[j+k].Distance[l]);&lt;br /&gt;
      }&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
  printf(&amp;quot;\n&amp;quot;);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Configuration du serveur===&lt;br /&gt;
Configuration d'un serveur HTTP sur la machine virtuelle gabidann :&amp;lt;syntaxhighlight lang=&amp;quot;python3&amp;quot;&amp;gt;&lt;br /&gt;
import socket&lt;br /&gt;
from http.server import HTTPServer, SimpleHTTPRequestHandler&lt;br /&gt;
&lt;br /&gt;
class MyHandler(SimpleHTTPRequestHandler):&lt;br /&gt;
  def do_GET(self):&lt;br /&gt;
    if self.path == '/ip':&lt;br /&gt;
      self.send_response(200)&lt;br /&gt;
      self.send_header('Content-type', 'text/html')&lt;br /&gt;
      self.end_headers()&lt;br /&gt;
      self.wfile.write(f'Your IP address is {self.client_address[0]}'.encode())&lt;br /&gt;
      return&lt;br /&gt;
    else:&lt;br /&gt;
      return SimpleHTTPRequestHandler.do_GET(self)&lt;br /&gt;
&lt;br /&gt;
class HTTPServerV6(HTTPServer):&lt;br /&gt;
  address_family = socket.AF_INET6&lt;br /&gt;
&lt;br /&gt;
def main():&lt;br /&gt;
  server = HTTPServerV6(('::', 8080), MyHandler)&lt;br /&gt;
  server.serve_forever()&lt;br /&gt;
&lt;br /&gt;
if __name__ == '__main__':&lt;br /&gt;
  main()&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Pour se connecter au serveur depuis un navigateur, on peut ouvrir un navigateur depuis la zabeth et y accéder avec l'adresse : '''[&amp;lt;ipv6_VM&amp;gt;]:&amp;lt;port&amp;gt;'''. Dans notre cas, le serveur écoute le port 8080.&lt;br /&gt;
 &lt;br /&gt;
==Séance du 19/12/2023==&lt;/div&gt;</summary>
		<author><name>Gthomas</name></author>
	</entry>
	<entry>
		<id>https://wiki-se.plil.fr/mediawiki/index.php?title=RodenburgThomas&amp;diff=3270</id>
		<title>RodenburgThomas</title>
		<link rel="alternate" type="text/html" href="https://wiki-se.plil.fr/mediawiki/index.php?title=RodenburgThomas&amp;diff=3270"/>
		<updated>2023-12-04T17:03:59Z</updated>

		<summary type="html">&lt;p&gt;Gthomas : &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Création d'une machine virtuelle sur le serveur chassiron&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;xen-create-image --hostname gabidann --force --dist bookworm --size 10G --memory 10G --dir /usr/local/xen --password glopglop --dhcp --bridge bridgeStudents&amp;lt;/code&amp;gt;&lt;/div&gt;</summary>
		<author><name>Gthomas</name></author>
	</entry>
	<entry>
		<id>https://wiki-se.plil.fr/mediawiki/index.php?title=RodenburgThomas&amp;diff=3269</id>
		<title>RodenburgThomas</title>
		<link rel="alternate" type="text/html" href="https://wiki-se.plil.fr/mediawiki/index.php?title=RodenburgThomas&amp;diff=3269"/>
		<updated>2023-12-04T17:03:27Z</updated>

		<summary type="html">&lt;p&gt;Gthomas : &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Création d'une machine virtuelle sur le serveur chassiron&lt;/div&gt;</summary>
		<author><name>Gthomas</name></author>
	</entry>
	<entry>
		<id>https://wiki-se.plil.fr/mediawiki/index.php?title=RodenburgThomas&amp;diff=3268</id>
		<title>RodenburgThomas</title>
		<link rel="alternate" type="text/html" href="https://wiki-se.plil.fr/mediawiki/index.php?title=RodenburgThomas&amp;diff=3268"/>
		<updated>2023-12-04T17:02:53Z</updated>

		<summary type="html">&lt;p&gt;Gthomas : Page créée avec « dfzdz »&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;dfzdz&lt;/div&gt;</summary>
		<author><name>Gthomas</name></author>
	</entry>
	<entry>
		<id>https://wiki-se.plil.fr/mediawiki/index.php?title=SE5_ECEAI_2023/2024&amp;diff=3267</id>
		<title>SE5 ECEAI 2023/2024</title>
		<link rel="alternate" type="text/html" href="https://wiki-se.plil.fr/mediawiki/index.php?title=SE5_ECEAI_2023/2024&amp;diff=3267"/>
		<updated>2023-12-04T17:02:31Z</updated>

		<summary type="html">&lt;p&gt;Gthomas : &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;SE5 ECEAI 2023/2024&lt;br /&gt;
[[SE5 ECEAI/eceai 2023/2024/jcie]]&lt;br /&gt;
&lt;br /&gt;
[[Gabidann|SE5 ECEAI/eceai 2023/2024/gabidann]]&lt;br /&gt;
== Groupe Patrikeev-Mouton ==&lt;br /&gt;
'''Séance n°1:''' &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
* Une machin virtuelle a été crée sur le serveur chassiron avec la commande :&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;coffee&amp;quot;&amp;gt;&lt;br /&gt;
xen-create-image --hostname g19 --force --dist bookworm --size 10G --memory 1G --dir /usr/local/xen --password glopglop --dhcp --bridge bridgeStudents&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;La machine virtuelle possède les propriétés suivantes:&lt;br /&gt;
&lt;br /&gt;
Hostname       :  g19&lt;br /&gt;
&lt;br /&gt;
Distribution    :  bookworm&lt;br /&gt;
&lt;br /&gt;
Stockage        : 10G&lt;br /&gt;
&lt;br /&gt;
Mémoire vive : 1G&lt;br /&gt;
&lt;br /&gt;
Mot de passe : glopglop&lt;br /&gt;
&lt;br /&gt;
Les fichier /etc/network/interfaces, /etc/resolv.conf et /etc/apt/sources.list on étés configurés comme demandé dans le sujet.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
* La Raspberry Pi 4 a été configurée et connectée au WiFi WIFI_IE_1.&lt;br /&gt;
&lt;br /&gt;
Mot de passe : pasglop&lt;br /&gt;
&lt;br /&gt;
Login : pifou&lt;br /&gt;
&lt;br /&gt;
La communication entre la Raspberry et la machine virtuelle a été vérifiée avec une commande de ping.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
* Le STM32F401RE et le capteur de distance (Nucleo-53L5A1): &lt;br /&gt;
&lt;br /&gt;
Les valeurs lues par le capteurs sont renvoyés par le port série du contrôleur STM32 vers le logiciel nanoedge.&lt;br /&gt;
&lt;br /&gt;
== Groupe Vallée-Sellali ==&lt;br /&gt;
'''Séance n°1:'''&lt;br /&gt;
&lt;br /&gt;
Machine virtuelle créée sur chassiron : &lt;br /&gt;
&lt;br /&gt;
Hostname       :  ValSel&lt;br /&gt;
&lt;br /&gt;
Distribution    :  bookworm&lt;br /&gt;
&lt;br /&gt;
Stockage        : 10G&lt;br /&gt;
&lt;br /&gt;
Mémoire vive : 1G&lt;br /&gt;
&lt;br /&gt;
Mot de passe : glopglop&lt;br /&gt;
&lt;br /&gt;
Les fichiers /etc/network/interfaces,  /etc/resolv.conf et /etc/apt/sources.list ont été modifiés comme demandés.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Raspberry 4 :&lt;br /&gt;
&lt;br /&gt;
Communication via le port série possible&lt;br /&gt;
&lt;br /&gt;
Login : pifou Pwd : pasglop&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
STM32F401RE : Nanoedge et IDE installés, conception d'un code pour tester le capteur en cours&lt;/div&gt;</summary>
		<author><name>Gthomas</name></author>
	</entry>
</feed>