[
Date Prev][
Date Next][
Thread Prev][
Thread Next][
Date Index][
Thread Index]
[
List Home]
Re: [mosquitto-dev] connect_async problem and advice publish/dedconnect needed
|
Hi Markus,
That's great, it'll be included in the upcoming 1.4.2 release.
Cheers,
Roger
On Wed, Apr 29, 2015 at 10:05 AM, Bayerlein, Markus (I/AEV-23)
<markus.bayerlein@xxxxxxx> wrote:
> Hi.
>
> Roger, indeed the 'if(rc)' conditional seems to be the problem. I rebuilt mosquitto, changing it to 'if(rc > 0)' as you suggested, and voilà, connect_async works. The function now returns MOSQ_ERR_SUCCESS as expected.
> Karl, it did not matter if I used loop() or loop_start()/loop_end(), the behavior was the same.
> Also loop_end() did not help with my problem with undelivered messages. But waiting for publish callbacks to fire, as you suggested, did the job. I include my (test) source code below. It can probably be done in a more elegant way, but for my use case, this will do.
> Compiling it into an executable 'mqtt_c' now gives the following output:
>
>> ./mqtt_c
> synchronous connection to broker at localhost:1883
> connack string: Connection Accepted.
> connected to broker at localhost:1883
> sending message 1 with QoS 0 on topic test/topic
> published message with QoS 0
> sending message 2 with QoS 1 on topic test/topic
> published message with QoS 1
> sending message 3 with QoS 2 on topic test/topic
> published message with QoS 2
> message 1 has been sent successfully
> message 2 has been sent successfully
> message 3 has been sent successfully
> disconnected from broker (0)
> Thank you, good bye.
>
>> ./mqtt_c 1
> asynchronous connection to broker at localhost:1883
> connack string: Connection Accepted.
> connected to broker at localhost:1883
> sending message 1 with QoS 0 on topic test/topic
> published message with QoS 0
> sending message 2 with QoS 1 on topic test/topic
> published message with QoS 1
> sending message 3 with QoS 2 on topic test/topic
> published message with QoS 2
> message 1 has been sent successfully
> message 2 has been sent successfully
> message 3 has been sent successfully
> disconnected from broker (0)
> Thank you, good bye.
>
> Subscribing to the topic test/# (using mosquitto_sub) shows me that all messages are delivered.
> Thank you very much, guys.
>
> Regards
>
> Markus
> ________________
>
> Source code:
>
> #include <stdlib.h>
> #include <stdio.h>
> #include <string.h>
> #include <stdbool.h>
> #include <mosquitto.h>
>
> void on_publish(struct mosquitto *m, void *msg_published, int mid)
> {
> printf("message %d has been sent successfully\n", mid);
> *((bool *)msg_published + (mid-1)*sizeof(bool)) = true;
> }
>
> void on_disconnect(struct mosquitto *m, void *o, int rc)
> {
> printf("disconnected from broker (%d)\n", rc);
> }
>
> int main( int argc, char **argv )
> {
> int msg_id = 0;
> bool msg_sent[3] = {false, false, false};
> bool all_msg_sent = false;
> bool async = argc > 1 ? atoi(argv[1]) : false;
> const char *host = "localhost";
> const int port = 1883;
> const char topic[] = "test/topic";
> char msg[30];
> int mlen, qos, status, i;
> struct mosquitto *m;
>
> if ( mosquitto_lib_init() != MOSQ_ERR_SUCCESS ) {
> perror("library initialization failed");
> exit(EXIT_FAILURE);
> }
>
> m = mosquitto_new(NULL, true, msg_sent);
> if ( m == NULL ) {
> perror("failed to create mosquitto instance");
> mosquitto_lib_cleanup();
> exit(EXIT_FAILURE);
> }
>
> printf("%s connection to broker at %s:%d\n", async ? "asynchronous" : "synchronous", host,
> port);
> status =
> async ? mosquitto_connect_async(m, host, port, 60) : mosquitto_connect(m, host, port, 60);
> printf("connack string: %s\n", mosquitto_connack_string(status));
> if ( status != MOSQ_ERR_SUCCESS ) {
> perror("could not connect to broker");
> }
> else {
> printf("connected to broker at %s:%d\n", host, port);
> // set callbacks
> mosquitto_disconnect_callback_set(m, on_disconnect);
> mosquitto_publish_callback_set(m, on_publish);
> status = mosquitto_loop_start(m);
> for ( qos = 0; qos <= 2; ++qos ) {
> ++msg_id;
> sprintf(msg, "my test message, QoS %d, id %d", qos, msg_id);
> mlen = strlen(msg);
> printf("sending message %d with QoS %d on topic %s\n", msg_id, qos, topic);
> if ( mosquitto_publish(m, &msg_id, topic, mlen, msg, qos, false) != MOSQ_ERR_SUCCESS ) {
> perror("failed to publish message");
> }
> else {
> printf("published message with QoS %d\n", qos);
> }
>
> }
>
> /* wait until all publish callbacks fired;
> * the publish callback sets msg_sent[mid - 1] for message id mid */
> do {
> all_msg_sent = true;
> for (i = 0; i < msg_id; ++i) {
> all_msg_sent = all_msg_sent && msg_sent[i];
> }
> } while (!all_msg_sent);
>
> mosquitto_disconnect(m);
> status = mosquitto_loop_stop(m, true);
> }
>
> mosquitto_destroy(m);
> mosquitto_lib_cleanup();
>
> printf("Thank you, good bye.\n");
> exit(EXIT_SUCCESS);
> }
> ________________
>
> -----Ursprüngliche Nachricht-----
> Von: mosquitto-dev-bounces@xxxxxxxxxxx [mailto:mosquitto-dev-bounces@xxxxxxxxxxx] Im Auftrag von Karl Palsson
> Gesendet: Dienstag, 28. April 2015 19:31
> An: General development discussions for the mosquitto project
> Betreff: Re: [mosquitto-dev] connect_async problem and advice publish/dedconnect needed
>
>
> "Bayerlein, Markus (I/AEV-23)" <markus.bayerlein@xxxxxxx> wrote:
>> Hi there.
>>
>> As already stated in the email subject, I encounter two problems with
>> the Mosquitto library and hope for some advice.
>>
>> 1. I can't connect to an MQTT broker using 'connect_async'. The
>> return value of the function is '-1' (= MOSQ_ERR_CONN_PENDING). The
>> connack string returned is 'Connection Refused: unknown reason.' and the
>> error string is 'Operation now in progress ' The broker I try to connect
>> to is mosquitto (v1.4.1). Using 'connect' works fine.
>
> I see something like this, but it works when it reconnects. Are you
> using loop_start, or loop() directly? I haven't dug any further in it
> yet.
>
>>
>> 2. When I publish a message and disconnect immediately thereafter,
>> the message sometimes is not sent (actually, it depends on the QoS:
>> messages with QoS 0 or 1 are sometimes not sent, Qos 2 messages never) .
>> If I do a sleep(1) before the disconnect, all messages are delivered
>> correctly. I am sure there is a better solution than waiting for a
>> second. How do I ensure that all messages are sent before a disconnect?
>
>
> loop_stop() is a pretty good way of doing it. Either that, or you have
> to wait for all callbacks to fire as Roger mentions in the other reply
> _______________________________________________
> mosquitto-dev mailing list
> mosquitto-dev@xxxxxxxxxxx
> To change your delivery options, retrieve your password, or unsubscribe from this list, visit
> https://dev.eclipse.org/mailman/listinfo/mosquitto-dev