Controlando o Onion Omega2 via WiFi, com SSH sem senha

Comandos remotos acionam um circuito conectado ao minúsculo Onion Omega2, via SSH sem senha.

No artigo anterior sobre o impressionante Onion Omega2, eu senti que estava faltando alguma coisa – afinal, como apresentar uma placa para IoT sem incluir alguma foto de protoboard mostrando jumpers e, no mínimo, um led e um resistor?

No artigo de hoje, portanto, darei continuidade, usando um circuito bem simples para demonstrar uma técnica possibilitada pelo ambiente Linux do Omega2, que inclui suporte bastante completo ao SSH. Usarei em especial os aspectos não-interativos do SSH (comandos remotos e login sem senha interativa), que possibilitam maior automação de métodos de enviar comandos via rede à plaquinha – tudo demonstrado fazendo o led acender e apagar, claro ;-)

Recapitulando, no artigo “Onion Omega2: computador para makers, do tamanho de um selo” eu apresentei o Onion Omega2 e sua Expansion Dock. O Onion Omega2 é um computador bem barato e do tamanho de um selo postal, roda Linux com WiFi e tem um barramento GPIO digital de 3,3V. Você pode desenvolver seu projeto usando só ele, mas a Expansion Dock facilita muito a etapa de desenvolvimento, por oferecer conector USB para alimentação e acesso, mais um conector USB host (para plugar pen drives, por exemplo), botões de reset e liga/desliga, um led RGB para interface com o usuário, e acesso fácil ao GPIO via jumpers machos.

Recebi os 2 produtos da Usinainfo, para análise e divulgação. Ela tem ambos no catálogo, visite a página do Onion Omega2 e da Expansion Dock para saber os detalhes comerciais.

Primeiro passo: montar o circuito

O Omega2 tem uma coleção de pinos GPIO de 3,3V. No dock de expansão eles estão dispostos assim:

Para ilustrar seu uso neste artigo, vamos construir em uma mini protoboard um dos circuitos funcionais mais simples para esta categoria de projetos: o par led-resistor controlado e alimentado por uma porta digital de saída:

O esquema simplificado acima ilustra a montagem. Note que o lado positivo do led vermelho L1 está conectado à porta 11 do Omega2, e que o seu lado negativo está conectado a um resistor de 100Ω, que por fim está conectado ao terra (conector GND do Omega2).

O circuito acima tem um funcionamento bem direto: sempre que a porta 11 do Omega2 estiver no estado HIGH, os 3,3V dela farão o led L1 ficar aceso. Quando ela estiver em LOW, não haverá tensão, e o led L1 ficará apagado.

Montado na mini-protoboard, o circuito acima fica assim:

Simples, não?

Passo 2: controlar localmente o circuito

A documentação do GPIO do OMEGA2 apresenta os comandos para interagir com os pinos a partir da shell, e nela podemos verificar que o estado do nosso led pode ser controlado interativamente, na shell do ambiente Linux do Omega2, por meio do comando gpioctl direcionado ao pino 11.

O primeiro passo é colocar o pino 11 no modo de saída digital, com o comando a seguir:

gpioctl dirout 11

A partir daí, para acender o led, simplesmente usamos o comando que coloca o pino 11 no estado HIGH, no qual ele oferece 3,3V ao circuito externo:

gpioctl dirout-high 11

Para apagar o led, basta substituir high por low:

gpioctl dirout-low 11

Se você estiver apto a se aventurar com o editor vi, ou já tiver instalado o seu editor preferido (os aplicativos disponíveis podem ser consultados digitando opkg list), pode criar um script que faça uso desses comandos. Por exemplo, eu criei o script a seguir:

#!/bin/ash
# acende e apaga o led conectado ao pino 11, 3 vezes

/usr/bin/gpioctl dirout 11

for i in $(seq 1 3); do 
  echo $i; 
  /usr/bin/gpioctl dirout-high 11
  sleep 1
  /usr/bin/gpioctl dirout-low 11
  sleep 1
done

Após salvar com o nome de /root/piscaled.sh e sair do editor, usei o comando chmod +x /root/piscaled.sh para torná-lo executável. A partir daí, para rodar, basta digitar o comando /root/piscaled.sh, e o led piscará 3 vezes, com intervalos de 1 segundo.

Vale observar: o shell default do Omega2 é o econômico ash, e não o gigantesco Bash típico de desktops e servidores.

Dica: Se, ao invés de acionar o circuito externo, nós quiséssemos ler o seu valor digital (lembre-se que 3,3V é o limite, nada de plugar circuitos de 5V feitos para o Arduino Uno!), nós primeiro usaríamos o comando gpioctl dirin 11 para colocar o pino 11 em modo de entrada digital, e em seguida usaríamos, quantas vezes desejássemos, o comando gpioctl get 11 para fazer a leitura, que retorna HIGH ou LOW. Antes, é claro, plugaríamos ao pino 11 algum sensor digital, botão ou outro elemento que pudesse oferecer os valores que desejamos ler ;-)

Passo 3: configurar o acesso SSH sem senha interativa

Usuários de Linux no desktop ou em servidores possivelmente já passaram várias vezes pela tarefa de configurar um acesso SSH remoto sem senha, usando autenticação por par de chaves criptográficas.

Quando esse tipo de autenticação está ativa, torna-se mais simples controlar remotamente as operações de um ambiente remoto de forma programável, pois deixa de ser necessária a interação com o usuário (para digitar a senha) a cada estabelecimento de sessão.

Trata-se de um método de segurança baseado na ideia de que o usuário tem uma chave privada cuidadosamente armazenada na sua máquina local. Para cada chave privada existe uma chave pública correspondente, e essa chave pública pode ser divulgada livremente, e armazenada em múltiplos computadores.

Para a conexão ssh, a mágica acontece quando uma chave pública está presente no arquivo de configuração de um usuário (tipicamente em ~/.ssh/authorized_keys), e esse usuário tenta fazer login a partir da máquina em que a chave privada correspondente está armazenada com segurança (com um nome como ~/.ssh/id_dsa ou ~/.ssh/id_rsa). Neste caso, em configurações comuns, o SSH não solicita senha para o login, pois o par de chaves é uma confirmação segura das credenciais do usuário.

O processo de criação e distribuição dessas chaves já foi complicado, mas hoje em dia é tipicamente feito com apenas 3 comandos (no Linux e Mac). Para usuários de Windows que optam pelo cliente SSH Putty, o processo ainda tem vários passos.

Como já vimos no meu artigo introdutório sobre o Onion Omega2, essa interessante plaquinha roda um ambiente Linux bem completo, o que a princípio me levou a acreditar que o mesmo procedimento tradicional (em distribuições Linux de servidores) de configuração de uma chave pública funcionaria na conta do seu usuário default.

Eu estava enganado, mas a razão da diferença está bem justificada: ao invés do servidor OpenSSH, típico de desktops e servidores, o Onion Omega2 adota o Dropbear SSH, que ocupa menos espaço e memória, sendo voltado especificamente para plataformas embarcadas e equipamentos de rede.

O Dropbear SSH é compatível com clientes OpenSSH, mas tem outros métodos de configuração. A diferença fundamental, para a configuração que eu queria fazer, é que as chaves públicas para o usuário root precisam ficar no arquivo /etc/dropbear/authorized_keys.

Assim, como eu já tinha o par de chaves criado na minha máquina desktop (usando o primeiro passo do procedimento de 3 comandos do link acima), bastou criar no Omega2 o arquivo /etc/dropbear/authorized_keys e copiar para ele o conteúdo do arquivo ~/.ssh/id_rsa do meu desktop.

Essa operação pode ser feita copiando e colando num editor de texto (o Omega2 inclui o vi por default), ou com comandos da shell. Eu usei o comando a seguir, rodando no terminal do meu desktop (que é um Mac, mas seria o mesmo comando se fosse Linux):

cat .ssh/id_rsa.pub | ssh root@omega-e60b.local 'cat >> /etc/dropbear/authorized_keys'

É necessário substituir o e60b pelos 4 últimos dígitos em negrito do endereço MAC que vem impresso na sua placa. Esse comando solicitará a senha de root da sua placa Omega2 durante sua execução, mas será última vez que isso vai acontecer ;-)

