O MQTT é um protocolo de mensagens leve de publicação / assinatura. É útil para uso com sensores de baixa potência, mas é aplicável a muitos cenários.
Para informações mais completas sobre o MQTT, consulte
http://mqtt.org/ .Publicar / Assinar
O protocolo MQTT é baseado no princípio de publicar mensagens e assinar tópicos, ou "pub / sub". Vários clientes se conectam a um broker e se inscrevem em tópicos nos quais estão interessados. Os clientes também se conectam ao broker e publicam mensagens nos tópicos. Muitos clientes podem se inscrever nos mesmos tópicos e fazer as informações que desejarem. O broker e o MQTT atuam como uma interface simples e comum para tudo para se conectar. Isso significa que se você tiver clientes que descarregam mensagens assinadas para um banco de dados, para o Twitter, Cosm ou até mesmo um arquivo de texto simples, torna-se muito simples adicionar novos sensores ou outra entrada de dados a um banco de dados, Twitter ou assim por diante.Tópicos / Assinaturas
Mensagens no MQTT são publicadas nos tópicos. Não há necessidade de configurar um tópico, publicar nele é o suficiente. Os tópicos são tratados como uma hierarquia, usando uma barra (/) como separador. Isso permite que uma organização sensata de temas comuns seja criada, da mesma maneira que um sistema de arquivos. Por exemplo, vários computadores podem publicar suas informações de temperatura do disco rígido no tópico a seguir, com seu próprio computador e o nome do disco rígido sendo substituído conforme apropriado:- sensors / COMPUTER_NAME / temperature / HARDDRIVE_NAME
+ ou # . + pode ser usado como curinga para um único nível de hierarquia. Pode ser usado com o tópico acima para obter informações sobre todos os computadores e discos rígidos da seguinte maneira: - sensores / + / temperatura / +
- a / b / c / d
- + / b / c / d
- a / + / c / d
- um / + / + / d
- + / + / + / +
- abc
- b / + / c / d
- + / + / +
# pode ser usado como curinga para todos os níveis restantes de hierarquia. Isso significa que ele deve ser o caractere final de uma assinatura. Com um tópico de "a / b / c / d", as seguintes assinaturas de exemplo corresponderão: - a / b / c / d
- #
- uma/#
- a / b / #
- abc/#
- + / b / c / #
Qualidade de serviço
O MQTT define três níveis de Qualidade de Serviço (QoS). A QoS define quão difícil o brocker / cliente tentará garantir que uma mensagem seja recebida. As mensagens podem ser enviadas em qualquer nível de QoS e os clientes podem tentar assinar tópicos em qualquer nível de QoS. Isso significa que o cliente escolhe o máximo de QoS que receberá. Por exemplo, se uma mensagem for publicada na QoS 2 e um cliente estiver inscrito com QoS 0, a mensagem será entregue a esse cliente com QoS 0. Se um segundo cliente também estiver inscrito no mesmo tópico, mas com QoS 2, ele receberá a mesma mensagem, mas com a QoS 2. Para um segundo exemplo, se um cliente estiver inscrito na QoS 2 e uma mensagem for publicada na QoS 0, o cliente a receberá na QoS 0.Níveis mais altos de QoS são mais confiáveis, mas envolvem maior latência e maiores requisitos de largura de banda.
- 0: O brocker / cliente entregará a mensagem uma vez, sem confirmação.
- 1: O brocker / cliente entregará a mensagem pelo menos uma vez, com a confirmação necessária.
- 2: O brocker / cliente entregará a mensagem exatamente uma vez usando um handshake de quatro etapas.
Installing the MQTT
mosquitto
sudo wget https://repo.mosquitto.org/debian/mosquitto-repo.gpg.key
sudo apt-key add mosquitto-repo.gpg.key
cd /etc/apt/sources.list.d/
sudo wget http://repo.mosquitto.org/debian/mosquitto-stretch.list
sudo apt-get update
Cliente
sudo apt-get install mosquitto mosquitto-clients
sudo apt-get install python-pip
sudo pip install paho-mqtt
Configuração
sudo /etc/init.d/mosquitto stop
sudo nano /etc/mosquitto/mosquitto.conf
# Place your local configuration in /etc/mosquitto/conf.d/
#
# A full description of the configuration file is at
# /usr/share/doc/mosquitto/examples/mosquitto.conf.example
pid_file /var/run/mosquitto.pid
persistence true
persistence_location /var/lib/mosquitto/
log_dest topic
log_type error
log_type warning
log_type notice
log_type information
connection_messages true
log_timestamp true
include_dir /etc/mosquitto/conf.d
Testando
sudo /etc/init.d/mosquitto start
Iniciando server
mosquitto_sub -d -t hello/world
Enviando mensagem
mosquitto_pub -d -t hello/world -m "Hello from Terminal window 2!"
Vendo logs
sudo mosquitto_sub -d -t hello/world
Java
Download de um cliente Java: https://www.eclipse.org/paho/
Sendo mais direto: https://repo.eclipse.org/content/repositories/paho-snapshots/org/eclipse/paho/mqtt-client
Publicar uma mensagem
Publicar uma mensagem é muito fácil, crie um MqttClient e use-o para postar em um tópico.
MqttClient client = new MqttClient("tcp://localhost:1883", MqttClient.generateClientId());
client.connect();
MqttMessage message = new MqttMessage();
message.setPayload("Hello world from Java".getBytes());
client.publish("test_java", message);
client.disconnect();
Você tem muitas outras opções, configurações que você pode usar ao postar uma mensagem como segurança, qualidade de serviço (QoS) e muito mais.
Mensagens Consumidoras
Para consumir mensagens, você precisa implementar uma
org.eclipse.paho.client.mqttv3.MqttCallbackmensagem que receberá a mensagem e usou essa classe Callback no MqttClient do aplicativo Assinante.
A classe de retorno de chamada:
public class SimpleMqttCallBack implements MqttCallback {
public void connectionLost(Throwable throwable) {
System.out.println("Connection to MQTT broker lost!");
}
public void messageArrived(String s, MqttMessage mqttMessage) throws Exception {
System.out.println("Message received:\n\t"+ new String(mqttMessage.getPayload()) );
}
public void deliveryComplete(IMqttDeliveryToken iMqttDeliveryToken) {
// not used in this example
}
}
Esta classe de retorno de chamada é usada no aplicativo Assinante da seguinte forma:
MqttClient client=new MqttClient("tcp://localhost:1883", MqttClient.generateClientId());
client.setCallback( new SimpleMqttCallBack() );
client.connect();
Como para o editor, estou usando o broker e o cliente sem nenhuma opção (QoS, segurança).


