⚠️ O conteúdo desta documentação encontra-se sob revisão pelos desenvolvedores.
Software

Tecnologias de Software

Abaixo são apresentadas as tecnologias de software utilizadas, tanto na concepção do iHorus quanto no Projeto SANEP-I²MF. São elas: a linguagem de programação JavaScript, o JavaScript Object Notation (JSON), a linguagem de programação Python, a linguagem de programação MicroPython, tecnologias empregadas no desenvolvimento Web moderno, o banco de dados PostgreSQL, a plataforma do mensageiro instantâneo Telegram, o Message Queuing Telemetry Transport (MQTT) e, por fim, outras tecnologias pertinentes na concepção da aplicação.

Linguagem de Programação JavaScript

O JavaScript (frequentemente chamado de JS) é uma linguagem de programação leve, interpretada, orientada a objetos (POO) e que tem uma sintaxe muito parecida com a de linguagens como C/C++ e Java, além de diversas inspirações na linguagem Perl. O nome oficial da linguagem, segundo a especificação da European Computer Manufacturer's Association (ECMA), ECMA-262, é ECMAScript. Ela foi padronizada e estabilizada pela associação, conta com diversas implementações do padrão e é mantida pelo mesmo, onde se encontra atualmente na sua sexta versão lançada em 2015.

Em suas versões primárias, os navegadores disponíveis na época tinham embutidos em seu núcleo um interpretador de JavaScript, possibilitando a execução de scripts cuja principal finalidade era a de executar ações de manipulação do Document Object Model (DOM) de uma página, como validar dados de um formulário e executar pequenos cálculos sem a necessidade de uma requisição ao servidor HTTP.

Conforme a tecnologia foi evoluindo, diversas capacidades foram adicionadas à linguagem, como a capacidade de efetuar requisições assíncronas (AJAX), padronização de uma notação para objetos (JSON), entre outras, o que trouxe a criação de diversos frameworks e bibliotecas para facilitar e aprimorar o desenvolvimento fazendo uso da mesma. Estas soluções são convenientes, uma vez que o JavaScript não inclui nenhuma operação do tipo I/O, como instalações de rede, armazenamento ou gráficos. Para isso, é necessário o suporte pelo ambiente host em que ele está inserido.

Com o advento do interpretador de alto desempenho da Google, o Chrome V8, desenvolvido para o seu navegador Google Chrome, foi criada a plataforma Node.js, que possibilitou a execução de scripts utilizando a linguagem pelo lado servidor da aplicação, originando uma nova gama de possibilidades como, por exemplo, a criação de servidores HTTP utilizando JavaScript.

Hoje, a linguagem é baseada em protótipos, é multiparadigma e dinâmica, suportando diversos padrões de orientação, como o de objetos e de eventos, além de modos imperativos e declarativos, como a programação funcional. Além disso, possui APIs propícias para tratamentos de texto, matrizes, datas e expressões regulares, e em conjunto com o HTML e CSS, se torna integrante da tríade de tecnologias que é utilizada hoje na World Wide Web (WWW) para desenvolvimento de sites e aplicações. Isso faz com que o JavaScript seja a escolha principal entre os desenvolvedores para programação do tipo client-side em navegadores Web, e torna a linguagem versátil o suficiente para desenvolver aplicações que compreendam toda a stack de programação.

JavaScript Object Notation (JSON)

O JSON, acrônimo de JavaScript Object Notation, é um formato de dados leve para troca de informações de forma simples e rápida entre sistemas e linguagens distintas. Especificado em 2000 por Douglas Crockford, o padrão aberto utiliza textos que são legíveis a seres humanos e máquinas e são baseados no formato atributo-valor para sua estruturação.

Sua estrutura é de fácil compreensão e conta com diversas ferramentas para interpretação, podendo representar quatro tipos de dados primários (strings, números, booleanos e nulos) e dois tipos estruturados (objetos e vetores).

