Bouton d'appel bricolage partie 2. Vidéophone de Raspberry Pi

Dans cette partie, nous fabriquons un appareil VoIP Raspberry Pi pour passer des appels vidéo en utilisant le protocole SIP.

La tâche initiale est restée la même: passer un appel par influence extérieure (appuyer sur un bouton). Mais la mise en œuvre de l'idée a un peu changé. Comme dans la partie précédente, nous utiliserons le client SIP du terminal Linphonec, mais afin de simplifier la configuration, j'ai décidé d'utiliser le fournisseur VoIP Zadarma.com avec des appels en ligne gratuits, y compris le support vidéo. Pour les appels vidéo, j'ai utilisé une caméra USB économique.

Détails, ainsi que des instructions étape par étape sous la coupe.

Première partie
Le système est déployé sur l' image de base pour RPI v3_40_int hors de la boîte sans installer quoi que ce soit supplémentaire.

Lier les images de base de MajorDoMo pour la framboise

La webcam que j'ai utilisée est économique (environ 7 ans à Minsk) - Ritmix RVC-015M. A la possibilité de régler manuellement la mise au point.

En train de tester et d'écrire un article, j'ai décidé d'abandonner l'utilisation de mon serveur VoIP (Fresswitch). L'installation de votre serveur VoIP complique le processus de configuration, mais vous donne plus de flexibilité.

Pour un exemple, nous utiliserons l'opérateur Zadarma présenté sur Habr VoIP.

Pour passer des appels, nous avons besoin de deux comptes sur le serveur SIP. Sous l'un, le Raspberry Pi et le client de la console fonctionneront, le second pour le smartphone (ou PC). Le processus d'inscription est intuitif et n'a pas besoin de description.

Je vais répéter brièvement l'installation et la configuration du package Linphone, des informations plus détaillées dans la première partie.

Installation et assemblage de Linphone


Préparation de l'installation:


Arrêtez l'exécution mais les services inutilisés:

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 


Création d'un fichier d'échange swap temporaire
Au cas où, nous créons un fichier d'échange temporaire (avant le redémarrage du système) (espace disque dur), que le système d'exploitation utilise en cas de RAM insuffisante.

Commandes alternatives: vérifier si le fichier d'échange est inclus dans notre installation Raspbian (Debian); si la sortie est vide, cela signifie que le fichier d'échange est manquant sur le système.
Ajoutez un échange 1G et créez un fichier.

Nous définissons les autorisations appropriées pour ce fichier, seul l'utilisateur root peut lire et écrire dans le fichier d'échange.

Nous utilisons l'outil mkswap pour configurer la zone de swap Linux dans le fichier et l'activer:

 sudo swapon --show sudo fallocate -l 1G /swapfile sudo chmod 600 /swapfile sudo mkswap /swapfile sudo swapon /swapfile 

Installation du client SIP de la console Linphonec et de l'utilitaire de gestion Linphonecsh


Pour construire le 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 

Nous allons dans le répertoire personnel et téléchargeons le package Linphone lui-même, le téléchargement a pris environ 20 minutes:

 cd /home/pi/ git clone git://git.linphone.org/linphone-desktop.git -recursive 

