2016-09-01 3 views
0

Ich benutze Paho-Client-Bibliotheken für C, um einen Client zu schreiben, der eine ganze Zahl an den Mosquitto-Broker veröffentlicht. Wenn ich die Nutzlast als Zeichenfolge festlege, wird sie ohne Probleme veröffentlicht, aber wenn ich die Nutzlast auf eine Ganzzahl setze, stürzt der Herausgeber mit der folgenden Meldung ab, wie im Bild gezeigt.Mosquitto-Verlag veröffentlicht keine Ganzzahlen in C

A problem has caused the program to stop working correctly

Mein Client-Code ist wie folgt:

#include "stdio.h" 
#include "stdlib.h" 
#include "string.h" 
#include "MQTTClient.h" 

#define ADDRESS  "tcp://localhost:1883" 
#define CLIENTID "ExampleClientPub" 
#define TOPIC  "MQTT Examples" 
#define QOS   1 
#define TIMEOUT  10000L 

int main(int argc, char* argv[]) 
{ 
    MQTTClient client; 
    MQTTClient_connectOptions conn_opts = MQTTClient_connectOptions_initializer; 
    MQTTClient_message pubmsg = MQTTClient_message_initializer; 
    MQTTClient_deliveryToken token; 
    int rc, ch; 
    int i = 4; 

    MQTTClient_create(&client, ADDRESS, CLIENTID, 
    MQTTCLIENT_PERSISTENCE_NONE, NULL); 
    conn_opts.username = "user"; 
    conn_opts.password = "hello"; 
    conn_opts.keepAliveInterval = 65000; 
    conn_opts.cleansession = 1; 

    if ((rc = MQTTClient_connect(client, &conn_opts)) != MQTTCLIENT_SUCCESS) 
    { 
    printf("Failed to connect, return code %d\n", rc); 
    exit(-1); 
    } 
    pubmsg.payload = i; 
    pubmsg.payloadlen = sizeof(i); //strlen(PAYLOAD); 
    pubmsg.qos = QOS; 
    pubmsg.retained = 0; 
    MQTTClient_publishMessage(client, TOPIC, &pubmsg, &token); 
    printf("Waiting for up to %d seconds for publication of %d\n" 
    "on topic %s for client with ClientID: %s\n", 
    (int)(TIMEOUT/1000), i, TOPIC, CLIENTID); 
    rc = MQTTClient_waitForCompletion(client, token, TIMEOUT); 
    printf("Message with delivery token %d delivered\n", token); 
    do 
    { 
    ch = getchar(); 
    } while (ch != 'Q' && ch != 'q'); 
    MQTTClient_disconnect(client, 10000); 
    MQTTClient_destroy(&client); 
    return rc; 
} 

Kann mir jemand bitte sagen, was ich falsch mache?

+0

'pubmsg.payloadlen = sizeof (i);' ist verdächtig, warum die Größe von 'i'? – chux

+0

@chux 'payloadlen' beschreibt die Größe der Nutzdaten in Bytes. Da ich eine einzelne Integer-Payload sende, sollte das nicht funktionieren? –

+0

Detail: "Wenn ich die Nutzlast als eine Zeichenfolge festlegen, veröffentlicht es ohne Probleme, aber wenn ich die Nutzlast auf eine Ganzzahl festlegen," legt Code Payload auf die _Adresse_ einer Zeichenfolge. Wie weiß das empfangende Publishing, dass es eine Adresse eines Strings im Vergleich zu einem "Int" erhält? – chux

Antwort

1

Die Art der payload ist char *

typedef struct { 
    char * topic; 
    char * payload; 
    unsigned int length; 
    boolean retained; 
} MQTTMessage; 

Das heißt, es Strings nur akzeptiert.

+0

Wird die Änderung der Payload-Typ in dieser Struktur arbeiten? –

+0

@ bhai410 nur, wenn Sie alles andere ändern, die es auch nutzt schließt den Server ein, ohne auch nur auf den relevanten Code zu schauen: das wäre ein großer Zug! – deamentiaemundi

+0

aber laut der Datei mosquitto.h, struct mosquitto_message { \t int Mitte; \t char * Thema; \t void * Nutzlast; \t int Nutzlast; \t int qos; \t Bool behalten; }; Der Typ ist nur ein Zeiger –

0

Falls jemand über dieses Thema kommt, funktioniert das für mich:

als Publish:

uint32_t mmsg = (2<<31)-1; 
    mosquitto_publish(mosq, NULL, "topic\0", 4, &mmsg, 2, false); 

lesen Wie

LOGD("Message topic and load are %s and %lu\n ", msg->topic, *((uint32_t *) (msg->payload))); 

LOGD ist nur ein Makro um fprintf (stdout, ....)

Verwandte Themen