Network

MQTT(mosquitto) Visual studio - 3 (subscriber)

Angler.lee 2021. 3. 8. 21:20

<Header>

#include <stdio.h>
#include <stdlib.h>
#include <windows.h>
#include <mosquitto.h>

#define sleep(x) Sleep((x)*1000)
#define strdup _strdup

#define IN_BUF_LENGTH 65536

#define DEFAULT_MQTT_HOST "127.0.0.1"
#define DEFAULT_MQTT_PORT 1883
#define DEFAULT_MQTT_KEEPALIVE 60
#define DEFAULT_MQTT_TOPIC "EXAMPLE_TOPIC"

static bool run = true;

<Callback Function>

void connect_callback(struct mosquitto *mosq, void *obj, int result) {
	printf("connect callback, rc=%d\n", result);
}

void message_callback(struct mosquitto *mosq, void *obj, const struct mosquitto_message *msg) {
	
	if (msg->payloadlen == 0) return;

	fprintf(stdout, "topic '%s': message %d bytes\n", msg->topic, msg->payloadlen);
	
	fprintf(stderr, "message : '%s'\n", (char *)msg->payload);
}

<main>

int main(int argc, char **argv)
{
	char *mqtt_host = strdup(DEFAULT_MQTT_HOST);
	char *mqtt_topic = strdup(DEFAULT_MQTT_TOPIC);
	int mqtt_port = DEFAULT_MQTT_PORT;
	int mqtt_keepalive = DEFAULT_MQTT_KEEPALIVE;


	int mdelay = 0;
	bool clean_session = true;

	struct mosquitto *mosq = NULL;
	
    mosquitto_lib_init();
	mosq = mosquitto_new(NULL, clean_session, NULL);
	if (!mosq) {
		fprintf(stderr, "Could not create new mosquitto struct\n");

		exit(1);
	}

	mosquitto_connect_callback_set(mosq, connect_callback);
	mosquitto_message_callback_set(mosq, message_callback);

	if (mosquitto_connect(mosq, mqtt_host, mqtt_port, mqtt_keepalive)) {
		fprintf(stderr, "Unable to connect mosquitto.\n");

		exit(1);
	}

	mosquitto_subscribe(mosq, NULL, mqtt_topic, 0);

	while (run) {
		int loop = mosquitto_loop(mosq, -1, 1);
		if (loop) {
			fprintf(stderr, "mosquitto connection error!\n");
			sleep(1);
			mosquitto_reconnect(mosq);
		}
	}

	mosquitto_destroy(mosq);
	mosquitto_lib_cleanup();
	free(mqtt_host);
	free(mqtt_topic);


	return 0;
}