Ele é amplamente utilizado hoje pelos desenvolvedores devido a sua capacidade de estruturar informações de forma compacta, se comparado a protocolos semelhantes, como o XML. Isso faz com que o parsing destas informações seja mais rápido e torna o JSON o formato ideal para o intercâmbio de dados em ambientes onde seu volume é excessivo. Por utilizar convenções familiares às linguagens de programação mais utilizadas, ele se torna também uma excelente opção para desenvolvedores iniciantes.

Linguagem de Programação Python

O Python é uma linguagem de programação de propósito geral, de alto nível, orientada a objetos, funcional e de tipagem dinâmica e forte. Lançada em 1991 e criada pelo holandês Guido Van Rossum, a linguagem foi criada com o propósito de enfatizar a importância do esforço do programador na escrita do código. Para isso, ela prioriza a legibilidade sobre a velocidade ou expressividade.

Hoje, a linguagem vem sendo empregada em uma ampla variedade de domínios justamente por sua robustez e capacidade de realizar tarefas complexas, e sua popularidade se deve a diversos fatores, como:

  • Sintaxe clara e expressiva.
  • Vasta documentação.
  • Vasto ecossistema de bibliotecas e ferramentas.
  • Curva de aprendizagem inferior a maioria das linguagens semelhantes.
  • Ambiente de desenvolvimento de fácil manipulação.

Devido a suas características, ela é utilizada principalmente no processamento de textos, em dados científicos e em sistemas de Inteligência Artificial. Assim, sua adoção pela comunidade científica costuma ser bastante forte. Todavia, ela é também utilizada como solução de pequenos problemas dentro de grandes aplicações, pois funciona como uma linguagem de script.

Se comparada com a linguagem de programação C, o Python é considerado um ambiente de desenvolvimento mais legível e limpo, talvez pela falta de regras e sintaxes. Ela é, portanto, uma linguagem multiplataforma, e isso faz com que ela funcione da mesma forma em diferentes sistemas operacionais. Esta característica serviu como base para o uso desta linguagem neste trabalho.

Linguagem de Programação MicroPython

O MicroPython é uma implementação de software de código aberto enxuta e eficiente da linguagem de programação Python 3, otimizada para rodar em microcontroladores e ambientes restritos em poder computacional. Ela inclui um pequeno subconjunto das bibliotecas disponíveis na versão não enxuta da linguagem.

Criada pelo programador australiano e físico Damien George, a linguagem suporta dispositivos baseados na arquitetura ARM, entre outros, e necessita de apenas 256kB de espaço para instalação e 16kB de memória para execução de seu firmware.

Com a linguagem, o desenvolvedor pode escrever códigos limpos e simples para realizar o controle de dispositivos físicos sem que seja necessário o uso de outras linguagens de programação, como o C ou C++.

A simplicidade da programação em Python torna o MicroPython uma excelente opção para desenvolvedores iniciantes. Além dessa característica, a linguagem possui algumas funcionalidades únicas que a destacam dentre outras para dispositivos embarcados. São elas:

  • Read-evaluate-print loop (REPL): consiste em um prompt de comandos interativo que tem como propósito conectar o embarcado a um dispositivo I/O para execução de código sem que haja a necessidade de compilar ou realizar o upload do código ao embarcado.
  • Vasto ecossistema de bibliotecas: assim como o Python, o MicroPython possui features extras expandidas por meio de bibliotecas, que podem ser disponibilizadas pelos desenvolvedores. Realizar um parsing em um JSON de um Web Service, fazer a busca de um texto utilizando expressões regulares ou até mesmo utilizar protocolos de rede se torna fácil com o uso das bibliotecas.
  • Extensibilidade: para usuários avançados, há a possibilidade de explorar a versatilidade do MicroPython com as vantagens a baixo-nível do C, podendo realizar o uso contínuo destas duas linguagens conforme necessidade.

Tecnologias Empregadas no Desenvolvimento Web

Desenvolvimento Web é o termo utilizado para descrever a criação de sites e/ou aplicações Web, e refere-se ao processo de construção e testes específicos destes softwares com a finalidade de se obter um conjunto de funções que satisfaçam as necessidades do usuário, podendo variar desde páginas estáticas a aplicações ricas. Neste sentido, é apresentado o React. O React é um framework JavaScript, de front-end, desenvolvido pela equipe do Instagram (adquirido posteriormente pela Meta). Ele foi concebido primariamente para criar interfaces de usuário e, na arquitetura MVC, o framework se encaixaria no V (View) da aplicação, ou seja, não traz componentes para o Model nem para o Controller.

