Qual é a diferença entre MQTT e Web Sockets e quando devo usá-los?

17

Quais são as principais diferenças entre o MQTT e os soquetes da Web?

Ao usar a IoT para automação residencial - controle e monitore o acesso em diferentes dispositivos, qual deles deve ser usado quando a API Rest Rest e a acessibilidade baseada no navegador forem necessárias.

Estou usando Java (Pi4J Library) em um Raspberry Pi 2 B +.

Eu tenho uma configuração de vários sensores, como claro e escuro, umidade, PID etc.

Eu também tenho um servidor em nuvem onde posso enviar os dados, se necessário.

Shakti Phartiyal
fonte
1
Você decide qual usar definindo claramente todos os seus requisitos atuais e prováveis ​​futuros. Em seguida, você gera uma matriz cruzada mostrando qual tecnologia melhor atende aos seus requisitos. Você escolhe usar uma ou mais tecnologias para atender aos seus requisitos.

Respostas:

23

A configuração das perguntas aqui é um pouco enganadora, porque na verdade esses protocolos não podem ser comparados. Eles são como TCP e IP, camadas acima uma da outra. [1]

Websockets é um protocolo de baixo nível para fornecer coisas que o http RESTful 'concorrente' que está no mesmo nível não fornece: um canal sempre aberto sem a necessidade de abrir e fechar a cada solicitação. [2]

O MQTT fornece uma maneira leve de publicar ou assinar dados. A confusão pode ser que essas assinaturas sejam algum tipo de canal, mas esse é um tipo diferente de canal. Para estabelecer uma conexão aberta constante no MQTT, você precisa de Websockets AND MQTT ao mesmo tempo.

Na IoT, assim como em qualquer design, é necessário selecionar se você precisa de um fluxo ou não (WebSockets vs RESTful) e sobre o MQTT, talvez seja necessário pensar se deseja um mecanismo de assinatura e publicação em seu aplicativo.

Em algumas circunstâncias, você pode considerar o MQTT sobre WebSockets, se houver algo em comum. [3]

Responda a pergunta:

Você diz que tem uma configuração de um Rasperry Pi e vários sensores ao redor do local. Se os sensores estiverem longe do Rasperry com seus próprios controladores, você poderá usar o MQTT para coletar os dados. Para armazenar dados na nuvem, envie os dados em HTTP. Na nuvem, forneça dados através do descanso. [4]

Para websockets, não há necessidade, mas se você achar útil, use-o.

Fontes:

[1] https://www.quora.com/What-are-the-pros-and-cons-of-WebSockets-versus-MQTT-as-real-time-web-infrastructure-for-the-Internet-of -Coisas

[2] https://www.pubnub.com/blog/2015-01-05-websockets-vs-rest-api-understanding-the-difference/

[3] /programming/30624897/direct-mqtt-vs-mqtt-over-websocket

[4] http://www.theinternetofthings.eu/antonio-grasso-mqtt-vs-http-what-best-protocol-iot

mico
fonte
3
Também relevante para o seu último ponto: esta resposta de Roger Light, desenvolvedor do broker Mosquitto MQTT, comparando os casos de uso de soquetes brutos com soquetes da Web com MQTT.
Aurora0001
Obrigado mico, que é uma explicação maravilhosa. mas ainda não estou claro o que usar .. o que você recomendaria para o meu cenário?
Shakti Phartiyal
3
Ótima resposta, mas: O uso de "abrir e fechar" WRT WS: // vs. HTTP: // pode ser enganoso; primeiro, as solicitações HTTP 1.1 podem ser canalizadas, portanto, em um soquete literal, uma conexão pode incluir um número indefinido de solicitações sem abrir e fechar nesse sentido. Seria melhor dizer que a vantagem dos websockets é que não há compromisso com um ciclo síncrono de "solicitação e resposta" ; você possui um canal bidirecional aberto com um conjunto mínimo de regras para troca.
goldilocks
"Para estabelecer uma conexão aberta constante no MQTT, você precisa de Websockets AND MQTT ao mesmo tempo." Você tem certeza disso? Por favor, explique por que o MQTT precisa usar o webSockets para manter uma "conexão aberta constante" se o cliente puder continuar publicando pacotes PINGRESP de volta ao servidor? Um cliente que implementa o MQTT enviará um pacote PINGRESP para manter a conexão ativa e um cliente que implementa o webSockets usará keepAlive () para enviar um pacote vazio webSocket.send ('') ao servidor para manter a conexão ativa.
John John
Hmm .. Você pode manter a conexão ativa com esse pacote . Eu descobri que o MQTT funciona sobre TCP / IP (não HTTP). Nesse caso, você pode deixar a conexão aberta.
Mico
9

Eles são comparáveis, pois ambos permitem que você tenha comunicação full-duplex, de modo que o servidor possa passar dados imediatamente para o cliente, sem que o cliente faça pesquisas (como pode ser no HTTP).

No entanto, o Websockets foi projetado para uma conexão ponto a ponto simples entre um cliente e um servidor. O MQTT coloca abstrações extras sobre o envio básico de mensagens, para que várias partes interessadas possam assinar mensagens que possam interessá-las. Portanto, as mensagens podem ser roteadas por 'tópico da mensagem' para que muitos clientes possam compartilhar uma fila nocional, onde um servidor pode optar por ouvir todas as mensagens de todos os clientes, mas também pode filtrar por tópico.

O MQTT possui uma variedade de outros recursos úteis, por exemplo, mensagens retidas, para que os assinantes recebam a mensagem imediatamente, e o LWT (Last Will and Testament), que é uma mensagem que pode ser enviada automaticamente se o cliente se desconectar anormalmente. Em resumo, o MQTT é 'mais alto na pilha', oferecendo recursos e abstrações que um simples Websocket não oferece.

TheMagicCow
fonte