En juillet 2018, un orage a foudroyé la box, et le rasppberri pi, pourtant pas directement connecté à la box, n'a pas redémarré. Asterisk est maintenent sur banana pi en wifi, au moins la foudre ne remontera pas par les fils réseau !. voir la page Prise en main de la carte Banana Pi
Un certain nombre de motivations peuvent vous inciter à installer un système téléphonique PBX Asterisk à la maison:
Ce document se propose donc de fournir une description, parmi tant d'autres, d'une installation du logiciel asterisk sur une carte, tout à fait adaptée à ce genre d'exercice, comme le Raspberry PI.
Le choix du matériel dépend du besoin qui est relativement limité dans une maison d'habitation avec une ligne RTC, une ligne SIP, un à 2 postes téléphoniques, un en haut et un en bas, ceci se réduit en un poste avec un téléphone DECT à plusieurs combinés. On pourrait penser à héberger tout cela sur un modem/routeur qui reste allumé en permanence, mais en fait cette solution n'est pas très adaptée car les modems sont déjà bien chargés, pas toujours ouverts, et vraiment limités par rapport à une carte comme le Raspberry Pi.
Le choix s'est fixé sur un Raspberry Pi parce qu'il est facile à approvisionner, que pour l'instant je n'ai pas trouvé moins cher et que je pensais trouver quelque chose de nouveau, mais de ce coté on nage vraiment en terrain connu.
Maintenant il existe des solutions d'IP-PBX toutes faites et prêtes à l'emploi comme IcallDroid, AtCom, etc...Il peut être utile de les considérer si ne veut pas passer trop de temps et mettre les mains dans le cambouis. Mais ce n'est pas mon cas et je ne choisis pas forcément la solution la plus simple...
Un logiciel comme Asterisk présente toujours une complexité, surtout si c'est la première fois qu'on l'aborde, il faut commencer par comprendre les concepts pour mieux les utiliser. Pour cela, un livre comme Asterisk: the definitive guide (fourth edition) est très utile, si ce n'est indispensable.
Le livre s'appuye sur la version 11 du logiciel. Eh oui, il y a aussi un certain nombre de versions, de quoi dérouter. On va donc s'installer la version 11. Mais avant, il faut faire le choix de l'OS, le livre décrit l'installation sur RHEL et Ubuntu, on va donc choisir Archlinux.
Ici encore on aurait pu choisir une solution plus compléte comme raspbx qui est une association de Raspian, Asterisk et Free-Pbx qui est une interface pour configurer Asterisk. Mais comment voulez vous configurer un produit que vous ne connaissez pas avec une interface que vous ne connaissez pas, qui n'est pas documentée sous prétexte que tout ce qui est présenté sur un écran est intuitif. On essaie de cacher un problème et on ramène un autre. Personnellement je préfére modifier la valeur des champs avec un éditeur de texte dans un fichier documenté, que des champs non documenté sur une page d'écran.
Avant d'installer Asterisk, il faut, bien sûr, installer l'operating system et ici, pour une fois, on a le choix entre Linux et Linux et encore pas tous. L'architecture du processeur étant de l'ARMv6 n'est pas supportée par toutes les distributions entre autres RHEL et Ubuntu du livre. Par contre elle est supportée par Archlinux une distribution sobre, bien documentée et ne modifiant pas les fichiers de configurations des applications.
La première chose à faire, c'est de télécharger une image ArchLinuxARM-2014.01-rpi.img.zip (vous ne trouverez sans doute pas celle-ci, mais une plus récente) soit sur le site http://www.raspberrypi.org/downloads/ soit http://os.archlinuxarm.org/os/rpi/.
Sachant qu'une image est la copie d'un disque mise dans un fichier, l'installation consiste, après un unzip, à copier le contenu du fichier sur le disque cible qui est la carte SD qui va s'insérer dans le support du Raspberry Pi.
unzip ArchLinuxARM-2014.01-rpi.img.zip dd if=ArchLinuxARM-2014.01-rpi.img of=/dev/sdb
Ceci se fait sur PC linux. Vous n'avez pas Linux, votre OS a certainement une commande pour faire la même opération. La première commande décompresse (unzip) le fichier, la deuxième copie l'image vers le disque (ici /dev/sdb pour l'exemple, à remplacer impérativement par le nom de votre disque). Copier l'image veut dire partitionner le disque et y copier les fichiers en une seule commande. Cette commande écrase le contenu précédent du disque. Sur linux, il y a toujours une incertitude sur le nom du disque inséré, il est prudent de le vérifier avec la commande dmesg ou blkid. Ici une erreur est fatale pour le contenu du disque. Une autre erreur à éviter: il faut donner le nom du disque /dev/sdb et non pas le nom de la partition /dev/sdb1.
Pendant que l'on y est, il y a une autre manipulation à faire pour récupérer le volume inutilisé de la carte SD. Après la copie de l'image seul 2 Go sont utilisés, si votre carte fait 8 Go, vous en perdez les 3 / 4. Voici l'état du disque:
# fdisk /dev/sdb Welcome to fdisk (util-linux 2.24.1). Changes will remain in memory only, until you decide to write them. Be careful before using the write command. Command (m for help): p Disk /dev/sdb: 7.3 GiB, 7803174912 bytes, 15240576 sectors Units: sectors of 1 * 512 = 512 bytes Sector size (logical/physical): 512 bytes / 512 bytes I/O size (minimum/optimal): 512 bytes / 512 bytes Disklabel type: dos Disk identifier: 0x417ee54b Device Boot Start End Blocks Id System /dev/sdb1 2048 186367 92160 c W95 FAT32 (LBA) /dev/sdb2 186368 3667967 1740800 5 Extended /dev/sdb5 188416 3667967 1739776 83 Linux
La manipulation consiste à supprimer la dernière partition puis à créer une nouvelle avec les valeurs par défaut. Ceci se fait avec le commande fdisk. Rien n'est modifié, tant qu'on n'a pas appuyé sur w.
fdisk /dev/sdb d # tapez d suivi d'entrée suppression de la partition 5 # la partition 5 est proposée appuyer sur entrée d # tapez d suivi d'entrée suppression de la partition 2 # la partition 2 est proposée appuyer sur entrée n # tapez n suivi d'entrée création d'une nouvelle partition e # tapez e suivi d'entrée création d'une partition étendue 2 # la partition 2 est proposée appuyer sur entrée 186368 # le block de départ est proposé appuyer sur entrée 15240575 # le block de fin est proposé appuyer sur entrée n # tapez n suivi d'entrée création d'une nouvelle partition l # tapez l suivi d'entrée partition logique 5 # la partition 5 est proposée appuyer sur entrée 188416 # le block de départ est proposé appuyer sur entrée 15240575 # le block de fin est proposé appuyer sur entrée w # tapez w suivi d'entrée écriture de la table sur le disque
On a modifié la table des partitions, il faut encore redimensionner le filesystem.
resize2fs /dev/sdb5
La carte SD peut être installée sur la carte Raspberry Pi. On connecte la carte au réseau ethernet par un cable rj45. On alimente la carte et elle boote en quelques secondes, elle s'adresse au routeur pour avoir une adresse ip. Vous pouvez consulter le routeur pour connaitre cette adresse. On se connecte alors à la carte avec la commande ssh sur le compte root avec le mot de passe root:
ssh 192.168.1.65 -l root
Nous voila connecté au Pi avec seulement 2 accessoires: la carte SD et le cordon rj45, bravo et merci ArchLinux. Mais il reste quelques ajustages à faire.
passwd
fallocate -l 200M /var/swap chmod 600 /var/swap mkswap /var/swap swapon /var/swap
Rajouter la ligne suivante dans le fichier /etc/fstab:
/var/swap swap swap defaults 0 0
ln -sf /usr/share/zoneinfo/Europe/Paris /etc/localtime
Sélectionner les locales utilisées dans le fichier /etc/locale.gen et les générer:
locale-gen
La carte obtient son adresse IP par dhcp sur le réseau. C'est très bien, laissons le continuer, mais en se connectant sur la page DHCP du modem/routeur on peut affecter une adresse IP fixe à une adresse MAC donnée.
Le modem routeur utilise dnsmasq comme relai et cache dns pour le réseau local. Dnsmasq lit le fichier /etc/hosts au démarrage. Donc si on introduit dans ce fichier /etc/hosts les adresses ip et les noms des machines correspondantes du réseau local, la résolution des noms se fera pour ces machines.
Un compte pour soi et un pour asterisk. On en profite pour installer le répertoire ~/.ssh et la clé publique permettant l'accés à distance sans mot de passe.
useradd asterisk passwd asterisk
Le livre recommande d'installer Asterisk à partir des sources. C'est ce que l'on va faire.
Le système de compilation natif est, sans doute, préférable au système de compilation croisé. En effet le Raspberry Pi est suffisemment puissant pour fournir un temps de compilation décent.
En se logguant root, il est peut être nécessaire de compléter le système, si ce n'est pas déja fait, pour la compilation d'asterisk:
# pacman -Syu # pacman -S gcc make wget subversion libxml2 ncurses openssl sqlite \ libnewt linux-raspberrypi-headers
Créer un répertoire et y installer les derniers sources de la version 11 qui est recommandée par le livre. Dans le livre, on trouvera un topo sur le versionnement de Asterisk qu'il est utile de comprendre.
$ mkdir -p ~/src/asterisk-complete/asterisk $ cd ~/src/asterisk-complete/asterisk $ svn co http://svn.asterisk.org/svn/asterisk/branches/11
Lancer la compilation qui dure un moment, puis l'installation:
$ cd ~/src/asterisk-complete/asterisk/11 $ ./configure $ make $ sudo make install $ sudo make config
Changer les droits des répertoires utilisés par asterisk:
# chown -R asterisk.asterisk /var/lib/asterisk/ \ /var/spool/asterisk/ /var/log/asterisk/ /var/run/asterisk/ # mkdir -p /etc/asterisk # chown asterisk.asterisk /etc/asterisk # cp ~/src/asterisk-complete/asterisk/11/configs/indications.conf.sample \ /etc/asterisk/indications.conf # cp ~/src/asterisk-complete/asterisk/11/configs/asterisk.conf.sample \ /etc/asterisk/asterisk.conf
Il est recommandé de positionner les variables suivantes du fichier /etc/asterisk/asterisk.conf:
runuser = asterisk rungroup = asterisk
En suivant les indications du livre créer les fichiers:
Afin de permettre le démarrage automatique de Asterisk au démarrage du système, créer un fichier asterisk.service dans le répertoire /etc/systemd/system avec les informations suivantes:
Description=Asterisk PBX Documentation=man:asterisk(8) Wants=network.target After=network.target [Service] Type=forking PIDFile=/var/run/asterisk/asterisk.pid ExecStart=/usr/sbin/asterisk Restart=on-abort [Install] WantedBy=multi-user.target
Activer le service avec la commande:
# systemctl enable asterisk.service
L'installation des voix en français semble indispensable, la majorité des utilisateurs parlant le français. Pour cela, il existe un paquet archive Prompt.FR.AF.Ver.2.1.GSM.Released.tar.gz que l'on peut télécharger sur ce lien et qui contient les messages vocaux d'Asterisk en français. Ces messages sont d'une qualité remarquable et ont été enregistrées par Aurélie Bassart, que je remercie au passage.
Si vous installez l'archive, il y aura quelques manipulations à faire sur les répertoires. Pour éviter cela, je mets une copie à télécharger (voir dans le paragraphe Download plus bas) et extraire dans le répertoire /var/lib/asterisk/sounds.
Pour écouter les fichiers .gsm sur son PC Linux, on peut utiliser la commande play du paquet sox.
play day-4.gsm
Il peut être nécessaire d'éditer un message vocal. On pourrait, bien sûr, l'enregistrer, mais pour rester homogène avec les autres messages, on peut découper des morceaux dans les fichiers existants, puis les réassembler, avec un outil comme audacity. Mais audacity ne sait pas lire directement les fichiers .gsm, il faut d'abord les convertir en .wav. Les 2 commandes suivantes permettent de convertir de gsm à wav, puis de wav à gsm:
sox day-4.gsm -e signed-integer day-4.wav sox -t ul day-4.ulaw -c1 -r 8000 day-4.gsm
Tout ce qui a été fait jusqu'à présent permet de démarrer Asterisk, mais il ne fera pas grand chose, il faut encore le configurer et c'est l'objet de la page configuration d'asterisk.
C'est bien d'avoir une carte Raspberry Pi. C'est mieux quand on peut le ranger. Voici donc un beau boitier sorti tout droit de la poubelle juste au bon moment. C'est un adaptateur TNT que je n'ai même pas testé. L'alimentation, fonctionnant correctement, sert donc à alimenter le Pi, car croyant avoir des adaptateurs avec le bon connecteur, je n'ai pas acheté l'alimentation spéciale pour le Pi. Et je vous laisse deviner que mes connecteurs ne convenaient pas au moment de les brancher.
Le circuit imprimé du boitier d'origine a été débarrassé de ses composants, excepté ceux de l'alimentation. Pour ce faire, un pistolet à air chaud, genre décolleur de peinture, fait très bien l'affaire.
L'alimentation se trouve à gauche sur la photo.
Vient ensuite la carte de décodage de téléinformation du compteur d"électricité. Bien que n'ayant rien à voir avec Asterisk, elle est là pour être couplée au Raspberry Pi et fonctionner en permanence Cette carte est décrite dans le document carte de décodage de téléinformation
Il faut noter que l'arrêt du Raspberry Pi est assez délicat. L'arrêt par coupure de l'alimentation peut être désastreux pour le contenu de la carte SD.
Pour l'arrêt en temps normal, il est conseillé d'utiliser la commande systemctl stop puis couper l'alimentation.
Pour les cas d'urgence, il est conseillé d' utiliser le reset du Raspberri Pi situé sur le connecteur P6-1 (RP B, pin la plus près du bord de la carte) que l'on aura relié à un bouton poussoir accessible, l'autre pôle du poussoir étant relié au 0 Volt. En effet, après une coupure de courant, le RPi ne démarre pas tout seul, il faut alors appuyer sur la touche reset.
Vous trouverez la comsommation du Rasperry Pi et de son alim sur cette page: Quelques consommations d'appareils domestiques.
Les sites et documents traitant de l'installation d'Asterisk sont assez nombreux. En voici quelques uns qui m'ont inspirés.