Skip to main content

[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();
}


Back to the top