• mqtt的C库 paho.mqtt.c 自动重联配置


    1、只有异步接口 MQTTAsync中才有,使用起来不是特别方便

    2、需要配置参数

      conn_opts.automaticReconnect = 1;
        conn_opts.minRetryInterval = 2; 
        conn_opts.maxRetryInterval = 365*24*60*60;

    3、需要配置函数

    if ((rc = MQTTAsync_setConnected(client, client, onReconnected)) != MQTTASYNC_SUCCESS)
     {
      printf("Failed to MQTTAsync_setConnected, return code %d ", rc);
      rc = EXIT_FAILURE;
      goto destroy_exit;
     }

    4、连接成功后的回调实现

    void onReconnected(void* context, char* cause)
    {
     MQTTAsync client = (MQTTAsync)context;
     MQTTAsync_responseOptions opts = MQTTAsync_responseOptions_initializer;
     int rc;
     printf("Successful reconnection ");
     printf("Subscribing to topic %s for client %s using QoS%d "
               "Press Q<Enter> to quit ", TOPIC, CLIENTID, QOS);
     opts.onSuccess = onSubscribe;
     opts.onFailure = onSubscribeFailure;
     opts.context = client;
     if ((rc = MQTTAsync_subscribe(client, TOPIC, QOS, &opts)) != MQTTASYNC_SUCCESS)
     {
      printf("Failed to start subscribe, return code %d ", rc);
      finished = 1;
     }
     
    }
    /*******************************************************************************
     * Copyright (c) 2012, 2020 IBM Corp.
     *
     * All rights reserved. This program and the accompanying materials
     * are made available under the terms of the Eclipse Public License v2.0
     * and Eclipse Distribution License v1.0 which accompany this distribution. 
     *
     * The Eclipse Public License is available at 
     *   https://www.eclipse.org/legal/epl-2.0/
     * and the Eclipse Distribution License is available at 
     *   http://www.eclipse.org/org/documents/edl-v10.php.
     *
     * Contributors:
     *    Ian Craggs - initial contribution
     *******************************************************************************/
    
    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
    #include "MQTTAsync.h"
    
    #if !defined(_WIN32)
    #include <unistd.h>
    #else
    #include <windows.h>
    #endif
    
    #if defined(_WRS_KERNEL)
    #include <OsWrapper.h>
    #endif
    
    #define ADDRESS     "tcp://mqtt.eclipse.org:1883"
    #define CLIENTID    "ExampleClientSub"
    #define TOPIC       "MQTT Examples"
    #define PAYLOAD     "Hello World!"
    #define QOS         1
    #define TIMEOUT     10000L
    
    int disc_finished = 0;
    int subscribed = 0;
    int finished = 0;
    
    void connlost(void *context, char *cause)
    {
    	MQTTAsync client = (MQTTAsync)context;
    	MQTTAsync_connectOptions conn_opts = MQTTAsync_connectOptions_initializer;
    	int rc;
    
    	printf("
    Connection lost
    ");
    	if (cause)
    		printf("     cause: %s
    ", cause);
    
    	printf("Reconnecting
    ");
    	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
    ", rc);
    		finished = 1;
    	}
    }
    
    
    int msgarrvd(void *context, char *topicName, int topicLen, MQTTAsync_message *message)
    {
        printf("Message arrived
    ");
        printf("     topic: %s
    ", topicName);
        printf("   message: %.*s
    ", message->payloadlen, (char*)message->payload);
        MQTTAsync_freeMessage(&message);
        MQTTAsync_free(topicName);
        return 1;
    }
    
    void onDisconnectFailure(void* context, MQTTAsync_failureData* response)
    {
    	printf("Disconnect failed, rc %d
    ", response->code);
    	disc_finished = 1;
    }
    
    void onDisconnect(void* context, MQTTAsync_successData* response)
    {
    	printf("Successful disconnection
    ");
    	disc_finished = 1;
    }
    
    void onSubscribe(void* context, MQTTAsync_successData* response)
    {
    	printf("Subscribe succeeded
    ");
    	subscribed = 1;
    }
    
    void onSubscribeFailure(void* context, MQTTAsync_failureData* response)
    {
    	printf("Subscribe failed, rc %d
    ", response->code);
    	finished = 1;
    }
    
    
    void onConnectFailure(void* context, MQTTAsync_failureData* response)
    {
    	printf("Connect failed, rc %d
    ", response->code);
    	finished = 1;
    }
    
    
    void onConnect(void* context, MQTTAsync_successData* response)
    {
    	MQTTAsync client = (MQTTAsync)context;
    	MQTTAsync_responseOptions opts = MQTTAsync_responseOptions_initializer;
    	int rc;
    
    	printf("Successful connection
    ");
    
    	printf("Subscribing to topic %s
    for client %s using QoS%d
    
    "
               "Press Q<Enter> to quit
    
    ", TOPIC, CLIENTID, QOS);
    	opts.onSuccess = onSubscribe;
    	opts.onFailure = onSubscribeFailure;
    	opts.context = client;
    	if ((rc = MQTTAsync_subscribe(client, TOPIC, QOS, &opts)) != MQTTASYNC_SUCCESS)
    	{
    		printf("Failed to start subscribe, return code %d
    ", rc);
    		finished = 1;
    	}
    }
    
    void onReconnected(void* context, char* cause)
    {
    	MQTTAsync client = (MQTTAsync)context;
    	MQTTAsync_responseOptions opts = MQTTAsync_responseOptions_initializer;
    	int rc;
    
    	printf("Successful reconnection
    ");
    
    	printf("Subscribing to topic %s
    for client %s using QoS%d
    
    "
               "Press Q<Enter> to quit
    
    ", TOPIC, CLIENTID, QOS);
    	opts.onSuccess = onSubscribe;
    	opts.onFailure = onSubscribeFailure;
    	opts.context = client;
    	if ((rc = MQTTAsync_subscribe(client, TOPIC, QOS, &opts)) != MQTTASYNC_SUCCESS)
    	{
    		printf("Failed to start subscribe, return code %d
    ", rc);
    		finished = 1;
    	}
    	
    }
    
    int main(int argc, char* argv[])
    {
    	MQTTAsync client;
    	MQTTAsync_connectOptions conn_opts = MQTTAsync_connectOptions_initializer;
    	MQTTAsync_disconnectOptions disc_opts = MQTTAsync_disconnectOptions_initializer;
    	int rc;
    	int ch;
    
    	if ((rc = MQTTAsync_create(&client, ADDRESS, CLIENTID, MQTTCLIENT_PERSISTENCE_NONE, NULL))
    			!= MQTTASYNC_SUCCESS)
    	{
    		printf("Failed to create client, return code %d
    ", rc);
    		rc = EXIT_FAILURE;
    		goto exit;
    	}
    
    	if ((rc = MQTTAsync_setCallbacks(client, client, connlost, msgarrvd, NULL)) != MQTTASYNC_SUCCESS)
    	{
    		printf("Failed to set callbacks, return code %d
    ", rc);
    		rc = EXIT_FAILURE;
    		goto destroy_exit;
    	}
    	if ((rc = MQTTAsync_setConnected(client, client, onReconnected)) != MQTTASYNC_SUCCESS)
    	{
    		printf("Failed to MQTTAsync_setConnected, return code %d
    ", rc);
    		rc = EXIT_FAILURE;
    		goto destroy_exit;
    	}
    	
    	conn_opts.keepAliveInterval = 20;
    	conn_opts.cleansession = 1;
    	conn_opts.onSuccess = onConnect;
    	conn_opts.onFailure = onConnectFailure;
    	conn_opts.context = client;
    	conn_opts.automaticReconnect = 1;
    	conn_opts.minRetryInterval = 2; //seconds
        conn_opts.maxRetryInterval = 365*24*60*60;
    	if ((rc = MQTTAsync_connect(client, &conn_opts)) != MQTTASYNC_SUCCESS)
    	{
    		printf("Failed to start connect, return code %d
    ", rc);
    		rc = EXIT_FAILURE;
    		goto destroy_exit;
    	}
    
    	while (!subscribed && !finished)
    		#if defined(_WIN32)
    			Sleep(100);
    		#else
    			usleep(10000L);
    		#endif
    
    	if (finished)
    		goto exit;
    
    	do 
    	{
    		ch = getchar();
    	} while (ch!='Q' && ch != 'q');
    
    	disc_opts.onSuccess = onDisconnect;
    	disc_opts.onFailure = onDisconnectFailure;
    	if ((rc = MQTTAsync_disconnect(client, &disc_opts)) != MQTTASYNC_SUCCESS)
    	{
    		printf("Failed to start disconnect, return code %d
    ", rc);
    		rc = EXIT_FAILURE;
    		goto destroy_exit;
    	}
     	while (!disc_finished)
     	{
    		#if defined(_WIN32)
    			Sleep(100);
    		#else
    			usleep(10000L);
    		#endif
     	}
    
    destroy_exit:
    	MQTTAsync_destroy(&client);
    exit:
     	return rc;
    }
    

      

  • 相关阅读:
    【DWM1000】 code 解密2一 工程初始化代码分析
    【DWM1000】 code 解密1一 去掉Main 函数多余内容
    Integration between SharePoint 2013 and CRM 2013 (On-Premise)
    Windows Server2012R2 添加Microsoft .NET Framework 3.5 功能失败的解决方法
    Windows Server2012R2 安装 SharePoint 2013 的必备组件
    SSRS: How to Display Checkbox on Report
    ADFS部署过程中设置network service对证书的读取权限
    Dynamics CRM2013 ScLib::AccessCheckEx failed
    ADFS3.0 Customizing the AD FS Sign-in Pages
    Dynamics CRM2013 picklist下拉项行数控制
  • 原文地址:https://www.cnblogs.com/seacode/p/13665054.html
Copyright © 2020-2023  润新知