2011-03-08 6 views
1

IA92 Java implementation for MQTT을 사용 중이므로 MQTT 브로커에 연결할 수 있습니다. 연결을 설정하기 위해, 나는 이런 식으로 뭔가를하고 있어요 :MQTT 클라이언트의 시간 종료를 설정하는 방법은 무엇입니까?

// Create connection spec 
String mqttConnSpec = "tcp://[email protected]_port"; 
// Create the client and connect 
mqttClient = MqttClient.createMqttClient(mqttConnSpec, null); 
mqttClient.connect("the_id", true, 666); 

문제는 가끔 서버가 응답을 보내는 데 너무 많은 시간을 소요하고 시간 제한 예외가 발생한다는 것입니다 :

org.apache.harmony.luni.platform.OSNetworkSystem.connectStreamWithTimeoutSocket(OSNetworkSystem.java:130) 
    at org.apache.harmony.luni.net.PlainSocketImpl.connect(PlainSocketImpl.java:246) 
    at org.apache.harmony.luni.net.PlainSocketImpl.connect(PlainSocketImpl.java:533) 
    at java.net.Socket.connect(Socket.java:1055) 
    at com.ibm.mqtt.j2se.MqttJava14NetSocket.<init>((null):-1) 
    at com.ibm.mqtt.j2se.MqttJavaNetSocket.setConnection((null):-1) 
    at com.ibm.mqtt.Mqtt.tcpipConnect((null):-1) 
    at com.ibm.mqtt.MqttBaseClient.doConnect((null):-1) 
    at com.ibm.mqtt.MqttBaseClient.connect((null):-1) 
    at com.ibm.mqtt.MqttClient.connect((null):-1) 
    at com.ibm.mqtt.MqttClient.connect((null):-1) 

내가해야 할 일은 mqtt 클라이언트가 직접 결정하도록하는 대신 수동으로 시간 초과를 설정하는 것입니다. 설명서에는 다음 내용이 나와 있습니다. MQ Telemetry Transport 연결의 속성을 설정하는 방법 (예 : 시간 초과 및 재시도)이 있습니다.

하지만 솔직히 나는 그것에 대해 아무 것도 발견하지 못했습니다. 전체 javadoc 참조를 살펴 보았습니다. 타임 아웃 구성에 대한 증거는 없습니다. 오픈 소스가 아니기 때문에 소스 코드를 볼 수 없습니다.

그래서 어떻게 Mqtt 연결에 대한 시간 초과를 설정할 수 있습니까?

답변

0

ia92에 대해서는 아무것도 몰라요.하지만 connect() 호출의 666이 타임 아웃을 설정하려고하는 것이라고 생각합니까?

설명서가 언급 한 시간 초과는 아마도 keepalive timeout입니다. 이것은 서버와 클라이언트 간의 통신없이 경과 할 수있는 최대 시간 (클라이언트가 선택)입니다. 나는 이것이 당신이 가장 관심이있는 것 같아요.

반면에 재시도는 QoS> 0 인 메시지를 보낼 때 잘못된 것으로 보인 메시지를 다시 시도하는 것을 의미 할 가능성이 큽니다. 이것은 브로커가 아닌 클라이언트 라이브러리 코드에 의해 처리 될 것입니다. 이것은 당신이 연결 한 후에 만 ​​작용하는 것입니다. 그래서 나는 그것이 당신의 문제라고 의심합니다.

keepalive 시간 초과가 올바르게 설정되어 있는지 확인하려면 클라이언트가 수정 된 mosquitto 중개인을 가리 키도록하십시오. src/read_handle_server.c에서 mqtt3_handle_connect()를 수정하여 연결시 keepalive 값을 출력 할 수 있습니다. 이것은 당신이 생각하는 것을 해줄 것이지만, 나는 두려워하는 실제 문제에 도움이되지 않을 것입니다!

0

어떤 중개인을 사용하십니까? 정말 작은 메시지 브로커 V1.1 Alpha, Mosquitto, IBM WebSphere와 함께 제공되는 브로커? 서버 구성에서이 시간 종료 값을 설정해야합니다. 시스템이 그런 식으로 작동하기 때문입니다. 브로커가 클라이언트 - 서버 연결을 닫지 않고 프로세스가 다시 시작되지 않도록 브로커에서 활성 상태 값을 설정하고 해당 간격이 만료되기 전에 클라이언트에서 ping을 전송합니다. 사실, 해당 간격이 만료 되더라도 서버는 '유예 기간'이 끝날 때까지 연결을 닫지 않습니다. http://public.dhe.ibm.com/software/dw/webservices/ws-mqtt/mqtt-v3r1.html#connect

1

혼란이 있으면 자세히 알아 보려면 MqttConnectionOptions를 참조하십시오.

String userName="Ohelig"; 
    String password="Pojke"; 
    MqttClient client = new MqttClient("tcp://192.168.1.4:1883","Sending");  
    MqttConnectOptions authen = new MqttConnectOptions(); 
    authen.setKeepAliveInterval(30); 
    authen.setUserName(userName); 
    authen.setPassword(password.toCharArray()); 
    authen.setKeepAliveInterval(30); 
    authen.setConnectionTimeout(300); 

    client.connect(authen);