{"id":143,"date":"2019-03-23T12:03:36","date_gmt":"2019-03-23T15:03:36","guid":{"rendered":"http:\/\/fabiobrandao.net.br\/blog\/?p=143"},"modified":"2019-03-23T13:04:13","modified_gmt":"2019-03-23T16:04:13","slug":"o-que-e-mqtt","status":"publish","type":"post","link":"https:\/\/fabiobrandao.net.br\/blog\/novidades-e-curiosidades\/o-que-e-mqtt\/","title":{"rendered":"O que \u00e9 MQTT"},"content":{"rendered":"<p><strong>Mqtt<\/strong> (Message Queue Telemetry Transport) \u00e9 um protocolo de conectividade M2M (M\u00e1quina M\u00e1quina) para comunica\u00e7\u00e3o ass\u00edncrona.\u00a0O protocolo \u00e9 baseado em publish\/subscribe onde um cliente pode se inscrever em um ou mais t\u00f3picos e receber mensagens que outros clientes publicam sobre estes temas.\u00a0Em geral, o ambiente MQTT consiste de m\u00faltiplos clientes e um servidor, chamado corretor ou broker.<\/p>\n<p>Desenvolvido pela IBM e Eurotech, o protocolo MQTT \u00e9 lan\u00e7ado como um padr\u00e3o aberto e a ser desenvolvido pelo <a href=\"https:\/\/www.oasis-open.org\">OASIS<\/a> (Organiza\u00e7\u00e3o para o Avan\u00e7o da informa\u00e7\u00e3o estruturada padr\u00e3o), um cons\u00f3rcio sem fins lucrativos que impulsiona o desenvolvimento, a converg\u00eancia e a ado\u00e7\u00e3o de padr\u00f5es abertos.<\/p>\n<h2>Fundamentos do MQTT<\/h2>\n<p>O protocolo MQTT \u00e9 uma alternativa excelente para os dispositivos de Internet das Coisas (IoT) e hoje \u00e9 praticamente um padr\u00e3o neste sentido j\u00e1 que \u00e9 um protocolo leve e flex\u00edvel, podendo ser implementado em hardwares com poucos recursos e trabalhar em redes com largura de banda limitada e alta lat\u00eancia.<\/p>\n<p>Vamos conhecer alguns dos conceitos fundamentais do MQTT:<\/p>\n<h3>Broker MQTT<\/h3>\n<p>O broker ou corretor \u00e9 o intermedi\u00e1rio no processo de comunica\u00e7\u00e3o, atuando como um servidor. Cada dispositivo dever\u00e1 estabelecer uma conex\u00e3o com o broker para a troca de mensagens. Existem v\u00e1rias op\u00e7\u00f5es dispon\u00edveis no mercado, por exemplo:<\/p>\n<ul>\n<li>RabbitMQ<\/li>\n<li>Mosquitto<\/li>\n<li>GnatMQ<\/li>\n<\/ul>\n<p>Normalmente o servidor utiliza as portas 1883 e 8883 para o transporte de dados em uma conex\u00e3o TCP\/IP e uso de criptografia (SSL\/TLS).<\/p>\n<h3>Client MQTT<\/h3>\n<p>O cliente \u00e9 uma implementa\u00e7\u00e3o de software respons\u00e1vel por estabelecer e manter uma conex\u00e3o com o broker, enviar e receber as mensagens.\u00a0A conex\u00e3o \u00e9 feita geralmente via TCP\/IP, com op\u00e7\u00f5es de login (usu\u00e1rio e senha) e uso de criptografia (SSL\/TLS).<\/p>\n<p>Um cliente pode ser um sensor de IoT em campo ou um aplicativo em um data center que processa dados de IoT.<\/p>\n<p>Todo processo de conex\u00e3o estabelece tamb\u00e9m um n\u00edvel de qualidade de servi\u00e7o (QoS, de Quality of Service) desejado, indicando como deve ser a rela\u00e7\u00e3o entre os elementos comunicantes. S\u00e3o previstos tr\u00eas n\u00edveis de qualidade de servi\u00e7o:<\/p>\n<ul>\n<li><strong>QoS 0<\/strong> (at most once): \u00c9 o que conhecemos como \u201cbest effort\u201d, ou melhor esfor\u00e7o. Assemelha-se ao protocolo de transporte UDP, onde n\u00e3o se tem confirma\u00e7\u00f5es de entrega de mensagem. Quem envia tamb\u00e9m n\u00e3o tem a obriga\u00e7\u00e3o de manter a mensagem armazenada para futuras retransmiss\u00f5es;<\/li>\n<li><strong>QoS 1<\/strong> (at least once): Neste n\u00edvel existe a confirma\u00e7\u00e3o de entrega de uma mensagem. Atende situa\u00e7\u00f5es onde quem envia acaba gerando v\u00e1rias mensagens iguais possivelmente por um atraso na chegada de confirma\u00e7\u00e3o de recebimento. Neste caso, \u00e9 garantido que uma delas ter\u00e1 o reconhecimento realizado. Note que existe um armazenamento da mensagem por parte de quem envia at\u00e9 a posterior confirma\u00e7\u00e3o;<\/li>\n<li><strong>QoS 2<\/strong> (exactly once): Garante que a mensagem seja entregue exatamente uma vez, com envio de confirma\u00e7\u00f5es de recebimento e confirma\u00e7\u00f5es de recebimento de confirma\u00e7\u00f5es de recebimento. Parece confuso, mas n\u00e3o \u00e9, apenas existem confirma\u00e7\u00f5es nos dois sentidos, para tudo que \u00e9 trafegado. Enquanto uma mensagem n\u00e3o \u00e9 confirmada, ela \u00e9 mantida. \u00c9 um caso mais pr\u00f3ximo do protocolo de transporte TCP.<\/li>\n<\/ul>\n<p>N\u00e3o existe um QoS melhor ou pior, isto ir\u00e1 depender de cada cen\u00e1rio de aplica\u00e7\u00e3o do MQTT, da qualidade do link de comunica\u00e7\u00e3o, dos recursos dispon\u00edveis no seu sensor, etc. Cada n\u00edvel de QoS \u00e9 negociado entre o cliente e o broker, n\u00e3o entre o publicador e o subscritor. Assim, \u00e9 poss\u00edvel ter uma publica\u00e7\u00e3o em QoS 0 e uma subscri\u00e7\u00e3o em QoS 2, para um mesmo t\u00f3pico.<\/p>\n<h3>T\u00f3picos, publish e subscribe<\/h3>\n<p>Podemos entender os t\u00f3picos como os assuntos de interesse para uma comunica\u00e7\u00e3o. Para receber ou enviar mensagens para outros dispositivos conectados ao broker voc\u00ea dever\u00e1 fazer isso sempre indicando o t\u00f3pico de interesse. Para enviar uma mensagem ser\u00e1 necess\u00e1rio fazer um <strong>publish<\/strong> para um t\u00f3pico e para receber mensagens ser\u00e1 necess\u00e1rio fazer o <strong>subscribe<\/strong> de um t\u00f3pico. Os n\u00edveis de um t\u00f3pico s\u00e3o separados por &#8220;\/&#8221;.<\/p>\n<p>Podemos usar alguns caracteres coringas em rela\u00e7\u00e3o aos t\u00f3picos:<\/p>\n<ul>\n<li>+ &#8211; Coringa, qualquer informa\u00e7\u00e3o naquele n\u00edvel (Ex: topic\/topic\/+\/topic)<\/li>\n<li># &#8211; Qualquer coisa abaixo daquele n\u00edvel (Ex: topic\/topic\/#)<\/li>\n<li>$ &#8211; T\u00f3picos iniciados com $ s\u00e3o especiais usados internamente pelo broker. No mosquito por exemplo $SYS\/broker\/clients\/total pega a quantidade de clientes ativos.<\/li>\n<\/ul>\n<p>As mensagens podem ser enviadas em v\u00e1rios formatos j\u00e1 que o MQTT n\u00e3o imp\u00f5e restri\u00e7\u00f5es sobre isso, sendo assim o\u00a0aplicativo pode usar qualquer formato de dados para a carga \u00fatil como JSON, XML, bin\u00e1rio criptografado ou Base64, desde que os clientes de destino possam analisar a carga \u00fatil.<\/p>\n<h2>Conclus\u00e3o<\/h2>\n<p>Neste post apresentei uma introdu\u00e7\u00e3o t\u00e9cnica ao protocolo MQTT. Em um pr\u00f3ximo post vamos ver como colocar um servidor MQTT para trabalhar e implementar um cliente MQTT. At\u00e9 l\u00e1! \ud83d\ude09<\/p>\n<p>&nbsp;<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Mqtt (Message Queue Telemetry Transport) \u00e9 um protocolo de conectividade M2M (M\u00e1quina M\u00e1quina) para comunica\u00e7\u00e3o ass\u00edncrona.\u00a0O protocolo \u00e9 baseado em publish\/subscribe onde um cliente pode se inscrever em um ou&#8230; <\/p>\n","protected":false},"author":1,"featured_media":145,"comment_status":"closed","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"_exactmetrics_skip_tracking":false,"_exactmetrics_sitenote_active":false,"_exactmetrics_sitenote_note":"","_exactmetrics_sitenote_category":0,"footnotes":""},"categories":[24,17],"tags":[25,23],"class_list":["post-143","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-iot","category-novidades-e-curiosidades","tag-iot","tag-mqtt"],"_links":{"self":[{"href":"https:\/\/fabiobrandao.net.br\/blog\/wp-json\/wp\/v2\/posts\/143","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/fabiobrandao.net.br\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/fabiobrandao.net.br\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/fabiobrandao.net.br\/blog\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/fabiobrandao.net.br\/blog\/wp-json\/wp\/v2\/comments?post=143"}],"version-history":[{"count":11,"href":"https:\/\/fabiobrandao.net.br\/blog\/wp-json\/wp\/v2\/posts\/143\/revisions"}],"predecessor-version":[{"id":155,"href":"https:\/\/fabiobrandao.net.br\/blog\/wp-json\/wp\/v2\/posts\/143\/revisions\/155"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/fabiobrandao.net.br\/blog\/wp-json\/wp\/v2\/media\/145"}],"wp:attachment":[{"href":"https:\/\/fabiobrandao.net.br\/blog\/wp-json\/wp\/v2\/media?parent=143"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/fabiobrandao.net.br\/blog\/wp-json\/wp\/v2\/categories?post=143"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/fabiobrandao.net.br\/blog\/wp-json\/wp\/v2\/tags?post=143"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}