Hace algún tiempo, tuve la necesidad de comunicarme con una persona después de una enfermedad que no podía usar el teléfono físicamente. Se necesitaba un dispositivo de llamada simple, se realizó una llamada de voz con solo tocar un botón. Sin embargo, la necesidad desapareció, habiendo visitado el hospital él mismo, mirando a los pacientes, se pensó que tal solución podría ser útil.
Ahora veo el uso personal de este dispositivo como un timbre SIP.
Quizás con pequeñas alteraciones, la combinación de telefonía VoIP con un sistema de automatización del hogar. Como opciones de uso: timbre SIP, intercomunicador, sistema de comunicación por voz (personal del cliente, director-secretario), etc.

Toda la decisión se toma sobre software libre y de código abierto: sistema operativo - Raspbian Stretch (Debian 9), sistema de automatización del hogar - MajorDoMo, servidor VoIP - Freeswitch, cliente de software de telefonía IP con la capacidad de trabajar en modo terminal Linphonec.
En esta parte, debajo del corte, hablaremos principalmente sobre la instalación del cliente SIP de la consola Linphonec.
Necesitaremos:
- Raspberry Pi - Computadora de placa única (tengo un modelo Raspberry Pi 3B)
- Tarjeta de memoria Micro SD de al menos 16 GB, cargador USB, carcasa.
- Tarjeta de sonido USB (una de las más baratas, Gembird utilizada), micrófono, altavoz (auriculares).
- Botón y un par de puentes BBJ para pines GPIO.
1.
Primer paso: instalar una imagen de MajorDoMo para RPIActualmente, la versión actual de la imagen para Raspberry Pi es v. 3.40 Aquí hay una breve descripción de las imágenes y los cambios de MajorDoMo:
Imágenes básicas de MajorDoMo para Raspberry PiDespués de la instalación y cuando se inicia el sistema, conectando los altavoces al conector 3.5, escucharemos los mensajes del sistema y la dirección IP de Raspberry.
El nombre de usuario predeterminado es: pi contraseña: frambuesa.
2. Instale FREESWITCH,
Instalación del servidor FRESWITCH VoIP para RaspberryDespués de eso, procedemos a la instalación de los componentes necesarios. Un paso opcional, pero posiblemente útil más tarde.
Instalar RPi-Monitor
Instale una utilidad de monitor RPI pequeña pero útil que muestra los recursos de nuestro Raspberry PI.
RPi-Monitor es un software de monitoreo de placa Raspberry Pi basado en la web. Esta herramienta puede ser útil para controlar el uso de espacio en disco, carga de CPU, memoria y tráfico de red, temperatura. RPI-Monitor es bastante simple de instalar y muestra visualmente información sobre el sistema.
En primer lugar, le daré un enlace a la fuente:
RPi-Monitor .
Instale la clave pública RPi-Monitor y agréguela a los repositorios de confianza:
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
Luego, actualice el sistema e instale el monitor RPI:
sudo apt-get update sudo apt-get install rpimonitor
Abra la IP de su computadora en el navegador con el puerto: 8888, en el que se ejecuta el monitor, y vea el estado de RPI.

Instalar una tarjeta de audio USB y configurar el sonido en el sistema operativo Raspberry Pi
Desafortunadamente, nuestra mini computadora Raspberry no tiene su propio micrófono y entrada incorporados. Por lo tanto, para conectar un micrófono, deberá usar una tarjeta de sonido USB externa. Conectamos la tarjeta al puerto USB de Raspberry y ejecutamos el comando (que muestra los dispositivos de sonido en el sistema):
cat /proc/asound/cards
Vemos la respuesta con dos tarjetas, bcm2835 - incorporado, externo, definido como dispositivo de audio USB:
0 [ALSA]: bcm2835_alsa - bcm2835 ALSA
bcm2835 ALSA
1 [Dispositivo]: USB-Audio - Dispositivo de audio USB
Dispositivo de audio USB GeneralPlus en usb-3f980000.usb-1.4, velocidad máximaEl sistema operativo ve nuestra tarjeta de sonido, pero aún no está registrada en el sistema.
Crea un archivo:
sudo nano /etc/modprobe.d/alsa-base.conf
Escribimos (pegamos) la siguiente línea:
opciones snd-usb-audio index = 1Guardar (en el editor Ctrl + X).
Crea otro archivo:
sudo nano /etc/asound.conf
Añadir contenido:
contenido del archivo pcm.!default { type plug slave { pcm "hw:1,0" } } ctl.!default { type hw card 1 }
Editamos el siguiente archivo de configuración:
sudo nano /usr/share/alsa/alsa.conf
Cambie la tarjeta de sonido predeterminada de 0 a 1 (tarjeta USB). Obviamente, 0 por defecto es la salida de sonido incorporada de la minicomputadora, configure los siguientes parámetros en 2 líneas:
defaults.ctl.card 1 defaults.pcm.card 1
Los cambios surtirán efecto, después de reiniciar, sobrecargamos escribiendo en la consola:
sudo reboot
Conectamos un micrófono y altavoces (auriculares) a una tarjeta de audio externa. Después de reiniciar, ejecute la utilidad de configuración de sonido Alsamixer.
alsamixer
Vemos nuestros dispositivos que definimos en el sistema por defecto:

