A Raspberry Pi Zero W trata-se de uma poderosa e compacta placa de desenvolvimento, dispondo da mesma quantidade de I/Os da Raspberry Pi 3B, saída de vídeo HDMI, USB e conectividade wi-fi e Bluetooth. Dadas suas compactas dimensões físicas em relação às demais placas de desenvolvimento da linha Raspberry, a Raspberry Pi Zero W se encaixa muito bem em projetos que devem ser discretos , tais como sistemas de automação residencial e totens, por exemplo. Visando maior flexibilidade do uso dessa placa, este post irá tratar de uma interessante possibilidade de uso do wi-fi desta placa: a configuração de uma Raspberry Pi como access point e station/client simultaneamente.
Material necessário
Para realizar o que é proposto no post, você deve dispor de:
- Uma placa Raspberry Pi Zero W
- Uma Fonte DC Chaveada 5V 2A Micro USB
- Um Cabo adaptador USB para Micro USB
- Um Cabo conversor mini HDMI
- Um teclado USB, mouse USB ou monitor/TV/display HDMI
- Um cartão microSD de 16GB de capacidade ou mais, preferencialmente de classe 10
- Um hub USB
De forma alternativa, exceto pelos itens cartão microSD, teclado USB, mouse USB e monitor/TV/display HDMI, você pode comprar de uma vez todo material no Kit Raspberry Pi Zero W Intermediate
Este post considera que sua Raspberry Pi Zero W já está totalmente operacional, ou seja, com Raspbian instalado e conectividade à Internet operando normalmente.
Wi-fi como access point e station/client simultaneamente: overview
O wi-fi possui, de forma simplificada, dois modos de operação:
- Access Point (AP): neste modo de operação, o wi-fi serve como ponto de conexão para outros dispositivos (clients/stations), de forma similar a operação de um roteador doméstico comum, por exemplo. Os objetivos mais comuns do wi-fi operando como Acess Point são oferecer conectividade a outros dispositivos wi-fi, compartilhar conectividade à Internet e criar uma rede exclusiva para algum fim de configuração (como no caso de alguns roteadores domésticos, por exemplo).
- Client/Station (ST): neste modo de operação, o wi-fi busca se conectar a um Access Point para obter acesso à uma rede sem fio, da mesma forma que você conecta seu smartphone em um roteador doméstico comum, por exemplo. Neste caso, o dispositivo que possui wi-fi operando como Station busca conectividade a uma rede wi-fi, seja para acesso a uma rede com fins específicos ou para obter conectividade à Internet.
Ambos os modos de operação permitem o envio e recepção de dados simultaneamente, logo a comunicação em ambos os modos é full-duplex.
Em termos de sistemas operacionais (sobretudo as distribuições Linux embarcado), um modo de operação de wi-fi é chamado de interface wi-fi. O número/limite e possibilidade de interfaces wi-fi operando simultaneamente é definido pelo hardware de wi-fi, ficando a cargo do sistema operacional gerenciar, dentro dos limites desse hardware, as interfaces desejadas. No caso da Raspberry Pi Zero W, o wi-fi da placa suporta tranquilamente duas interfaces operando como AP e ST simultaneamente. Ainda no caso deste post, as interfaces serão chamadas de:
- wlan0: interface correspondente ao modo de operação do wi-fi como ST
- ap0: interface correspondente ao modo de operação do wi-fi como AP
Configurando o wi-fi da Raspberry Pi Zero como Acess Point e Client/Station
Antes de iniciar, é necessário utilizar a Raspberry Pi Zero W ligada a um teclado USB, mouse USB e monitor/TV/display HDMI. Como configurações relativas ao wi-fi serão modificadas, não é recomendável fazer este processo utilizando conexão ssh com a placa, sob risco de queda de conexão e impossibilidade de reconexão via ssh. Feito isso, siga o procedimento abaixo:
1. Primeiramente, atualize os pacotes existentes na sua Raspberry Pi Zero W e instale os pacotes dsnmasq, dhcpcd e hostapd. Faça isso com os comandos abaixo:
sudo apt -y update sudo apt -y upgrade sudo apt -y install dnsmasq dhcpcd hostapd
2. Agora, deve-se descobrir o endereço físico (MAC address) do wi-fi da placa. para isso execute o comando abaixo e salve/guarde a resposta para uso futuro,
cat /sys/class/net/wlan0/address
3. Em posse do MAC address, o próximo passo é criar o arquivo /etc/udev/rules.d/70-persistent-net.rules. Crie este arquivo (e abra-o no editor nano) com o comando abaixo:
sudo nano /etc/udev/rules.d/70-persistent-net.rules
No arquivo, coloque o seguinte conteúdo:
SUBSYSTEM=="ieee80211", ACTION=="add|change", ATTR{macaddress}=="MAC_ADDRESS", KERNEL=="phy0", \ RUN+="/sbin/iw phy phy0 interface add ap0 type __ap", \ RUN+="/bin/ip link set ap0 address MAC_ADDRESS"
Onde MAC_ADDRESS corresponde ao MAC Address obtido neste passo.
4. Agora, abra o arquivo /etc/dnsmasq.conf com o editor nano (como sudo: sudo nano) e faça com que o conteúdo abaixo seja o conteúdo deste arquivo. Basicamente, estas configurações configuram o DHCP para a interface AP, incluindo o range de IPs possíveis de serem atribuídos aos que se irão se conectar na interface AP.
interface=lo,ap0 no-dhcp-interface=lo,wlan0 bind-interfaces server=8.8.8.8 domain-needed bogus-priv dhcp-range=192.168.10.50,192.168.10.150,12h
5. Agora é o momento de fazer as configuração da interface AP (incluindo o SSID/nome da rede e senha da mesma). Para isso, abra o arquivo /etc/hostapd/hostapd.conf com o editor nano(como sudo: sudo nano) e faça com que seu conteúdo seja conforme consta abaixo:
ctrl_interface=/var/run/hostapd ctrl_interface_group=0 interface=ap0 driver=nl80211 ssid=AP_SSID hw_mode=g channel=11 wmm_enabled=0 macaddr_acl=0 auth_algs=1 wpa=2PASSPHRASE wpa_passphrase= AP_PASSPHRASE wpa_key_mgmt=WPA-PSK wpa_pairwise=TKIP CCMP rsn_pairwise=CCMP
Onde:
- AP_SSID: nome desejado para o Access Point
- AP_PASSPHRASE: senha para se conectar ao Access Point criado pela Raspberry Pi Zero W
6. Uma vez escritas as configurações da interface Access Point, o hostapd deve ter conecimento das mesmas. Para isso, abra o arquivo /etc/default/hostapd no editor nano(como sudo: sudo nano) e faça com que seu conteúdo seja conforme mostrado abaixo:
DAEMON_CONF="/etc/hostapd/hostapd.conf"
7. Agora é o momento de configurar a parte Station (ou seja a qual SSID/rede a Raspberry Pi Zero W deve se conectar). Para isso, abra o arquivo /etc/wpa_supplicant/wpa_supplicant.conf no editor nano(como sudo: sudo nano) e faça com que seu conteúdo seja conforme mostrado abaixo:
country=US ctrl_interface=DIR=/var/run/wpa_supplicant GROUP=netdev update_config=1 network={ ssid="CLIENT_SSID" psk="CLIENT_PASSPHRASE" id_str="AP1" }
Onde:
- CLIENT_SSID: nome da rede a qual a Raspberry Pi Zero W deve se conectar (esta rede irá prover conectividade Internet à Raspberry PI Zero W).
- CLIENT_PASSPHRASE: senha da rede a qual a Raspberry Pi Zero W deve se conectar
8. Mais algumas configurações de ambas as interfaces wi-fi precisam ser feitas. Para isso, abra o arquivo /etc/network/interfaces no editor nano (como sudo: sudo nano) e faça com que seu conteúdo seja conforme mostrado abaixo:
source-directory /etc/network/interfaces.d auto lo auto ap0 auto wlan0 iface lo inet loopback allow-hotplug ap0 iface ap0 inet static address 192.168.10.1 netmask 255.255.255.0 hostapd /etc/hostapd/hostapd.conf allow-hotplug wlan0 iface wlan0 inet manual wpa-roam /etc/wpa_supplicant/wpa_supplicant.conf iface AP1 inet dhcp
9. Todas as configurações necessárias foram feitas. Agora, é o momento de criar um script que, ao ser carregado a cada boot, vai ativar as interfaces conforme se deseja e , além disso, faz com a que interface AP possa prover acesso à Internet para os dispositivos que nela se conectem (redirecionamento de conectividade). Para isso, crie o arquivo /bin/start_wifi.sh com o editor nano (como sudo: sudo nano) e coloque o conteúdo abaixo no arquivo.
Note que a primeira linha é um sleep de 50 segundos. Ele faz com que as interfaces sejam configuradas conforme desejamos após 50 segundos do início do boot da placa, tempo mais do que suficiente para o sistema operacional ser carregado e operar plenamente.
sleep 50 sudo ifdown --force wlan0 sudo ifdown --force ap0 sudo ifup ap0 sudo ifup wlan0 sudo sysctl -w net.ipv4.ip_forward=1 sudo iptables -t nat -A POSTROUTING -s 192.168.10.0/24 ! -d 192.168.10.0/24 -j MASQUERADE sudo systemctl restart dnsmasq
10. Como o script do passo 9 deverá ser executado a cada boot, este deve ter permissão de execução. Conceda permissão de execução a ele com o comando abaixo:
sudo chmod +x /bin/start_wifi.sh
11. Agora, para garantir que o script do passo 9 seja executado a cada boot / reboot da placa, faremos uso do Cron. Para isso, utilize o comando abaixo para agendar a execução do script pelo cron a cada boot/reboot:
crontab -l | { cat; echo "@reboot /bin/start_wifi.sh"; } | crontab -
12. Pronto! Agora basta reiniciar a placa, aguardar aproximadamente 50 segundos e verificar com seu computador ou smartphone que uma rede wi-fi (AP) foi criada pela sua Raspberry PI Zero W!
Sugestões de utilizações da Raspberry Pi como Access Point
O projeto deste post pode ser usado como base para projetos muito interessantes, tais como:
- Controle de utilização de wi-fi (utilizando a placa como roteador), de forma a controlar o acesso / tempo de acesso de quem se conecta à Raspberry Pi Zero W pela interface AP
- Toten wi-fi, de modo que haja uma rede wi-fi privada para fins comerciais e informativos
- Rede exclusiva para configuração de algum dispositivo eletrônico feito com base na Raspberry Pi Zero W (de forma similar a feita em alguns roteadores domésticos comuns)
- Servidor privado de arquivos e banco de dados
Gostou deste post sobre como configurar o wi-fi da Raspberry Pi como access point e station/client simultaneamente? Deixe seu comentário logo abaixo.
############ ATENÇÃO #############
Demorei mais descobri o motivo do meu não funcionar, era pq o canal do AP deve ser o mesmo do client
ou seja, conecte no sinal wifi, verifique o canal com o comando:
iw dev
altere o canal do arquivo /etc/hostapd/hostapd.conf
Fonte: https://blog.thewalr.us/2017/09/26/raspberry-pi-zero-w-simultaneous-ap-and-managed-mode-wifi/
Olá Danilo,
Obrigado por compartilhar essa informação aqui no post!
Abraços!
Vinícius – Equipe MakerHero
Olá Pedro, segui o processo passo a passo (alias muito bem explicado) porem após reiniciar meu Rpi não aparece a rede AP e também a placa não consegue se conectar na WiFi. No icone do Wifi aparece a seguinte mensagem:
No Wireless interfaces found
e ao passar o mouse aparece
Connection to dhcpcd lost
Vc poderia, por favor, me orientar sobre como proceder?
Obrigado
Pedro, consegui ativar a rede WiFi do RPi como AP (eu tinha cometido alguns erros de digitação nas configurações) porem continua sem accessar a rede WiFi do roteador…
Aguardo suas dicas, obrigado
Simon, boa noite.
Primeiramente, obrigado pelo elogio (falar que o artigo estava bem explicado). Fico feliz que o artigo ficou claro.
Sobre não ter acesso a rede wifi do roteador, vocẽ quis dizer que pode se conectar a rede que criou, mas o dispositivo não acessa a Internet? Se sim, faça o seguinte:
1) verifique o conteúdo do arquivo /etc/resolv.conf (o comando pra isso é cat /etc/resolv.conf )
2) Se o IP que estiver lá for diferente de 8.8.8.8 (DNS do Google), abra o arquivo com o editor nano e substitua o IP lá gravado pelo 8.8.8.8
Se o problema for relativo a resolver DNS, isso deve corrigir.
Atenciosamente,
Pedro Bertoleti
Olá Pedro, muito obrigado pela pronta resposta. Vc interpretou corretamente meu problema, o Rpi não consegue se conectar a internet, desculpe por não ter sido claro.
Fiz como orientado e a boa noticia é que de fato o endereço IP estava diferente. O conteudo do arquivo /etc/resolv.conf é
#generated by resolvconf
nameserver 127.0.0.1
Editei conforme informado e a noticia ruim é que após reiniciar o arquivo volta a ficar com o mesmo conteudo e o Pi continua sem conseguir se conectar à Internet…
Onde posso estar errando?
Caro Pedro, não sei o que houve mas após um novo reset estou conseguindo accessar a Internet embora a situação descrita no post anterior continua sendo verdadeira. Misterios da Eletronica.
O único ponto a observar é que o icone da Wifi continua cinza indicando (desabilitado?) com dois “x” vermelhas e ao passar o mouse aparece a mensagem “Connection to dhcpcd lost”. Isso é normal? Se for sugiro incluir na documentação…
Obrigado e abraço