Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

OpenSSL subscribe #58

Closed
theanhhoang opened this issue Nov 18, 2019 · 5 comments
Closed

OpenSSL subscribe #58

theanhhoang opened this issue Nov 18, 2019 · 5 comments

Comments

@theanhhoang
Copy link

Hi Liam,
I am working on the function for OpenSSL Subscriber. I tried combining the OpenSSL_Publisher and Simple_Subscriber to produce the function. However, there is an error that I am facing, which is Subscriber subscribes all topics, regardless which topic I have set.
Then, I want to ask that do you have any example for OpenSSL subscriber?

Thanks in advance!

@LiamBindle
Copy link
Owner

Hi @theanhhoang, sorry for the delayed response. What you've tried is the correct approach. The only difference between the simple and openssl examples is how the socket is create/set up.

It's very strange it appears the subscriber is subscribing to all topics. My guess is an application-level peice of code would be causing this. Have you made any progress with tracking down your issue?

@LiamBindle
Copy link
Owner

Received an email from @theanhhoang saying this issue was resolved. The issue ended up being -D MQTT_USE_BIO wasn't being defined in their build.

@theanhhoang
Copy link
Author

theanhhoang commented Nov 26, 2019

Hi @LiamBindle, sorry for the late reply. I have checked my build and -D MQTT_USE_BIO is in the build and the subscriber still subscribes every topics!
My build is like this:

gcc -Wextra -Wall -std=gnu99 -Iinclude -Wno-unused-parameter -Wno-unused-variable -Wno-duplicate-decl-specifier -D MQTT_USE_BIO examples/openssl_subscriber.c src/mqtt.c src/mqtt_pal.c -lpthread `pkg-config --libs openssl` -o bin/openssl_subscriber

In main function, I combined openssl_publisher and simple_subscriber and got something like this:

int main(int argc, const char *argv[])
{
    const char* addr;
    const char* port;
    const char* topic;
    const char* ca_file;

    /* Load OpenSSL */
    SSL_load_error_strings();
    ERR_load_BIO_strings();
    OpenSSL_add_all_algorithms();
    SSL_library_init();


    SSL_CTX* ssl_ctx;
    BIO* sockfd;

    if (argc > 1) {
        ca_file = argv[1];
    } else {
        printf("error: path to the CA certificate to use\n");
        exit(1);
    }

    addr = "10.109.242.139";

    port = "8883";

    topic = "datetime";

    /* open the non-blocking TCP socket (connecting to the broker) */
    open_nb_socket(&sockfd, &ssl_ctx, addr, port, ca_file, NULL);

    if (sockfd == NULL) {
        perror("Failed to open socket: ");
        exit_example(EXIT_FAILURE, sockfd, NULL);
    }

    /* setup a client */
    struct mqtt_client client;
    uint8_t sendbuf[2048]; /* sendbuf should be large enough to hold multiple whole mqtt messages */
    uint8_t recvbuf[1024]; /* recvbuf should be large enough any whole mqtt message expected to be received */
    mqtt_init(&client, sockfd, sendbuf, sizeof(sendbuf), recvbuf, sizeof(recvbuf), publish_callback);
    mqtt_connect(&client, "subscribing_client", NULL, NULL, 0, NULL, NULL, 0, 400);

    /* check that we don't have any errors */
    if (client.error != MQTT_OK) {
        fprintf(stderr, "error: %s\n", mqtt_error_str(client.error));
        exit_example(EXIT_FAILURE, sockfd, NULL);
    }

    /* start a thread to refresh the client (handle egress and ingree client traffic) */
    pthread_t client_daemon;
    if(pthread_create(&client_daemon, NULL, client_refresher, &client)) {
        fprintf(stderr, "Failed to start client daemon.\n");
        exit_example(EXIT_FAILURE, sockfd, NULL);

    }

    /* subscribe */
    mqtt_subscribe(&client, topic, 0);


    /* start publishing the time */
    printf("%s listening for '%s' messages.\n", argv[0], topic);
    printf("Press CTRL-D to exit.\n\n");

    while(fgetc(stdin) == '\n');

    /* disconnect */
    printf("\n%s disconnecting from %s\n", argv[0], addr);
    sleep(1);

    /* exit */
    exit_example(EXIT_SUCCESS, sockfd, &client_daemon);
}

And here is the result:
image

Rgs,
The Anh

@learn-more
Copy link
Contributor

Hello @theanhhoang

The problem here is that you are using a very generic subscriber name, and you are also not passing the MQTT_CONNECT_CLEAN_SESSION flag to mqtt_connect.

Effectively, this means that you continue on the previous session of a client named subscribing_client.

@theanhhoang
Copy link
Author

Hi @learn-more, MQTT_CONNECT_CLEAN_SESSION solved my problems.!!!!

Thank you so much for your help! 💯 💯 💯

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

3 participants