Filtre d'appel téléphonique

11/2011 : j'ai décidé de mettre un terme aux appels téléphoniques publicitaires sur la ligne fixe reliée à la Freebox.

L'idée est qu'un fax décroche le téléphone lorsqu'un numéro masqué appelle. Pour se faire, j'ai utilisé un bon vieux modem USB 56k branché sur la sortie téléphonique de la Freebox via un dédoubleur RJ11 (pour toujours pouvoir installer le téléphone fixe normal) et sur le serveur en USB de l'autre. J'ai configuré le modem en mode écoute fax avec mgetty. Lorsque le téléphone sonne, le modem reçoit la notification d'appel. Chez free, le numéro de l'appelant est transmis lors de la 2e sonnerie. Le modem attends alors sagement et lorsqu'il reçoit les informations voulues, si le destinataire appelle en numéro masqué alors le modem décroche et débute une réception de fax en négociant la transmission. Ainsi le destinataire reçoit une porteuse de fax :p

Les centrales d'appel automatique pensent que c'est un fax et ne recommencent plus, je ne suis donc plus embêté.

splitter RJ11   Modem Conexant

Le modem est branché en USB et est reconnu sur /dev/ttyACM0. mgetty est utilisé pour que le modem soit configuré en réception de fax et pour exécuter un script shell /usr/local/bin/repondeur.sh :

/etc/mgetty
port ttyACM0
  debug 4
  speed 38400
  post-init-chat "" AT+VCID=1 OK
  cnd-program /usr/local/bin/repondeur.sh

Configuration du lancement de mgetty

/etc/inittab
...
T3:23:respawn:/sbin/mgetty /dev/ttyACM0

Ce script shell est appelé par mgetty et reçoit en argument le device du modem, le numéro de l'appelant et son nom. Ce comportement est natif à mgetty : il interprète les commandes Hayes ou AT transmises. Si le numéro est masqué, free transmet alors 0 et le script /usr/local/bin/decroche.sh décroche le téléphone.

/usr/local/bin/repondeur.sh
#!/bin/sh
NOW="$(date +"%d-%m-%Y %T")"
TTY="$1"
NUMBER="$2"
NAME="$3"
 
LOG=/var/log/repondeur/appel.log
 
# log
echo "Appel entrant le $NOW de '$NAME' ($NUMBER) sur '$TTY'" >> $LOG
 
if [ "z$NUMBER" = "zO" ]
then
    echo "Appel filtré" >> $LOG
    nohup /usr/local/bin/decroche.sh $TTY &
    # exit 0 pour que minicom décroche, le script lancé précédement va raccrocher la ligne 
    exit 0
else
    # on sort en erreur pour que mgetty ne decroche pas
    exit 1
fi

Ce script produit un petit programme de commandes AT exécuté par minicom indiquant au modem de décrocher, d'envoyer une porteuse de fax puis de raccrocher au bout de 3 secondes :

/usr/local/bin/decroche.sh
#/bin/bash
 
PID=$$
FILE=/tmp/minicom.$PID
DEVICE=/dev/$1
 
echo 'send ATZ
expect {
"OK"
}
send AT+FCLASS=1
expect {
"OK"
}
send ATH1
expect {
"OK"
}
send ATH0
expect {
"OK"
}
send ATZ
expect {
"OK"
}
sleep 3
 
! killall minicom' > $FILE
 
/usr/bin/minicom -D $DEVICE -S $FILE
rm -f $FILE