++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Serveur javascript abandonnée ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ .. include:: volabid.rst :Création: 05/2024 :Maj: 05/2024 ==================================================================================================== Explications à posteriori ==================================================================================================== Nous étions parti sur un serveur Javascript (pour conservé le même langage côté front end et backend). Difficulté la connection automatique au port série nous a conduit par manque d'expérience à abandonner cette solution (peut-être très proche du but...) ==================================================================================================== Mise en place du serveur node.js / express.js **Pour mémoire et abandonné** ==================================================================================================== Dans _02-realisation/_01-software/brasRobotWebGuiServer Pour lancer le serveur: nodemon app.js Première route:: app.get('/', (req, res) => { res.sendFile(`${__dirname}/index.html`) }) to do : ajouter les autres routes... :: npm i serialport npm install -g @serialport/list ==================================================================================================== Websocket et node.js ==================================================================================================== Une des api se nomme socket.io https://www.scriptol.fr/javascript/nodejs-socket.php Mais ce n'est pas la seule : `ws: a Node.js WebSocket library`_ .. _`ws: a Node.js WebSocket library` : https://www.npmjs.com/package/ws La librairie ws est également hébergé sur gihub : `github de ws`_ .. _`github de ws` : https://github.com/websockets/ws Il y a aussi tout simplement WebSocket de Mozilla (celui du code étudié) .. NOTE:: Au final dans notre serveur, nous avons utilisé la librairie nodejs ws (voir les liens ci-dessus) :class: without-title Node.js + express.js + websocket.js ---------------------------------------------------------------------------------------------------- `WebSockets tutorial: How to go real-time with Node and React video yt`_ Dans cette vidéo, on réalise un chat. Côté serveur : avec Node.js à partir de 4:15. Client à partir de REACT et websocket .. _`WebSockets tutorial: How to go real-time with Node and React video yt` : https://www.youtube.com/watch?v=LenNpb5zqGE `WebSocket + Node.js + Express`_ .. _`WebSocket + Node.js + Express` : https://medium.com/factory-mind/websocket-node-js-express-step-by-step-using-typescript-725114ad5fe4 Question : et le ws de l'appli web ? ---------------------------------------------------------------------------------------------------- Qu'en est-il de la lib utilisée par l'appli ? Nous n'avons pas trouvé la réponse. Toujours est-il que cela fonctionne. :: ws = new WebSocket(`ws:///remote_arm`, "text.phpoc"); Est-ce que tous les navigateur utilisent la même API? Quasi oui il s'agit d'un IETF standard u `Internet Engineering Task Force (IETF) The WebSocket Protocol`_ .. _`Internet Engineering Task Force (IETF) The WebSocket Protocol` : https://datatracker.ietf.org/doc/html/rfc6455 ==================================================================================================== Node.js, Express.js et les Promise ==================================================================================================== Nous sommes resté bloqué sur *SerialPort.list* qui retourne une promesse. Lorsqu'on fait appelle à une promesse au sein d'une fonction:: var getPortsList = () => { var portsList = []; console.log("dans la fonction"); SerialPort.list().then( function (ports) { ports.forEach(function (port) { console.log("Po____rt: ", port.path); portsList.push(port.path); }) } ) console.log(portsList); return portsList; }; La liste n'est mise à jour que lorsque toute la chaîne d'appel de fonction est terminée. Solution : remonter la génération de la liste à la racine du serveur. Article intéressant : `How to automatically connecting Arduino using serial-port in NodeJS`_ .. _`How to automatically connecting Arduino using serial-port in NodeJS` : https://dev.to/azzamjiul/how-to-connect-to-arduino-automatically-using-serial-port-in-nodejs-plh ==================================================================================================== Gestion des erreur node.js SerialPort ==================================================================================================== :: var portCom = new SerialPort({ path: "COM8", baudRate: 9600 }, (err)=>{ if (err){ return console.log('Error', err.message); } } );* Version js **ABANDONNEE** ---------------------------------------------------------------------------------------------------- Ligne 63 de app.js modifiée et intégrée dans le code ARDUINO La fonction server app.js checkcom utilise les codes fabricant pour reconnaitre l'ARDUINO. le CH340 renvoie wch.cn L'Arduino officiel : Arduino LLC (www.arduino.cc) ==================================================================================================== Bilan au 13/05/2023 ==================================================================================================== On a un serveur node.js qui: - se nomme app.js - sait vérifier la liste des port com - sait vérifier la présence du simulateur - sert un fichier index.html hyper simplement contenant 2 liens: - lancer l'interface - vérifier la connexion (pas de remonté vers la page du résultat - que du console log) - sert l'interface du bras mais c'est tout - sert le fichier toto pour allumage de la LED - sait transmettre des commandes de LED vers le simulateur ARDUINO Ce jour, nous sommes tombés sur le comportement de ``ArduinoPort.on('data', function (data)``. Et ``ArduinoPort.close``. Arduino.on reste actif même quand le script est terminé... Donc, il conveint de mettre en place un mécanisme de close avec un moyen spécial. - sait mettre à jour correctement dans le navigateur l'état de la connexion avec le simulateur - sait établit un connexion websocket avec le serveur - sait rompre la connexion - sait transmettre les angles des moteurs ==================================================================================================== Weblinks ==================================================================================================== .. target-notes::