Il y a quelque temps, j'avais besoin de communiquer avec une personne après une maladie qui ne pouvait pas utiliser physiquement le téléphone. Un simple dispositif d'appel était nécessaire, un appel vocal a été effectué au simple toucher d'un bouton. Le besoin a disparu, cependant, après avoir visité l'hôpital lui-même, en regardant les patients, on pensait qu'une telle solution pourrait être utile.
Maintenant, je vois l'utilisation personnelle de cet appareil comme une sonnette SIP.
Peut-être avec de petites modifications, la combinaison de la téléphonie VoIP avec un système domotique. Comme options d'utilisation - sonnette SIP, interphone, système de communication vocale (client-personnel, directeur-secrétaire), etc.

Toute la décision est prise sur les logiciels libres et open source: système d'exploitation - Raspbian Stretch (Debian 9), système domotique - MajorDoMo, serveur VoIP - Freeswitch, client logiciel de téléphonie IP avec la possibilité de travailler en mode terminal Linphonec.
Dans cette partie, sous la coupe, nous parlerons principalement de l'installation du client SIP de la console Linphonec.
Nous aurons besoin de:
- Raspberry Pi - Ordinateur monocarte (j'ai un modèle Raspberry Pi 3B)
- Carte mémoire Micro SD d'au moins 16 Go, chargeur USB, boîtier.
- Carte son USB (l'une des moins chères, utilisée par Gembird), microphone, haut-parleur (casque).
- Bouton et une paire de cavaliers BBJ pour broches GPIO.
1.
Première étape - Installation d'une image MajorDoMo pour RPIActuellement, la version actuelle de l'image pour le Raspberry Pi est v. 3.40. Voici une brève description des images et des modifications de MajorDoMo:
Images de base MajorDoMo pour Raspberry PiAprès l'installation et lorsque le système démarre, connectez les haut-parleurs au connecteur 3.5 - nous entendrons les messages système et l'adresse IP de Raspberry.
Le nom d'utilisateur par défaut est: mot de passe pi: framboise.
2. Installez FREESWITCH,
Installation du serveur VoIP FRESWITCH pour RaspberryAprès cela, nous procédons à l'installation des composants nécessaires. Une étape facultative, mais peut-être utile ultérieurement.
Installer RPi-Monitor
Installez un utilitaire de surveillance RPI petit mais utile qui montre les ressources de notre Raspberry PI.
RPi-Monitor est un logiciel de surveillance de carte Raspberry Pi basé sur le Web. Cet outil peut être utile pour contrôler l'utilisation de l'espace disque, la charge CPU, la mémoire et le trafic réseau, la température. RPI-Monitor est assez simple à installer et affiche visuellement des informations sur le système.
Tout d'abord, je vais donner un lien vers la source:
RPi-Monitor .
Installez la clé publique RPi-Monitor et ajoutez-la aux référentiels approuvés:
sudo apt-get install dirmngr sudo apt-key adv --recv-keys --keyserver keyserver.ubuntu.com 2C0D3C0F sudo wget http://goo.gl/vewCLL -O /etc/apt/sources.list.d/rpimonitor.list
Ensuite, mettez à jour le système et installez le moniteur RPI lui-même:
sudo apt-get update sudo apt-get install rpimonitor
Ouvrez l'IP de votre ordinateur dans le navigateur avec le port: 8888, sur lequel le moniteur fonctionne, et voyez l'état RPI.

Installation d'une carte audio USB et configuration du son dans le système d'exploitation Raspberry Pi
Malheureusement, notre mini ordinateur Raspberry n'a pas son propre microphone intégré et une entrée pour cela. Par conséquent, pour connecter un microphone, vous devrez utiliser une carte son USB externe. Nous connectons la carte au port USB Raspberry et exécutons la commande (qui montre les périphériques audio du système):
cat /proc/asound/cards
Nous voyons la réponse avec deux cartes, bcm2835 - intégrées, externes définies comme périphérique audio USB:
0 [ALSA]: bcm2835_alsa - bcm2835 ALSA
bcm2835 ALSA
1 [Périphérique]: USB-Audio - Périphérique audio USB
Périphérique audio USB GeneralPlus à usb-3f980000.usb-1.4, pleine vitesseLe système d'exploitation voit notre carte son, mais elle n'est pas encore enregistrée dans le système.
Créez un fichier:
sudo nano /etc/modprobe.d/alsa-base.conf
Nous écrivons (collons) la ligne suivante:
options index snd-usb-audio = 1Enregistrez (dans l'éditeur Ctrl + X).
Créez un autre fichier:
sudo nano /etc/asound.conf
Ajouter du contenu:
contenu du fichier pcm.!default { type plug slave { pcm "hw:1,0" } } ctl.!default { type hw card 1 }
Nous éditons le fichier de configuration suivant:
sudo nano /usr/share/alsa/alsa.conf
Changez la carte son par défaut de 0 à 1 (carte USB). Évidemment, 0 par défaut est la sortie audio intégrée du mini-ordinateur, définissez les paramètres suivants sur 2 lignes:
defaults.ctl.card 1 defaults.pcm.card 1
Les modifications prendront effet, après le redémarrage, on surchargera en tapant dans la console:
sudo reboot
Nous connectons un microphone et des haut-parleurs (casque) à une carte audio externe. Après le redémarrage, exécutez l'utilitaire de configuration du son Alsamixer.
alsamixer
Nous voyons nos appareils que nous avons définis dans le système par défaut:

Utilisez les touches de curseur gauche et droite, sélectionnez l'appareil souhaité, haut et bas, ajustez, faites attention aux symboles sous l'appareil sélectionné:
xOOx - l'appareil est allumé, xMMx - l'appareil est éteint. Comme vous pouvez le voir sur la capture d'écran, mon microphone a été désactivé par défaut dans le système.
Pour allumer / éteindre l'appareil, vous devez appuyer sur
M sur le clavier.
Quittez alsamixer (quittez ctr + C).
Vérification du son dans le système. Des haut-parleurs et un microphone sont connectés aux sorties USB correspondantes de la carte son.
Nous donnons la commande:
arecord -D plughw:1,0 -f cd /home/pi/test_record.wav
Avec cette commande, un fichier son est enregistré via le microphone dans le répertoire approprié (dans notre cas, le home pi de l'utilisateur). Arrêtez l'enregistrement
Ctrl + c .
Vérifiez le fichier enregistré:
aplay /home/pi/test_record.wav
Nous effectuerons un meilleur contrôle plus tard.
Installation du client VoIP de la console Linphonec
Il n'y a pas tellement de programmes qui peuvent fonctionner dans le système d'exploitation sans interface graphique; je me suis installé sur le package Linphone.
Le paquet est assez grand, il a de nombreuses fonctionnalités potentielles, mais jusqu'à présent, nous n'avons besoin que d'un petit utilitaire Linphonec qui peut fonctionner dans le terminal et a la fonction de réponse automatique (ramassage automatique).
Pour elle, les actions suivantes seront effectuées.
Je note que lors de l'installation à partir du référentiel Raspbian, une version 3.6.1 assez ancienne est installée, qui ne fonctionne pas correctement avec le système audio ALSA, j'ai eu une perte de son, le programme s'est écrasé plusieurs fois.
Par conséquent, j'utiliserai une version plus récente.
Pour l'auto-assemblage du package à partir des sources, nous installons des dépendances supplémentaires:
sudo apt-get install cmake automake autoconf libtool intltool yasm libasound2-dev libpulse-dev libv4l-dev nasm git libglew-dev
Accédez au répertoire personnel:
cd /home/pi/
Téléchargez le package Linphone lui-même, le téléchargement a pris environ 20 minutes.
git clone git://git.linphone.org/linphone-desktop.git --recursive
Je ne pouvais pas compiler et compiler le package Linphone de la première ou même de la deuxième fois. Par conséquent, je vais donner mon algorithme d'action.
Nous arrêtons presque tous les services en cours d'exécution, mais actuellement inutilisés, à l'aide du système de gestion des services systemctl.
Il y a eu des erreurs lors du montage, notre mini PC n'a tout simplement pas assez de ressources. Libérez-les pour l'installation.
Arrêt des services sudo systemctl stop freeswitch.service sudo systemctl stop majordomo.service sudo systemctl stop avahi-daemon.socket sudo systemctl stop avahi-daemon.service sudo systemctl stop mosquitto.service sudo systemctl stop mysql sudo systemctl stop mpd.service sudo systemctl stop mpd.socket sudo systemctl stop homebridge.service sudo systemctl stop nginx.service sudo systemctl stop bluetooth.target sudo systemctl stop bluetooth.service
Au cas où, nous pouvons créer un fichier d'échange temporaire (avant de redémarrer) (espace disque dur), que le système d'exploitation utilise en cas de RAM insuffisante.
Pour vérifier si le fichier d'échange est inclus dans notre installation Raspbian (Debian) en tapant:
sudo swapon --show
La sortie est vide, ce qui signifie que le système n'a pas de fichier d'échange.
Ajoutez un swap 1G et créez un fichier:
sudo fallocate -l 1G /swapfile
Seul l'utilisateur root peut lire et écrire dans le fichier d'échange, nous définissons donc les autorisations appropriées:
sudo chmod 600 /swapfile
Nous utilisons l'outil mkswap pour configurer la zone d'échange Linux dans le fichier et l'activer en tapant les commandes suivantes:
sudo mkswap /swapfile sudo swapon /swapfile
Accédez au répertoire créé lors du téléchargement du package:
cd linphone-desktop
Nous préparons pour l'installation une version sans interface graphique:
sudo ./prepare.py no-ui -DENABLE_OPENH264=ON -DENABLE_WEBRTC_AEC=OFF -DENABLE_UNIT_TESTS=OFF -DENABLE_MKV=OFF -DENABLE_FFMPEG=ON -DENABLE_CXX_WRAPPER=OFF -DENABLE_NON_FREE_CODECS=ON -DENABLE_VCARD=OFF -DENABLE_BV16=OFF -DENABLE_V4L=OFF
Générez en utilisant l'attribut –j4 (c'est-à-dire, créez en 4 threads en même temps.
sudo make -j4
Lors de l'installation, nous pouvons regarder l'état de notre ordinateur dans RPI-Monitor:

Le temps de construction pour moi était d'environ 30 à 40 minutes.
Les fichiers de programme compilés sont apparus dans le répertoire OUTPUT / no-ui / bin. Pour exécuter le programme, allons-y:
cd OUTPUT/no-ui/bin
Vérifiez la version du programme:
./linphonec -v
On obtient le résultat: version: 3.12.0
Surcharger notre framboise
Au redémarrage, le fichier d'échange disparaît, tous les services en cours d'exécution enregistrés au démarrage sont restaurés.
Une petite configuration initiale de Freeswitch.
Le serveur FREESWITCH est installé par défaut dans le répertoire / usr / local / freeswitch /. Le dossier conf contient des fichiers de configuration. Par défaut, la configuration de test vanilla est installée, ce qui sert pour la plupart à vous familiariser avec la possibilité d'un serveur VoIP et contient un grand nombre d'exemples qui sont clairement redondants pour un usage domestique. Tout d'abord, voyons la configuration prête à l'emploi du serveur VoIP.
Modifiez le fichier de configuration vars.xml
sudo nano /usr/local/freeswitch/conf/vars.xml
Tout d'abord, remplacez le mot de passe par défaut 1234 par une autre valeur, par exemple 1111. Si vous ne le faites pas, avant chaque appel, une pause est définie avant de composer 10 secondes.
Par défaut, comme je l'ai écrit dans un article précédent, nous avons 20 numéros d'abonné 1001-1020. Dialplan est également installé par défaut.
Pour une raison quelconque, ces fois, par rapport à il y a six mois, lorsque le module mod_xml_rpc était allumé, le serveur se bloquait constamment.
Dialplan FreeSWITCH utilise largement les expressions régulières. Le plan de numérotation par défaut est responsable du traitement des appels, la section suivante du fichier Local_Extension est responsable de l'envoi à nos numéros locaux. Commentez quelques lignes:
sudo nano /usr/local/freeswitch/conf/dialplan/defaults.xml
Édition de la boîte de dialogue, insérez un symbole de commentaire dans cette section:
Modification de la boîte de dialogue des numéros 1001-1019 <extension name="Local_Extension"> <condition field="destination_number" expression="^(10[01][0-9])$"> <action application="export" data="dialed_extension=$1"/>
Une petite digression, à mon avis, malgré la capacité de travail du FS, après nos plusieurs changements, il est préférable de refaire les fichiers de configuration FS pour vous-même, y compris abonnement, plan de numérotation, etc., mais vous ne pouvez pas tout ranger dans un seul article, nous nous tournons donc vers notre client terminal.Configurer et lancer le client terminal Linphonec
Exécutez Linphonec en mode de réponse automatique à partir de l'utilisateur pi actuel:
/home/pi/linphone-desktop/OUTPUT/no-ui/bin/linphonec -a
Au premier lancement, Linphonec essaie de créer un fichier de base de données et un fichier de paramètres. Cependant, le lancement est par erreur.
erreur au démarrage de linphonec 2019-08-02 18:02:58:715 mediastreamer-error-Connection to the pulseaudio server failed 2019-08-02 18:02:58:946 belle-sip-error-udp bind() failed for ::0 port 5060: Address already in use 2019-08-02 18:02:58:947 belle-sip-error-TCP bind() failed for ::0 port 5060: Address already in use 2019-08-02 18:02:59:126 liblinphone-fatal-Unable to open linphone database. Aborted
Dans un premier temps, nous traiterons de la dernière erreur, en ouvrant le fichier de base de données.
Le fichier de base de données est créé dans le répertoire personnel le long du chemin suivant: /home/pi/.local/share/linphone
Un fichier (ou répertoire) Linux est considéré comme masqué si son nom commence par un point ".". Par exemple, ".myfile". En règle générale, ces fichiers sont utilisés par les applications pour stocker les paramètres, les configurations et d'autres informations qui doivent être cachées à l'utilisateur.
Créer un répertoire à partir de l'utilisateur actuel (pi)
mkdir /home/pi/.local mkdir /home/pi/.local/share mkdir /home/pi/.local/share/linphone
Nous démarrons le programme, le programme a démarré, mais il donne une erreur:
Erreur d'ouverture de port 2019-08-07 11:29:32:780 mediastreamer-error-Connection to the pulseaudio server failed 2019-08-07 11:29:32:866 belle-sip-error-udp bind() failed for ::0 port 5060: Address already in use 2019-08-07 11:29:32:866 belle-sip-error-TCP bind() failed for ::0 port 5060: Address already in use
Nous avons découvert le premier problème de création d'une base de données; au lancement initial, le programme a généré un fichier de base de données.
L'erreur associée au système audio Pulseaudio - n'interfère pas avec le fonctionnement du programme, je prévois d'utiliser ALSA, si nécessaire, un serveur audio peut toujours être installé avant.
Le second - les ports 5060 sont occupés. Ces ports sont couramment utilisés par les applications SIP. Nous pouvons quitter le programme et donner la commande:
sudo netstat -tulpn | grep LISTEN
Nous verrons que le port 5060 utilise notre serveur VoIP FREESWITCH. Eh bien, nous utiliserons des ports gratuits.
Nous revenons au programme linphonec. Et faites un peu de configuration.
Tout d'abord, changez le port pour Linfon, puis indiquez l'enregistrement sur le serveur VoIP, vérifiez l'état de l'enregistrement et consultez la liste des cartes son, la carte utilisée et configurez-la sur une clé USB externe (avec l'index dans le programme Linphone - 2):
ports sip 5062 register sip:1001@192.168.15.13 192.168.15.13 1111 linphonec> help register status register soundcard list soundcard show soundcard use 2 soundcard show

Dans l'équipe d'inscription, nous utilisons le format suivant: ID utilisateur Sip - par défaut, nous avons 20 abonnés avec les numéros 1001-1019. Ces numéros sont les noms d'utilisateurs des abonnés Connexion abonné @ [Nom de domaine] - nom de domaine - Adresse IP de notre Raspberry. Sip proxy - correspond à l'adresse IP RPI et, à la fin, au mot de passe de l'utilisateur que nous avons récemment configuré 1111.
Quittez le programme (Ctrl + x), les paramètres ne sont pas toujours appliqués à la volée. Après avoir quitté le répertoire personnel / home / pi, le fichier de configuration du client de la console est apparu: .linphonerc.
Nous pouvons déjà apporter des modifications en éditant le fichier de configuration du client SIP.
Sur une nouvelle console de lancement client SIP.
Parallèlement à la session SSH en cours, ouvrez-en une nouvelle, connectez-vous en utilisant votre nom d'utilisateur et votre mot de passe.
Nous commençons alsamixer. Dans une session, nous avons Linphonec, dans la seconde, un utilitaire de réglage du son.
Nous effectuons la configuration de l'appel à partir du client SIP sur un smartphone ou un PC (comme décrit dans l'article sur l'installation de FREESWITCH) en changeant le mot de passe par défaut en votre propre et en composant un numéro, dans notre cas 1001. Nous pouvons aller sur le portail freswitch à IP_Raspberry: 8080, voir l'enregistrement des abonnés, le statut appeler, etc.

En utilisant alsamixer, nous ajustons le son. Les modifications sonores sont appliquées à la volée, sans quitter les programmes.
Malheureusement, en raison de l'utilisation d'une carte audio bon marché, je n'ai pas pu obtenir un son acceptable, un écho a été entendu dans les haut-parleurs. Il peut être minimisé quelque peu, mais complètement supprimé - je n'ai pas réussi.
Par conséquent, comme il n'a pas été possible de le supprimer d'une manière, nous l'éliminons d'une autre.
Fermez Linphonec, éditez le fichier de configuration:
sudo nano /home/pi/.linphonerc
Dans la section son, nous apportons les trois dernières lignes à ce formulaire:
Section du son de Linphonerc [sound] remote_ring=/home/pi/linphone-desktop/OUTPUT/no-ui/share/sounds/linphone/ringback.wav playback_gain_db=0.000000 mic_gain_db=0.000000 ringer_dev_id=ALSA: bcm2835 ALSA playback_dev_id=ALSA: bcm2835 ALSA capture_dev_id=ALSA: USB Audio Device
De cette façon, nous avons forcé la sonnerie et le périphérique de sortie audio à fonctionner sur la prise framboise 3,5 intégrée, et le périphérique d'enregistrement - le microphone fonctionnant via une carte son externe - l'écho a disparu.
Basculez les haut-parleurs sur le propre connecteur de la framboise.
Nous prenons en compte le moment suivant: lors du chargement et dans certains cas, le système de maison intelligente lit ses messages système via cette sortie audio.
Éteignez-les. Nous passons IP_Rasberry à la page principale, ouvrant le système domotique MajorDoMo.
Nous entrons dans le panneau de configuration - l'objet Ordinateur (développez l'appareil) - ThisComputer sur l'onglet Propriétés et définissons les valeurs:
ThisComputer.minMsgLevel 100 ThisComputer.volumeLevel 0

Ajoutez une entrée à cron (un programme démon conçu pour effectuer des tâches à un moment précis ou à certains intervalles. L'utilitaire crontab est utilisé pour modifier des tâches):
crontab –e
Je note que nous faisons cela sous l'utilisateur pi.
Insérez la ligne à la toute fin:
@reboot /home/pi/linphone-desktop/OUTPUT/no-ui/bin/linphonec –a
Lors du redémarrage, de la mise sous tension de l'ordinateur, cette ligne lance le programme Linphonec en mode de réponse automatique.
Retour à MajorDoMo:
Allons à la page principale, dans la section service:
Dans le menu de cette section, des boutons sont créés pour redémarrer (éteindre) l'ordinateur.
Le fait est que pour économiser les ressources de la carte mémoire SD, les modifications sont enregistrées dans le système «maison intelligente» après un certain temps (15 minutes). Par conséquent, si vous devez surcharger les framboises, il est préférable de le faire correctement. Nous redémarrons le système.

Après le redémarrage, accédez à la page principale de MajorDoMo, accédez au panneau de configuration et, comme dans le dernier article, nous appelons à partir de la console en utilisant le format suivant:
GetURL("http://freeswitch:works@192.168.1.103:8080/webapi/originate?user/1001%201003%20XML%20default")
Après la commande, Linphonec décroche automatiquement le téléphone. Dans le haut-parleur RPI, un fichier son est en cours de lecture, un appel est envoyé vers le second softphone (PC / smartphone). Après avoir décroché le combiné (en appuyant sur le bouton de réponse dans le programme), la connexion est établie.

Sur ce, je termine cette partie. J'essaierai de décrire un peu plus tard le bouton lui-même en utilisant GPIO et en configurant des appels en dehors de mon réseau local.