Il y a déjà pas mal de sujets sur LE sujet. A mon tour !
… Et d’autres [LudoJoey/MiniPavi, etc …]
Nombreux sont ceux qui s’y sont essayés, rares sont ceux qui sont parvenus à de BONS (*) résultats hormis JHR/Hacker.
J’ai monté un environnement de test, j’ai des heures de tests et de mesures. Je vais, dans un premier temps, décrire ici l’environnement, le robot, puis les premiers résultats, actuellement conclusifs de « Je ne sais pas » …
- Dernier RPi OS 64 bits version complète avec GUI (pas bien mais ne semble pas en cause)
- Dernière distribution « PhreakNet » d’Asterisk V22 incluant PjSip, SpanDSP, APP_SoftModem
- TCP (et non pas UDP)
- Suppression d’écho désactivée (préco SteeveU)
- Codec G711 aLaw (consensus des sachants - 8Kb/s) exclusif
==> Pour ceux qui ne suivraient pas, SpanDSP est LA librairie qui permet, entre autres, de détecter la porteuse et les bits transmis [canal montant] (les variations de fréquences reçues) sur une liaison VoIP, en conséquence, en (a)FSK (V23, c’est du (audio) Frequency Shift Keying)., mais aussi et surtout la génération de la porteuse et des bits du canal descendant (variations des fréquences envoyées). J’ai trouvé Not Black Magic: AFSK qui est pas mal pour décrire comment ça marche.
[Minitel] : J’utilise un M2 Alcatel Cv; (pas trouvé d’image propre) qui reste initialisé en veille en permanence.
[Câbles Ethernet] : 3 câbles de 2m « pro » (CAT à vérifier)
[ATA] : Assure la conversion Analogique <=> Numérique pour la liaison SIP. (Plus de détails sur sa configuration ici, plus tard)
[ASTERISK : APP_SoftModem] : Hormis les détails d’accès au serveur Telnet et de format (V23, 7 bits, 1 stop, parité paire) ne permet que de ‹ jouer › sur les niveaux TX et RX… Le SoftModem s’appuie exclusivement sur SpanDSP. J’ai trouvé assez peu d’information sur les paramètres utilisés dans la vraie vie.
- Le versioning d’APP_SoftModem est malheureusement opaque. La version inclue à la distribution PhreakNet d’Asterisk comporte les mentions
- 2010 de C.Groeger (Version originale, dérivée de APP_Fax)
- 2018 de Rob O’Donnell (ajout d’options pour la parité)
- 2021/2023 de A.Naveen (corrections pour compilation avec Asterisk v18, support du 45 et 50 Bps pour TDD, documentation XML)
- Le source suggère des valeurs (float) par défaut de RX= -35 et TX= -28
- John Newcombe (Telstar) suggère RX=2 et TX=2 avec un ATA Grandstream HT802 ==> Realy ?
- KikiHC16 semble utiliser les valeurs par défaut @KiwiHC16 mais il utilise une carte Digium TDM410 en guise d’ATA et Asterisk v16
- Je ne sais pas si quelqu’un d’autre a testé/décrit d’autres valeurs (et dans quel environnement - l’ATA et le Minitel (modem) utilisé doivent aussi avoir leur importance !) @ludojoey @nathaantfm …
- Comme un gros crétin, j’ai commencé à tester avec des valeurs RX/TX très éloignées (0 à +50) !
[ASTERISK : SPANDSP]
A voir
[ASTERISK : PJSIP]
- Un Endpoint (« EndPoint/Point de terminaison » == Un compte client SIP) [ici 2000] est affecté à une ligne analogique de l’ATA.
- Des EndPoints (1000,1001, 1002) sont affectés à divers clients SIP LinPhone ‹ pour test ›.
[ASTERISK : DIALPLAN / EXTENSIONS]
- Des extensions (« Extension » == Numéro d’appel) sont configurées sur le plan de numérotation interne (from-internal) pour utiliser le SoftModem sur le schéma : Set(VOLUME(TX)=XX)/Set(Volume(RX)=YY)/Answer()/Softmodem(<@IpDuRobot>,< PortDuRobot >,ld(7),s(1),e)/Hangup()
- [Aujourd’hui !] Pour les numéros 3600 à 3619 : XX=4, YY=< Deux derniers chiffres de l’extension>
- [Aujourd’hui !] Pour les numéros 3620 à 3639 : XX=< Deux derniers chiffres de l’extension>, YY=20
[Robot]
Sur ce RPi (initialement, j’avais prévu d’utiliser un autre RPi afin de laisser Asterisk 100% seul ; à l’usage, cette précaution semble inutile avec, au maximum, 2% de CPU mangés par Asterisk et 2% par le robot), j’ai fait un robot basé sur TCPSER et Python-TelnetServer d’OliverLSanz. Ce robot est constitué de plusieurs parties/fonctionalités :
- Serveur Telnet : Destiné à s’interfacer avec le ‹ client › ouvert par APP_SoftModem lors des appels aux extensions où il est configuré [une fois que la connexion est établie (détection de porteuse) ou avant (dès la communication SIP est établie) ?]
- Ce serveur est capable de prendre en compte plusieurs sessions simultanément.
- Les émissions sont bufferisées en amont par le robot, cadencées de telle sorte que le moins de données possibles soient en transit dans les buffers de la pile IP.
- Connexion série : Destinée à piloter le Minitel appelant
- Etablissement de la communication (remise à l’état initial du terminal, numérotation pour appel de l’extension choisie, connexion du modem)
- A tout moment, suivi de l’état du terminal (connexion, etc). En détail suivi des SEP50/53/59, interrogation du terminal avec les commandes protocoles adéquates.
- Une fois la connexion établie, transmission de l’identifiant du port série (nécessaire au robot pour faire le lien entre la session Telnet et le port série correspondant). Permet aussi de valider un minimum de la qualité de la transmission montante.
- Toutes les émission sont bufferisées en amont par le robot et cadencées de telle sorte que le moins de données possibles soient en transit dans l’ensemble des buffers série (et éventuellement des piles IP intermédiaires).
- Toutes les émissions sont temporisées.
- Evolutions prévues/possibles
- Utilisation de 2 ports série/2 minitels afin de pouvoir tester les M1 qui ne disposent pas de numéroteur
- Utilisation du mode RFC2217, supporté par TCPSER, afin de pouvoir faire un test distant
- Plusieurs tests simultanés (avec plusieurs ports série/minitels numéroteurs)
Le robot répète autant de fois que souhaité (10, à aujourd’hui) les cycles de test.
Un cycle de test s’effectue sur une plage donnée d’extensions (3600 => 3619 à aujourd’hui) configurées différemment.
Un test fonctionne sur 2 phases :
- L’établissement de la communication « Minitel <> SoftModem » sur l’extension donnée (en conséquence, un paramètre RX et TX spécifique)
- Initialisation OK ou KO
- Numérotation OK ou KO
- Connexion OK ou KO
- Identification du port série OK ou KO
- Mesure (observation) de la qualité de la transmission descendante en cas de succès de la phase d’établissement de connexion
- Deux séries de séquences de caractères sont utilisées successivement [numériques puis alphanumériques]
- Pour chaque série de séquence de caractère, un certain nombre de salves (aujourd’hui, 21) de séquence de caractères (aujourd’hui, 120) sont transmises en sens descendant.
- Entre chaque salve, un délais d’une seconde est imposé en plus de la durée de transmission de la séquence de caractères.
- En cas de déconnexion, fin de l’observation
- Comparaison du nombre de caractères entre la séquence envoyée et reçue
- Si identique, comparaison des caractères entre la séquence envoyée et reçue
- Si différent, échec noté pour cette série [BUG à corriger ici, il faudrait vérifier/noter l’absence/présence de caractères dans le sens montant]
- Si identique, succès noté pour cette série et vérification de l’absence/présence de caractères dans le sens montant
- Si différent, échec noté pour cette série [BUG à corriger ici, il faudrait vérifier/noter l’absence/présence de caractères dans le sens montant]
- Si identique, comparaison des caractères entre la séquence envoyée et reçue
- Log du résultat dans un CSV à chaque fin de test ou à chaque observation
- Date/Heure
- Numéro du cycle de test
- L’état d’avancement du test (phase d’avancement)
- Le numéro appelé
- Succès de numérotation
- Succès de connexion
- Succès de correspondance ‹ port série › <=> ‹ Client Telnet ›
- Numéro de session telnet
- Numéro de la salve
- Succès/Echec de la salve
- Cause de l’échec (longueur, différence, caractères reçus)
- Details
[BUG : La dernière extension du dernier cycle n’est jamais testée, sauf à n’avoir qu’un seul cycle et une seule extension ?]
[Désolé, c’est très long, mais je voulais être précis]
Dans le post suivant, le condensé des résultats obtenus.
==> Après, on pourra discuter méthodologie et suggestion.
(*) BONs résultats : avec une ligne RTC normale/décente, il n’y avait juste ‹ jamais › d’erreur de transmission en V23. Je voudrais essayer de parvenir à 100% de succès pour au moins 10Ko transmis.