Como fazer um hotspot no Raspberry Pi | O Gravador sem Cabeça #4

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:
Consigo gravar de uma interface de áudio usando arecord?✅Consigo gravar de duas interfaces de áudio simultaneamente usando arecord?✅Consigo usar um serviço web pra disparar a gravação?✅- 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:

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

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

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.

Colocando a senha mega segura…

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.

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!