Nous allons dans le répertoire créé lors du téléchargement du package, préparons pour l'installation la version sans interface graphique:

 cd linphone-desktop 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 à l'aide de l'attribut –j4 (c'est-à-dire, créez en 4 threads en même temps:

 sudo make -j4 

L'assemblage prend 30 à 40 minutes.

Les fichiers de programme compilés sont apparus dans le répertoire OUTPUT / no-ui / bin. Pour exécuter le programme, allez-y, vérifiez la version du programme:

 cd OUTPUT/no-ui/bin ./linphonec -v 

On obtient le résultat: version: 3.12.0

Surcharger notre framboise.

Lorsque vous redémarrez, tous les services enregistrés au démarrage sont restaurés, le fichier d'échange est supprimé.

Configuration d'un terminal client SIP 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 

Au premier lancement, Linphonec essaie de créer un fichier de base de données et un fichier de paramètres. Toutefois, le démarrage se produit avec des erreurs et le programme s'arrête.

Comment créer un répertoire à partir de l'utilisateur actuel (pi) dans la première partie

 mkdir /home/pi/.local mkdir /home/pi/.local/share mkdir /home/pi/.local/share/linphone 

Parce que dans notre cas, nous n'utilisons pas de serveur VoIP, alors le port standard pour la téléphonie IP 5060 est utilisé.

Nous enregistrerons l'un des comptes en exécutant la commande suivante dans Linphonec:

 register sip:XXXXXX@sip.zadarma.com sip.zadarma.com YYYYYYY 

le format de la commande peut être consulté en tapant help register.

Dans notre cas, XXXXXX est le numéro de compte (login), YYYYY est le mot de passe émis lors de l'inscription. Vérifiez l'inscription:

 status register 

réponse lors de l'inscription réussie: enregistré, identité = sip: XXXXX@sip.zadarma.com durée = 3600

Pour quitter le client, appuyez sur ctrl + c ou sur la commande quit.

Après avoir quitté le répertoire personnel / home / pi, le fichier de configuration du client de la console est apparu: .linphonerc.

Connexion d'un caméscope WEB


Nous nous connectons à la caméra Raspberry.

Vérifier si mon compte est inclus dans le groupe vidéo

 cat /etc/group | grep video 

Réponse: vidéo: x: 44: pi

Voyons si la webcam de votre système a été déterminée:

 sudo ls -l /dev/ | grep video 

Vérifiez si le microphone de la caméra est déterminé:

 arecord -l 

La réponse est:

Liste des périphériques matériels CAPTURE
carte 1: CAMERA [USB2.0 PC CAMERA], périphérique 0: USB Audio [USB Audio]
Sous-appareils: 1/1
Sous-appareil # 0: sous-appareil # 0

Tout est en ordre, il y a aussi un microphone. Nous allons le vérifier dans alsemikser

 alsamixer 

Je précise tout de suite que mon microphone est activé par défaut, il a été identifié comme le principal et est presque complètement tordu, il y a une forte surpuissance.

Appuyez sur F6 (sélectionnez une carte), sélectionnez USB PC Camera, puis F4 - le périphérique de capture (microphone sur la caméra), abaissez son niveau à presque zéro, avec les touches de curseur vers le bas, en même temps, nous vérifierons la capture.

"

Sur le marché des applications pour Android, j'installe l'application Linphone (j'en ai essayé plusieurs, seulement elle a la diffusion vidéo. Sur Windows, tous les clients SIP que j'utilise fonctionnent sans problème. Cela fonctionne aussi sans problème sur mon serveur SIP (freeswitch, si utilisé en local, et pas seulement le réseau, la meilleure option est votre serveur + passerelle pour les appels depuis votre réseau local).

Pour obtenir des instructions sur la configuration de l'application Linphone Android, rendez-vous sur Zadarma.com.
Instructions du fournisseur SIP .

Nous enregistrons le téléphone mobile sur Zadarma, puis, éventuellement, nous configurons la vidéo, l'audio, etc.

Pour les tests, nous exécutons l'utilitaire linphonec avec la fonction d'appel vidéo et de réponse automatique dans RPI (en ajoutant les touches -V -a):

 /home/pi/linphone-desktop/OUTPUT/no-ui/bin/linphonec -V -a 

et passez un appel dans le terminal client en tapant:

 call 576935 

La substitution du serveur VoIP (domaine) est effectuée automatiquement, bien que vous puissiez entièrement composer l'adresse SIP.

En conséquence, nous obtenons:


(qualité plus ou moins bonne pour cet appareil photo à une distance de 2-3 mètres de l'objectif).

Nous pouvons vérifier le mode de réponse automatique en composant le numéro RPI sur le smartphone.

Pour exécuter et contrôler Linphonec en mode démon, l'utilitaire Linphonecsh est utilisé.

Initialement, au démarrage, l'initialisation du client linphonecsh -init est requise. Lorsque cette commande est exécutée, le client de console démarre sans charger le fichier de configuration.
Pour qu'au démarrage le fichier de configuration soit lu, l'appel vidéo et la réponse automatique aux appels entrants seront lancés avec les drapeaux - s - V -a:

 /home/pi/linphone-desktop/OUTPUT/no-ui/bin/linphonecsh init -c /home/pi/.linphonerc -V -a 

Nous pouvons maintenant gérer le client de console à partir de la ligne de commande du système d'exploitation et de MajorDoMo.

La commande pour démarrer un appel vidéo depuis le terminal:

 /home/pi/linphone-desktop/OUTPUT/no-ui/bin/linphonecsh dial XXXXX 

La première étape peut être franchie.

Connecter un bouton et travailler avec GPIO




Le Raspberry Pi possède un certain nombre de ports GPIO (entrée / sortie à usage général) qui s'interfacent. qui contient des entrées et sorties à usage général auxquelles différents actionneurs peuvent être connectés, dans notre cas un simple bouton.

Presque toutes les broches GPIO (il y en a plusieurs réservées) peuvent être réglées sur l'un des deux états: «sortie» (alias OUT ou logique 1) ou «entrée» (IN ou logique 0). La tension de sortie est de 3,3 V.

Pour mon bouton, j'utiliserai les deux broches les plus à droite dans la rangée supérieure. Le connecteur n ° 38 (GPIO20) sera réglé sur «sortie» (OUT) et le connecteur n ° 40 (GPIO21) sur «entrée» (IN).

Les cavaliers BBJ sont utilisés pour se connecter au peigne GPIO. Il est recommandé de se connecter lorsque la framboise est déconnectée du réseau.

Créons deux scripts. Le premier est utilisé pour initialiser les ports GPIO, le second est pour les commandes de contrôle de l'utilitaire Linphonecsh.

Script Bash pour initialiser les ports GPIO:

 sudo nano /usr/local/bin/gpio21.sh 

et collez le contenu

gpio21.sh
#! / bin / bash
# Configurer GPIO20 et définir pour sortir
echo 20> / sys / class / gpio / export
echo out> / sys / class / gpio / gpio20 / direction
echo 1> / sys / class / gpio / gpio20 / value
# Configurer GPIO21 et paramétrer pour entrer
echo 21> / sys / class / gpio / export
écho dans> / sys / class / gpio / gpio21 / direction

Nous rendons le fichier exécutable:

 sudo chmod +x /usr/local/bin/gpio21.sh 

Le deuxième script de numérotation au clic d'un bouton, j'ai décidé de le faire en PHP, pour une intégration ultérieure avec le système domotique MajorDoMo. Au toucher d'un bouton, l'état du port 21 change, le système lit périodiquement la valeur du port 21 et, s'il est modifié, envoie une commande de numérotation à Linphonecsh.

 sudo nano /usr/local/bin/dial.php 

et collez le contenu:

dial.php
<? php
$ old_state = 0;
tandis que (vrai)
{
$ state = file_get_contents ('/ sys / class / gpio / gpio21 / value');
if ($ state! = $ old_state)
{
if ($ state == 1)
{
// Faire un nouvel appel
écho «faire»;
exec ("sudo -u pi / home / pi / linphone-desktop / OUTPUT / no-ui / bin / linphonecsh dial sip: XXXXX@sip.zadarma.com");
usleep (200000);
}
$ old_state = $ state;
}
usleep (20000);
}
?>

Nous rendons le fichier exécutable.

Ensuite, nous écrivons trois lignes à la fin du fichier de démarrage:

  1. Script d'initialisation du port GPIO
  2. lancement de l'utilitaire de gestion en mode réponse automatique et prise en charge du transfert vidéo
  3. Composition de scripts PHP.

 crontab -e 


 @reboot sudo /usr/local/bin/gpio21.sh @reboot sudo -u pi /home/pi/linphone-desktop/OUTPUT/no-ui/bin/linphonecsh init -c /home/pi/.linphonerc -V -a @reboot sudo php /usr/local/bin/dial.php 

Surcharger notre Raspberry, sudo reboot. Après redémarrage, notre visiophone est prêt à l'emploi.

De plus, si vous le souhaitez et si possible - intégration dans un système domotique, connexion à votre serveur SIP, etc.

Charge RPI pendant l'attente et l'appel vidéo
Charge RPI en attendant et en effectuant un appel vidéo:





Une petite digression comme conclusion


Au départ, je prévoyais de faire un appareil pour communiquer avec une personne après une maladie qui ne peut pas utiliser le téléphone seule, après cela le besoin a disparu, mais j'ai décidé de terminer le travail, et j'ai vu la possibilité d'utiliser l'un des composants de la domotique à d'autres fins.

Lors de la création, je souhaite que les critères suivants soient remplis, ou au moins deux sur trois:

  1. Disponibilité (la possibilité d'acheter des composants ici et maintenant (dans ma région).
  2. Budget (faible coût de l'appareil à la sortie).
  3. Simplicité d'exécution, ou au moins l'exhaustivité des instructions étape par étape (La capacité pour une personne qui avait besoin de le répéter, sans connaissances particulières et sans temps, de fabriquer un appareil et de commencer à l'utiliser)

Source: https://habr.com/ru/post/fr478970/


All Articles