Botão de chamada DIY parte 2. Videofone do Raspberry Pi

Nesta parte, fabricamos um dispositivo VoIP Raspberry Pi para fazer chamadas de vídeo usando o protocolo SIP.

A tarefa inicial permaneceu a mesma - telefonar por influência externa (pressionar um botão). Mas a implementação da ideia mudou um pouco. Como na parte anterior, usaremos o cliente SIP do terminal Linphonec, mas, para simplificar a configuração, decidi usar o provedor de VoIP Zadarma.com com chamadas on-net gratuitas, incluindo suporte a vídeo. Para chamadas de vídeo, usei uma câmera USB econômica.

Detalhes, bem como instruções passo a passo sob o corte.

Primeira parte
O sistema é implementado na imagem base para o RPI v3_40_int imediatamente , sem instalar nada adicional.

Vincule imagens básicas do MajorDoMo para Raspberry

A webcam que usei é econômica (cerca de 7 anos em Minsk) - Ritmix RVC-015M. Tem a capacidade de ajustar manualmente o foco.

No processo de teste e para escrever uma postagem, decidi abandonar o uso do meu servidor de VoIP (Fresswitch). A instalação do servidor VoIP complica o processo de instalação, mas oferece mais flexibilidade.

Por exemplo, usaremos o operador Zadarma apresentado no Habr VoIP.

Para fazer chamadas, precisamos de duas contas no servidor SIP. Sob um deles, o Raspberry Pi e o cliente do console funcionarão, o segundo para o smartphone (ou PC). O processo de registro é intuitivo e não precisa de uma descrição.

Repetirei brevemente a instalação e a configuração do pacote Linphone, informações mais detalhadas na primeira parte.

Instalando e montando o Linphone


Preparando para instalação:


Pare de executar serviços mas não utilizados:

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 


Criando um arquivo de troca de troca temporário
Apenas no caso, criamos um arquivo de troca temporário (antes de reiniciar o sistema) (espaço no disco rígido), que o sistema operacional usa no caso de RAM insuficiente.

Comandos alternativos: verificando se o arquivo de troca está incluído em nossa instalação do Raspbian (Debian); se a saída estiver vazia, isso significa que o arquivo de troca está ausente no sistema.
Adicione 1G swap e crie um arquivo.

Definimos as permissões corretas para esse arquivo, apenas o usuário root pode ler e gravar no arquivo de paginação.

Usamos a ferramenta mkswap para configurar a área de troca do Linux no arquivo e ativá-la:

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

Instalando o Cliente SIP do Linphonec Console e o Utilitário de Gerenciamento Linphonecsh


Para compilar o 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 

Vamos para o diretório inicial e baixamos o pacote Linphone, o download levou cerca de 20 minutos:

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

Vamos para o diretório criado ao baixar o pacote, preparamos a instalação da versão sem uma interface 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 