O React permite ao desenvolvedor criar diversos componentes de interface gráfica que podem ser reutilizados de maneira simples, e tem seu estado gerenciado, por padrão, pelo próprio framework Quando um dado utilizado dentro de um componente for atualizado, o componente se atualizará automaticamente. Tal funcionalidade é possível pois o React trabalha utilizando o conceito de Virtual DOM, onde é calculado em quais nodos do DOM existem alterações. Caso haja alterações, esses nodos serão atualizados, gerando assim um grande ganho de performance na aplicação, visto que não é necessário atualizar toda a árvore de objetos a cada atualização de um nodo.

Além disso, o React tem a capacidade de ser executado do lado do servidor graças aos interpretadores de JavaScript. Por si só, o framework não oferece nenhuma diretriz de como se deve organizar o projeto, assim como não tem diversas funcionalidades embutidas.

Existem duas formas de se representar elementos no React: a forma tradicional, na qual se pede ao objeto responsável pela interface de acesso à biblioteca para criar um elemento através de um método definido em sua API, ou utilizando uma sintaxe chamada JSX. No iHorus, está sendo utilizado o JSX. O JSX é a forma onde os elementos podem ser declarados com uma sintaxe que se assemelha muito ao HTML, beneficiando desenvolvedores que estão acostumados com este tipo de sintaxe. Além de permitir declarar elementos de marcação do próprio HTML, como div e span, ele permite representar os componentes criados utilizando o React com a mesma sintaxe.

Juntamente ao framework, é utilizada a biblioteca React Router. O React Router tem como intuito promover a capacidade de navegação e roteamento dentro da aplicação escrita em React. Ela é flexível o suficiente para fornecer a mesma funcionalidade para o caso da aplicação ser processada no lado do servidor, o que torna a mesma essencial para atingir os objetivos aqui propostos.

Por se tratar de uma aplicação Web, modelo cliente-servidor, utiliza-se o conceito de Single Page Application (SPA). Em uma SPA, o conteúdo da página é carregado no momento da primeira requisição ao servidor e, a partir daí, a navegação se torna semântica, ou seja, a interação é feita reescrevendo dinamicamente a página atual com novos dados do servidor Web. Os arquivos são recuperados pelo navegador a cada novo carregamento da página e os dados são carregados dinamicamente e adicionados à página conforme necessidade, geralmente levando em consideração as ações do usuário. Isso traz uma fluidez maior para a aplicação e alivia a carga de processamento no lado do servidor Web.

Como resultado da aplicação destas tecnologias, no seu build, ou seja, na sua construção, são gerados os arquivos HTML (Hypertext Markup Language), CSS (Cascading Style Sheets) e JavaScript, minificados e otimizados para que a aplicação possa ser posta em produção.

Banco de Dados PostgreSQL

O PostgreSQL é um Sistema de Gerenciamento de Banco de Dados (SGBD) objeto relacional, gratuito e de código aberto, desenvolvido inicialmente pelo Departamento de Ciência da Computação da Universidade da Califórnia, Berkeley, em 1998. Ele é amplamente utilizado na indústria devido a sua confiabilidade, integridade de dados e correção, robustez de recursos, extensibilidade e dedicação por parte da comunidade de código aberto no seu desenvolvimento, fornecendo versões com novos recursos, patches de segurança e elevada performance.

O SGBD é compatível com os principais sistemas operacionais da atualidade e é totalmente compatível com ACID, além de ter suporte completo a chaves estrangeiras, junções (JOINs), visões, gatilhos e procedimentos armazenados. Suporta também o armazenamento de objetos binários, incluindo figuras, sons ou vídeos, e possui uma vasta documentação.

