« SE5 ECEAI/eceai 2023/2024/NaudotRiffaut » : différence entre les versions
Aucun résumé des modifications |
Aucun résumé des modifications |
||
Ligne 49 : | Ligne 49 : | ||
On installe un environnement web Python de manière à définir un client simple et de tester la connexion. | On installe un environnement web Python de manière à définir un client simple et de tester la connexion. | ||
On a également défini un programme Python3 qui envoie des requêtes au serveur. | On a également défini un programme Python3 qui envoie des requêtes au serveur : <syntaxhighlight lang="python3"> | ||
import requests | |||
import json | |||
import sys | |||
def send_post_request(url, data): | |||
try: | |||
response = requests.post(url, data=json.dumps(data), headers={'Content-T | |||
ype': 'application/json'}) | |||
print("Réponse du serveur :", response.text) | |||
except requests.exceptions.RequestException as e: | |||
print("Erreur lors de l'envoi de la requête POST :", e) | |||
def main(): | |||
if len(sys.argv) < 2: | |||
print("Usage: python script.py '{\"key\": \"value\"}'") | |||
return | |||
try: | |||
data = json.loads(sys.argv[1]) | |||
except json.JSONDecodeError as e: | |||
print("Erreur de décodage JSON :", e) | |||
return | |||
# L'adresse du serveur (remplacez avec l'adresse IPv6 de votre serveur et le | |||
port) | |||
url = 'http://[2001:660:4401:6050:216:3eff:fe4c:2673]:8888' | |||
send_post_request(url, data) | |||
if __name__ == "__main__": | |||
main() | |||
</syntaxhighlight><u>Code Python3 côté client</u> | |||
=== Partie Serveur (VM Debian): === | === Partie Serveur (VM Debian): === | ||
Ligne 60 : | Ligne 94 : | ||
On a testé le fonctionnement de ce serveur en lui ajoutant les bibliothèques JSON, HTTP et socket de manière à faire apparaître sur une page html, des requetes POST envoyés. | On a testé le fonctionnement de ce serveur en lui ajoutant les bibliothèques JSON, HTTP et socket de manière à faire apparaître sur une page html, des requetes POST envoyés. | ||
On définit sur ce serveur des méthodes do_GET() et do_POST() de manière les prendres en compte, on définit également des fonctions pour configurer l'ipv6 et lancer la page Web | On définit sur ce serveur des méthodes do_GET() et do_POST() de manière les prendres en compte, on définit également des fonctions pour configurer l'ipv6 et lancer la page Web :<syntaxhighlight lang="python3"> | ||
# -*- coding: utf-8 -*- | |||
from http.server import HTTPServer, BaseHTTPRequestHandler | |||
import json | |||
import socket | |||
# Stocker les requêtes POST reçues | |||
post_requests = [] | |||
class CustomHTTPHandler(BaseHTTPRequestHandler): | |||
def do_GET(self): | |||
if self.path == '/': | |||
self.path = '/index.html' | |||
if self.path == '/data': | |||
self.send_response(200) | |||
self.send_header('Content-type', 'application/json') | |||
self.end_headers() | |||
self.wfile.write(bytes(json.dumps(post_requests), 'utf-8')) | |||
return | |||
if self.path == '/index.html': | |||
self.send_response(200) | |||
self.send_header('Content-type', 'text/html') | |||
self.end_headers() | |||
# Créer le contenu HTML avec les données POST | |||
content = '<html><body><h1>Voici la liste des donnees POST:</h1><ul>' | |||
for item in post_requests: | |||
content += f'<li>{item}</li>' | |||
content += '</ul></body></html>' | |||
self.wfile.write(content.encode('utf-8')) | |||
return | |||
try: | |||
file_to_open = open(self.path[1:]).read() | |||
self.send_response(200) | |||
self.send_header('Content-type', 'text/html') | |||
self.end_headers() | |||
self.wfile.write(bytes(file_to_open, 'utf-8')) | |||
except FileNotFoundError: | |||
self.send_error(404, 'File Not Found: %s' % self.path) | |||
def do_POST(self): | |||
content_length = int(self.headers['Content-Length']) | |||
post_data = self.rfile.read(content_length).decode('utf-8') | |||
# Ajouter les données POST à la liste | |||
post_requests.append(post_data) | |||
# Envoyer une réponse HTTP | |||
self.send_response(200) | |||
self.end_headers() | |||
self.wfile.write(b"POST request processed") | |||
class HTTPServerV6(HTTPServer): | |||
address_family = socket.AF_INET6 | |||
if __name__ == '__main__': | |||
server_address = ('::', 8888) # Écoute sur toutes les interfaces IPv6, port 8888 | |||
httpd = HTTPServerV6(server_address, CustomHTTPHandler) | |||
print("Serveur actif sur le port", 8888) | |||
httpd.serve_forever() | |||
</syntaxhighlight><u>Code Python 3 du serveur</u><syntaxhighlight lang="html"> | |||
<!DOCTYPE html> | |||
<html lang="en"> | |||
<head> | |||
<meta charset="UTF-8"> | |||
<title>Page d'Accueil</title> | |||
</head> | |||
<body> | |||
<h1>Bienvenue sur Mon Serveur</h1> | |||
<h2>Données POST reçues:</h2> | |||
<ul id="data"> | |||
<!-- Les données POST seront listées ici --> | |||
</ul> | |||
</body> | |||
</html> | |||
</syntaxhighlight><u>Code html de la page web</u> | |||
== Séance du 19/12/2023 == | == Séance du 19/12/2023 == |
Version du 18 décembre 2023 à 15:39
Lors de ce projet nous allons réaliser un projet pour détecter la direction et la vitesse d'un mouvement passant devant un capteur de distance. L’aboutissement de ce projet permettrait de réaliser un système de suivi de mouvement.
Le binôme
Le binôme est constitué de 2 élèves de SE5-SC :
- Mathis RIFFAUT
- François NAUDOT
Compte rendu des séances
Séance du 04/12/2023
Une machine virtuelle a été crée sur le serveur chassiron avec la commande :
xen-create-image --hostname fnrm --force --dist bookworm --size 10G --memory 1G --dir /usr/local/xen --password glopglop --dhcp --bridge bridgeStudents
La machine virtuelle possède les propriétés suivantes:
Hostname : fnrm
Distribution : bookworm
Stockage : 10G
Mémoire vive : 1G
Mot de passe : glopglop
Les fichier /etc/network/interfaces, /etc/resolv.conf et /etc/apt/sources.list on étés configurés comme demandé dans le sujet.
La VM est connecté à internet par le BridgeStudents.
On vérifie la connexion à internet à l'aide d'un ping www.google.com.
Le STM32F401RE et le capteur de distance (Nucleo-53L5A1):
Les valeurs lues par le capteurs sont renvoyés par le port série du contrôleur STM32 vers le logiciel nanoedge.
Séance du 18/12/2023
Partie Client (Raspberry):
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). Le problème venait des arguments saisis lors du lancement de Minicom.
Mot de passe : pasglop
Login : pifou
La communication entre la Raspberry et la machine virtuelle a été vérifiée avec une commande de ping.
La Raspberry Pi 4 a été configurée et connectée au WiFi WIFI_IE_1.
On se connecte a la Raspberry Pi 4 avec une liaison série et on l'alimente en la branchant avec l'alimentation officielle qui se branche sur secteur.
On vérifie la connexion avec un ping www.google.com
Avec la commande suivante, il est à présent possible de se connecter sur la Raspberry : minicom -D /dev/ttyUSB0 -b 115200
On installe un environnement web Python de manière à définir un client simple et de tester la connexion.
On a également défini un programme Python3 qui envoie des requêtes au serveur :
import requests
import json
import sys
def send_post_request(url, data):
try:
response = requests.post(url, data=json.dumps(data), headers={'Content-T
ype': 'application/json'})
print("Réponse du serveur :", response.text)
except requests.exceptions.RequestException as e:
print("Erreur lors de l'envoi de la requête POST :", e)
def main():
if len(sys.argv) < 2:
print("Usage: python script.py '{\"key\": \"value\"}'")
return
try:
data = json.loads(sys.argv[1])
except json.JSONDecodeError as e:
print("Erreur de décodage JSON :", e)
return
# L'adresse du serveur (remplacez avec l'adresse IPv6 de votre serveur et le
port)
url = 'http://[2001:660:4401:6050:216:3eff:fe4c:2673]:8888'
send_post_request(url, data)
if __name__ == "__main__":
main()
Code Python3 côté client
Partie Serveur (VM Debian):
On installe Python 3 sur la VM, on installe ufw comme Pare feu, on lui autorise donc les connexions HTTP
On configure un fichier app.py contenant un code de réception simple en Python capable de récupérer des fichiers JSON
On autorise les ipv6 sur le port 8888 de l'adresse : "2001:660:4401:6050:216:3eff:fe4c:2673" dans un programme Python app.py qui lance également une page html index.html qui affiche les requetes.
On a testé le fonctionnement de ce serveur en lui ajoutant les bibliothèques JSON, HTTP et socket de manière à faire apparaître sur une page html, des requetes POST envoyés.
On définit sur ce serveur des méthodes do_GET() et do_POST() de manière les prendres en compte, on définit également des fonctions pour configurer l'ipv6 et lancer la page Web :
# -*- coding: utf-8 -*-
from http.server import HTTPServer, BaseHTTPRequestHandler
import json
import socket
# Stocker les requêtes POST reçues
post_requests = []
class CustomHTTPHandler(BaseHTTPRequestHandler):
def do_GET(self):
if self.path == '/':
self.path = '/index.html'
if self.path == '/data':
self.send_response(200)
self.send_header('Content-type', 'application/json')
self.end_headers()
self.wfile.write(bytes(json.dumps(post_requests), 'utf-8'))
return
if self.path == '/index.html':
self.send_response(200)
self.send_header('Content-type', 'text/html')
self.end_headers()
# Créer le contenu HTML avec les données POST
content = '<html><body><h1>Voici la liste des donnees POST:</h1><ul>'
for item in post_requests:
content += f'<li>{item}</li>'
content += '</ul></body></html>'
self.wfile.write(content.encode('utf-8'))
return
try:
file_to_open = open(self.path[1:]).read()
self.send_response(200)
self.send_header('Content-type', 'text/html')
self.end_headers()
self.wfile.write(bytes(file_to_open, 'utf-8'))
except FileNotFoundError:
self.send_error(404, 'File Not Found: %s' % self.path)
def do_POST(self):
content_length = int(self.headers['Content-Length'])
post_data = self.rfile.read(content_length).decode('utf-8')
# Ajouter les données POST à la liste
post_requests.append(post_data)
# Envoyer une réponse HTTP
self.send_response(200)
self.end_headers()
self.wfile.write(b"POST request processed")
class HTTPServerV6(HTTPServer):
address_family = socket.AF_INET6
if __name__ == '__main__':
server_address = ('::', 8888) # Écoute sur toutes les interfaces IPv6, port 8888
httpd = HTTPServerV6(server_address, CustomHTTPHandler)
print("Serveur actif sur le port", 8888)
httpd.serve_forever()
Code Python 3 du serveur
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Page d'Accueil</title>
</head>
<body>
<h1>Bienvenue sur Mon Serveur</h1>
<h2>Données POST reçues:</h2>
<ul id="data">
<!-- Les données POST seront listées ici -->
</ul>
</body>
</html>
Code html de la page web