至于怎么连接,订阅,发布的,这里就不重复说了,网上很多,详细看官方文档,
1,特别说明,重连这个是异步特有的,不是同步的,同步的是没有的;
2,详细的,代码我这里也不全部粘贴了,毕竟是公司的;
3,其实就是连接的3个参数和一个MQTTAsync_setConnected()函数。
conn_opts.automaticReconnect = 1;
conn_opts.minRetryInterval = 2; //seconds
conn_opts.maxRetryInterval = 365*24*60*60;
第一个参数,使能自动重连;
第二个参数,是每次重连的时间间隔;
第三个参数,是重连时间的最大限度。
conn_opts.automaticReconnect = 1;
conn_opts.minRetryInterval = 2; //seconds
conn_opts.maxRetryInterval = 365*24*60*60;
conn_opts.context = GlobalClient;
//注意,异步连接函数的返回值为0,表示的是请求连接被接收了,onConnect被调用才是真正地连接成功
while(1)
{
rc = MQTTAsync_connect(GlobalClient, &conn_opts);
if (rc == MQTTASYNC_SUCCESS)
{
printf("Successfully start the request of connect.\n");
break;
}
sleep(1);
printf("Failed to start the request of connect, return error code.\n", rc);
}
//这个函数是只有automaticReconnect被置为真时,才用的,也就是说自动重连的时候,会用这个函数
while(1)
{
rc = MQTTAsync_setConnected(GlobalClient, (VOID *)GlobalClient, onConnected);
if (rc == MQTTASYNC_SUCCESS)
{
printf("Successfully setConnected.\n");
break;
}
sleep(1);
printf("Failed to setConnected, return error code %d.\n", rc);
}
}
onConnected函数,重新连接是需要重新订阅的,之前有人说不需要重新订阅,但是我试了,重连之后,不重新订阅是可以收到消息的。
/*******************************************************************************
函 数 名 : onConnected
功能描述 : MQTTAsync_setConnected()函数重连成功调用的函数,在这里做重连之后的订阅操作
输入参数 : VOID *context, CHAR *cause,参数是固定的
输出参数 : None
返 回 值 : None
*******************************************************************************/
VOID onConnected(VOID* context, CHAR* cause)
{
printf("set on connected\n");
MQTTAsync_responseOptions sub_opts = MQTTAsync_responseOptions_initializer;
sub_opts.onSuccess = onSubscribe;
sub_opts.onFailure = onSubscribeFailure;
sub_opts.context = GlobalClient;
INT32 rc;
printf("Successful connection, then ");
INT32 qoss[SUB_TOPIC_COUNT] = {SUB_TOPIC_QOS2, SUB_TOPIC_QOS2, SUB_TOPIC_QOS2, SUB_TOPIC_QOS2, \
SUB_TOPIC_QOS2, SUB_TOPIC_QOS2, SUB_TOPIC_QOS2, SUB_TOPIC_QOS2, \
SUB_TOPIC_QOS2, SUB_TOPIC_QOS2, SUB_TOPIC_QOS2, SUB_TOPIC_QOS2, \
SUB_TOPIC_QOS2, SUB_TOPIC_QOS2, SUB_TOPIC_QOS2, SUB_TOPIC_QOS2, \
SUB_TOPIC_QOS2, SUB_TOPIC_QOS2};
CHAR *topics[SUB_TOPIC_COUNT] = {