[
Date Prev][
Date Next][
Thread Prev][
Thread Next][
Date Index][
Thread Index]
[
List Home]
| Re: [mosquitto-dev] CONNACK not being processed | 
Hi Ben.
The (working) code is below.  For the archives.
Roger, you got it.  I was doing a single call to mosquitto_loop(); which appears to be insufficient.  When I change it to either mosquitto_loop_start() or mosquitto_loop_forever() the publish was handled correctly.  I was using some code I created a year ago, and failed to notice I had the call to mosquitto_loop() in a do/while loop.
Sigh.
Thank you for the sanity check.
- Mark
/*
 * cc -o mqtt_test mqtt_test.c -lmosquitto
 */
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <mosquitto.h>
static char message[] = "{\n"
                        "  \"d\": {\n"
                        "  \"Message\": \"Hello world\",\n"
                        "  }\n"
                        "}\n";
static char host[] = "xxxxxx.messaging.internetofthings.ibmcloud.com";
static char id[] = "d:xxxxxx:RPI3:lmp-rpi-4";
static char topic[] = "iot-2/evt/status/fmt/json";
static char *bind_address = 0;
static int port = 1883;
static int qos = 0;
static int retain = 0;
static int mid_sent = 0;
struct mosquitto *mosq = NULL;
void connect_callback(struct mosquitto *mosq, void *obj, int result) {
    int rc;
    printf(">>>Connect: %d\n", result);
    if (!result) {
        rc = mosquitto_publish(mosq, &mid_sent, topic, strlen(message), message, qos, retain);
        if (rc) {
            printf("Error (%d) publishing\n", rc);
            return;
        }
    }
}
void disconnect_callback(struct mosquitto *mosq, void *obj, int rc) {
    printf(">>>Disconnect\n");
}
void log_callback(struct mosquitto *mosq, void *obj, int level, const char *str) {
    printf(">>>Log: %s\n", str);
}
void publish_callback(struct mosquitto *mosq, void *obj, int mid) {
    printf(">>>Publish: Message id: %d\n", mid);
    mosquitto_disconnect(mosq);
}
int main (int argc, char *argv[]) {
    int rc;
    mosquitto_lib_init();
    printf("Create instance\n");
    mosq = mosquitto_new(id, true, NULL);
    if (!mosq) {
        printf("Error creating mosquitto instance\n");
        mosquitto_lib_cleanup();
        return 1;
    }
    printf("Establish callbacks\n");
    mosquitto_log_callback_set(mosq, log_callback);
    mosquitto_connect_callback_set(mosq, connect_callback);
    mosquitto_disconnect_callback_set(mosq, disconnect_callback);
    mosquitto_publish_callback_set(mosq, publish_callback);
    printf("Set username and password\n");
    if (mosquitto_username_pw_set(mosq, "use-token-auth", "xxxxxxxxxxxxxxxxxx")) {
        printf("Error setting username and password\n");
        return 2;
    }
    mosquitto_max_inflight_messages_set(mosq, 20);
    printf("Connect\n");
    rc = mosquitto_connect_bind(mosq, host, port, 60, bind_address);
    if (rc > 0) {
        printf("Error (%d) connecting\n", rc);
        mosquitto_lib_cleanup();
        return 3;
    }
    printf("Loop\n");
    rc = mosquitto_loop_forever(mosq, -1, 1);
    sleep(5);
    printf("Cleanup\n");
    mosquitto_destroy(mosq);
    mosquitto_lib_cleanup();
}