Embora seja gratuito, o PostgreSQL possui algumas funcionalidades mais sofisticadas a nível corporativo, como o controle de concorrência multiversionado, recuperando em um ponto no tempo, tablespaces, replicação assíncrona, transações agrupadas, cópias de segurança a quente, um sofisticado planejador de consultas (otimizador) e registrador de transações sequencial (WAL) para tolerância a falhas. Além disso, suporta conjuntos de caracteres internacionais, codificação de caracteres multibyte, Unicode e sua ordenação por localização, sensibilidade à caixa (maiúsculas e minúsculas) e formatação. É altamente escalável, tanto na quantidade enorme de dados que pode gerenciar, quanto no número de usuários concorrentes que pode acomodar.

O PostgreSQL tem também a capacidade de lidar com bancos de dados de tamanho ilimitado, tabelas com tamanho máximo de 32TB, linhas com tamanho máximo de 1,6TB e campos com tamanho máximo de 1GB. Outrossim, seu número de linhas e índices por tabela é ilimitado e o número máximo de colunas pode variar de 250 a 1600 a depender do tipo da coluna. Com isso, o SGBD da liberdade aos desenvolvedores para desenvolver suas aplicações e da autonomia aos administradores para proteger a integridade dos dados e criar ambientes tolerantes a falhas, além de ajudá-los a gerenciá-los. Neste sentido, utiliza-se a plataforma de desenvolvimento PgAdmin, uma ferramenta também open-source e bastante popular no mercado, que pode ser instalada e usada em sistemas como o Windows, Linux, macOS, entre outros.

Plataforma do Mensageiro Instantâneo Telegram

O Telegram é um mensageiro instantâneo totalmente gratuito, baseado em nuvem e disponível para diversas plataformas, como Android, iOS, Windows, macOS, Linux, entre outros, além de sua versão Web. Desenvolvido por Nicolai Durov e Pavel Durov, foi lançado em 2013 com a premissa de ser veloz e simples de se utilizar, tendo como foco principal a segurança entre as comunicações.

Com ele, o usuário pode enviar mensagens, fotos e arquivos de qualquer tipo, assim como criar grupos de até 200,000 pessoas ou canais para transmitir conteúdos para audiências ilimitadas utilizando sincronização contínua. Como resultado, o usuário consegue acessar todas as suas mensagens em tempo real de vários dispositivos ao mesmo tempo. É possível utilizar tanto um número de telefone quanto um nome de usuário, que é público, para comunicação.

Além disso, possui chamadas de voz e vídeo com criptografia de ponta a ponta e possui dois modos de troca de mensagens, o primeiro utilizando criptografia cliente-servidor e o segundo utilizando criptografia end-to-end, permitindo que a conversa seja acessada apenas em uma instância por cada um dos dois participantes. As mensagens podem ser configuradas para se autodestruir em um determinado período de tempo depois de serem lidas, desaparecendo em ambos os dispositivos.

Diferentemente de mensageiros concorrentes, como o WhatsApp, o Telegram possui uma API aberta, o que torna fácil a criação de aplicativos e chatbots utilizando a plataforma. Chatbots são aplicações de terceiros que são executadas dentro do mensageiro e tem como finalidade a interação do usuário com a máquina, ou vice versa, de forma que atenda suas necessidades de maneira rápida e assertiva. Ou seja, eles nasceram de uma necessidade de estreitar relacionamentos e permitir o estabelecimento de uma comunicação imediata, ao passo que também possibilitasse a redução de custos operacionais e a ampliação da capacidade de resposta aos usuários.

Os chatbots no Telegram se comunicam através de requisições HTTPS para a API do mensageiro, e toda a interação parte daí. Por não precisarem de um número de telefone para serem configurados, os bots podem ser facilmente criados por qualquer usuário, bastando apenas obedecer os critérios contidos nos Termos de Uso da plataforma. Estas contas servem, portanto, apenas como uma interface para o código criado e executado por um servidor de terceiros.

No mensageiro, eles têm capacidade de se comunicar, respondendo a mensagens e menções, serem adicionados em grupos, prover notificações a quem possa interessar e até mesmo se integrar a outros serviços e aceitar pagamentos. A plataforma provê toda a estrutura para que o desenvolvedor possa implementar estas funcionalidades, contando sempre com uma vasta documentação e suporte da comunidade.

Message Queuing Telemetry Transport (MQTT)