Crie usando o atributo –j4 (ou seja, crie 4 threads ao mesmo tempo:

 sudo make -j4 

A montagem leva de 30 a 40 minutos.

Os arquivos de programa compilados apareceram no diretório OUTPUT / no-ui / bin. Para executar o programa, vá para ele, verifique a versão do programa:

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

Temos o resultado: versão: 3.12.0

Sobrecarregando nossa framboesa.

Quando você reinicia, todos os serviços registrados na inicialização são restaurados, o arquivo de paginação é excluído.

Configurando um cliente SIP do 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 

No primeiro lançamento, o Linphonec tenta criar um arquivo de banco de dados e um arquivo de configurações. No entanto, o início ocorre com erros e o programa para.

Como criar um diretório a partir do usuário atual (pi) na primeira parte

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

Porque no nosso caso, não usamos um servidor VoIP, então a porta padrão para telefonia IP 5060 é usada.

Registraremos uma das contas executando o seguinte comando no Linphonec:

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

o formato do comando pode ser visualizado digitando help register.

No nosso caso, XXXXXX é o número da conta (login), AAAA é a senha emitida durante o registro. Verifique o registro:

 status register 

resposta após o registro bem-sucedido: registrado, identidade = sip: XXXXX@sip.zadarma.com duration = 3600

O cliente é encerrado pressionando ctrl + c ou o comando quit.

Após sair do diretório inicial / home / pi, o arquivo de configuração do cliente do console apareceu: .linphonerc.

Conectando uma câmera de vídeo WEB


Nós nos conectamos à câmera Raspberry.

Verificando se minha conta está incluída no grupo de vídeos

 cat /etc/group | grep video 

Resposta: vídeo: x: 44: pi

Vamos ver se a webcam no seu sistema foi determinada:

 sudo ls -l /dev/ | grep video 

Verifique se o microfone da câmera está determinado:

 arecord -l 

A resposta é:

Lista de dispositivos de hardware CAPTURE
cartão 1: CÂMERA [USB2.0 PC CAMERA], dispositivo 0: USB Audio [USB Audio]
Subdispositivos: 1/1
Subdispositivo # 0: subdispositivo # 0

Está tudo em ordem, também há um microfone. Vamos verificar no alsemikser

 alsamixer 

Esclarecerei imediatamente que meu microfone está ativado por padrão, foi identificado como o principal e está quase completamente distorcido, há uma forte sobrecarga.

Pressione F6 (selecione um cartão), selecione USB PC Camera e, em seguida, F4 - o dispositivo Capture (microfone na câmera), abaixe seu nível para quase zero, com as teclas do cursor pressionadas, ao mesmo tempo verificamos Capture.

"

No mercado de aplicativos para Android, eu instalo o aplicativo Linphone (tentei vários, apenas ele começou a transmitir vídeo. No Windows, todos os clientes SIP que utilizo funcionam sem problemas. Também funciona sem problemas no meu servidor SIP (freeswitch, se usado em local, e não apenas a rede, a melhor opção é o servidor + gateway para chamadas da rede local).

Para obter instruções sobre como configurar o aplicativo Linphone Android, acesse Zadarma.com.
Instruções do provedor SIP .

Registramos o celular no Zadarma e, opcionalmente, configuramos vídeo, áudio etc.

Para o teste, executamos o utilitário linphonec no RPI com a função de chamada de vídeo e atendimento automático (adicionando as teclas -V -a):

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

e faça uma chamada no cliente do terminal digitando:

 call 576935 

A substituição do servidor VoIP (domínio) é realizada automaticamente, embora você possa discar completamente o endereço SIP.

Como resultado, obtemos:


(qualidade mais ou menos boa para esta câmera a uma distância de 2 a 3 metros da lente).

Podemos verificar o modo de atendimento automático discando o número RPI no smartphone.

Para executar e controlar o Linphonec no modo daemon, o utilitário Linphonecsh é usado.

Inicialmente, na inicialização, a inicialização do cliente linphonecsh -init é necessária. Quando esse comando é executado, o cliente do console inicia sem carregar o arquivo de configuração.
Para que na inicialização o arquivo de configuração seja lido, a chamada de vídeo e a resposta automática às chamadas recebidas serão iniciadas com os sinalizadores - s - V -a:

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

Agora podemos gerenciar o cliente do console na linha de comando do SO e do MajorDoMo.

O comando para iniciar uma vídeo chamada a partir do terminal:

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

O primeiro passo pode ser dado.

Conectando um botão e trabalhando com o GPIO




O Raspberry Pi possui várias portas GPIO (General Purpose Input / Output) que fazem interface. que contém entradas e saídas de uso geral às quais vários atuadores podem ser conectados, no nosso caso, um simples botão.

Quase todos os pinos GPIO (existem vários reservados) podem ser configurados para um dos dois estados: “output” (também conhecido como OUT ou lógico 1) ou “input” (IN ou lógico 0). A tensão de saída é 3.3V.

Para o meu botão, usarei os dois pinos mais à direita na linha superior. O conector nº 38 (GPIO20) será definido como "output" (OUT) e o conector nº 40 (GPIO21) será definido como "input" (IN).

Os jumpers BBJ são usados ​​para conectar-se ao pente GPIO. Recomenda-se conectar quando o framboesa for desconectado da rede.

Vamos criar dois scripts. O primeiro é usado para inicializar as portas GPIO, o segundo é para os comandos de controle do utilitário Linphonecsh.

Script Bash para inicializar portas GPIO:

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

e cole o conteúdo

gpio21.sh
#! / bin / bash
# Configure o GPIO20 e configure para saída
eco 20> / sys / class / gpio / export
eco> / sys / class / gpio / gpio20 / direction
eco 1> / sys / class / gpio / gpio20 / value
# Configure o GPIO21 e configure para entrada
eco 21> / sys / class / gpio / export
eco em> / sys / class / gpio / gpio21 / direction

Tornamos o arquivo executável:

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

O segundo script para discar com o clique de um botão, decidi fazer em PHP, para posterior integração com o sistema de automação residencial MajorDoMo. Com o toque de um botão, o status da porta 21 muda, o sistema lê periodicamente o valor da porta 21 e, se alterado, envia um comando de discagem para Linphonecsh.

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

e cole o conteúdo:

dial.php
<? php
$ old_state = 0;
enquanto (verdadeiro)
{
$ state = file_get_contents ('/ sys / classe / gpio / gpio21 / value');
if ($ state! = $ old_state)
{
if ($ state == 1)
{
// Fazendo nova chamada
eco "make";
exec ("sudo -u pi / home / pi / linphone-desktop / OUTPUT / no-ui / bin / linphonecsh sip de discagem: XXXXX@sip.zadarma.com");
usleep (200000);
}
$ old_state = $ state;
}
adormecido (20000);
}
?>

Tornamos o arquivo executável.

Em seguida, escrevemos três linhas no final do arquivo de inicialização:

  1. Script de inicialização da porta GPIO
  2. lançamento do utilitário de gerenciamento no modo de atendimento automático e suporte à transferência de vídeo
  3. Discagem 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 

Sobrecarregando nosso Raspberry, sudo reboot. Após reiniciar, nosso videofone está pronto para uso.

Além disso, se desejado e possível - integração em um sistema de automação residencial, conexão com o servidor SIP, etc.

Carregamento de RPI enquanto aguarda e faz uma chamada de vídeo
O RPI é carregado enquanto aguarda e faz uma vídeo chamada:





Uma pequena digressão como conclusão


Inicialmente, planejei criar um dispositivo para se comunicar com uma pessoa após uma doença que não pudesse usar o telefone por conta própria; depois disso, a necessidade desapareceu, mas decidi terminar o trabalho e vi a possibilidade de usar um dos componentes da automação residencial para outros fins.

Ao criar, eu gostaria que os seguintes critérios fossem atendidos, ou pelo menos dois em três:

  1. Disponibilidade (a capacidade de comprar componentes aqui e agora (na minha área).
  2. Orçamento (baixo custo do dispositivo na saída).
  3. Simplicidade de execução, ou pelo menos a integridade de uma instrução passo a passo (a capacidade de uma pessoa que precisava repeti-la, sem conhecimentos e custos de tempo especiais, para fabricar um dispositivo e começar a usá-lo).

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


All Articles