IoTHubDeviceClient_SendEventAsyn c проблема обратного вызова - PullRequest
0 голосов
/ 14 июля 2020

Я отправляю 10 сообщений через функцию IoTHubDeviceClient_SendEventAsyn c () каждые 30 секунд. И я использую целочисленный идентификатор сообщения в качестве параметра userContextCallback, я буду спать через 10 мс после IoTHubDeviceClient_SendEventAsyn c (). Но в функции обратного вызова я обнаружил, что есть повторяющиеся параметры userContextCallback, которые являются идентификатором сообщения, который я установил при отправке сообщения. Я не знаю, что случилось.

static uint16_t g_messageTrackingId = 0;
void sendMessage(String postJson)
{
    uint16_t msgId;
    msgId = g_messageTrackingId++;
    message_handle = IoTHubMessage_CreateFromString(postJson.c_str());
    IoTHubDeviceClient_SendEventAsync(_device_handle, message_handle, send_confirm_callback, &msgId);
    printf( "IoTHubDeviceClient_SendEventAsync--> msgTrackId:%u !!!\n",msgId);
    ThreadAPI_Sleep(10);
}

static void send_confirm_callback(IOTHUB_CLIENT_CONFIRMATION_RESULT result, void* userContextCallback)
{

    uint16_t id = *(uint16_t *)userContextCallback;

    if(IOTHUB_CLIENT_CONFIRMATION_OK == result)
    {
        printf( "send_confirm_callback--> msgTrackId:%u, send successful !!!\n",id);
    }
    else
    {
        printf( "send_confirm_callback--> msgTrackId:%u, send failure!!!\n",id);
    }
}

void main()
{

    IOTHUB_DEVICE_CLIENT_HANDLE _device_handle = 
    IoTHubDeviceClient_CreateFromConnectionString(_azure.primaryConnectionString.c_str(), MQTT_Protocol);
    int keep_alive_interval_sec = 30;
    IoTHubDeviceClient_SetOption(_device_handle, OPTION_KEEP_ALIVE, &keep_alive_interval_sec);

    uint32_t azure_message_timeout_msec = 30 * 1000; 
    IoTHubDeviceClient_SetOption(_device_handle, OPTION_MESSAGE_TIMEOUT,&azure_message_timeout_msec);
    tickcounter_ms_t ms_delay = 1;
    (void)IoTHubDeviceClient_SetOption(_device_handle, OPTION_DO_WORK_FREQUENCY_IN_MS, &ms_delay);
    (void)IoTHubDeviceClient_SetConnectionStatusCallback(_device_handle, 
         connection_status_callback,NULL);
    while(true)
    {
        for(int i = 0; i < 30; i++)
        {
            sendMessage("XXXXX");
        }
        sleep(30);
    }
}
print information is: 
    IoTHubDeviceClient_SendEventAsync-->
    msgTrackId:0 IoTHubDeviceClient_SendEventAsync--> msgTrackId:1
    IoTHubDeviceClient_SendEventAsync--> msgTrackId:2
    send_confirm_callback--> msgTrackId:2,, send successful !!!
    send_confirm_callback--> msgTrackId:2,, send successful !!!
    send_confirm_callback--> msgTrackId:2,, send successful !!!
    IoTHubDeviceClient_SendEventAsync--> msgTrackId:3
    IoTHubDeviceClient_SendEventAsync--> msgTrackId:4
    IoTHubDeviceClient_SendEventAsync--> msgTrackId:5
    IoTHubDeviceClient_SendEventAsync--> msgTrackId:6
    IoTHubDeviceClient_SendEventAsync--> msgTrackId:7
    IoTHubDeviceClient_SendEventAsync--> msgTrackId:8
    IoTHubDeviceClient_SendEventAsync--> msgTrackId:9
    send_confirm_callback--> msgTrackId:9,, send successful !!!
    send_confirm_callback--> msgTrackId:9,, send successful !!!
    send_confirm_callback--> msgTrackId:9,, send successful !!!
    send_confirm_callback--> msgTrackId:9,, send successful !!!
    send_confirm_callback--> msgTrackId:9,, send successful !!!
    send_confirm_callback--> msgTrackId:9,, send successful !!!
    send_confirm_callback--> msgTrackId:9,, send successful !!!

Итак, я не знаю, где идентификатор сообщения 0,1,3,4,5,6,7,8? если они перекрываются? Что я должен делать? Буду признателен за вашу помощь

Azure Лог Azure Журнал

Запрос:

Мой идентификатор сообщения Azure Идентификатор пакета

 1              6
 2              7
 3              9

Получить ответ и вызвать функцию обратного вызова:

Идентификатор сообщения от обратный звонок | Azure Идентификатор пакета

 3                         6
 3                         7
 3                         9

Это нормально, если я отправлю одно сообщение в течение одного цикла отправки. Но если я отправляю несколько сообщений в течение одного цикла отправки, почему аргумент, возвращаемый функцией обратного вызова, всегда является тем, которому соответствует последний пакет?

...