Mettre en place son propre serveur Minitel, partie 2

 x0r   4
hack minitel FreeBSD modem

Je poursuis donc avec un autre billet à propos de la mise en place d'un serveur Minitel, un sujet que j'avais déjà traité en détail dans un billet précédent.

Dans ce billet-là, je n'avais traité que du système d'exploitation Linux et lorsque j'avais tenté l'expérience à nouveau sous FreeBSD, je me suis rendu compte que la mise en place d'un tel serveur était radicalement différente par rapport à Linux et que ces différences justifiaient selon moi un nouveau billet. J’en profiterai également pour ajouter quelques informations sommaires à propos de la gestion des ports série.

Schéma de principe
Schéma de principe du montage (rappel de mon billet précédent).

La principale différence par rapport à Linux est la façon dont le serveur attend des appels entrants au moyen du modem branché dessus : sous Linux, il est en effet nécessaire d'utiliser mgetty(1) du fait des limitations des autres « getty » qu'on peut trouver installés par défaut sous Linux. Le résultat est une série d’immondes bidouilles.

Sous FreeBSD, nul besoin d'installer quoi que ce soit : avec les outils du système de base et une bonne configuration de son modem, on peut obtenir un résultat propre et fonctionnel. En particulier, on obtient un écran de login sans erreurs de parité.

J'ai aussi été contraint de changer mon Olitec Self Memory Pro pour un US Robotics Sportster Flash (pour une poignée d'euros sur Leboncoin) car mon Olitec ne parvenait pas toujours à terminer le handshake lorsque je l'appelais. J'ai eu d'excellents résultats avec ce modem US Robotics. La gamme Courier de chez US Robotics était à une époque utilisée par les fournisseurs d'accès à Internet, mais un modem de cette gamme coûte aux alentours de 200 € sur eBay.

Les signaux importants d'un port série

L'écrasante majorité des modems externes communiquent avec leur hôte à l'aide d'une liaison série RS-232 (que ce soit encapsulé par USB ou non). L'interface RS-232 PC, comme on le sait, utilise des connecteurs DB-9 (9 broches). Ce qui paraît un peu moins évident, en revanche, c’est qu’un modem nécessite une signalisation assez spécifique pour fonctionner correctement dans notre configuration.

En terminologie RS-232, les périphériques peuvent assumer l'un des deux rôles suivants : le Data Terminal Equipment ou DTE d'une part et le Data Circuit-terminating Equipment ou DCE d'autre part. En règle générale, on relie toujours un DTE à un DCE (ou l'inverse) à l'aide d'un câble série.

Généralement, les modems sont des DCE et les équipements qui y sont connectés (comme un PC) sont donc des DTE.

Le brochage d'un connecteur DB-9 n'est pas non plus le même selon le rôle (DTE ou DCE) du périphérique.  La figure ci-dessous illustre le brochage DB-9 côté DTE.

Brochage DB-9 côté DTE
Brochage DB-9 côté DTE (source db9-pinout.com)

Parmi ces signaux, les plus importants pour nous sont :

  • TD (resp. RD) pour la transmission (resp. réception) de données proprement dite ;
  • DCD (« détection de porteuse de données »), qui est mis au niveau haut lorsque le modem a reçu un appel entrant, a terminé le handshake avec le modem distant et a établi une connexion ; concrètement, cela correspond au moment où la lettre C en haut à droite de l'écran du Minitel devient fixe. Le signal DCD repasse au niveau bas lorsque l'un des modems raccroche ;
  • DTR (« terminal de données prêt ») est mis au niveau haut par le DTE pour signaler au DCE qu'il est prêt. En cours d'une communication, si ce signal passe au niveau bas, alors le modem raccroche.

Ces signaux sont utilisés de la manière suivante dans notre configuration :

  1. Le serveur FreeBSD ouvre le port série et passe DTR au niveau haut ;
  2. Un utilisateur compose le numéro du modem, qui décroche et débute le handshake (dont le début correspond au son strident au bout de la ligne). L'utilisateur appuie sur Connexion/Fin sur le Minitel pour poursuivre le handshake.
  3. Une fois le handshake terminé (i.e. la connexion établie), le modem met DCD au niveau haut.
  4. Le serveur FreeBSD réagit à la montée de DCD et affiche l'invite de login UNIX, ou tout autre programme éventuellement configuré.

S'y ajoutent éventuellement les signaux DSR, RTS et CTS servant au contrôle de flux matériel.

Contrairement à ce qu'on pourrait croire, le signal RI (« indication de sonnerie ») ne nous intéresse pas. Dans notre configuration, le modem décroche automatiquement à la réception d'un appel, établit la connexion puis signale à l'aide de DCD le moment où le serveur doit démarrer getty(1) sur la ligne.

On peut désormais rentrer dans le vif du sujet. Il est en effet nécessaire de configurer à la fois le modem et le serveur FreeBSD.

Configuration du modem

La plupart des modems comprennent un jeu de commandes dit « jeu de commandes Hayes » (de l'entreprise qui l'a introduit pour la première fois). Ces commandes permettent notamment de configurer un modem pour être autonome et si placer dans un mode « réponse automatique ».

Tout d'abord, sur la machine FreeBSD, ouvrir le port série en 1 200 bauds, parité paire (cuaU0 dénotant un port série USB) :

# cu -e -s 1200 -l /dev/cuaU0

Une fois la connexion établie, saisir les deux commandes :

AT&F1E0M0Q1&N2 S0=1 S7=30 S13=1 S27=16
AT&W0

