Há algum tempo, eu precisava me comunicar com uma pessoa após uma doença que não podia usar fisicamente o telefone. Era necessário um dispositivo de chamada simples, uma chamada de voz com o toque de um botão. A necessidade desapareceu, no entanto, tendo visitado o próprio hospital, olhando os pacientes, pensava-se que essa solução poderia ser útil.
Agora vejo o uso pessoal deste dispositivo como uma campainha SIP.
Talvez com pequenas alterações, a combinação de telefonia VoIP com um sistema de automação residencial. Como opções de uso - campainha SIP, interfone, sistema de comunicação de voz (pessoal do cliente, diretor-secretário), etc.

Toda a solução é feita em software livre e de código aberto: sistema operacional - Raspbian Stretch (Debian 9), sistema de automação residencial - MajorDoMo, servidor VoIP - Freeswitch, software cliente de telefonia IP com a capacidade de trabalhar no modo terminal Linphonec.
Nesta parte, sob o corte, falaremos principalmente sobre a instalação do cliente SIP do console Linphonec.
Vamos precisar de:
- Raspberry Pi - Computador de placa única (eu tenho um modelo Raspberry Pi 3B)
- Cartão de memória Micro SD de pelo menos 16 GB, carregador USB, compartimento.
- Placa de som USB (uma das mais baratas, Gembird usado), microfone, alto-falante (fones de ouvido).
- Botão e um par de jumpers BBJ para pinos GPIO.
1.
Primeiro passo - Instalando uma imagem MajorDoMo para RPIAtualmente, a versão atual da imagem para o Raspberry Pi é v. 3,40 Aqui está uma breve descrição das imagens e alterações do MajorDoMo:
Imagens básicas do MajorDoMo para Raspberry PiApós a instalação e quando o sistema inicializar, conectar os alto-falantes ao conector 3.5 - ouviremos as mensagens do sistema e o endereço IP do Raspberry.
O nome de usuário padrão é: pi senha: raspberry.
2. Instale o FREESWITCH,
Instalando o servidor VoIP FRESWITCH para RaspberryDepois disso, procedemos à instalação dos componentes necessários. Uma etapa útil opcional, mas possivelmente posterior.
Instale o RPi-Monitor
Instale um utilitário de monitor RPI pequeno, mas útil, que mostre os recursos do nosso Raspberry PI.
O RPi-Monitor é um software de monitoramento de placas Raspberry Pi baseado na Web. Esta ferramenta pode ser útil para controlar o uso de espaço em disco, carga da CPU, memória e tráfego de rede, temperatura. O RPI-Monitor é bastante simples de instalar e exibe visualmente informações sobre o sistema.
Primeiro, darei um link para a fonte:
RPi-Monitor .
Instale a chave pública do RPi-Monitor e adicione-a aos repositórios confiáveis:
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
Em seguida, atualize o sistema e instale o próprio monitor RPI:
sudo apt-get update sudo apt-get install rpimonitor
Abra o IP do seu computador no navegador com a porta: 8888, na qual o monitor está sendo executado, e veja o status do RPI.

Instalando uma placa de áudio USB e configurando som no Raspberry Pi OS
Infelizmente, o nosso mini computador Raspberry não possui seu próprio microfone embutido e entrada para isso. Portanto, para conectar um microfone, você precisará usar uma placa de som USB externa. Conectamos o cartão à porta USB Raspberry e executamos o comando (que mostra os dispositivos de som no sistema):
cat /proc/asound/cards
Vemos a resposta com dois cartões, bcm2835 - interno, externo definido como dispositivo de áudio USB:
0 [ALSA]: bcm2835_alsa - bcm2835 ALSA
bcm2835 ALSA
1 [Dispositivo]: Áudio USB - Dispositivo de áudio USB
GeneralPlus USB Audio Device em usb-3f980000.usb-1.4, velocidade máximaO sistema operacional vê nossa placa de som, mas ainda não está registrada no sistema.
Crie um arquivo:
sudo nano /etc/modprobe.d/alsa-base.conf
Escrevemos (colamos) a seguinte linha:
opções snd-usb-audio index = 1Salvar (no editor Ctrl + X).
Crie outro arquivo:
sudo nano /etc/asound.conf
Adicionar conteúdo:
conteúdo do arquivo pcm.!default { type plug slave { pcm "hw:1,0" } } ctl.!default { type hw card 1 }
Editamos o seguinte arquivo de configuração:
sudo nano /usr/share/alsa/alsa.conf
Altere a placa de som padrão de 0 para 1 (placa USB). Obviamente, 0 por padrão é a saída de som interna do minicomputador, defina os seguintes parâmetros em 2 linhas:
defaults.ctl.card 1 defaults.pcm.card 1
As alterações entrarão em vigor, após a reinicialização, sobrecarregaremos digitando no console:
sudo reboot
Conectamos um microfone e alto-falantes (fones de ouvido) a uma placa de áudio externa. Após a reinicialização, execute o utilitário de configuração de som Alsamixer.
alsamixer
Vemos nossos dispositivos que definimos no sistema por padrão:

Use as teclas do cursor para a esquerda e para a direita, selecione o dispositivo desejado, para cima e para baixo, ajuste, preste atenção aos símbolos no dispositivo selecionado:
xOOx - o dispositivo está ligado, xMMx - o dispositivo está desligado. Como você pode ver na captura de tela, meu microfone foi desligado por padrão no sistema.
Para ligar / desligar o dispositivo, você precisa pressionar
M no teclado.
Saia do samsixer (saia ctr + C).
Verificando o som no sistema. Alto-falantes e microfone estão conectados às saídas USB correspondentes da placa de som.
Nós damos o comando:
arecord -D plughw:1,0 -f cd /home/pi/test_record.wav
Com este comando, um arquivo de som é gravado através do microfone no diretório apropriado (no nosso caso, o pi inicial do usuário). Pare de gravar
Ctrl + c .
Verifique o arquivo gravado:
aplay /home/pi/test_record.wav
Faremos uma verificação melhor mais tarde.
Instalando o cliente VoIP do console Linphonec
Não existem tantos programas que possam funcionar no sistema operacional sem uma interface gráfica; decidi pelo pacote Linphone.
O pacote é bastante grande, possui muitos recursos em potencial, mas até agora precisamos apenas de um pequeno utilitário Linphonec que possa funcionar no terminal e tenha a função de resposta automática (coleta automática).
Para ela, as seguintes ações serão realizadas.
Percebo que, ao instalar a partir do repositório Raspbian, uma versão 3.6.1 bastante antiga é instalada, que não funciona corretamente com o sistema de som ALSA, tive uma perda de som, o programa travou várias vezes.
Portanto, usarei uma versão mais atual.
Para auto-montagem do pacote a partir das fontes, instalamos dependências adicionais:
sudo apt-get install cmake automake autoconf libtool intltool yasm libasound2-dev libpulse-dev libv4l-dev nasm git libglew-dev
Vá para o diretório inicial:
cd /home/pi/
Faça o download do pacote Linphone, o download levou cerca de 20 minutos.
git clone git://git.linphone.org/linphone-desktop.git --recursive
Não pude compilar e compilar o pacote Linphone da primeira ou da segunda vez. Portanto, darei meu algoritmo de ação.
Paramos quase todos os serviços atualmente em execução, mas atualmente não utilizados, usando o sistema de gerenciamento de serviços systemctl.
Ocorreram erros durante a montagem, nosso mini PC simplesmente não possui recursos suficientes. Liberte-os para instalação.
Interrompendo serviços 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 precaução, podemos criar um arquivo de troca temporário (antes de reiniciar) (espaço no disco rígido), que o sistema operacional usa em caso de RAM insuficiente.
Para verificar se o arquivo de troca está incluído em nossa instalação do Raspbian (Debian), digitando:
sudo swapon --show
A saída está vazia, o que significa que o sistema não possui um arquivo de troca.
Adicione 1G swap e crie um arquivo:
sudo fallocate -l 1G /swapfile
Somente o usuário root pode ler e gravar no arquivo de paginação, portanto, definimos as permissões corretas:
sudo chmod 600 /swapfile
Usamos a ferramenta mkswap para configurar a área de troca do Linux no arquivo e ativá-la digitando os seguintes comandos:
sudo mkswap /swapfile sudo swapon /swapfile
Vá para o diretório criado ao baixar o pacote:
cd linphone-desktop
Preparamos para a instalação uma versão sem uma interface 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
Crie usando o atributo –j4 (ou seja, crie 4 threads ao mesmo tempo).
sudo make -j4
Ao instalar, podemos verificar o status do nosso computador no RPI-Monitor:

