Confusão sobre o estabelecimento de conexão cliente-servidor no MQTT

19

De acordo com as especificações , é sempre o cliente que deve estabelecer a conexão com um servidor.

Cliente:

Um programa ou dispositivo que usa o MQTT. Um cliente sempre estabelece a conexão de rede com o servidor . Pode

  • Publique mensagens de aplicativos nas quais outros clientes possam estar interessados.

  • Inscreva-se para solicitar as Mensagens do aplicativo que ele está interessado em receber.

  • Cancele a inscrição para remover uma solicitação de mensagens do aplicativo.

  • Desconecte do servidor.

E se esse cliente se inscrever para receber uma mensagem do aplicativo, o servidor deverá encaminhar essas mensagens para esse cliente específico.

Servidor:

Um programa ou dispositivo que atua como intermediário entre Clientes que publicam Mensagens de Aplicativo e Clientes que fizeram Assinaturas. Um servidor

  • Aceita conexões de rede de clientes.

  • Aceita mensagens de aplicativos publicadas por clientes.

  • Processos Solicitações de inscrição e cancelamento de inscrição de clientes.

  • Encaminha mensagens de aplicativos que correspondem às assinaturas de clientes .

Isso significa que, se um cliente se inscrever, ele permanecerá conectado ao servidor enquanto a assinatura for válida, mesmo que não haja fluxo de dados na maioria das vezes?

Eu chego a essa conclusão porque, se o cliente se desconectar após a assinatura, um servidor não poderá encaminhar mensagens para ele porque é o cliente que deve estabelecer a conexão. Mas não saberá quando restabelecê-lo.

Bence Kaulics
fonte

Respostas:

11

Isso significa que, se um Cliente se inscrever, ele permanecerá conectado ao servidor enquanto a assinatura for válida, mesmo que não haja fluxo de dados na maior parte do tempo?

Sim, assim que a conexão for estabelecida, o cliente aguardará as mensagens, no entanto, também enviará mensagens PING para o servidor regularmente com base no valor da manutenção de atividade. Se uma mensagem PING não for recebida pelo servidor, ela poderá desconectá-lo.

se o Cliente for desconectado após a assinatura, um servidor não poderá encaminhar mensagens para ele, pois é o Cliente que deve estabelecer a conformidade.

Se o cliente estiver desconectado, sim, ele não receberá mensagens, no entanto, existem recursos no MQTT que solucionam isso.

Se o cliente se conectar ao servidor com o sinalizador 'Limpar sessão' definido como falso, o servidor lembrará a assinatura desse ID do cliente. Depois que o cliente se reconectar, ele não precisará se inscrever novamente, pois o servidor terá se lembrado.

Além disso, você pode se inscrever usando o QoS Nível 1 ou 2. Com esses níveis de QoS, o servidor armazenará mensagens e esperará que o cliente se reconecte antes de enviá-las. Dessa forma, mesmo que o cliente desconecte e reconecte, ainda receberá todas as mensagens publicadas.

Este site possui alguns bons recursos para explicar o protocolo MQTT.

jpwsutton
fonte
9

Isso significa que, se um Cliente se inscrever, ele permanecerá conectado ao servidor enquanto a assinatura for válida, mesmo que não haja fluxo de dados na maior parte do tempo?

Sim, seu cliente aguardará as mensagens.

... se o Cliente for desconectado após a assinatura, um servidor não poderá encaminhar mensagens

Você precisa gerenciar a desconexão (especialmente em dispositivos alimentados por bateria). Isso pode ser feito usando o recurso " última vontade e testamento " do MQTT: quando um dispositivo é desconectado, ele envia uma última mensagem.

Goufalite
fonte
1

Você deve diferenciar conexão e sessão.

Tudo é definido pela sessão. Quando a conexão MQTT é autorizada para o broker pela primeira vez, o broker cria uma sessão para essa conexão, geralmente com base no parâmetro de conexão com o ID do cliente.

No protocolo MQTT 3.1.1 (padrão atualmente na maioria dos clientes / intermediários) durante a conexão, você pode especificar o sinalizador clean = true ou clean = false. Se clean = true, o broker criará automaticamente uma nova sessão e a fechará quando a conexão for interrompida / fechada. Se clean = false, o broker manterá a sessão e entregará os eventos (em algum tipo de armazenamento de sessão) mesmo quando o cliente for desconectado. Depende da implementação dos intermediários, se ela permitir uma sessão clean = false e o que é o máximo ttl dessa sessão.

No protocolo MQTT 5.0 (muito recente, mas em perspectiva), é possível especificar a sessão ttl do lado do cliente ou até alterá-la após a conexão. Isso é extremamente útil para conexões WAN instáveis ​​(principalmente IoT) ou conexões com estado, como você descreveu.

AFAIK actualmente MQTT 5,0 protocolo do ponto de vista do cliente pode ser utilizado em python com gmqtt e em JavaScript com mqtt.js .

shal
fonte