Skip to main content

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] [List Home]
Re: [paho-dev] subscribing to multiple topics

Hello Ian,

 

The full program is rather lengthy since I am parsing a configuration file and initializing different stuffs and data structure for my board.

In the code I increment a counter for each message published so that I can compare the number of publications with the messages I receive.

 

However, the following code sample might sufficient.

I also added below the output of my program.

 

You should be able to observe that, though I register to the topics

- MyMod1Al/IN6/ChangeDetected

- MyMod1A1/IN3/ChangeDetected

 

I only receive messages related to the first subscription, not to the second.

 

If needed, I could try to write a simplified code to see if I can get more info. Please let me know if this is necessary.

 

 

/**********************************************************************************/

 

   MQTT::Client<IPStack, Countdown> client = MQTT::Client<IPStack, Countdown>(ipstack);

 

    if(verbose==1)    

        printf("Connecting to %s:%d\n", config->hostname, config->port);

    int rc = ipstack.connect(config->hostname, config->port);

               if ((rc != 0)&&(verbose==1))

                   printf("rc from TCP connect is %d\n", rc);

               if(verbose==1)

        printf("MQTT connecting\n");

    MQTTPacket_connectData data = ""

    data.MQTTVersion = 3;

    data.clientID.cstring = (char*)config->clientID;

 

    rc = client.connect(data);

               if ((rc != 0)&&(verbose==1))

                   printf("rc from MQTT connect is %d\n", rc);

               if(verbose==1)

        printf("MQTT connected\n");

    for(i=0;i<4;i++){

        if (strcmp(config->relayTopic[i],"None")!=0){

            switch(i){

                case 0:

                    rc = client.subscribe(config->relayTopic[i], MQTT::QOS2, switchRelay1);

                    break;

                case 1:

                    rc = client.subscribe(config->relayTopic[i], MQTT::QOS2, switchRelay2);

                    break;

                case 2:

                    rc = client.subscribe(config->relayTopic[i], MQTT::QOS2, switchRelay3);

                    break;

                case 3:

                    rc = client.subscribe(config->relayTopic[i], MQTT::QOS2, switchRelay4);

                    break;

                default:

                    break;

            }

            if (verbose==1){  

                if (rc != 0)

                    printf("rc from MQTT subscribe (Relay %d, topic %s) is %d\n",

                        i+1,config->relayTopic[i],rc);

                else

                    printf("MQTT subscription for relay activation %d - topic %s\n",

                        i+1,config->relayTopic[i]);

            }

        }

    }

   

    MQTT::Message message;

    switch(config->QoS){

        case 0:

            message.qos = MQTT::QOS0;

            break;

        case 1:

            message.qos = MQTT::QOS1;

            break;

        case 2:

            message.qos = MQTT::QOS2;

            break;

        default:

            message.qos = MQTT::QOS0;

    }

    if(verbose==1)

        printf("Selected message QoS is %d\n",config->QoS);

 

    while(!toStop){

        /*if(verbose==1)

            printf("Sample loop\n");*/

        for(i=0;i<7;i++){

            if(config->activateInput[i]==1){

                if(sampleChangedInput(fdADC,i,&res,config) != 0)

                    return -1;

                if(res==1){

                    if(verbose==1)

                        printf("Change detected on input %d - state value %d\n",i+1,inputState[i]);

                    sprintf(topic, "%s/IN%d/ChangeDetected",config->topic,i+1);

                    sprintf(buf,"In%d - New state value is %d",i+1,inputState[i]);

                    message.payload = (void*)buf;

                    message.payloadlen = strlen(buf)+1;

                    rc = client.publish(topic, message);

                    if (verbose==1){

                        printf("Publishing(%d): \nTopic is %s\nBuf   is %s\n",eventCounter,topic,buf);

                    }

                    eventCounter++;

                    if ((rc != 0)&&(verbose==1))

                        printf("Error %d from sending message\n", rc);

                    while (arrivedcount == config->QoS)

                        client.yield(100);

                }

            }

        }

        usleep(config->samplingTime);

    }

/**********************************************************************************/

 

The output I get from the program is the following:

 

Parsing configuration file MQTTTest.conf

The content of the configuration file is the following:

    Broker hostname is 192.104.167.67

    Broker port num is 1883

    Client ID is MyModule1

    Client QoS is 1

    Client default topic is MyMod1Al

    Relay switching activation topic are:

        Relay 1 is MyMod1Al/IN6/ChangeDetected

        Relay 2 is MyMod1A1/IN3/ChangeDetected

        Relay 3 is MyMod1A1/IN1/ChangeDetected

        Relay 4 is None

    Input activation configurations are:

        Input 1 is 1

        Input 2 is 0

        Input 3 is 1

        Input 4 is 0

        Input 5 is 0

        Input 6 is 1

        Input 7 is 0