O Message Queuing Telemetry Transport (MQTT) é um protocolo de comunicação leve, do tipo machine-to-machine (M2M) e que roda sobre o protocolo TCP/IP na camada de aplicação. Inventado e desenvolvido inicialmente pela IBM no final dos anos 90, seu propósito original era vincular sensores em pipelines de petróleo a satélites, trocando mensagens de forma assíncrona entre eles.

Sua estrutura utiliza o padrão de comunicação cliente-servidor e é baseado em publicação e assinatura (publish/subscribe), onde um ou mais clientes, que podem ser qualquer dispositivos dentro da rede IoT, se conectam a um servidor, ou, como é chamado, broker. Clientes podem enviar dados ao broker por meio de publicações, ou receber dados por meio de subscrições, informando um tópico, que é uma forma de organização da informação por parte do broker. A partir daí, o broker distribui os dados recebidos a qualquer subscriber do mesmo tópico.

O gateway concebido na arquitetura do SANEP-I²MF tem o papel de publicar e receber os dados ao broker que por sua vez os encaminha para outros dispositivos subscribers quando os mesmos estiverem escutando, a exemplo do Servidor de Borda, podendo também fazer o caminho inverso. A grande maioria da lógica do protocolo é gerenciada pelo broker, resultando em uma implementação extremamente leve por parte do usuário.

Clientes podem assinar qualquer tópico, e essa conexão pode ser simples ou pode ser uma conexão criptografada do tipo TLS, levando em conta o conteúdo das mensagens. Do ponto de vista da infraestrutura de comunicação, o MQTT pode ser implementado sobre uma vasta gama de tecnologias. Assim, podem existir dispositivos que se comunicam através de cabos de rede, utilizando redes sem fio ou ainda usando comunicação celular ou bluetooth, por exemplo.

Hoje, o MQTT é um padrão aberto para comunicação entre dispositivos, provendo suporte para as mais diversas linguagens de programação, e é considerado um dos padrões disponíveis atualmente para comunicação na IoT, principalmente devido ao seu desempenho em condições de baixa largura de banda de rede e/ou capacidade de recursos limitada.

Outras tecnologias

Além do uso das tecnologias supracitadas, são apresentadas outras ferramentas e tecnologias que não impactam diretamente no funcionamento da solução, porém auxiliam no processo de desenvolvimento e entrega da aplicação.

A começar pelo Redux. O Redux, proveniente da implementação da arquitetura Flux, é um container de estados previsível para aplicações JavaScript. Ele ajuda o desenvolvedor a escrever aplicações que se comportam de forma consistente, rodam em diferentes ambientes e são fáceis de testar. O Redux é utilizado em combinação com o React, visando um controle consistente dos estados da aplicação e do fluxo de execução das operações da solução desenvolvida neste trabalho.

O Flux é a arquitetura para construção de interfaces de usuários, proposta pelo Facebook e comumente adotada como a arquitetura padrão do React. A arquitetura separa a aplicação em diversas camadas, e propõe um fluxo de dados em uma única direção, onde as Views da aplicação geram Actions e essas são encaminhadas ao Dispatcher, que avisa a todas as Stores que estavam registradas com ele sobre a ação. As Stores, por sua vez, lidam com a ação desejada e atualizam seu estado para que a View possa ser atualizada.

Apesar do Redux ser baseado na arquitetura do Flux, ele possui algumas peculiaridades que não seguem à risca os princípios da arquitetura, como por exemplo o Store único e centralizado e o uso de Action Creators, que são responsáveis pela criação das Actions, além de introduzir o conceito de Reducers, entidades com o propósito de manipular o Store com base nas Actions criadas pelos Actions Creators.

Além do Redux, é utilizado também no mesmo escopo o Redux-Saga, cujo objetivo é focar nos efeitos colaterais da aplicação, a exemplo de chamadas assíncronas para busca de dados dentro de uma API, para que as mesmas sejam mais fáceis e simples de se manejar, mais eficientes de se executar e mais fáceis de se testar e manter.

