2 wjw173 wjw173 于 2016.02.22 14:44 提问

mqttkit 如何取消自动重连

如题,项目需要,我们用mqtt协议做远程控制。通信双方为mqtt服务器和两个ios APP,A和B .
现在我用同一个账号(如账号:32456@qq.com 密码:123456)先在A客户端登录,然后再用这个账号登录B客户端。这时B会把A挤掉,重新连上,(重连成功后发订阅,也会一直发订阅)。待B登陆成功,A掉线后,A又自动重连。就这样一直挤掉对方。请问该如何取消mqtt Client的自动重连?

2个回答

wjw173
wjw173   2016.02.25 16:09

int mosquitto_loop_forever(struct mosquitto *mosq, int timeout, int max_packets)
{
int run = 1;
int rc;
unsigned int reconnects = 0;
unsigned long reconnect_delay;

if(!mosq) return MOSQ_ERR_INVAL;

if(mosq->state == mosq_cs_connect_async){
    mosquitto_reconnect(mosq);
}

while(run){
    do{
        rc = mosquitto_loop(mosq, timeout, max_packets);
        if (reconnects !=0 && rc == MOSQ_ERR_SUCCESS){
            reconnects = 0;
        }
    }while(rc == MOSQ_ERR_SUCCESS);
    if(errno == EPROTO){
        return rc;
    }
    pthread_mutex_lock(&mosq->state_mutex);
    if(mosq->state == mosq_cs_disconnecting){
        run = 0;
        pthread_mutex_unlock(&mosq->state_mutex);
    }else{
        pthread_mutex_unlock(&mosq->state_mutex);

        if(mosq->reconnect_delay > 0 && mosq->reconnect_exponential_backoff){
            reconnect_delay = mosq->reconnect_delay*reconnects*reconnects;
        }else{
            reconnect_delay = mosq->reconnect_delay;
        }

        if(reconnect_delay > mosq->reconnect_delay_max){
            reconnect_delay = mosq->reconnect_delay_max;
        }else{
            reconnects++;
        }

#ifdef WIN32
Sleep(reconnect_delay*1000);
#else
sleep(reconnect_delay);
#endif

        pthread_mutex_lock(&mosq->state_mutex);
        if(mosq->state == mosq_cs_disconnecting
           || mosq->state == mosq_cs_connected){
            run = 0;
            pthread_mutex_unlock(&mosq->state_mutex);
        }else{
            pthread_mutex_unlock(&mosq->state_mutex);
            mosquitto_reconnect(mosq);
        }
    }
}
return rc;

}

wjw173
wjw173   2016.02.25 16:17

if(mosq->state == mosq_cs_disconnecting
|| mosq->state == mosq_cs_connected){
run = 0;

                    mqtt client 链接到服务器后,mosq->state 的状态是mosq_cs_connected,原来是if(mosq->state == mosq_cs_disconnecting
       ){
        run = 0;
                    }
                    要想跳出循环。在状态是mosq_cs_connected的时候也要跳出循环,在mosq_loop_forever(){}里设置 run = 0;就可以避免自动重连的while循环。
                    mqttkit 很久之前就没有更新了,mqttclient 会比较好点。ios的关于mqtt第三方库还是少了点。还有只支持swift 的cocomqtt.
Csdn user default icon
上传中...
上传图片
插入图片
准确详细的回答,更有利于被提问者采纳,从而获得C币。复制、灌水、广告等回答会被删除,是时候展现真正的技术了!
其他相关推荐
MQTTKit即时通讯使用
IOS长连接是由系统来维护的,也就是说苹果的IOS系统在系统级别维护了一个客户端和苹果服务器的长链接,IOS上的所有应用上的推送都是先将消息推送到苹果的服务器然后将苹果服务器通过这个系统级别的长链接推送到手机终端上,这样的的几个好处为: 1.在手机终端始终只要维护一个长连接即可,而且由于这个长链接是系统级别的不会出现被杀死而无法推送的情况。 2.省电,不会出现每个应用都各自维护一个自己
(六)、ZooKeeper自动重连
在一套分布式的online services系统中,各service通常不会放在一台服务器上,而是通过Zookeeper这样的东西,将自己的service信息注册到上面,service的使用者通过Zookeeper来发现各service的信息,从而可以将request发送到不同的service上去处理。                            如上图所示,两个Service Pr
JDBC如何实现Mysql自动重连的机制
日志:using the Connector/J connection property 'autoReconnect=true' to avoid this problem com.mysql.jdbc.CommunicationsException: The last packet successfully received from the server was58129 se
测试自动重连代码
DELPHI 自动重连 DELPHI 自动重连
hibernate自动重新连接数据库
现在遇到这样情况,tomcat应用(持久层是hibernate)和数据库在不同机器上,当数据库重启或者出问题或者网络有问题,连接就会中断。修复以后需要重启tomcat,否则应用就持续报connection refused错误。有何办法能让hibernate在知道连接失败以后自动重新连接数据库。在网上查了很多资料都没有办法很好的解决,最后更换了连接池,使用proxool具体配置可以看别一篇文
数据库自动重连
1、引入c3p0 maven依赖        c3p0        c3p0        0.9.1.2     2、继承UnpooledDataSourceFactory并实现 c3p0 的数据连接池 import com.mchange.v2.c3p0.ComboPooledDataSource;   import org.apache.ibatis.
mysql 自动重连
MYSQL_OPT_RECONNECT (argument type: my_bool *) Enable or disable automatic reconnection to the server if the connection is found to have been lost. Reconnect has been off by default since MySQL 5.0.3
Mysql 断开连接之后自动重新连接
假定,你没有网络,只是本机的数据库,是没有问题的(断电不算,当然mysql连接也有个timeout时间,超出这个时间之后mysql连接会被mysql数据库断开的)一旦有了网络,一切假定都不成立,必须也不得不考虑网络连通检测机制,使得在必要的时候,让无效的数据库联接抛弃,而重新连接。
wpa_supplicant--忘记网络后,wpa自动连接规则
注:下面的规则去掉了WPS过程 忘记网络后,会进入如下规则进行匹配: a.      扫描列表不为空 b.      从最高优先级(priority)ssid群中开始匹配,此类ssid都是保存在config文件中的network,例如: network={         ssid="CM_AP"         psk="33333333333"         key_mgmt=
连接池自动重新连接数据库的测试
我对数据库重启后, 是否自动重新初始化连接池进行了测试:一、使用oracle数据库1.  resin-3.0.22  无需特殊配置,自动支持2.  jboss-4.0.4.GA  需加如下配置  org.jboss.resource.adapter.jdbc.vendor.OracleValidConnectionChecker3.  tomcat5.0    测试一、当我的tom