Use las teclas del cursor hacia la izquierda y hacia la derecha, seleccione el dispositivo deseado, arriba y abajo, ajuste, preste atención a los símbolos debajo del dispositivo seleccionado:
xOOx: el dispositivo está encendido, xMMx: el dispositivo está apagado. Como puede ver en la captura de pantalla, mi micrófono estaba apagado por defecto en el sistema.
Para encender / apagar el dispositivo, debe presionar
M en el teclado.
Salga de alsamixer (salga ctr + C).
Comprobando el sonido en el sistema. Los altavoces y un micrófono están conectados a las salidas USB correspondientes de la tarjeta de sonido.
Le damos el comando:
arecord -D plughw:1,0 -f cd /home/pi/test_record.wav
Con este comando, se graba un archivo de sonido a través del micrófono en el directorio apropiado (en nuestro caso, la pi de inicio del usuario). Dejar de grabar
Ctrl + c .
Verifique el archivo grabado:
aplay /home/pi/test_record.wav
Realizaremos un mejor control más tarde.
Instalación del cliente de VoIP de la consola Linphonec
No hay tantos programas que puedan funcionar en el sistema operativo sin una interfaz gráfica; me decidí por el paquete Linphone.
El paquete es bastante grande, tiene muchas características potenciales, pero hasta ahora solo necesitamos una pequeña utilidad Linphonec que pueda funcionar en el terminal y tenga la función de respuesta automática (respuesta automática).
Para ella, se realizarán las siguientes acciones.
Observo que cuando instalo desde el repositorio Raspbian, se instala una versión 3.6.1 bastante antigua, que no funciona correctamente con el sistema de sonido ALSA, tuve una pérdida de sonido, el programa se bloqueó varias veces.
Por lo tanto, usaré una versión más actual.
Para el autoensamblaje del 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
Vaya al directorio de inicio:
cd /home/pi/
Descargue el paquete Linphone en sí, la descarga tardó unos 20 minutos.
git clone git://git.linphone.org/linphone-desktop.git --recursive
No pude compilar y compilar el paquete Linphone desde la primera o incluso la segunda vez. Por lo tanto, daré mi algoritmo de acción.
Paramos casi todos los servicios actualmente en ejecución, pero actualmente no utilizados, utilizando el sistema de gestión de servicios systemctl.
Hubo errores durante el ensamblaje, nuestra mini PC simplemente no tiene suficientes recursos. Libéralos para la instalación.
Detener servicios 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
Por si acaso, podemos hacer un archivo de intercambio temporal (antes de reiniciar) (espacio en el disco duro), que el sistema operativo utiliza en caso de RAM insuficiente.
Para verificar si el archivo de intercambio está incluido en nuestra instalación Raspbian (Debian) escribiendo:
sudo swapon --show
La salida está vacía, lo que significa que el sistema no tiene un archivo de intercambio.
Agregue 1G swap y cree un archivo:
sudo fallocate -l 1G /swapfile
Solo el usuario root puede leer y escribir en el archivo de página, por lo que establecemos los permisos correctos:
sudo chmod 600 /swapfile
Utilizamos la herramienta mkswap para configurar el área de intercambio de Linux en el archivo y activarlo escribiendo los siguientes comandos:
sudo mkswap /swapfile sudo swapon /swapfile
Vaya al directorio creado cuando descargue el paquete:
cd linphone-desktop
Preparamos para la instalación de una versión sin interfaz gráfica:
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
Compila utilizando el atributo –j4 (es decir, compila 4 hilos al mismo tiempo).
sudo make -j4
Al instalar, podemos ver el estado de nuestra computadora en RPI-Monitor:

