En esta parte, creamos un dispositivo VoIP Raspberry Pi para hacer videollamadas utilizando el protocolo SIP.
La tarea inicial seguía siendo la misma: hacer una llamada por influencia externa (presionar un botón). Pero la implementación de la idea ha cambiado un poco. Como en la parte anterior, usaremos el cliente SIP del terminal Linphonec, pero para simplificar la configuración, decidí usar el proveedor de VoIP Zadarma.com con llamadas gratuitas en la red, incluido soporte de video. Para las videollamadas, utilicé una cámara USB económica.
Detalles, así como instrucciones paso a paso debajo del corte.
Primera parteEl sistema se implementa en la
imagen base para RPI v3_40_int fuera de la caja sin instalar nada adicional.
Enlace imágenes básicas de MajorDoMo para RaspberryLa cámara web que utilicé es económica (aproximadamente 7 años en Minsk) - Ritmix RVC-015M. Tiene la capacidad de ajustar manualmente el enfoque.
En el proceso de prueba y para escribir una publicación, decidí abandonar el uso de mi servidor VoIP (Fresswitch). Instalar su servidor VoIP complica el proceso de configuración, pero le brinda más flexibilidad.
Por ejemplo, utilizaremos el operador que
Zadarma presentó en Habr VoIP.
Para realizar llamadas, necesitamos dos cuentas en el servidor SIP. Debajo de uno, el Raspberry Pi y el cliente de la consola funcionarán, el segundo para el teléfono inteligente (o PC). El proceso de registro es intuitivo y no necesita una descripción.
Repetiré brevemente la instalación y configuración del paquete Linphone, información más detallada en la primera parte.
Instalación y montaje de Linphone
Preparación para la instalación:
Dejar de ejecutar pero servicios no utilizados:
Detener serviciossudo 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
Crear un archivo de intercambio de intercambio temporalPor si acaso, creamos un archivo de intercambio temporal (antes de reiniciar el sistema) (espacio en el disco duro), que el sistema operativo utiliza en caso de RAM insuficiente.
Comandos alternativos: verificar si el archivo de intercambio está incluido en nuestra instalación de Raspbian (Debian); si la salida está vacía, esto significa que falta el archivo de intercambio en el sistema.
Agregue 1G swap y cree un archivo.
Establecemos los permisos correctos para este archivo, solo el usuario root puede leer y escribir en el archivo de página.
Usamos la herramienta mkswap para configurar el área de intercambio de Linux en el archivo y activarlo:
sudo swapon --show sudo fallocate -l 1G /swapfile sudo chmod 600 /swapfile sudo mkswap /swapfile sudo swapon /swapfile
Instalación del cliente SIP de la consola Linphonec y la utilidad de administración Linphonecsh
Para construir el paquete desde las fuentes, instalamos dependencias adicionales:
sudo apt-get install cmake automake autoconf libtool intltool yasm libasound2-dev libpulse-dev libv4l-dev nasm git libglew-dev
Vamos al directorio de inicio y descargamos el paquete Linphone en sí, la descarga tardó unos 20 minutos:
cd /home/pi/ git clone git://git.linphone.org/linphone-desktop.git -recursive
Vamos al directorio creado al descargar el paquete, preparamos la instalación de la versión sin una interfaz gráfica:
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
Construya utilizando el atributo –j4 (es decir, compile en 4 hilos al mismo tiempo:
sudo make -j4
El montaje demora entre 30 y 40 minutos.
Los archivos de programa compilados aparecieron en el directorio OUTPUT / no-ui / bin. Para ejecutar el programa, vaya a él, verifique la versión del programa:
cd OUTPUT/no-ui/bin ./linphonec -v
Obtenemos el resultado: versión: 3.12.0Sobrecargando nuestra frambuesa.
Cuando reinicia, todos los servicios registrados en el inicio se restauran, el archivo de página se elimina.
Configuración de un cliente SIP de terminal Linphonec
Ejecute Linphonec en modo de respuesta automática desde el usuario pi actual:
/home/pi/linphone-desktop/OUTPUT/no-ui/bin/linphonec
En el primer lanzamiento, Linphonec intenta crear un archivo de base de datos y un archivo de configuración. Sin embargo, el inicio ocurre con errores y el programa se detiene.
Cómo crear un directorio desde el usuario actual (pi) en la primera parte
mkdir /home/pi/.local mkdir /home/pi/.local/share mkdir /home/pi/.local/share/linphone
Porque en nuestro caso no usamos un servidor VoIP, entonces se usa el puerto estándar para telefonía IP 5060.
Registraremos una de las cuentas ejecutando el siguiente comando en Linphonec:
register sip:XXXXXX@sip.zadarma.com sip.zadarma.com YYYYYYY
El formato del comando se puede ver escribiendo help register.
En nuestro caso, XXXXXX es el número de cuenta (inicio de sesión), AAAAA es la contraseña emitida durante el registro. Verifique el registro:
status register
respuesta tras el registro exitoso:
registrado, identidad = sip: XXXXX@sip.zadarma.com duración = 3600El cliente se cierra presionando ctrl + c o el comando salir.
Después de salir en el directorio de inicio / home / pi, apareció el archivo de configuración del cliente de la consola: .linphonerc.
Conexión de una videocámara WEB
Nos conectamos a la cámara Raspberry.
Comprobar si mi cuenta está incluida en el grupo de videos
cat /etc/group | grep video
Respuesta:
video: x: 44: piVeamos si se ha determinado la cámara web en su sistema:
sudo ls -l /dev/ | grep video
Compruebe si se determina el micrófono de la cámara:
arecord -l
La respuesta es:
Lista de dispositivos de hardware CAPTURE
tarjeta 1: CÁMARA [USB2.0 PC CAMERA], dispositivo 0: USB Audio [USB Audio]
Subdispositivos: 1/1
Subdispositivo # 0: subdispositivo # 0Todo está en orden, también hay un micrófono. Lo comprobaremos en alsemikser
alsamixer
Aclararé de inmediato que mi micrófono está encendido de forma predeterminada, se ha identificado como el principal y está casi completamente retorcido, hay una fuerte sobrecarga.
Presione F6 (seleccione una tarjeta), seleccione USB PC Camera, luego F4 - el dispositivo de captura (micrófono en la cámara), baje su nivel a casi cero, con las teclas del cursor hacia abajo, al mismo tiempo verificaremos Capture.

"
En el mercado de aplicaciones para Android, instalo la aplicación Linphone (probé varias, solo que obtuvo transmisión de video. En Windows, todos los clientes SIP que uso funcionan sin problemas. También funciona sin problemas en mi servidor SIP (interruptor libre, si se usa en local, y no solo la red, la mejor opción es su servidor + puerta de enlace para llamadas desde su red local).
Para obtener instrucciones sobre cómo configurar la aplicación de Android Linphone, vaya a Zadarma.com.
Instrucciones del proveedor de SIP .
Registramos el teléfono móvil en Zadarma, luego, opcionalmente, configuramos video, audio, etc.
Para las pruebas, ejecutamos la utilidad linphonec en el RPI con la función de videollamada y respuesta automática (agregando las teclas -V -a):
/home/pi/linphone-desktop/OUTPUT/no-ui/bin/linphonec -V -a
y hacer una llamada en el cliente terminal escribiendo:
call 576935
La sustitución del servidor VoIP (dominio) se realiza automáticamente, aunque puede marcar completamente la dirección SIP.
Como resultado, obtenemos:

(Más o menos buena calidad para esta cámara a una distancia de 2-3 metros del objetivo).
Podemos verificar el modo de respuesta automática marcando el número RPI en el teléfono inteligente.
Para ejecutar y controlar Linphonec en modo demonio, se utiliza la utilidad Linphonecsh.
Inicialmente, al inicio, se requiere la inicialización del cliente linphonecsh -init. Cuando se ejecuta este comando, el cliente de la consola se inicia sin cargar el archivo de configuración.
Para que al inicio se lea el archivo de configuración, la videollamada y la respuesta automática a las llamadas entrantes se iniciarán con los indicadores - s - V -a:
/home/pi/linphone-desktop/OUTPUT/no-ui/bin/linphonecsh init -c /home/pi/.linphonerc -V -a
Ahora podemos administrar el cliente de la consola desde la línea de comandos del sistema operativo y MajorDoMo.
El comando para iniciar una videollamada desde la terminal:
/home/pi/linphone-desktop/OUTPUT/no-ui/bin/linphonecsh dial XXXXX
Se puede dar el primer paso.
Conectar un botón y trabajar con GPIO

La Raspberry Pi tiene una serie de puertos GPIO (entrada / salida de uso general) que interactúan. que contiene entradas y salidas de uso general a las que se pueden conectar varios actuadores, en nuestro caso un simple botón.
Casi cualquier pin GPIO (hay varios reservados) se puede configurar en uno de dos estados: "salida" (también conocido como OUT o 1 lógico) o "input" (IN o 0 lógico). El voltaje de salida es 3.3V.
Para mi botón, usaré los dos pines más a la derecha en la fila superior. El conector n. ° 38 (GPIO20) se establecerá en "salida" (OUT), y el conector n. ° 40 (GPIO21) en "entrada" (IN).
Los puentes BBJ se utilizan para conectarse al peine GPIO. Se recomienda conectarse cuando la frambuesa se desconecta de la red.
Vamos a crear dos guiones. El primero se usa para inicializar los puertos GPIO, el segundo es para los comandos de control de la utilidad Linphonecsh.
Script Bash para inicializar puertos GPIO:
sudo nano /usr/local/bin/gpio21.sh
y pegar el contenido
gpio21.sh#! / bin / bash
# Configurar GPIO20 y configurar como salida
echo 20> / sys / class / gpio / export
echo out> / sys / class / gpio / gpio20 / direction
echo 1> / sys / class / gpio / gpio20 / value
# Configurar GPIO21 y configurar como entrada
echo 21> / sys / class / gpio / export
echo en> / sys / class / gpio / gpio21 / direction
Hacemos que el archivo sea ejecutable:
sudo chmod +x /usr/local/bin/gpio21.sh
El segundo script para marcar con solo hacer clic en un botón, decidí hacerlo en PHP, para su posterior integración con el sistema de automatización del hogar MajorDoMo. Con solo tocar un botón, el estado del puerto 21 cambia, el sistema lee periódicamente el valor del puerto 21 y, si se cambia, envía un comando de marcación a Linphonecsh.
sudo nano /usr/local/bin/dial.php
y pegue el contenido:
dial.php<? php
$ old_state = 0;
mientras (cierto)
{
$ state = file_get_contents ('/ sys / class / gpio / gpio21 / value');
if ($ state! = $ old_state)
{
if ($ estado == 1)
{
// Hacer una nueva llamada
echo "hacer";
exec ("sudo -u pi / home / pi / linphone-desktop / OUTPUT / no-ui / bin / linphonecsh dial sip: XXXXX@sip.zadarma.com");
usleep (200000);
}
$ old_state = $ estado;
}
usleep (20000);
}
?>
Hacemos que el archivo sea ejecutable.
A continuación, escribimos tres líneas al final del archivo de inicio:
- Script de inicialización de puerto GPIO
- lanzamiento de la utilidad de administración en modo de respuesta automática y soporte de transferencia de video
- Marcación de script 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
Sobrecargando nuestra Frambuesa, reinicio de sudo. Después de reiniciar, nuestro videoteléfono está listo para usar.
Además, si lo desea y es posible: integración en un sistema de automatización del hogar, conexión a su servidor SIP, etc.
Carga de RPI mientras espera y realiza una videollamadaCarga de RPI mientras espera y realiza una videollamada:


Una pequeña digresión como conclusión
Inicialmente, planeé hacer un dispositivo para comunicarme con una persona después de una enfermedad que no puede usar el teléfono por sí sola, después de esto desapareció la necesidad, pero decidí terminar el trabajo y vi la posibilidad de usar uno de los componentes de la automatización del hogar para otros fines.
Al crear, me gustaría que se cumplan los siguientes criterios, o al menos dos de cada tres:
- Disponibilidad (la capacidad de comprar componentes aquí y ahora (en mi área).
- Presupuesto (bajo costo del dispositivo a la salida).
- Simplicidad de ejecución, o al menos la integridad de una instrucción paso a paso (La capacidad de una persona que necesitaba repetirlo, sin conocimientos especiales y costos de tiempo, para hacer un dispositivo y comenzar a usarlo).