Я отправляю 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
Это нормально, если я отправлю одно сообщение в течение одного цикла отправки. Но если я отправляю несколько сообщений в течение одного цикла отправки, почему аргумент, возвращаемый функцией обратного вызова, всегда является тем, которому соответствует последний пакет?