Services minitels via ESP32 en micropython

L’application Socketel est dispo !

Elle a pour but de consulter les services minitel sur un vrai minitel avec l’ESP32 et du wifi.

Il y a une interface utilisateur pour gérer le wifi et l’annuaire des services, donc une fois le programme installé, plus besoin de coder normalement.

L’UI est basé sur l’adaptation de PyMinitel de @zigazou en micropython :

Tous les services présents dans l’annuaire semblent fonctionner, sauf SM malheureusement, mais il y a déjà de quoi faire :slight_smile:

1 « J'aime »

PS

Pour SM, je décris ici ce qu’il se passe ici au cas où qqn saurait ce qu’il ne va pas:

Le handshake du websocket se passe bien, je reçois la page normalement en plusieurs trames de 128 bytes. Et c’est dès la première touche clavier appuyée que survient le problème: à l’appui de la touche, le programme envoie une frame en opcode=text conetnant la touche, mais le serveur répond invariablement par une demande de déconnexion (opcode=close, data = null) …

… tu as posté en double !

==> Ma réponse ici : Minitel ESP32 - Carte Péri-informatique Wifi / BLE - #63 par hwarin

Oui desolé la rubrique « Logiciel » m’a semblé plus adapté après coup !

Je te réponds ici du coup :

Pour ma part j’utilise pas de VM pour l’ESP32: J’ai un IDE micropython connecté au vrai ESP32 (branché sur le minitel) avec un shell interactif et un accès à la mémoire de stockage. Très pratique et rapide à installer !
Si ça peut aider qqn, voir la section Get started with Thonny IDE au lien suivant:

https://hackaday.io/project/180473/instructions

au sujet des annuaires:

Il y a en fait 2 annuaires consultables indépendamment :

  • L’annuaire en ligne, qui n’est autre que l’annuaire global :
    Comme tu l’as vu l’url est stockée dans le json et par défaut il s’agit bien de l’annuaire présent sur teletel.org. L’url est modifiable via l’UI dans les paramètres de services. Le contenu n’est pas stocké, une requete est envoyée à chaque consultation et le contenu est affiché tel quel.

  • L’annuaire personnel :
    Celui-ci est stocké en local dans la mémoire de l’ESP32 (dans le même json que l’url) et on peut soit l’éditer via le menu annuaire personnel, soit y importer des services depuis l’annuaire en ligne

Au sujet de la liaison série:

L’application est actuellement prévue pour gérer les vitesses de 300, 1200, 4800 et 9600 mais uniquement en 7E1 (pas de 8bits du coup).

Au démarrage, l’application détecte la vitesse actuelle du minitel pour pouvoir s’afficher correctement. Ensuite il y a un menu permettant de détecter le minitel utilisé et sa vitesse max, et également de modifier la vitesse en live et demander à ce qu’elle soit configurée automatiquement au démarrage de l’application.

Concernant SM

J’ai testé en encodage unicode , utf-8 , et aussi en opcode binary. toujours le même problème :confused:

==> Je verrais ca sous peu, une fois mon « bureau » débarrassé du projet « poignée Davic & Analogique radio » (oui, je n’ai pas pour seuls vices les vieilleries informatiques, je m’adonne aussi au slot-racing [en amateur de bidouilles et pas en champion])

Les annuaires : OK mais je tique sur la fonction « y importer des services depuis l’annuaire en ligne » (cf ma réponse précédente - on ne devrait pas avoir dans l’annuaire perso un copier/coller d’une entrée de l’annuaire global [un peu sur le même principe que DNS versus fichier etc/hosts])

Liaison série : Il faudrait pouvoir supporter le mode 8 bits [images JPEG sur Minitel photo et MagisClub]

SM : Bizarre - Es-tu certain de ne jamais envoyer au serveur de code >0x7F ?
==> Comme SM fonctionne (ait hier) avec ma passerelle, essayes au travers de ws:home.teletel.org:9001 « pour voir » … au pire, j’aurais les logs.

Moralité : Sans logiciel, le matériel n’est rien … et réciproquement !

Merci pour ta réponse

Pour l’annuaire, l’appli se connecte à un service uniquement via le menu annuaire (soit perso soit global). Donc il n’y a pas d’identification de code service, et donc pas de possibilité de conflit !