O tempo de construção para mim foi de 30 a 40 minutos.
Os arquivos de programa compilados apareceram no diretório OUTPUT / no-ui / bin. Para executar o programa, vamos entrar nele:
cd OUTPUT/no-ui/bin
Verifique a versão do programa:
./linphonec -v
Temos o resultado: versão: 3.12.0
Sobrecarregando nossa framboesa
Ao reiniciar, o arquivo de permuta desaparece, todos os serviços em execução registrados na inicialização são restaurados.
Uma pequena configuração inicial do Freeswitch.
O servidor FREESWITCH é instalado por padrão no diretório / usr / local / freeswitch /. A pasta conf contém arquivos de configuração. Por padrão, a configuração de teste de baunilha é instalada, o que na maioria das vezes serve para se familiarizar com a possibilidade de um servidor VoIP e contém um grande número de exemplos claramente redundantes para uso doméstico. Primeiro, vamos ver a configuração pronta para uso do servidor VoIP.
Edite o arquivo de configuração vars.xml
sudo nano /usr/local/freeswitch/conf/vars.xml
Primeiro, altere a senha padrão 1234 para um valor diferente, digamos 1111. Se você não fizer isso, antes de cada chamada, uma pausa será definida antes de discar 10 segundos.
Por padrão, como escrevi em um artigo anterior, temos 20 números de assinantes 1001-1020. O Dialplan também é instalado por padrão.
Por alguma razão, nesses tempos, em comparação com seis meses atrás, quando o módulo mod_xml_rpc foi ativado, o servidor travava constantemente.
O Dialplan FreeSWITCH faz uso extensivo de expressões regulares. O plano de discagem padrão é responsável pelo processamento de chamadas, a próxima seção do arquivo Local_Extension é responsável pelo envio para nossos números locais. Comente algumas linhas:
sudo nano /usr/local/freeswitch/conf/dialplan/defaults.xml
Na caixa de diálogo, insira um símbolo de comentário nesta seção:
Edição de diálogo dos números 1001-1019 <extension name="Local_Extension"> <condition field="destination_number" expression="^(10[01][0-9])$"> <action application="export" data="dialed_extension=$1"/>
Uma pequena digressão, na minha opinião, apesar da capacidade de trabalho do FS, após nossas várias alterações, é melhor refazer os arquivos de configuração do FS, incluindo: assinatura, plano de discagem etc., mas você não pode incluir tudo em um artigo. Por isso, procuramos nosso cliente de terminal.Configurar e iniciar o cliente de terminal Linphonec
Execute o Linphonec no modo de atendimento automático do usuário pi atual:
/home/pi/linphone-desktop/OUTPUT/no-ui/bin/linphonec -a
No primeiro lançamento, o Linphonec tenta criar um arquivo de banco de dados e um arquivo de configurações. No entanto, o lançamento está errado.
erros ao iniciar o 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, lidaremos com o último erro, abrindo o arquivo de banco de dados.
O arquivo do banco de dados é criado no diretório inicial ao longo do seguinte caminho: /home/pi/.local/share/linphone
Um arquivo Linux (ou diretório) é considerado oculto se o nome começar com um ponto “.”. Por exemplo, ".myfile". Normalmente, esses arquivos são usados pelos aplicativos para armazenar configurações, configurações e outras informações que precisam ser ocultadas do usuário.
Crie um diretório a partir do usuário atual (pi)
mkdir /home/pi/.local mkdir /home/pi/.local/share mkdir /home/pi/.local/share/linphone
Iniciamos o programa, o programa foi iniciado, mas ocorre um erro:
Erro de abertura da porta 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
Descobrimos o primeiro problema de criar um banco de dados: no lançamento inicial, o programa gerava um arquivo de banco de dados.
O erro associado ao sistema de som Pulseaudio - não interfere no funcionamento do programa, pretendo usar o ALSA, se necessário, um servidor de som sempre pode ser instalado antes.
As segundas portas 5060 estão ocupadas. Essas portas são comumente usadas por aplicativos SIP. Podemos sair do programa e dar o comando:
sudo netstat -tulpn | grep LISTEN
Veremos que a porta 5060 usa nosso servidor VoIP FREESWITCH. Bem, usaremos portas livres.
Voltamos ao programa linphonec. E faça uma pequena configuração.
Primeiro, alteramos a porta do Linfon, depois indicamos o registro no servidor VoIP, verificamos o status do registro e observamos a lista de placas de som, a placa usada e a configuramos em um USB externo (com um índice no 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

Na equipe de registro, usamos o seguinte formato: Sip user ID - por padrão, temos 20 assinantes com os números 1001-1019. Esses números são os nomes de usuário dos assinantes: Login do assinante @ [Nome do domínio] - nome do domínio - endereço IP do nosso Raspberry. Sip proxy - corresponde ao endereço IP do RPI e, no final, à senha do usuário que configuramos 1111 recentemente.
Saia do programa (Ctrl + x), as configurações nem sempre são aplicadas em tempo real. Após sair do diretório inicial / home / pi, o arquivo de configuração do cliente do console apareceu: .linphonerc.
Já podemos fazer alterações editando o arquivo de configuração do cliente SIP.
Em um novo cliente SIP do console de ativação.
Paralelamente à sessão SSH atual, abra uma nova, faça login usando seu nome de usuário e senha.
Começamos um samsixer. Em uma sessão, temos o Linphonec, na segunda, um utilitário de ajuste de som.
Fazemos a configuração da chamada do cliente SIP em um smartphone ou PC (conforme descrito no artigo sobre a instalação do FREESWITCH) alterando a senha padrão para sua própria e discando um número, no nosso caso 1001. Podemos acessar o portal freswitch em IP_Raspberry: 8080, visualizar o registro de assinantes, status chamada etc.

Usando o alsamixer, ajustamos o som. As alterações de som são aplicadas em tempo real, sem sair dos programas.
Infelizmente, devido ao uso de uma placa de áudio barata, não consegui um som aceitável; um eco foi ouvido nos alto-falantes. Pode ser minimizado um pouco, mas completamente removido - não obtive sucesso.
Portanto, como não foi possível removê-lo de uma maneira, nós a eliminamos de outra.
Feche o Linphonec, edite o arquivo de configuração:
sudo nano /home/pi/.linphonerc
Na seção de som, trazemos as três últimas linhas para este formulário:
Seção de som 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
Dessa maneira, forçamos o toque e o dispositivo de saída de som a trabalhar no conector raspberry 3.5 embutido, e o dispositivo de gravação - microfone para funcionar através de uma placa de som externa - o eco desapareceu.
Mude os alto-falantes para o próprio conector da framboesa.
Levamos em consideração o seguinte momento: ao carregar e, em alguns casos, o sistema doméstico inteligente reproduz as mensagens do sistema através desta saída de áudio.
Desligue-os. Passamos o IP_Rasberry para a página principal, abrindo o sistema de automação residencial MajorDoMo.
Entramos no painel de controle - o objeto Computador (expanda o dispositivo) - ThisComputer na guia Propriedades e definimos os valores:
ThisComputer.minMsgLevel 100 ThisComputer.volumeLevel 0

Adicione uma entrada ao cron (um programa daemon projetado para executar tarefas em um horário específico ou em determinados intervalos. O utilitário crontab é usado para editar tarefas):
crontab –e
Observo que estamos fazendo isso sob o usuário pi.
Insira a linha no final:
@reboot /home/pi/linphone-desktop/OUTPUT/no-ui/bin/linphonec –a
Ao reiniciar, ligando o computador, esta linha inicia o programa Linphonec no modo de atendimento automático.
Voltar para MajorDoMo:
Vamos para a página principal, na seção de serviço:
No menu desta seção, botões são criados para reiniciar (desligar) o computador.
O fato é que, para economizar os recursos do cartão de memória SD, as alterações são registradas no sistema “smart home” após um certo tempo (15 minutos). Portanto, se você precisar sobrecarregar framboesas, é melhor fazê-lo corretamente. Nós reiniciamos o sistema.

Após a reinicialização, vá para a página principal do MajorDoMo, vá para o painel de controle e, como no último artigo, fazemos uma chamada do console usando o seguinte formato:
GetURL("http://freeswitch:works@192.168.1.103:8080/webapi/originate?user/1001%201003%20XML%20default")
Após o comando, o Linphonec atende automaticamente o telefone. No alto-falante RPI, um arquivo de som está sendo reproduzido, uma chamada está sendo enviada para o segundo softphone (PC / smartphone). Depois de pegar o fone (pressionando o botão de atendimento no programa), a conexão é estabelecida.

Sobre isso, eu termino esta parte. Tentarei descrever um pouco mais tarde o botão em si usando o GPIO e configurar chamadas fora da minha rede local.