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:

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