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