++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Serveur ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ .. include:: volabid.rst :Création: 01/04/2023 :Maj: 04/2023 ==================================================================================================== Passage à un serveur Python/Flask ==================================================================================================== Synthèse ---------------------------------------------------------------------------------------------------- :: Serveur : ``0021_brasRobot_webGUI\projet\_02-realisation\brasrobot2023serveur`` Lancer une fennêtre de commande DOS dans le dossier brasrobot2023serveur .venv\Scripts\activate python server.py Dans la fenêtre navigateur : localhost:8300 (sur la machine qui héberge le serveur) ou adresse_ip_du_serveur:8300 sur une autre machine. Pour lancer le serveur, Gilles a développé server.bat .. index:: pair: Serveur; Flask Serveur hyper simple ---------------------------------------------------------------------------------------------------- serveur hyper simple:: Premier test serveur python : python -m http.server 9000 .. index:: pair: Serveur; Flask Premier script serveur ---------------------------------------------------------------------------------------------------- Puis serveur **flask** de base repris d'un très vieux projet perso même pas terminé iot_plateforme `Flask quickstart`_ .. _`Flask quickstart` : https://flask.palletsprojects.com/en/3.0.x/quickstart/#a-minimal-application .. NOTE:: Lancement de server :class: without-title ATTENTION Travailler dans .venv : commande d'activation : .venv\\Scripts\\activate Lancer le serveur : python server.py Le serveur est alors accessible localhost:8300 Commande pour créer un environnement .venv:: python -m venv /path/to/new/virtual/environment Exemple n'importe où : python -m venv c:\tmp\monEnvironnementVirtuel Dans un dossier en particulier avec un chemin relatif python -m venv monEnv pour nous python -m venv .venv Ajout websocket dans Flask ---------------------------------------------------------------------------------------------------- venv : doc officielle : `venv — Création d'environnements virtuels`_ .. _`venv — Création d'environnements virtuels` : https://docs.python.org/fr/3/library/venv.html Ajout websocket en python dans le serveur Flask. How to Voir `Flask WebSocket`_ .. _`Flask WebSocket` : https://www.educba.com/flask-websocket/ Installation websocket ok .. _refSelPortAuto: Sélection automatique du port série ---------------------------------------------------------------------------------------------------- On liste:: requête Windows all serial ports on tente un open timeout 0.2s liste des Ports valide pour récupérer les descriptions on filtre, critères sur description:: ("CP210x" in element['description']) \ or ("USB Serial Port" in element['description']) \ or ('sur Bluetooth' in element['description'] ): on teste:: pour chaque éléments de listeValide, on essaie une ouverture, on écoute 2s On espère la phrase TAG: ROBOT_TAG_PHRASE = "Bras Robot 2023 v1.0" Optimization:: On ne parcourt qu'une seule fois la liste des ports com sans la filtrer, on ouvre, on cherche directement la passe phrase. Transfert des commandes ws vers serial ---------------------------------------------------------------------------------------------------- Ne pas oublier de passer en mode WEB Vérification : sur le port de debug .. _refModifTrameWeb: ==================================================================================================== Adaption pour le code ARDUINO Gilles ==================================================================================================== Adaptation des trames ---------------------------------------------------------------------------------------------------- Trame avant modif:: received: 90,96,132,132,90,17 Trame après modification:: received: @90,96,132,132,90,17 .. WARNING:: Le mot received + l'espace ne font pas partie de la trame. :class: without-title Rangement et initialisation ---------------------------------------------------------------------------------------------------- Ajout de 2 boutons dans l'interface WEB pour rangement et initialisation. L'idée utilisée est de transmettre directement par le BT les commandes et à la place des trames habituelles. L'impact est sur le fichier interfaceBras.html :: function initBrasFunction() { console.log("appel de init bras") if(ws != null && ws.readyState == 1) { console.log("trame transmise"); trame = ""; ws.send(trame + "\r\n"); } else { console.log("Seulement en mode connecté"); alert("Mode connecté seulement") } } function rangeBrasFunction() { console.log("appel de rangement") if(ws != null && ws.readyState == 1) { console.log("trame transmise"); trame = ""; ws.send(trame + "\r\n"); } else { console.log("Seulement en mode connecté"); alert("Mode connecté seulement") } } Impacte sur le code ARDUINO:: Dans la fonction decodeTrameWeb on filtre le premier caractère @ ou < ==================================================================================================== Signature des différents port série ==================================================================================================== Version Python ---------------------------------------------------------------------------------------------------- :: COM28: Arduino Mega 2560 (COM28) COM13: USB-SERIAL CH340 (COM13) FTDI : USB Serial Port CP210x Silicon Labs CP210x USB to UART Bridge COM21: Arduino Uno (COM21) BT : Lien série sur Bluetooth standard émulateur com0com : com0com - serial port emulator .. WARNING:: Ce n'est pas le port série de l'ARDUINO qui est utilisé pour le dialogue entre le serveur et le robot :class: without-title Dans notre projet, on ne devrait garder que la liaison Bluetooth pour communiquer entre serveur web et la carte ARDUINO du robot. Pour des besoin de mise au point, on conserve également dans un premier temps les FTDI et CP210x. Ces 3 modules (BT, FTDI et Silicon Labs) sont connectés aux broches 8 et 9 de l'Arduino (MySerial). .. WARNING:: le BT HC05 crée 2 ports série !!! :class: without-title `Bluetooth HC-05 module - why are there two COM ports?`_ .. _`Bluetooth HC-05 module - why are there two COM ports?` : https://stackoverflow.com/questions/66857106/bluetooth-hc-05-module-why-are-there-two-com-ports :: This answer in Microsoft Technet sounds good: when connecting your terminal program to the first you are actually instructing Windows to attempt to establish the Bluetooth connection to the remote paired device, and if the connection is established the RFCOMM channel will be opened for the exchange of data when connecting your terminal program to the second you are actually instructing Windows to load the SPP SDP record and to remain waiting for incoming connections from the remote paired device. Le fournisseur est : Microsoft ==================================================================================================== Annexes ==================================================================================================== Procédure navigateur javascript de connection de l'interface bras robot ---------------------------------------------------------------------------------------------------- Les fonctions du Javascript de l'interface: - ws_onopen() - ws_onclose() - wc_onclick - ws_onmessage() C'est onclick qui est associé au bouton est qui register les 3 autres fonctions. .. _refvenvinstall: .. index:: pair: venv; Environnement Python Procédure de copy d'environnement ---------------------------------------------------------------------------------------------------- - **dans** l'environnement de départ : pip freeze > req.txt - sur la machine d'arrivée: - créer un environnement pip -m venv .venv - activer l'environnement : ``.venv\Scripts\activate`` - installer les modules : pip install -r req.txt ==================================================================================================== Weblinks ==================================================================================================== .. target-notes::