Connecting to 192.104.167.67:1883

MQTT connecting

MQTT connected

MQTT subscription for relay activation 1 - topic MyMod1Al/IN6/ChangeDetected

MQTT subscription for relay activation 2 - topic MyMod1A1/IN3/ChangeDetected

MQTT subscription for relay activation 3 - topic MyMod1A1/IN1/ChangeDetected

Selected message QoS is 1

Change detected on input 6 - state value 1

Publishing(1):

Topic is MyMod1Al/IN6/ChangeDetected

Buf   is In6 - New state value is 1

Change detected on input 6 - state value 0

 

Message 1 arrived: qos 1, retained 0, dup 0, packetid 1

Payload (len is 27): In6 - New state value is 1

Topic - MyMod1Al/IN6/ChangeDetected

 

Publishing(2):

Topic is MyMod1Al/IN6/ChangeDetected

Buf   is In6 - New state value is 0

 

Message 2 arrived: qos 1, retained 0, dup 0, packetid 2

Payload (len is 27): In6 - New state value is 0

Topic - MyMod1Al/IN6/ChangeDetected

 

Change detected on input 6 - state value 1

Publishing(3):

Topic is MyMod1Al/IN6/ChangeDetected

Buf   is In6 - New state value is 1

 

Change detected on input 6 - state value 0

Publishing(4):

Topic is MyMod1Al/IN6/ChangeDetected

Buf   is In6 - New state value is 0

 

Message 3 arrived: qos 1, retained 0, dup 0, packetid 3

Payload (len is 27): In6 - New state value is 1

Topic - MyMod1Al/IN6/ChangeDetected

 

Change detected on input 3 - state value 1

Publishing(5):

Topic is MyMod1Al/IN3/ChangeDetected

Buf   is In3 - New state value is 1

 

Message 4 arrived: qos 1, retained 0, dup 0, packetid 4

Payload (len is 27): In6 - New state value is 0

Topic - MyMod1Al/IN6/ChangeDetected

 

Change detected on input 3 - state value 0

Publishing(6):

Topic is MyMod1Al/IN3/ChangeDetected

Buf   is In3 - New state value is 0

 

Change detected on input 6 - state value 1

Publishing(7):

Topic is MyMod1Al/IN6/ChangeDetected

Buf   is In6 - New state value is 1

 

Change detected on input 6 - state value 0

Publishing(8):

Topic is MyMod1Al/IN6/ChangeDetected

Buf   is In6 - New state value is 0

 

Message 5 arrived: qos 1, retained 0, dup 0, packetid 5

Payload (len is 27): In6 - New state value is 1

Topic - MyMod1Al/IN6/ChangeDetected

 

Change detected on input 3 - state value 1

Publishing(9):

Topic is MyMod1Al/IN3/ChangeDetected

Buf   is In3 - New state value is 1

 

Message 6 arrived: qos 1, retained 0, dup 0, packetid 6

Payload (len is 27): In6 - New state value is 0

Topic - MyMod1Al/IN6/ChangeDetected

 

Change detected on input 3 - state value 0

Publishing(10):

Topic is MyMod1Al/IN3/ChangeDetected

Buf   is In3 - New state value is 0

 

Change detected on input 6 - state value 1

Publishing(11):

Topic is MyMod1Al/IN6/ChangeDetected

Buf   is In6 - New state value is 1

 

Change detected on input 6 - state value 0

Publishing(12):

Topic is MyMod1Al/IN6/ChangeDetected

Buf   is In6 - New state value is 0

 

Message 7 arrived: qos 1, retained 0, dup 0, packetid 7

Payload (len is 27): In6 - New state value is 1

Topic - MyMod1Al/IN6/ChangeDetected

 

Change detected on input 3 - state value 1

Publishing(13):

Topic is MyMod1Al/IN3/ChangeDetected

Buf   is In3 - New state value is 1

 

Message 8 arrived: qos 1, retained 0, dup 0, packetid 8

Payload (len is 27): In6 - New state value is 0

Topic - MyMod1Al/IN6/ChangeDetected

 

Change detected on input 3 - state value 0

Publishing(14):

Topic is MyMod1Al/IN3/ChangeDetected

Buf   is In3 - New state value is 0

 

^CFinishing with 8 messages received

 

 

François Macé

 


Back to the top