O objetivo deste BLOG é demonstrar como é possível utilizar o .NET nanoFramework para programar o módulo U-BLOX NINA W106. Foi utilizado o EVK-NINA-W1 para o teste e exemplo consiste em acessar um servidor MQTT (mqtt.thingstream.io), inscrever em um tópico e então fazer um publish, a inscrição será no mesmo tópico. Mensagens enviadas ao tópico serão exibidas, bem como recebidas.
MQTT
Para os dispositivos de Internet das Coisas (IoT), a conexão com a Internet é um requisito. A conexão com a Internet permite que os dispositivos trabalhem entre si e com serviços de backend. O protocolo de rede subjacente da Internet é o TCP/IP. Desenvolvido com base na pilha TCP/IP, o MQTT (Message Queue Telemetry Transport) tornou-se o padrão para comunicações de IoT.
MQTT
Para os dispositivos de Internet das Coisas (IoT), a conexão com a Internet é um requisito. A conexão com a Internet permite que os dispositivos trabalhem entre si e com serviços de backend. O protocolo de rede subjacente da Internet é o TCP/IP. Desenvolvido com base na pilha TCP/IP, o MQTT (Message Queue Telemetry Transport) tornou-se o padrão para comunicações de IoT.
É um protocolo de mensagens de publicação/assinatura, extremamente simples e leve, projetado para dispositivos restritos e redes de baixa largura de banda, alta latência ou não confiáveis. Os princípios de design são minimizar a largura de banda da rede e os requisitos de recursos do dispositivo, ao mesmo tempo em que tentam garantir a confiabilidade e algum grau de garantia de entrega. Esses princípios também acabam por tornar o protocolo ideal do emergente mundo "máquina para máquina" (M2M) ou "Internet das Coisas" de dispositivos conectados, e para aplicativos móveis onde a largura de banda e a bateria estão em um prêmio.
o custo do Thingstream como um MQTT Broker é muito menor do que o custo daqueles associados ao Azure e AWS;
o gerenciador de fluxo de dados é uma excelente vantagem, dados podem ser tratados no servidor e então encaminhados;
permite programação Node.js;
a segurança é diferente e muito mais simplificada do que tentar fazer uma troca de certificados com a AWS etc;
tem uma conexão segura em vez do dispositivo. Isso realmente simplifica a integração;
capacidade de se inscrever em vários tópicos diferentes;
nós para acessos para vários serviços da AWS Amazon, Azure IoT, IBM Watson, IFTTT (DashBoard e uma infinidade de outras opções)
criação de Coisas (Thing);
monitoração de eventos MQTT;
alertas quando algo não vai bem.
No modo tradicional, se você quer acessar AWS, AZURE, etc:
você deve fazer registro
gerar Certificados
manter, guardar e proteger seus Certificados
despachar cada Certificado um por um para os Devices na produção
você precisa manter identidades diferentes por cada um dispositivo e entregá-los com segurança
fortes impactos na complexidade na logística, produção tempo, configuração do sistema e custos de manutenção
Com ThingStream, se você quer acessar AWS, AZURE, etc:
você deve fazer um registro de CA (certificate authority) (Access ID e Secret Key), exemplo, IAM na AMAZON.
quando você cria um Device (Things) no ThingStream, você deve pegar as credenciais (Username, Password, Client ID) (Device Certificate), basicamente muda Client Id e Password para cada Device
utilize estas credenciais (Things) (Username, Password e Client ID) no Device (U-BLOX NINA W106) para acessar o ThingStream via MQTT
crie Tópicos (Topics) que devem acessados pelos Devices (U-BLOX NINA W106), ou seja, para fazer Publish ou Subscribe
no DATAFLOW manager (Flows), o Nó ThingStream Subscribe deve estar conectado à um Tópico previamente criado para o seu Device (U-BLOX NINA W106), é por ele que começa o disparo para o DATAFLOW manager
Dentro do DATAFLOW pode de ter vários NósThingStream Subscribe
no DATAFLOW manager tenha fácil acesso à AWS, AZURE, etc utilizando Access ID e Secret Key e então solicite os serviços disponíveis (S3, LAMBDA, etc) (No caso da AMAZON)
Planos acessíveis
"Ao contrário do Arduino (por exemplo) você pode fazer debug a sério do código que está executando. Sem necessitar de ligações ou hardware complexo com o JTAG no caso de programação C pura."
.NET nanoFramework é uma plataforma livre e de código aberto que permite a escrita de aplicativos de código gerenciados para dispositivos incorporados restritos. É adequado para muitos tipos de projetos, incluindo sensores de IoT, wearables, prova acadêmica de conceito, robótica, criações de hobistas/fabricantes ou até mesmo equipamentos industriais complexos. Isso torna o desenvolvimento dessas plataformas mais fácil, rápido e menos caro, dando aos desenvolvedores incorporados acesso a tecnologias e ferramentas modernas usadas pelos desenvolvedores de aplicativos desktop.
Os desenvolvedores podem aproveitar o poderoso e familiar Microsoft Visual Studio IDE e seu conhecimento .NET C# para escrever rapidamente código sem ter que se preocupar com os meandros de hardware de baixo nível de um microcontrolador. Os desenvolvedores do Desktop .NET se sentirão "em casa" e poderão usar suas habilidades no desenvolvimento de sistemas embarcados, ampliando o pool de desenvolvedores embarcados qualificados.
Ele inclui uma versão reduzida do CLR (Common Language Runtime, tempo de execução da linguagem comum .NET) e possui um subconjunto das bibliotecas de classe base .NET, juntamente com as APIs mais comuns incluídas na Universal Windows Platform (UWP) permitindo o reaproveitamento de códigos de aplicativos de desktop, aplicativos IoT Core, milhares de exemplos de código e projetos de código aberto.
Usando o Microsoft Visual Studio, um desenvolvedor pode implantar e depurar o código diretamente em hardware real.
É uma ferramenta global .NET Core CLI que permite atualizar um alvo nanoFramework com nanoBooter, nanoCLR, aplicativo gerenciado ou arquivos de backup. Faz parte da caixa de ferramentas nanoFramework, juntamente com outras várias ferramentas que são necessárias no desenvolvimento, uso ou gerenciamento de repositório do nanoFramework. Uma vez instalado é necessário atualizar o UBLOX NINA W106.
Crie um Projeto Blank com .NET nanoFramework (Blank Application nanoFramework)
Abra um repositório GIT para exemplos .NET
https://github.com/nanoframework/Samples.git
Vários exemplos em .NET nanoFramework
Abrindo o exemplo MQTT
Altere o código para
usingSystem;usingSystem.Diagnostics;usingSystem.Threading;usingSystem.Text;usingnanoFramework.M2Mqtt;usingnanoFramework.M2Mqtt.Messages;usingnanoFramework.Networking;namespaceTestMqtt{publicclassProgram{publicstaticvoidMain(){Debug.WriteLine("Acessing MQTT ThingStream");Thread.Sleep(1);// STEP 1: setup network
// You need to set WiFi connection credentials in the configuration first!
// Go to Device Explorer -> Edit network configuration -> WiFi proiles and set SSID and password there.
WifiConnect();// STEP 2: connect to MQTT broker
// Warning: test.mosquitto.org is very slow and congested, and is only suitable for very basic validation testing.
// Change it to your local broker as soon as possible.
varclient=newMqttClient("mqtt.thingstream.io");client.Connect("device:352fc9a7-xxxx-4e46-8a9a-a390f2xxxx86","I7UPHZWCKHZASRXXXXXX","n6omeX6qvfBpKXYXQ8AgYn1DqpZJa0lpBCI8yhzw");// STEP 3: subscribe to topics you want
client.Subscribe(new[]{"ublox-sniffer/a4cf127531c8/ble"},new[]{MqttQoSLevel.AtLeastOnce});client.MqttMsgPublishReceived+=HandleIncomingMessage;// STEP 4: publish something and watch it coming back
for(inti=0;i<5;i++){client.Publish("esp32-sniffer/a4cf127531c8/ble",Encoding.UTF8.GetBytes("===== Hello MQTT! ====="),MqttQoSLevel.AtLeastOnce,false);Thread.Sleep(10000);}// STEP 5: disconnecting
client.Disconnect();// App must not return.
Thread.Sleep(Timeout.Infinite);}privatestaticvoidHandleIncomingMessage(objectsender,MqttMsgPublishEventArgse){Debug.WriteLine($"Message received: {Encoding.UTF8.GetString(e.Message, 0, e.Message.Length)}");}privatestaticvoidClient_MqttMsgSubscribed(objectsender,MqttMsgSubscribedEventArgse){Debug.WriteLine("Client_MqttMsgSubscribed ");}privatestaticvoidClient_MqttMsgPublishReceived(objectsender,MqttMsgPublishEventArgse){stringtopic=e.Topic;stringmessage=Encoding.UTF8.GetString(e.Message,0,e.Message.Length);Debug.WriteLine("Publish Received Topic:"+topic+" Message:"+message);Thread.Sleep(1);}privatestaticvoidWifiConnect(){// Give 60 seconds to the wifi join to happen
CancellationTokenSourcecs=new(60000);// Conectar usando o autoreconnect, DHCP e horário local
varret=WiFiNetworkHelper.ScanAndConnectDhcp("TP-Link_A358","xxxxxxxx",requiresDateTime:true);// Caso conectar apenas sai do método
if(ret){Debug.WriteLine($"Connect to the network: {WiFiNetworkHelper.Status}");return;}Debug.WriteLine($"Can't connect to the network, error: {WiFiNetworkHelper.Status}");// Caso contrario, entra num loop com sleep de 500ms até conectar
do{try{Debug.WriteLine("Tryng Reconnect");WiFiNetworkHelper.Reconnect();}catch{Thread.Sleep(500);}}while(!ret);}}}
Nenhum comentário:
Postar um comentário