Índice:

MONITOR DE NUVEM Com AWS & ARDUINO - Menino Elétrico: 6 Passos
MONITOR DE NUVEM Com AWS & ARDUINO - Menino Elétrico: 6 Passos

Vídeo: MONITOR DE NUVEM Com AWS & ARDUINO - Menino Elétrico: 6 Passos

Vídeo: MONITOR DE NUVEM Com AWS & ARDUINO - Menino Elétrico: 6 Passos
Vídeo: Programador Sênior VS júnior #short #shorts 2024, Novembro
Anonim
CLOUD MONITOR With AWS & ARDUINO - Electric Boy
CLOUD MONITOR With AWS & ARDUINO - Electric Boy

É um projeto simples - acender uma luz quando algo der errado … Cada vez mais entorpecido com notificações com tantos painéis em nossos computadores hoje em dia, como podemos ter certeza de não perder os realmente importantes. A resposta é um indicador de status físico. Ou, mais específico para a tarefa, um Cloud Monitor, que pode ficar na sua mesa - sempre à vista. Como o nome sugere, o monitor ajudará a ficar de olho na saúde de seus serviços em nuvem (… ou qualquer outra coisa realmente, o céu é o limite, desculpe o trocadilho). Até você, como eu, precisa fazer um? Mesmo se não, você pode ter uma ideia para um futuro projeto de IoT.

Bem, se você estiver pronto, vamos começar!

Etapa 1: componentes, suprimentos, ferramentas necessárias, aplicativos e serviço online

COMPONENTES E SUPRIMENTOS