El tiempo de construcción para mí fue de aproximadamente 30-40 minutos.
Los archivos de programa compilados aparecieron en el directorio OUTPUT / no-ui / bin. Para ejecutar el programa, veamos:
cd OUTPUT/no-ui/bin
Verifique la versión del programa:
./linphonec -v
Obtenemos el resultado: versión: 3.12.0
Sobrecargando nuestra Frambuesa
Al reiniciar, el archivo de intercambio desaparece, todos los servicios en ejecución registrados en el inicio se restauran.
Una pequeña configuración inicial de Freeswitch.
El servidor FREESWITCH se instala por defecto en el directorio / usr / local / freeswitch /. La carpeta conf contiene archivos de configuración. De manera predeterminada, se instala la configuración de prueba de vainilla, que en su mayor parte sirve para familiarizarse con la posibilidad de un servidor VoIP y contiene una gran cantidad de ejemplos que son claramente redundantes para uso doméstico. Primero, veamos la configuración lista para usar del servidor VoIP.
Edite el archivo de configuración vars.xml
sudo nano /usr/local/freeswitch/conf/vars.xml
En primer lugar, cambie la contraseña predeterminada 1234 a un valor diferente, digamos 1111. Si no hace esto, antes de cada llamada se establece una pausa antes de marcar 10 segundos.
Por defecto, como escribí en un artículo anterior, tenemos 20 números de suscriptor 1001-1020. Dialplan también se instala por defecto.
Por alguna razón, en estos momentos, en comparación con hace seis meses, cuando el módulo mod_xml_rpc estaba encendido, el servidor se bloqueaba constantemente.
Dialplan FreeSWITCH hace un uso extensivo de expresiones regulares. El plan de marcado predeterminado es responsable de procesar las llamadas, la siguiente sección del archivo Local_Extension es responsable de enviar a nuestros números locales. Comente algunas líneas:
sudo nano /usr/local/freeswitch/conf/dialplan/defaults.xml
Edición de diálogo, inserte un símbolo de comentario en esta sección:
Edición de diálogo de números 1001-1019 <extension name="Local_Extension"> <condition field="destination_number" expression="^(10[01][0-9])$"> <action application="export" data="dialed_extension=$1"/>
Una pequeña digresión, en mi opinión, a pesar de la capacidad de trabajo de FS, después de varios cambios, es mejor rehacer los archivos de configuración de FS para usted, incluyendo suscripción, plan de marcado, etc., pero no puede incluir todo en un artículo, por lo que recurrimos a nuestro cliente terminal.Configure e inicie el cliente 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 -a
En el primer lanzamiento, Linphonec intenta crear un archivo de base de datos y un archivo de configuración. Sin embargo, el lanzamiento es un error.
errores al iniciar 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
Inicialmente, trataremos con el último error, abriendo el archivo de la base de datos.
El archivo de base de datos se crea en el directorio de inicio a lo largo de la siguiente ruta: /home/pi/.local/share/linphone
Un archivo (o directorio) de Linux se considera oculto si su nombre comienza con un punto ".". Por ejemplo, ".myfile". Por lo general, las aplicaciones utilizan dichos archivos para almacenar configuraciones, configuraciones y otra información que debe ocultarse al usuario.
Crear un directorio desde el usuario actual (pi)
mkdir /home/pi/.local mkdir /home/pi/.local/share mkdir /home/pi/.local/share/linphone
Iniciamos el programa, el programa comenzó, pero da un error:
Error de apertura de puerto 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
Descubrimos el primer problema de crear una base de datos; en el lanzamiento inicial, el programa generó un archivo de base de datos.
El error asociado con el sistema de sonido Pulseaudio - no interfiere con el funcionamiento del programa, planeo usar ALSA, si es necesario, siempre se puede instalar un servidor de sonido antes.
El segundo: los puertos 5060 están ocupados. Estos puertos son comúnmente utilizados por las aplicaciones SIP. Podemos salir del programa y dar el comando:
sudo netstat -tulpn | grep LISTEN
Veremos que el puerto 5060 usa nuestro servidor VoIP FREESWITCH. Bueno, usaremos puertos libres.
Volvemos al programa linphonec. Y haz una pequeña configuración.
En primer lugar, cambie el puerto para Linfon, luego indique el registro en el servidor VoIP, verifique el estado de registro y mire la lista de tarjetas de sonido, la tarjeta utilizada y configúrela en un USB externo (con el índice en el programa 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

En el equipo de registro, utilizamos el siguiente formato: ID de usuario Sip: de forma predeterminada, tenemos 20 suscriptores con los números 1001-1019. Estos números son los nombres de usuario de los suscriptores: inicio de sesión del suscriptor @ [nombre de dominio] - nombre de dominio - dirección IP de nuestra Raspberry. Sip proxy: coincide con la dirección IP de RPI y, al final, la contraseña del usuario que configuramos recientemente 1111.
Salga del programa (Ctrl + x), la configuración no siempre se aplica sobre la marcha. Después de salir en el directorio de inicio / home / pi, apareció el archivo de configuración del cliente de la consola: .linphonerc.
Ya podemos hacer cambios editando el archivo de configuración del cliente SIP.
En una nueva consola de lanzamiento de cliente SIP.
Paralelamente a la sesión SSH actual, abra una nueva, inicie sesión con su nombre de usuario y contraseña.
Comenzamos alsamixer. En una sesión, tenemos Linphonec, en la segunda, una utilidad de ajuste de sonido.
Realizamos la configuración de la llamada desde el cliente SIP en un teléfono inteligente o PC (como se describe en el artículo sobre la instalación de FREESWITCH) cambiando la contraseña predeterminada a la suya y marcando un número, en nuestro caso 1001. Podemos ir al portal freswitch en IP_Raspberry: 8080, ver el registro de suscriptores, estado llamada, etc.

Usando alsamixer, ajustamos el sonido. Los cambios de sonido se aplican sobre la marcha, sin salir de los programas.
Desafortunadamente, debido al uso de una tarjeta de audio barata, no pude lograr un sonido aceptable, se escuchó un eco en los altavoces. Puede minimizarse un poco, pero eliminarse por completo; no tuve éxito.
Por lo tanto, dado que no fue posible eliminarlo de una manera, lo eliminamos de otra.
Cierre Linphonec, edite el archivo de configuración:
sudo nano /home/pi/.linphonerc
En la sección de sonido, traemos las últimas tres líneas a este formulario:
Sección de sonido 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 esta manera, forzamos el timbre y el dispositivo de salida de sonido para que funcionen en el conector de frambuesa 3.5 incorporado, y el dispositivo de grabación, el micrófono para trabajar a través de una tarjeta de sonido externa, desapareció el eco.
Cambia los altavoces al conector de la frambuesa.
Tenemos en cuenta el siguiente momento: cuando se carga y, en algunos casos, el sistema doméstico inteligente reproduce sus mensajes del sistema a través de esta salida de audio.
Apágalos. Pasamos IP_Rasberry a la página principal, abriendo el sistema de automatización del hogar MajorDoMo.
Ingresamos al panel de control - el objeto Computadora (expande el dispositivo) - ThisComputer en la pestaña Propiedades y establecemos los valores:
ThisComputer.minMsgLevel 100 ThisComputer.volumeLevel 0

Agregue una entrada a cron (un programa demonio diseñado para realizar tareas en un momento específico o en ciertos intervalos. La utilidad crontab se usa para editar tareas):
crontab –e
Noto que estamos haciendo esto desde debajo del usuario pi.
Inserte la línea al final:
@reboot /home/pi/linphone-desktop/OUTPUT/no-ui/bin/linphonec –a
Al reiniciar, encender la computadora, esta línea inicia el programa Linphonec en modo de respuesta automática.
Volver a MajorDoMo:
Vayamos a la página principal, en la sección de servicio:
En el menú de esta sección, se crean botones para reiniciar (apagar) la computadora.
El hecho es que para guardar los recursos de la tarjeta de memoria SD, los cambios se registran en el sistema de "casa inteligente" después de un cierto tiempo (15 minutos). Por lo tanto, si necesita sobrecargar las frambuesas, entonces es mejor hacerlo bien. Reiniciamos el sistema.

Después de reiniciar, vaya a la página principal de MajorDoMo, vaya al panel de control y, como en el último artículo, realizamos una llamada desde la consola con el siguiente formato:
GetURL("http://freeswitch:works@192.168.1.103:8080/webapi/originate?user/1001%201003%20XML%20default")
Siguiendo el comando, Linphonec levanta automáticamente el teléfono. En el altavoz RPI, se está reproduciendo un archivo de sonido, se está enviando una llamada al segundo softphone (PC / teléfono inteligente). Después de levantar el auricular (presionando el botón de respuesta en el programa), se establece la conexión.

Sobre esto, termino esta parte. Trataré de describir un poco más tarde sobre el botón en sí usando GPIO y configurando llamadas fuera de mi red local.