Passo 4: Controlar remotamente o circuito

Agora que já temos o circuito montado e o comando ssh remoto configurado, basta usar o ssh para enviar comandos para o Omega2 executar. Por exemplo, para acender o led a partir do Terminal do meu desktop, eu digito nele o seguinte comando:

ssh root@omega-e60b.local 'gpioctl dirout-high 11'

Para apagar, a alteração é simples:

ssh root@omega-e60b.local 'gpioctl dirout-low 11'

Uma interação similar poderia ser efetuada para os comandos de leitura do estado dos pinos, que já vimos no passo 1.

Você também pode enviar uma sequência de comandos (separados por ponto e vírgula) para o Omega2, em um mesmo comando ssh do desktop. Por exemplo, para piscar o nome do site em código morse, usando a técnica que já vimos no artigo anterior, eu faria:

ssh root@omega-e60b.local 'echo morse > "/sys/class/leds/omega2:amber:system/trigger" ; echo 150 > "/sys/class/leds/omega2:amber:system/delay" ; echo "BR-Arduino" > "/sys/class/leds/omega2:amber:system/message"'

A mensagem fica piscando continuamente. Para parar, o comando remoto seria:

ssh root@omega-e60b.local 'echo default-on > "/sys/class/leds/omega2:amber:system/trigger"'

E, claro, também podemos comandar a execução de scripts armazenados no Omega2. Para executar o script piscaled.sh (armazenado no próprio Omega2) que eu criei no passo 1, eu posso digitar o seguinte comando no meu desktop:

ssh root@omega-e60b.local '/root/piscaled.sh'

A partir daí, o céu é o limite: você pode incluir esses comandos em scripts shell mais elaborados, ou mesmo (diretamente ou via bibliotecas variadas) em aplicativos desktop ou web (executados no desktop ou em um servidor) para interagir com o seu Omega2, sejam eles em Python, PHP, C, Java ou sua linguagem preferida, desde que tenha algum suporte para fazer chamadas (diretas ou indiretas) ao ssh.

Com isso, e uma quantidade de placas Omega2 adequada ao seu projeto (mais ao menos uma dock de expansão para apoiar o desenvolvimento), todas conectadas via WiFi, você poderá prototipar a aquisição de dados e o acionamento de atuadores de forma simples, até que queira migrar para bibliotecas e formas de controle mais robustas, integradas, escaláveis e que aproveitem com mais eficiência o tráfego de rede, sem tanto overhead a cada estabelecimento de sessão.

Lembrando: o artigo anterior “Onion Omega2: computador para makers, do tamanho de um selo” tem mais detalhes e referências sobre o Omega2, a dock de expansão e seu uso.

Parceria: Usinainfo

Quero agradecer à UsinaInfo, que ofereceu o Omega2 e a Expansion Dock usados neste artigo.

Além de receber material da empresa para os experimentos como parte do acordo de patrocínio, eu já fiz compras de componentes lá, aproveitando a variedade, o estoque bem suprido, as descrições detalhadas e a qualidade do seu sistema de comércio eletrônico. Recomendo sem ressalvas.

Agradeço também pela confiança que ficou expressa nos termos da parceria: a empresa me enviou os componentes necessários ao experimento combinado, mas não fez qualquer exigência sobre a forma e nem buscou exercer controle sobre o que eu fosse escrever. Obrigado, UsinaInfo!

Comentar

Dos leds ao Arduino, ESP8266 e mais

Aprenda eletrônica com as experiências de um geek veterano dos bits e bytes que nunca tinha soldado um led na vida, e resolveu narrar para você o que descobre enquanto explora esse universo – a partir da eletrônica básica, até chegar aos circuitos modernos.

Por Augusto Campos, autor do BR-Linux e Efetividade.net.

Recomendados

Livro recomendado


Artigos já disponíveis

Comunidade Arduino

O BR-Arduino é integrante da comunidade internacional de entusiastas do Arduino, mas não tem relação com os criadores e distribuidores do produto, nem com os detentores das marcas registradas.

Livros recomendados