_ Arduino Micro e Genuino Micro (1 unidade) … ou qualquer Arduino menor compatível - no meu caso, um Freetronics LeoStick (https://www.freetronics.com.au/collections/arduino/products/leostick)

_ ThingM BlinkM - LED RGB controlado I2C (1 unidade)

_ Mini nuvem de luz (1 unidade) … ou qualquer outro vaso translúcido de sua escolha

_ Cabo USB-A para B (1 unidade) … ou qualquer cabo USB antigo com plugue tipo A

FERRAMENTAS NECESSÁRIAS

_ Ferro de soldar (genérico)

APLICATIVOS E SERVIÇO ONLINE

_ Amazon Web Services AWS Lambda (https://aws.amazon.com/it/lambda/)

_ Amazon Web Services AWS IoT (https://aws.amazon.com/it/iot/)

Etapa 2: Hardware

Hardware
Hardware
Hardware
Hardware

A luz noturna já vem com um LED embutido - branco frio no meu caso. Achei que seria bom indicar diferentes status por cores diferentes. Então, eu apenas mantive o invólucro em forma de nuvem. Para o cérebro da operação, escolhi o menor Arduino compatível que tinha disponível: o Freetronics LeoStick tem sido minha plataforma de prototipagem preferida há anos e tenho muitas peças sobressalentes. Ele vem carregado com coisas boas: um alto-falante piezoelétrico, dois LEDs RGB (um está ligado à energia, embora RX e TX) e o melhor de tudo, você pode simplesmente conectá-lo a uma porta USB - nenhum FTDI externo ou cabo necessário. Também é pequeno, mas compatível com a placa de ensaio.

Por que não escolhi um ESP8266? Para ser verdadeiramente sem fio, você também pode cortar o cabo de alimentação - o que torna as coisas um pouco mais complicadas para adicionar uma bateria e o inconveniente de recarregar. Como o monitor em nuvem ficará próximo ao meu computador, é muito mais fácil usar a alimentação USB. Além disso, configurar a conexão Wi-Fi nem sempre é simples. Com base no ATmega32u4, o Arduino Micro e o LeoStick compartilham a estranheza de ter dados I2C no D2 e relógio no D3. Isso se torna relevante ao conectar o LED BlinkM RGB. Ao contrário das placas Atmega328 comuns, onde você pode simplesmente conectar a blindagem BlinkM nos conectores A2.. A5, isso não funcionará aqui (não me incomodei com a biblioteca I2C soft).

Ao dessoldar os cabeçalhos macho VCC e GND no BlinkM, eu poderia estendê-los com fio e manter tudo em um pequeno pacote plugável. O BlinkM tem seu próprio microcontrolador a bordo e permite aplicações avançadas: por ex. reproduza padrões de cores com script sem um Arduino conectado. Quase sinto que um WS2812 (Adafruits NeoPixels são ótimos) teria me servido melhor - infelizmente, não tinha nenhum disponível. Para finalizar a parte do hardware, cortei a extremidade oposta do plugue USB macho tipo A, passei-o por um orifício pré-perfurado perto da base da luz da nuvem e soldei os fios ao LeoStick (vermelho: 5V, branco: Dados-, verde: Dados +, preto: Terra).

Etapa 3: Arquitetura da Solução

Arquitetura da Solução
Arquitetura da Solução
Arquitetura da Solução
Arquitetura da Solução

O único requisito forte que me impus foi fazer com que o monitor rodasse atrás de um firewall. Embora seja um recurso crucial, isso tornou os web hooks para alterações de eventos impraticáveis. Um mecanismo de pesquisa é caro em termos de tráfego TCP e pode atrasar eventos dependendo da frequência de pesquisa.

A solução é encontrada em WebSockets que fornecem comunicação full-duplex. O serviço Amazon IoT fornece um agente de mensagens que suporta MQTT sobre WebSockets. Acontece que o serviço pode ser chamado sem a necessidade de configurar Coisas, Sombras, Políticas ou Regras.

Há um SDK de dispositivo disponível para o Arduino Yún e alguns esforços são feitos para portar o SDK para outras plataformas como o ESP8266. Mas como o monitor sempre estará conectado por interface serial, decidi desde o início ter um aplicativo NodeJS (executado no computador desktop) para implementar a API do cliente e usar o Arduino apenas para receber e exibir códigos de cores. Dessa forma, as alterações podem ser feitas facilmente em JavaScript, sem ter que se preocupar com uploads de firmware. Para testar um pequeno exemplo de infraestrutura é necessário. Digamos que temos um balanceador de carga habilitado em zonas de disponibilidade que faz verificações de integridade em uma instância de servidor da web e políticas de escalonamento automático com base na carga da CPU. O modelo CloudFormation correspondente pode ser ▶ ️ visualizado no Designer ou ▶ ️ criado diretamente no console. Nota: alguns dos serviços nesta pilha podem incorrer em cobranças.

Estendi o modelo com propriedades para a função Lambda e as permissões necessárias. Posteriormente, exige que o ponto de extremidade da API REST da IoT seja inserido como um parâmetro. Para automatizar isso, escrevi um pequeno script de shell que usa a CLI para solicitar o ARN (> aws iot describe-endpoint) e, em seguida, chama create-stack com o parâmetro in-line. Ou você ainda pode fazer isso manualmente:

// RETRIVE IoT REST API ENDPOINT

aws iot describe-endpoint

// CREATE STACK> aws cloudformation create-stack --stack-name MiniCloudMonitor --template-body file: //cfn-template.json --parameters ParameterKey = IotRestApiEndpoint, ParameterValue = {IoT_REST_API_ENDPOINT} --capabilities CAPABILITY_NAMED_IAM

// DELETE STACK> aws cloudformation delete-stack --stack-name MiniCloudMonitor

O ideal é usar os mesmos limites de alarme que acionam o escalonamento automático, para também chamar a função Lambda e assim atualizar o status do monitor. Atualmente, isso só é possível ao usar SNS como um intermediário. Na época, essa camada extra parecia redundante e decidi usar as regras de ciclo de vida do CloudWatch EC2 para chamar o Lambda diretamente. Ainda assim, quero explorar a opção de SNS → Lambda no futuro.

Etapa 4: Software

Comecei escrevendo o Arduino Sketch. O loop principal () está lendo Chars da conexão serial e construindo uma String até receber um caractere de nova linha. Em seguida, assume-se que um código de cor hexadecimal foi enviado e o comando I2C apropriado é gravado no LED BlinkM. Não se trata tanto de eficiência quanto de conveniência. As fontes completas para este Sketch e outros arquivos podem ser obtidas no GitHub. A seguir estão alguns snippets de código relevantes:

void loop () {

while (Serial.available ()) {

char inChar = (char) Serial.read ();

if (inChar == '\ n') {

número longo = strtol (inputString.c_str (), NULL, 16);

byte r = número >> 16;

byte g = número >> 8 & 0xFF;

byte b = número & 0xFF;

BlinkM_fadeToRGB (blinkm_addr, r, g, b);

inputString = "";

} outro {

inputString + = inChar;

}

}

}

O aplicativo NodeJS deve implementar interfaces para AWS e Arduino. Posteriormente, pode ser realizado em apenas algumas linhas de código ao usar o excelente pacote serialport:

var serialport = require ('serialport'); port = new serialport (PORT_COM_NAME, {

baudRate: SERIAL_BAUD_RATE

});

port.on ('abrir', função () {

});

port.on ('erro', função (errar) {

});

Conectar-se ao AWS IoT também não exige muito esforço. A única armadilha é saber que o uso de MQTT + WebSockets na porta 443 requer autenticação por meio de chaves de acesso. O SDK irá lê-los nas variáveis de ambiente. Pode ser necessário exportar explicitamente AWS_ACCESS_KEY_ID e AWS_SECRET_ACCESS_KEY.

var awsiot = require ('aws-iot-device-sdk'); var device = awsiot.device ({

clientId: 'MiniCloudMonitor-' + (Math.floor ((Math.random () * 100000) + 1)), região: AWS_REGION, protocolo: 'wss', porta: 443, debug: true

});

device.on ('conectar', função () {

device.subscribe (MQTT_TOPIC);

});

device.on ('mensagem', função (tópico, carga útil) {

if (porta && carga útil && tópico == MQTT_TOPIC) {

var mensagem = JSON.parse (carga útil);

if (message.hasOwnProperty (MQTT_JSON_KEY))

{ Retorna;

}

}

});

A função Lambda aceita um código de cor como parâmetro de entrada - não é bonito, mas muito flexível neste estágio. Para poder publicar no tópico MQTT, ele instancia um objeto IotData, que requer o terminal da API REST IoT. O modelo CloudFormation cuidou disso durante a criação da pilha.

var AWS = require ('aws-sdk'); var mqtt = new AWS. IotData ({

endpoint: process.env. MQTT_ENDPOINT});

exportações.handler = função (evento, contexto, retorno de chamada) {

var params = {

tópico: process.env. MQTT_TOPIC, carga útil: '{ "color \": / "' + event.colour + '\"}', qos: 0

};

mqtt.publish (params, function (err, data) {

retorno de chamada (errar);

});

};

Etapa 5: Conclusão

Eu realmente gostei de trazer um evento virtual "nascido" na nuvem para o mundo físico. E como meu projeto de estimação, foi muito divertido. Para levar isso para o próximo nível, eu consideraria …

  • melhorando a robustez e o tratamento de exceções
  • explore melhores maneiras de integrar as métricas de nuvem da AWS
  • experimente mais indicadores físicos, como medidores, gráficos de barras, …
  • tem a opção de mudar para outras plataformas como Azure, Google, Heroku, …
  • monitorar eventos específicos de aplicativos para Jenkins, GitHub, …

Espero que tenha gostado de ler este guia e talvez até tenha aprendido algo novo ao longo do caminho. Se você puder pensar em uma maneira diferente / melhor de fazer as coisas, compartilhe nos comentários abaixo. E, claro, se você detectar erros, um aviso será muito apreciado. Obrigado pelo seu tempo.

Recomendado: