Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/147.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++ Libmosquitto出版公司不';t将所有消息传递到Azure IoT中心_C++_C_Azure_Azure Iot Hub_Libmosquitto - Fatal编程技术网

C++ Libmosquitto出版公司不';t将所有消息传递到Azure IoT中心

C++ Libmosquitto出版公司不';t将所有消息传递到Azure IoT中心,c++,c,azure,azure-iot-hub,libmosquitto,C++,C,Azure,Azure Iot Hub,Libmosquitto,我正在尝试每秒向Azure Iot Hub内置事件中心发布100多条消息。我正在使用libmosquitto1.6.8库。我正在使用Azure Iot Hub的免费层包,我知道每秒有100条消息的限制。但这与该问题无关。我甚至无法将一半的消息发布到AZ Iot Hub 基本上,我在multimap中有一个需要发送的多个值的列表。指标清单: std::multimap< const std::string, std::tuple< const std::string, const st

我正在尝试每秒向Azure Iot Hub内置事件中心发布100多条消息。我正在使用libmosquitto1.6.8库。我正在使用Azure Iot Hub的免费层包,我知道每秒有100条消息的限制。但这与该问题无关。我甚至无法将一半的消息发布到AZ Iot Hub

基本上,我在multimap中有一个需要发送的多个值的列表。指标清单:

std::multimap< const std::string, std::tuple< const std::string, const std::string, float> > calculatedMetricList;
根据控制台,运行程序时,所有发布的消息返回ok。但Azure IoT中心端上只出现一两条消息

下图显示了物联网中心的监控,当时只有一条消息通过。

我尝试了很多不同的解决方案,但程序无法发布所有消息。看起来publish方法正在等待完成第一条消息,但迭代正在移动到下一条消息,导致它被删除。如果这是导致邮件丢失的原因,那么对邮件发送进行排序的最佳方法是什么?否则,还有什么会导致邮件被删除

更新 问题是程序没有等到消息成功发布到代理(Azure IoT Hub)时才开始。如果返回publish\u回调,您将知道消息是否成功发布到代理

void MosquittoClient::publish_callback(struct mosquitto* mosq, void* userdata, int mid)
{
    printf("Publish OK.\r\n");
}
解决方案是在销毁之前休眠线程,清除调用,并在建立连接之前启动MOSQUITO循环

sleep(30);
mosquitto_loop_stop(mosq, true);
mosquitto_destroy(mosq);
mosquitto_lib_cleanup();
mosquitto\u publish()
是异步的:让它返回
MOSQ\u ERR\u SUCCESS
仅仅意味着消息的发布已正确地传递给mosquitto线程。因此,目前您正在将大量消息排队,然后让程序在有机会实际发送数据包之前终止

您可以使用您的
mosquitchoclient::publish_回调
在停止循环和终止程序之前检查所有消息是否已有效发送。

mosquitcho_publish()
是异步的:让它返回
MOSQ\u ERR\u SUCCESS
仅仅意味着消息的发布已经正确地传递给了Mosquitto线程。因此,目前您正在将大量消息排队,然后让程序在有机会实际发送数据包之前终止


您可以使用
mosquitchoclient::publish\u回调
在停止循环和终止程序之前检查所有消息是否已有效发送。

好的,听起来我需要给线程时间在终止循环之前发布所有消息。但我想我确实试着让程序进入睡眠状态,但什么也没发生。mosquitchoclient::sendDataToUpstreamSystem()方法在它自己的线程上运行,我设置了一个条件,让它每60秒等待并执行一次这个方法。我已经宣布发布回调,但我没有真正听到任何回调。我会将程序的行为更改为等待所有消息发布,然后查看我的操作。谢谢。好的,听起来我需要给线程时间在终止循环之前发布所有消息。但我想我确实试着让程序进入睡眠状态,但什么也没发生。mosquitchoclient::sendDataToUpstreamSystem()方法在它自己的线程上运行,我设置了一个条件,让它每60秒等待并执行一次这个方法。我已经宣布发布回调,但我没有真正听到任何回调。我会将程序的行为更改为等待所有消息发布,然后查看我的操作。谢谢
void MosquittoClient::publish_callback(struct mosquitto* mosq, void* userdata, int mid)
{
    printf("Publish OK.\r\n");
}
sleep(30);
mosquitto_loop_stop(mosq, true);
mosquitto_destroy(mosq);
mosquitto_lib_cleanup();