[AIX, Linux, Windows]

Como enviar uma mensagem para um cliente MQTT

IBM® MQ aplicativos podem enviar mensagens de clientes MQTT v3 publicando em assinaturas criadas por clientes ou enviando mensagens diretamente. MQTT clientes podem enviar mensagens para um outro publicando em tópicos inscritos por outros clientes.

Um cliente MQTT assina uma publicação, que recebe de IBM MQ

Execute a tarefa Publicar uma mensagem para o utilitário de cliente MQTT do IBM MQ Explorer para enviar uma publicação do IBM MQ para um MQTT cliente.

A maneira padrão para um cliente MQTT v3 receber mensagens é para que ele crie uma assinatura de um tópico, ou conjunto de tópicos. No trecho de código de exemplo, Figura 1, o cliente MQTT assina usando a sequência de tópicos MQTT Examples. Um aplicativo IBM MQ C, Figura 2, publica para o tópico usando a sequência de tópicos MQTT Examples. No snippet de código Figura 3, o cliente MQTT recebe a publicação no método callback, messageArrived.

Para obter mais informações sobre como configurar IBM MQ para enviar publicações em resposta a assinaturas de MQTT clientes, consulte Publicando uma mensagem em resposta a uma assinatura de cliente MQTT.

Um aplicativo IBM MQ envia uma mensagem diretamente para um cliente MQTT

Execute a tarefa Enviar uma mensagem para um cliente MQTT usando o IBM MQ Explorer para enviar uma mensagem diretamente do IBM MQ para um MQTT cliente.

Uma mensagem enviada desta forma a um cliente MQTT é chamada de mensagem não solicitada. MQTT v3 recebem mensagens não solicitadas como publicações com um nome de tópico configurado. O serviço de telemetria (MQXR) configura o nome do tópico para o nome da fila remota.

Para obter mais informações sobre como configurar IBM MQ para enviar mensagens diretamente para os clientes MQTT , consulte Sendando uma mensagem para um cliente diretamente.

Um cliente MQTT publica uma mensagem

Um cliente MQTT v3 pode publicar uma mensagem que é recebida por outro cliente MQTT v3 , mas não pode enviar uma mensagem não solicitada. O snippet de código Figura 4 mostra como um cliente MQTT v3 , escrito em Java, publica uma mensagem.

O padrão típico para o envio de uma mensagem para um cliente específico MQTT v3 , é para cada cliente criar uma assinatura para o seu próprio ClientIdentifier. Execute a tarefa Publicar uma mensagem para um cliente MQTT v3 específico para publicar uma mensagem de um cliente MQTT para outro cliente MQTT usando ClientIdentifier como uma cadeia de tópicos.

Fragmentos de Código de Exemplo

O trecho de código na Figura 1 mostra como um cliente MQTT escrito em Java cria uma assinatura. Ele também precisa de um método de retorno de chamada, messageArrived, para receber publicações para a assinatura.

Figura 1. MQTT v3 assinante cliente
String    clientId = String.format("%-23.23s", 
                     System.getProperty("user.name") + "_" + 
                     (UUID.randomUUID().toString())).trim()).replace('-', '_');
MqttClient  client = new MqttClient("localhost", clientId);
String topicString = "MQTT Examples";
int            QoS = 1;
client.subscribe(topicString, QoS);

O trecho de código na Figura 2 mostra como um aplicativo IBM MQ escrito em C envia uma publicação. O trecho de código é extraído da tarefa, Criar uma editora para um tópico variável

Figura 2 IBM MQ publicador
/* Define and set variables to.defaults */
/* Omitted lines declaring variables    */
char * topicName   = ""
char * topicString = "MQTT Examples"
char * publication = "Hello world!";
do {
  MQCONN(qMgrName, &Hconn, &CompCode, &Reason);
  if (CompCode != MQCC_OK) break;
  td.ObjectType = MQOT_TOPIC;    /* Object is a topic             */
  td.Version = MQOD_VERSION_4;   /* Descriptor needs to be V4     */
  strncpy(td.ObjectName, topicName,  MQ_TOPIC_NAME_LENGTH);
  td.ObjectString.VSPtr = topicString;
  td.ObjectString.VSLength = (MQLONG)strlen(topicString);
  MQOPEN(Hconn, &td, MQOO_OUTPUT | MQOO_FAIL_IF_QUIESCING, &Hobj, &CompCode, &Reason);
  if (CompCode != MQCC_OK) break;
  pmo.Options = MQPMO_FAIL_IF_QUIESCING | MQPMO_RETAIN;
  MQPUT(Hconn, Hobj, &md, &pmo, (MQLONG)strlen(publication)+1, publication, &CompCode, &Reason);
  if (CompCode != MQCC_OK) break;
  MQCLOSE(Hconn, &Hobj, MQCO_NONE, &CompCode, &Reason);
  if (CompCode != MQCC_OK) break;
  MQDISC(&Hconn, &CompCode, &Reason);
} while (0);

Quando a publicação chega, o cliente MQTT chama o método messageArrived da classe MQTT do cliente do aplicativo MqttCallback .

Figura 3. método messageArrived
public class CallBack implements MqttCallback {
  public void messageArrived(MqttTopic topic, MqttMessage message) {
    try {
      System.out.println("Message arrived: \"" + message.toString()
          + "\" on topic \"" + topic.toString() + "\"");
    } catch (Exception e) {
      e.printStackTrace();
    }
  }
// ... Other callback methods 
}

Figura 4 mostra um MQTT v3 publicando uma mensagem para a assinatura criada na Figura 1.

Figura 4. MQTT v3
      String          address = "localhost";
      String         clientId = String.format("%-23.23s", 
                                System.getProperty("user.name") + "_" + 
                                (UUID.randomUUID().toString())).trim()).replace('-', '_');
      MqttClient       client = new MqttClient(address, clientId);
      String      topicString = "MQTT Examples";
      MqttTopic         topic = client.getTopic(Example.topicString);
      String     publication  = "Hello world";
      MqttMessage     message = new MqttMessage(publication.getBytes());
      MqttDeliveryToken token = topic.publish(message);