Pour la liaison Série, A vrai dire, j’ignorais que certains minitel communiquent en 8 bits. Par contre µPyMinitel est clairement prévu pour du 7 bit uniquement, donc ça me semble un peu hors champ :confused: As tu une idée de la compabilité de cette bibliothèque avec des minitels en 8 bits ? Et y a t-il des differences dans le protocole ?

SM:
Bonne idée !
Le mieu x serait d’avoir les logs côté serveur mais je sais pas si c’est possible.
En attendant voila les miens côté client:

uwebsockets.py header: b'HTTP/1.1 101 Switching Protocols'
uwebsockets.py header: b'Upgrade: websocket'
uwebsockets.py header: b'Connection: Upgrade'
uwebsockets.py header: b'Sec-WebSocket-Accept: p+mc2bwzY+7xzFVskB/w9KVC7tw='
WS: received 128 bytes
WS: received 7 bytes
WS: received 1 bytes
WS: received 128 bytes
WS: received 128 bytes
WS: received 128 bytes
WS: received 82 bytes
WS: received 128 bytes
WS: received 128 bytes
WS: received 128 bytes
WS: received 128 bytes
WS: received 128 bytes
WS: received 128 bytes
WS: received 128 bytes
WS: received 128 bytes
WS: received 125 bytes
WS_SEND: send OP_TEXT: C
WS_RECV: got OP_CLOSE with fin:1, data:b''
WS: unable to read frame. websocket is closed

Je me suis connecté à SM via teletel depuis l’esp32 et le bug ne se produit pas dans cette configuration.
La cause a probablement été filtré par ta passerelle. Si tu peux consulter les logs, la connexion a été établie à 15h40 précise !

Oui - Les MagisClub et M2-Photo, c’est nécessaire pour l’affichage des JPEG [je ne suis pas 100% certain s’il existe d’autres modèles avec ces capacités]

Pas surprenant - « tout » ce qui concerne le videotext est (archi-généralement) en 7 bits.

Aucune idée, je n’ai pas encore mis le nez dedans - mais à priori, ca devrait aller. Il me semble avoir vu quelque part (où ?) que la parité était calculée « manuellement » - dans ce cas, ca ne pose pas de soucis avec un 8eme bit à zéro lorsque le Minitel est configuré en 8 bits [ca, j’ai testé].

Oui, mais elles sont minimes, celles qui nous intéressent concernent justement le passage en 8 bits (et le modem TVR et le contrôle de flux) - il faut VRAIMENT que je trouve moyen de scanner les 300 pages du STUM MagisClub.

Je ne sais toujours pas qui « opère » se serveur … donc, no hope de ce côté là.

Le log de la passerelle (malheureusement, n’est pas assez verbeux pour aider) - on te voit arriver 4 fois (14", 136", 39", 137") et tu n’es pas revenu depuis (ou sous une autre @IP)

