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:

  1. Fixar um IP à placa
  2. Comunicar através de hostname
  3. 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:

  1. 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
  2. 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
  3. 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)
  4. 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!


Pedro Bertoleti

Informações completas em: http://pedrobertoleti.com.br/index.php/sobre/