header

Vamos continuar o nosso gravador sem cabeça da postagem anterior. Esse post não requer a leitura dos anteriores, mas vou dar um pouco de contexto.

Contexto

Eu quero criar um gravador em que você conecte interfaces de áudio USB e ele as grave, controlando por um tablet.

Pra isso eu preciso saber se com um Raspberry Pi 3B sem tela, eu:

  1. Consigo gravar de uma interface de áudio usando arecord?
  2. Consigo gravar de duas interfaces de áudio simultaneamente usando arecord?
  3. Consigo usar um serviço web pra disparar a gravação?
  4. Consigo conectar e enviar os comandos acima diretamente no pi como um hotspot?

Hoje vamos atacar o item #4: Consigo conectar e enviar os comandos acima diretamente no pi como um hotspot?

Bora lá!

Mão na massa

Nós vamos mexer com a rede Wi-Fi do Raspberry Pi, então se você está conectado nele por Wi-Fi, use a rede cabeada, ou use-o diretamente com teclado e monitor para poder resolver qualquer problema que venha a ocorrer com o Wi-Fi.

Isso dito, vamos nos certificar que o Pi está usando o NetworkManager, que vai facilitar muito a nossa vida:

Ativando o NetworkManager

raphaelpaiva@hr:~ $ sudo raspi-config

Isso deve abrir uma tela com um menu, parecida com esta aqui:

menu

Selecione a opção 6 Advanced Options e depois AA Network Config

networkconfig

Depois disso, certifique-se de que a opção 2 NetworkManager está habilitada.

nm

Pronto! Se você perdeu a conexão, tente conectar novamente.

Configurando o HotSpot

Pra configurar rede usando o NetworkManager, temos algumas opções muito boas como o nmcli (via linha de comando) e o nmtui (interface semelhante ao raspi-config). Vamos de nmcli por ser mais direto.

Pra configurar o hotspot, temos uns comandos pra rodar. Basicamente nmcli con add pra adicionar uma conexão e sudo nmcli con modify pra modificar configurações de uma conexão.

Vou explicar passo a passo.

# Cria uma conexão Wi-Fi chamada hr-hotspot com o mesmo ssid
raphaelpaiva@hr:~ $ sudo nmcli con add type Wi-Fi ifname wlan0 con-name hr-hotspot autoconnect yes ssid hr-hotspot

# Essa conexão vai estar no modo ap (access point) usando o banda bg e vai compartilhar qualquer outra conexão existente
# o compartilhamento não é necessário, mas é conveniente
raphaelpaiva@hr:~ $ sudo nmcli con modify hr-hotspot 802-11-wireless.mode ap 802-11-wireless.band bg ipv4.method shared

# Essa conexão vai usar segurança wpa-psk (passkey). Não é o mais seguro, mas esse projeto não requer muita segurança.
raphaelpaiva@hr:~ $ sudo nmcli con modify hr-hotspot Wi-Fi-sec.key-mgmt wpa-psk

# Vamos colocar uma senha bem segura...
raphaelpaiva@hr:~ $ sudo nmcli con modify hr-hotspot Wi-Fi-sec.psk "12345678"

# E vamos, finalmente, habilitar essa conexão.
raphaelpaiva@hr:~ $ sudo nmcli con up hr-hotspot

Vou rodar o servicinho que criamos na postagem anterior e tentar acessá-lo.

raphaelpaiva@hr:~ $ cd hr
raphaelpaiva@hr:~/hr $ python -m uvicorn main:app --reload --host 0.0.0.0
INFO:     Will watch for changes in these directories: ['/home/raphaelpaiva/hr']
INFO:     Uvicorn running on http://0.0.0.0:8000 (Press CTRL+C to quit)
INFO:     Started reloader process [1589] using WatchFiles
INFO:     Started server process [1592]
INFO:     Waiting for application startup.
INFO:     Application startup complete.

Importante também dar uma olhada no ip do pi nessa rede:

raphaelpaiva@hr:~ $ ip a
[...]
3: wlan0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000
    link/ether b8:27:eb:67:e6:84 brd ff:ff:ff:ff:ff:ff
    inet 10.42.0.1/24 brd 10.42.0.255 scope global noprefixroute wlan0
       valid_lft forever preferred_lft forever
    inet6 fe80::26aa:e855:d327:9941/64 scope link noprefixroute 
       valid_lft forever preferred_lft forever

Beleza! 10.42.0.1.

Nesse ponto eu desconectei o cabo de rede pra me certificar de que não havia nenhuma outra rede disponível.

Vamos lá pro meu tablet véio de guerra. conectando

Colocando a senha mega segura…

conectado

Vamos tentar agora acessar o serviço. Lembrando que ele roda na porta 8000, então vamos acessar http://10.42.0.1:8000 e cruzar os dedos.

sucesso

Solta os fogos! 🎉

Dando uma olhada nos logs da aplicação, dá pra ver que o acesso veio da mesma rede do Pi:

INFO:     10.42.0.177:37478 - "GET / HTTP/1.1" 200 OK
INFO:     10.42.0.177:37478 - "GET /favicon.ico HTTP/1.1" 404 Not Found
INFO:     10.42.0.177:41574 - "GET / HTTP/1.1" 200 OK

Conclusão

Conseguimos acessar o Raspberry Pi diretamente via Wi-Fi e entrar no nosso serviço, ou seja, todas as etapas pra validar a ideia do Gravador foram validadas!

Agora é hora de pensar nele como um produto e estruturar um pouco mais ele como um todo. Vamos dar prosseguimento no próximo post!

Referências

Claro que eu colei a configuração de algum lugar, então segue o link da alma caridosa que compilou pra gente: https://gist.github.com/narate/d3f001c97e1c981a59f94cd76f041140. Obrigado, estranho!