Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/eclipse/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 使用MQTT paho异步发布对新消息触发回调_C_Eclipse_Callback_Mqtt_Paho - Fatal编程技术网

C 使用MQTT paho异步发布对新消息触发回调

C 使用MQTT paho异步发布对新消息触发回调,c,eclipse,callback,mqtt,paho,C,Eclipse,Callback,Mqtt,Paho,我使用的是来自MQTT paho的MQTTAsync_publish.c示例代码。我所做的是用SendMessageArray替换示例代码中的常量有效负载。如果新的无线电消息到达,我的其他代码中该数组的内容将发生变化。负载在第一次连接时成功发送 但是,我不明白当我的负载发生变化时如何触发新的发布? 函数MQTTAsync_sendMessage是在onConnect回调中触发的,因此我必须以某种方式再次触发此回调,但是如何触发。如果我通过不调用onSend回调将示例代码更改为在首次发送后保持连接

我使用的是来自MQTT paho的MQTTAsync_publish.c示例代码。我所做的是用SendMessageArray替换示例代码中的常量有效负载。如果新的无线电消息到达,我的其他代码中该数组的内容将发生变化。负载在第一次连接时成功发送

但是,我不明白当我的负载发生变化时如何触发新的发布?

函数MQTTAsync_sendMessage是在onConnect回调中触发的,因此我必须以某种方式再次触发此回调,但是如何触发。如果我通过不调用onSend回调将示例代码更改为在首次发送后保持连接,则如果finished=0,则它将“等待发布客户端ID为%s的主题%s上的%s\n”,但我无法放置新的有效负载

volatile MQTTAsync_token deliveredtoken;
char SendMessageArray[4096] = { 0 };  // global
int finished = 0;

void connlost(void *context, char *cause)
{
    MQTTAsync client = (MQTTAsync)context;
    MQTTAsync_connectOptions conn_opts = MQTTAsync_connectOptions_initializer;
    int rc;

    printf("\nConnection lost\n");
    printf("     cause: %s\n", cause);

    printf("Reconnecting\n");
    conn_opts.keepAliveInterval = 20;
    conn_opts.cleansession = 1;
    if ((rc = MQTTAsync_connect(client, &conn_opts)) != MQTTASYNC_SUCCESS)
    {
        printf("Failed to start connect, return code %d\n", rc);
        finished = 1;
    }
}


void onDisconnect(void* context, MQTTAsync_successData* response)
{
    printf("Successful disconnection\n");
    finished = 1;
}


void onSend(void* context, MQTTAsync_successData* response)
{
    MQTTAsync client = (MQTTAsync)context;
    MQTTAsync_disconnectOptions opts = MQTTAsync_disconnectOptions_initializer;
    int rc;

    printf("Message with token value %d delivery confirmed\n", response->token);

    opts.onSuccess = onDisconnect;
    opts.context = client;

    if ((rc = MQTTAsync_disconnect(client, &opts)) != MQTTASYNC_SUCCESS)
    {
        printf("Failed to start sendMessage, return code %d\n", rc);
        exit(EXIT_FAILURE);
    }
}


void onConnectFailure(void* context, MQTTAsync_failureData* response)
{
    printf("Connect failed, rc %d\n", response ? response->code : 0);
    finished = 1;
}


void onConnect(void* context, MQTTAsync_successData* response)
{
    MQTTAsync client = (MQTTAsync)context;
    MQTTAsync_responseOptions opts = MQTTAsync_responseOptions_initializer;
    MQTTAsync_message pubmsg = MQTTAsync_message_initializer;
    int rc;

    printf("Successful connection\n");
    
    opts.onSuccess = onSend; // -> something like onHoldConnect???
    opts.context = client;

    pubmsg.payload = SendMessageArray; //PAYLOAD;
    pubmsg.payloadlen = (int)strlen(SendMessageArray);
    pubmsg.qos = QOS;
    pubmsg.retained = 0;
    deliveredtoken = 0;

    if ((rc = MQTTAsync_sendMessage(client, TOPIC, &pubmsg, &opts)) != MQTTASYNC_SUCCESS)
    {
        printf("Failed to start sendMessage, return code %d\n", rc);
        exit(EXIT_FAILURE);
    }
}


int main(int argc, char* argv[])
{
    MQTTAsync client;
    MQTTAsync_connectOptions conn_opts = MQTTAsync_connectOptions_initializer;
    int rc;

    MQTTAsync_create(&client, ADDRESS, CLIENTID, MQTTCLIENT_PERSISTENCE_NONE, NULL);

    MQTTAsync_setCallbacks(client, NULL, connlost, NULL, NULL);

    conn_opts.keepAliveInterval = 20;
    conn_opts.cleansession = 1;
    conn_opts.onSuccess = onConnect;
    conn_opts.onFailure = onConnectFailure;
    conn_opts.context = client;
    if ((rc = MQTTAsync_connect(client, &conn_opts)) != MQTTASYNC_SUCCESS)
    {
        printf("Failed to start connect, return code %d\n", rc);
        exit(EXIT_FAILURE);
    }

    printf("Waiting for publication of %s\n"
         "on topic %s for client with ClientID: %s\n",
         SendMessageArray, TOPIC, CLIENTID);
    while (!finished)
        #if defined(WIN32)
            Sleep(100);
        #else
            usleep(10000L);
        #endif

    MQTTAsync_destroy(&client);
    return rc;
}
以下是原始代码:

我需要与发送所有新消息的代理建立持久连接。谢谢你的帮助

编辑: 好吧,我现在做的是 (1) 发送后不要断开连接以保持连接:

void onHoldConnect(void* context, MQTTAsync_successData* response)
{
    printf("Holding connection\n");
}

void onConnect(void* context, MQTTAsync_successData* response)
{
    MQTTAsync client = (MQTTAsync)context;
    MQTTAsync_responseOptions opts = MQTTAsync_responseOptions_initializer;
    MQTTAsync_message pubmsg = MQTTAsync_message_initializer;
    int rc;

    printf("Successful connection\n");
    opts.onSuccess = onHoldConnect; //onSend;
    opts.onFailure = onSendFailure;
    opts.context = client;
    pubmsg.payload = SendMessageArray; //PAYLOAD;
    pubmsg.payloadlen = (int)strlen(SendMessageArray); 
    pubmsg.qos = QOS;
    pubmsg.retained = 0;

    if ((rc = MQTTAsync_sendMessage(client, TOPIC, &pubmsg, &opts)) != MQTTASYNC_SUCCESS)
    {
      printf("Failed to start sendMessage, return code %d\n", rc);
      exit(EXIT_FAILURE);
    }
}
和(2)如果修改了SendMessageArray,则使用全局bool在while循环中运行onConnect函数:

while (!finished) {
    if (sendFlag == true) {
      sendFlag = false;
      onConnect(client, &conn_opts);
    }
    #if defined(_WIN32)
        Sleep(100);
    #else
        usleep(10000L);
    #endif
}

这是解决问题的正确方法吗?我只是再次使用(客户端和连接选项)作为参数。

我也在努力解决这个问题,它最终对你有用吗?我也在努力解决这个问题,它最终对你有用吗?