A Raspberry Pi, conhecidíssima plataforma computacional, tornou-se um coringa das aplicações que exigem o uso de um sistema operacional. Podendo ser utilizada com monitores HDMI, VGA, controlando displays LCD ou até mesmo em modo headless, o leque possível de aplicação desta plataforma é gigantesco. Em termos de consumo energético e cabeamento, sem dúvida operá-la em modo headless (seja por VNC ou via SSH) é a melhor opção. E é justamente sobre como descobrir o IP da Raspberry Pi a qualquer momento (para acesso headless) de que esse artigo se trata.
Conectividade à rede: IP fixo ou dinâmico?
Quando se trata em operação headless, é fundamental se descobrir o endereço da placa na rede (IP). Neste ponto, nos deparamos com três possibilidades:
- Fixar um IP à placa
- Comunicar através de hostname
- Utilizar IP dinâmico (DHCP)
Quanto à fixar um IP, não é uma solução muito interessante. Motivo: se ao entrar na rede já existir algum dispositivo com o IP desejado, problemas acontecerão. Dessa forma, esta ideia é válida desde que toda a rede esteja endereçada em faixas bem definidas, algo que pode ser impossível em alguns dispositivos que não permitam fixar o IP.
Já quanto a se comunicar via hostname, esta é uma boa ideia, mas não pode ser tão simples assim configurar um hostname válido para toda sua rede. Além disso, se existirem dois hostnames iguais na rede, problemas acontecerão (similar à situação de dois IPs idênticos em uma rede).
Portanto, resta-nos utilizar IP dinâmico / DHCP. Desta forma, basicamente nada é preciso além de se informar a rede desejada para se conectar e a senha. Portanto, a garantia de não haver IPs duplicados ficará sob responsabilidade do roteador. Resumindo: a opção “menos traumática” seria utilizar IP dinâmico.
Ok, mas como saber qual o IP da Raspberry Pi (“de fora” / sem estar em um terminal do sistema operacional da placa)?
Aí é que entra o assunto desde artigo. Aqui, irei mostrar uma solução simples para tal.
A ideia é simples: acessar diretamente a Raspberry Pi (diretamente = com um monitor, teclado e mouse, enfim, como um computador comum) e fazer um script em Python capaz de mandar, via MQTT, o seu IP na rede local para o broker em um determinado tópico (e fazer com que este script seja executado automaticamente ao final do boot da placa). Em posse do tópico e conectado no broker (usando um client MQTT qualquer, como MQTTLens ou MyMQTT, por exemplo), é possível saber em qualquer momento o IP da Raspberry Pi na rede local e, finalmente, utilizá-lo para acessar a placa via SSH ou VNC (ou seja, em “modo headless”).
Para fazer isso, siga o procedimento abaixo:
- Acesse a Raspberry Pi como um computador normal (conectar teclado, mouse e monitor à placa). Certifique-se que a Raspberry Pi tem acesso à Internet.
Instale a biblioteca para se conectar a brokers MQTT com o seguinte comando:sudo pip install paho-mqtt
- Abra o console / terminal e dirija-se a pasta home com o seguinte comando:
cd ~
Agora é chegada a hora de criarmos o script. Crie o arquivo de script Python e abra-o no editor nano com o seguinte comando:
nano MQTTIP.py
- Cole o conteúdo abaixo no editor.IMPORTANTE: altere o tópico de publish para não ocorrer coincidência com tópico que alguém já esteja usando no broker. Após feito isso, pressione Ctrl + x e confirme o salvamento do arquivo.Observe que o script começa já com um delay de 60 segundos. Este delay existe para que se garanta que o Linux já inicializou por completo (sobretudo quanto à conectividade de rede) antes do script rodar.
import paho.mqtt.client as mqtt import os import socket import time import sys #definicoes: Broker = "iot.eclipse.org" PortaBroker = 1883 KeepAliveBroker = 10 TopicoPublish = "MQTTIPRaspPi" #IMPORTANTE: troque este nome para um que lhe seja familiar / unico!!! TimeoutConexao = 10 #Callback - conexao ao broker realizada def on_connect(client, userdata, flags, rc): print("[STATUS] Conectado ao Broker. Resultado de conexao: "+str(rc)) return #Callback - mensagem recebida do broker def on_message(client, userdata, msg): MensagemRecebida = str(msg.payload) print("[MSG RECEBIDA] Topico: "+msg.topic+" / Mensagem: "+MensagemRecebida) return #programa principal: time.sleep(60) #garante que o linux ja iniciou #descobre IP: s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM) s.connect(("gmail.com",80)) IPLocal = s.getsockname()[0] s.close() print("[STATUS] Inicializando MQTT...") #inicializa MQTT: client = mqtt.Client() client.on_connect = on_connect client.on_message = on_message client.connect(Broker, PortaBroker, KeepAliveBroker) while True: try: #reporte via MQTT StatusConexaoBroker = client.loop(TimeoutConexao) if (StatusConexaoBroker > 0): client.connect(Broker, PortaBroker, KeepAliveBroker) else: StringMQTT = "IP RaspBerry Pi A+: "+IPLocal client.publish(TopicoPublish, StringMQTT) time.sleep(5) except KeyboardInterrupt: print "\nCtrl+C pressionado, encerrando aplicacao e saindo..." sys.exit(0)
- Agora é a hora de fazer com que seu script inicie automaticamente assim que a Raspberry Pi bootar. Para isso, acesse o arquivo /etc/rc.local com o seguinte comando:
sudo nano /etc/rc.local
E, no arquivo, antes da linha exit(0), adicione a seguinte linha:
python /home/pi/MQTTIP.py &
Após feito isso, pressione Ctrl + x e confirme o salvamento do arquivo.
Pronto! Agora basta reiniciar a Raspberry Pi, usar um client qualquer de MQTT para dar subscribe no tópico escolhido e aguardar a mensagem MQTT contendo o IP da Raspberry Pi na sua rede local! Observe o resultado de um teste que eu fiz (utilizando o client MQTTLens):
Recomendação de lojas para o hardware
Segue abaixo algumas recomendações de lojas para adquirir o hardware envolvido neste projeto:
Gostou do artigo? Tem dúvidas? Tem críticas? Comente abaixo!