++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Serveur ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ .. include:: volabid.rst :Création: 01/04/2023 :Maj: 11/07/2024 .. index:: single: mise en place du serveur ==================================================================================================== Pourquoi un serveur web ? ==================================================================================================== La fonction principale de notre serveur est d'héberger l'interface web et de communiquer avec le bras. Ainsi, pour que notre interface web soit accessible nous avons besoin de notre propre serveur. Nous aurons ainsi les échanges entre un client et un serveur web. .. image:: images/architecture_branchement.png :width: 600 px ==================================================================================================== Mise en place du dossier Serveur ==================================================================================================== .. index:: single: Flask Passage à un `serveur Python/Flask`_ .. _`serveur Python/flask` : https://robotdeuxbras.bitbucket.io/server.html#passage-a-un-serveur-python-flask :: Créer le dossier robot2brasserveur Dans le dossier robot2brasserveur, créer dossiers templates et static demandés pour le fonctionnement du Serveur Flask. .. index:: single: venv .. index:: single: dependances .. index:: single: modules Procédure de copy d'environnement virtuel `venv`_ ----------------------------------------------------------------------------------------------------- .. _`venv` : https://docs.python.org/fr/3/tutorial/venv.html - **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 `dépot ici`_ .. _`dépot ici` : https://bitbucket.org/robotdeuxbras/robot2brasserveur/src/master/ .. index:: single: port série ==================================================================================================== Signature des différents ports série ==================================================================================================== Ce résultat diffère suivant les ordinateurs bien sûr ! .. index:: single: python Version Python ---------------------------------------------------------------------------------------------------- .. index:: single: bluetooth :: 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). .. index:: single: HC05 .. 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 .. _refModifTrameWeb: ==================================================================================================== Adaption pour le code ARDUINO ==================================================================================================== 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 .. index:: single: serveur ==================================================================================================== Passage à un serveur Python/Flask ==================================================================================================== `Serveur web avec Python Flask`_ .. _`Serveur web avec Python Flask` : https://nsi-snt.ac-normandie.fr/IMG/pdf/pythonflaskpresentation.pdf :: Lancer une fennêtre de commande DOS dans le dossier brasrobot2023serveur .venv\Scripts\activate python server.py Dans la fenêtre navigateur : localhost:8300 Premier script serveur ---------------------------------------------------------------------------------------------------- .. 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 .. index:: single: websocket 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 ==================================================================================================== 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. ==================================================================================================== Tables et index ==================================================================================================== * :ref:`genindex` * :ref:`search` ==================================================================================================== Weblinks ==================================================================================================== .. target-notes::