Outra tecnologia utilizada é o Node.js. O Node.js, mencionado na Seção referente a linguagem de programação JavaScript, é um ambiente de execução capaz de interpretar códigos escritos pela linguagem fora de um browser. Seu principal objetivo é permitir a criação de aplicações de rede escaláveis utilizando um modelo orientado a eventos, em contraste de outras soluções que utilizam um modelo orientado a threads, por exemplo.

Junto ao React, é utilizado também o framework AdonisJS. Ele tem como objetivo permitir a criação de um servidor para aplicações Web utilizando o Node.js, ajudando a tratar o fluxo de requisições e respostas da aplicação e facilitando o desenvolvimento através de abstrações de tarefas, como roteamento de páginas, tratamento de cookies e sessions, entre outros.

WebSockets são utilizados no projeto para comunicação assíncrona e bidirecional. Eles se valem de uma única conexão TCP para trafegar em ambas direções, apresentando uma evolução na comunicação do tradicional protocolo HTTP. A especificação descreve o tráfego, entre o cliente e servidor, em um único socket, se comunicando através da porta 80 (no caso do protocolo HTTP) ou da porta 443 (no caso do protocolo HTTPS).

O Webpack é outra tecnologia utilizada. Ela é uma ferramenta cujo objetivo é entregar uma versão modular de todo o código desenvolvido pela aplicação, além de incluir todas as dependências necessárias para executar tarefas, como compilar o código ECMAScript através da ferramenta Babel. O Babel é um compilador JavaScript usado principalmente para converter código ECMAScript em versões compatíveis com as anteriores da linguagem em navegadores ou ambientes atuais e mais antigos.

Para lidar com o download e instalação das dependências previamente citadas, é utilizado o Yarn. O Yarn é um gerenciador de pacotes para o Node.js capaz de baixar e instalar dentro do contexto da aplicação uma gama enorme de bibliotecas e frameworks disponibilizados em sua base de dados. Ele é uma alternativa ao gerenciador de pacotes nativo do Node.js, o Node Package Manager (NPM) e é utilizado devido a sua superior performance.

Além disso, é utilizado também o Nginx. O Nginx é um servidor Web HTTP levíssimo e de código aberto, desenvolvido em 2005 por Igor Vladimirovich Sysoev. Ele é um dos servidores Web mais utilizados do mundo, e muitas vezes é utilizado como proxy reverso em conjunto com servidores Apache. Uma das vantagens do servidor é sua capacidade poderosa de caching, capaz de desonerar muito o sistema na entrega de conteúdo estático, que não precisa ser enviado repetidas vezes para os mesmos clientes.

No lado do servidor, quanto a execução da aplicação, é utilizado o Process Manager 2 (PM2). O PM2 é um gerenciador de processos automatizado e avançado para produção desenvolvido em Node.js e visado para o gerenciamento dessas aplicações. Ele possui seu código aberto, é gratuito e tem como característica principal um Load-Balancing integrado, permitindo que os aplicativos sejam escalonados entre todas as CPUs disponíveis, sem que haja nenhuma modificação no código. Ele permite aos desenvolvedores, portanto, focar no desenvolvimento da aplicação sem se preocupar com a sobrecarga que é necessária para manter um aplicativo ativo e em execução.

Para versionamento do que foi desenvolvido durante o andamento do Projeto SANEP-I²MF, é utilizado o Git. O Git é um sistema de controle de versões distribuído, amplamente utilizado por desenvolvedores, gratuito e de código aberto. Ele se baseia no conceito de repositórios, onde para cada um é armazenado um histórico completo das alterações feitas em seu conteúdo e habilidade total de revisões, permitindo ao desenvolvedor voltar a uma versão de código mais antiga e acompanhar a evolução do projeto ao longo do tempo. Neste ambiente, o Git é usado para acompanhar a evolução do código bem como para realizar a atualização OTA dos Gateways inseridos na arquitetura do projeto.

Existem diversas outras dependências que só fazem sentido se utilizadas em conjunto com dependências maiores, como as diversas bibliotecas para complementar o React e o Redux, por exemplo. Estas não serão citadas por não serem pertinentes diretamente para o funcionamento da aplicação, e sim pertinentes no escopo do pacote a ser utilizado.