Taper ensuite ~. pour se déconnecter. Le modem est alors configuré.

La première commande, qui peut paraître absconse au premier abord, se décompose de la manière suivante :

AT
  &F1         Charger configuration usine (préréglage 1)
  E0          Désactiver l'écho local des commandes
  M0          Désactiver le haut-parleur
  Q1          Désactiver les messages d'état
  &N2         Vitesse 1 200 baud
  S0=1        Décrocher automatiquement à la 1ère sonnerie
  S7=30       Abandonner le handshake après 30 s
  S13=1       Réinitialiser le modem à la chute du signal DTR
  S27=16      Activer le mode « fallback » V.23

AT
  &W0         Sauvegarder la configuration dans le registre 0

À noter que ces deux commandes sont spécifiques à ce modèle particulier de modem et qu'il faudra impérativement consulter la documentation de votre modem pour constituer une commande qui fasse la même chose que celle montrée ci-dessus.

Le mode « fallback » V.23, qui est spécifique au modem que j'utilise, semble nécessaire pour que celui-ci fonctionne avec un Minitel en face. Tous les autres paramètres sont nécessaires pour des raisons de confort (par exemple parce que je n'ai pas envie d'entendre les bruits du handshake) ou exigés par FreeBSD (par exemple la réinitialisation à la chute de DTR). Enfin, on sauvegarde ces paramètres pour qu'ils soient chargés à l'allumage du modem et à chaque réinitialisation.

Configuration de FreeBSD

Avant de poursuivre, il faut noter que FreeBSD gère les ports série un peu différemment par rapport à Linux. FreeBSD crée deux fichiers de périphérique par port série : un périphérique « /dev/cuaX » et un périphérique « /dev/ttyX ». Le périphérique « tty » bloque tant que le signal DTR est au niveau bas ; en revanche, le périphérique « cua » ne tient pas compte de ce signal. Autrement dit : on ouvre un périphérique « tty » lorsque nous attendons une connexion d'un modem externe et le périphérique « cua » lorsque nous sommes nous-mêmes à l'origine d'une connexion.

En outre, et comme je l’avais déjà dit précédemment, contrairement à Linux où il fallait compiler une version patchée de mgetty pour espérer un fonctionnement à peu près correct, ici il n'y a besoin que de quelques ajouts dans deux fichiers de configuration.

Pour commencer, le getty(1) de FreeBSD intègre sa propre base de données « à la termcap », ce qui permet d'expliquer à getty qu'un Minitel est une drôle de bestiole nécessitant 1 200 bauds, 7 bits de données, parité paire, 1 bit d'arrêt, derrière un modem. C'est dans le fichier /etc/gettydefs (cf. gettydefs(5)) que ça se passe et il suffit d'ajouter la section suivante :

#
# Entries for Minitel communicating through their built-in modems
#

minitel.dialup|Minitel through dialup:\
        :hw:ec:ep:rw:sp#1200:

Le fichier permet même de définir un « auto-login » ou un programme de login alternatif. Enfin, dans /etc/ttys (cf. ttys(5)), ajouter :

# Minitel (par modem)
ttyU0   "/usr/libexec/getty minitel.dialup"     minitel on      insecure

Bien entendu, substituez dans le premier champ le vrai nom de votre port série. Ce sera ttyu0 pour le premier port série (l'équivalent de ttyS0 sous Linux) ou ttyU0 pour le premier port série USB (l'équivalent de ttyUSB0 sous Linux). Enfin, appliquez les changements en tapant la commande init q en tant que root).

Si tout se passe bien, les LEDs « AA » (réponse automatique), « TR » (terminal prêt) et « CS » (prêt à envoyer) seront allumés. Testez ensuite en suivant les instructions que j'ai déjà détaillés avant et vous aurez normalement une invite de connexion. Testez donc votre login et votre mot de passe !

Conclusion

Je suis agréablement surpris de voir que grâce à FreeBSD, il est encore plus facile de mettre en place le nécessaire pour héberger des serveurs Minitel. Mais outre la possibilité de monter un tel serveur, c'est en réalité une sorte de point d'accès qu'on met en place. Il suffit alors de substituer le programme de son choix à login(1) sur la ligne série concernée.

Bien que ce sujet semble susciter encore un peu d'intérêt parmi les bidouilleurs de tous les âges, je doute cependant qu'un serveur Minitel recevrait aujourd'hui beaucoup d'appels. Mais parfois, ce n'est pas toujours pour l'utilité pratique qu'on bidouille mais simplement pour la pure prouesse technique.

Commentaires

Poster un commentaire

Tintin

Bonsoir x0r,

Je suis tomber sur votre site par pur hasard (une citation de votre site dans un autre avec pour principe de mettre un RPI en communication avec un minitel). Etant très friand de bidouillage en tout genre (tellement fort que j'ai réussi a cramer mon adaptateur USB-RS232...) J'aimerais comprendre certain détails de votre billet.

Ce que vous avez fais a été réalisé avec un modem est-ce bien ça ?

Y a t-il possibilité de le faire sans possédé de modem juste avec FreeBSD ? Cdt, Tintin

x0r

À quelques détails près, ce genre de manipulations est tout à fait possible sans modem, mais dans ce cas il faut fabriquer le fameux câble série PC-Minitel. La configuration côté FreeBSD est quasi identique.

Tintin

Donc avec un adaptateur série PC-minitel serais bon ?

x0r

Oui.

Poster un commentaire