2022-01-13 15:35:32,886 [INFO] ##### IsBanned == False (Never) 93.29.109.252.
2022-01-13 15:35:32,888 [INFO] 28 joined.
2022-01-13 15:35:32,906 [INFO] 28 _ws_connect_to_server() connected to WS server [ws://127.0.0.1:8765]
2022-01-13 15:35:47,417 [INFO] 28 [93.29.109.252,63650,WS] delta 14 seconds.
2022-01-13 15:35:47,418 [INFO] 28 [93.29.109.252,63650,WS] quit.
2022-01-13 15:35:47,420 [INFO] 28 _ws_connect_to_server() disconnected from WS server [ws://127.0.0.1:8765]
2022-01-13 15:35:47,665 [INFO] ##### IsBanned == False (Never) 93.29.109.252.
2022-01-13 15:35:47,665 [INFO] 29 joined.
2022-01-13 15:35:47,677 [INFO] 29 _ws_connect_to_server() connected to WS server [ws://127.0.0.1:8765]
2022-01-13 15:38:03,962 [INFO] 29 [93.29.109.252,63654,WS] delta 136 seconds.
2022-01-13 15:38:03,963 [INFO] 29 [93.29.109.252,63654,WS] quit.
2022-01-13 15:38:03,966 [INFO] 29 _ws_connect_to_server() disconnected from WS server [ws://127.0.0.1:8765]
2022-01-13 15:38:04,278 [INFO] ##### IsBanned == False (Never) 93.29.109.252.
2022-01-13 15:38:04,279 [INFO] 30 joined.
2022-01-13 15:38:04,297 [INFO] 30 _ws_connect_to_server() connected to WS server [ws://127.0.0.1:8765]
2022-01-13 15:38:31,358 [INFO] 30 _ws_connect_to_server() redirected to WS server [ws://3611.re/ws]
2022-01-13 15:38:43,585 [INFO] 30 [93.29.109.252,63677,WS] delta 39 seconds.
2022-01-13 15:38:43,586 [INFO] 30 [93.29.109.252,63677,WS] quit.
2022-01-13 15:38:43,587 [WARNING] /home/pi/python/PyMoIP/Gateway/GatewayServer.py:1881: RuntimeWarning: coroutine ‹ WebSocketCommonProtocol.close › was never awaited
websocket.close() # Fails as not async

2022-01-13 15:38:43,629 [INFO] 30 _ws_connect_to_server() disconnected from redirected WS server [ws://3611.re/ws]
2022-01-13 15:38:43,630 [INFO] 30 _ws_connect_to_server() disconnected from WS server [ws://127.0.0.1:8765]
2022-01-13 15:40:07,974 [INFO] ##### IsBanned == False (Never) 93.29.109.252.
2022-01-13 15:40:07,975 [INFO] 31 joined.
2022-01-13 15:40:07,993 [INFO] 31 _ws_connect_to_server() connected to WS server [ws://127.0.0.1:8765]
2022-01-13 15:40:36,390 [INFO] 31 _ws_connect_to_server() redirected to WS server [wss://wss.3615.live:9991/?echo]
2022-01-13 15:42:25,231 [INFO] 31 [93.29.109.252,1199,WS] delta 137 seconds.
2022-01-13 15:42:25,231 [INFO] 31 [93.29.109.252,1199,WS] quit.
2022-01-13 15:42:25,232 [WARNING] /home/pi/python/PyMoIP/Gateway/GatewayServer.py:1881: RuntimeWarning: coroutine ‹ WebSocketCommonProtocol.close › was never awaited
websocket.close() # Fails as not async

2022-01-13 15:42:25,476 [INFO] 31 _ws_connect_to_server() disconnected from redirected WS server [wss://wss.3615.live:9991/?echo]
2022-01-13 15:42:25,477 [INFO] 31 _ws_connect_to_server() disconnected from WS server [ws://127.0.0.1:8765]

… toutefois, on voit que l’URL de redirection utilisée était « wss://wss.3615.live:9991/?echo »

Les sessions #28 et #29 sont initiées en WS par « ma » version de l’émulateur (ou une copie : ROM code Av0) mais aucun caractère n’est saisi
image

Sur la session #30, idem mais des caractères sont saisis : AE[Retour]AE[Envoi]AZF (mais, tu es de Toulouse, cong ??!)
image

Sur la session #31, c’est différent … toujours une session en WS mais avec un vrai Minitel 1b (Alcatel ou Matra) - Les caractères saisis étaient SM[Envoi]C[Envoi][Sommaire]J[Envoi][Pro2/73/42][Pro2/73/40][Pro2/73/42][Pro2/73/40][Sommaire][Sommaire] - ton Minitel a reçu des commandes protocoles en provenance du serveur SM (mode rouleau/mode page) et y a répondu.
image

Je n’ai pas (activé) de logs plus verbeux sur les couches basses de la passerelle, il faudrait éventuellement, aussi, regarder dans le source les paramètres que j’utilise pour initier la redirection.

La session 31 de 15:40 correspond bien a ma connexion sur minitel1b via l’ESP32 ! Dommage que ça ne donne rien. Je suis dispo pour faire d’autre tests ces jours ci

Une alternative à Socketel :

Il n’y a pas d’interface de paramétrage: il faut écrire la config minitel, wifi et serveur « en dur » et reprogrammer l’ESP32.

Par contre, ce code utilise une librairie websocket plus stable que socketel (pas de soucis avec SM ! et aucun bug constaté pour le moment :crossed_fingers:)

Il s’avère très pratique pour consulter un service kiosque tel que teletel.org ou 3615co.de :slight_smile:

@hwarin

Petites updates concernant les « problèmes techniques » observés ce WE dans mon environnement :

  1. Firmware uPython
    J’ai trouvé/compris mon problème, qui se résume, comme d’hab, à « RTFM » (que je n’ai évidement pas fait). Pour pouvoir mettre à jour/modifier le FW uPython, il faut le passer en mode « download » - pour cela, il est nécessaire d’appuyer LE bouton pendant le reset - c’est bête mais ça va mieux en le disant/faisant.
    « rst:0x1 (POWERON_RESET),boot:0x3 (DOWNLOAD_BOOT(UART0/UART1/SDIO_REI_REO_V2))
    waiting for download »
    ==> Du coup, j’ai essayé le FW « OTA 1.18 » … et je n’ai pas encore vu comment l’OTA pouvait marcher
    ==> Confirmation que le changement de FW supprime tous les fichiers (pas essayé en désactivant « Erase flash before installing »)

  2. IDE Arduino v1.8.18 et board manager ESP32 v2.0.2 et python 3.7.9 [je ne sais pas d’où il vient celui-là, et il n’est pas à jour - Thonny IDE ou ToolChain Espressif ou Arduino ??] et Win7x64SP1
    Là aussi, j’ai trouvé, c’est un peu plus subtil. Les compilations échouaient systématiquement avec « Failed to execute script pyi_rth_multiprocessing, ImportError: DLL load failed while importing _socket: The parameter is incorrect. ». Mon ami google m’a aidé à trouver le « coupable » le correctif MS16-014 (et moi-même qui utilise toujours un vieil OS <<« stable »>> sans jamais le mettre à jour puisqu’il est isolé) - avec un Win7 en 64 bits, c’est le KB3126593 qui fait le taff (au passage, ne pas oublier de réactiver la licence avec un SLMGR /REARM)

Du coup, je vais pouvoir essayer ton code ESP32/Arduino.
[EDIT] Et bien, ca fait le taff … Certes, c’est minimaliste [pas d’UI pour configurer le WIFI ou la connexion, pas d’option pour « démarrer » ou « interrompre » la connexion] mais ca ne plante pas et c’est l’essentiel. J’ai quand même repéré un truc étrange, je ne sais pas encore si c’est un souci dans le code Arduino ou ailleurs, je vais regarder.

Super tout ça !
Tiens moi au courant :wink:

Comment dire ?

[je reprends le blabla que j’ai posté ailleurs]

Un « success » (même incomplet) est toujours bon à mentionner - j’explique :

  • Une carte-mère de Minitel 1b RTIC (Philips) « stock » (seule modification : ajout d’un connecteur à 4 pins au pas de 2.54 pour avoir la vidéo « brute »)
  • Un bout de PCB pour produire le signal RESET et fournir un connecteur d’alimentation où la carte-mère peut se brancher directement
  • Un convertisseur « buck » chinois à trois sous pour convertir 12v à 5v
  • Une alimentation 12v « universelle » (supportant de 100v à 240v)
  • Un autre bout de PCB pour mise en forme des signaux couleur (produire du N&B à partir du RVB) à des niveaux « compatibles péritel » → CF l’interface « Jelora » sans LM1881 ni AD722 ni son
  • Un câble péritel=>GBS8220 (juste du câblage)
  • Une GBS8220 « stock » à 2 sous
  • Un convertisseur VGA=> HDMI chinois à 2 sous
  • Un dongle HDMI => USB

==> Le résultat est visible là : http://www.teletel.org/2022-03-04-14-57-20.mp4 pour la version courte et là http://www.teletel.org/2022-03-04-14-57-48.mp4 pour la version longue.

==> Il y a encore du travail car la vidéo n’est pas bien propre et le niveau des couleurs est incorrect mais fonctionnellement, c’est bon

… j’oubliais, la carte-mère du Minitel est connectée par la prise péri-info à 4800 Bds en WebSocket et en Wifi avec un ESP32/Minitel de LouisH (avec le code Arduino)

Je donnerai plus de détails « plus tard »