2017-11-04 27 views
0

Paho MQTTPacket Embedded C++ 라이브러리를 사용하여 C++ 코드를 MQTT 브로커에 연결했습니다. 해당 브로커가 io.adafruit.com 일 때 완벽하게 정상적으로 작동합니다. 그러나 제 라즈베리 파이에서 실행중인 내 Mosquitto 인스턴스 인 경우 연결이 실패합니다. 나는 MQTT :: 클라이언트에 MQTTClient.h에서이 라인을 좁혀했습니다 : 연결 방법 :Paho MQTT (C++) 클라이언트가 Mosquitto에 연결하지 못했습니다.

// this will be a blocking call, wait for the connack 
if (waitfor(CONNACK, connect_timer) == CONNACK) 

응용 약 30 초 여기를 중단하고 CONNACK 이외의 결과를 (얻는다을 0보다 구체적으로 0).

프로토콜 버전 3 (3.1)과 4 (3.1.1)를 모두 시도했습니다. 같은 결과.

My Mosquitto 인스턴스에는 인증 또는 암호가 설정되어 있지 않습니다. Mosquitto 로그에서 디버그 메시지를 켜려고 시도했지만 유용한 것은 표시되지 않습니다. 나는 잃어 버렸다. 내 C++ Paho 코드에서 Mosquitto에 연결할 수없는 이유는 무엇입니까?

EDIT : 여기에 클라이언트 코드가 있습니다 ... 다시이 점은 Adafruit와 잘 작동하지만 localhost에서 Mosquitto를 가리키면 설명대로 중단됩니다. (나는 사용자 이름과 패스워드를 생략했다. 나는 그것들을 보내고있다. 그러나 mosquitto_pub 나 mosquitto_sub를 명령 행으로 사용하면 모스투토가 익명 연결을 허용하십시오.)

const char* host = "127.0.0.1"; 
int port = 1883; 
const char* clientId = "ZoomBridge"; 
const char* username = "..."; 
const char* password = "..."; 
MQTT::QoS subsqos = MQTT::QOS2; 

ipstack = new IPStack(); 
client = new MQTT::Client<IPStack, Countdown, 30000>(*ipstack); 

MQTTPacket_connectData data = MQTTPacket_connectData_initializer; 
data.willFlag = 1; 
data.MQTTVersion = 3; 
data.clientID.cstring = (char*)clientId; 
data.username.cstring = (char*)username; 
data.password.cstring = (char*)password; 

data.keepAliveInterval = 20; 
data.cleansession = 1; 

int rc = ipstack->connect(host, port); 
if (rc != MQTT::SUCCESS) { 
    cout << "Failed [1] (result " << rc << ")" << endl; 
    return rc; 
} 

rc = client->connect(data); 
if (rc != MQTT::SUCCESS) { 
    cout << "Failed [2] (result " << rc << ")" << endl; 
    ipstack->disconnect(); 
    return rc; 
} 
+0

모기의 어떤 버전을 사용하고 있습니까? – hardillb

+0

모스 킷토 1.4.10 (빌드 날짜 월, 29 5 월 2017 13:43:29 +0100), 지난 주 다운로드 및 설치. 이 Pi의 모든 것은 지난 주 이내에 OS를 포함하여 신선합니다. –

+0

좋아요, 기본 raspbian 번들 버전이 매우 오래된 iirc인지 확인하십시오 (최신 1.4.14, 버그가 있으므로 1.4.13을 건너 뛰십시오) – hardillb

답변

1

주석에서 해시 된 바와 같이.

클라이언트 (LVT)에 대해 주제 나 페이로드를 전달하지 않고 클라이언트에 대한 최종 유언문을 설정하려는 플래그를 설정하는 것처럼 보입니다 (data.willFlag = 1;).

LWT가 필요하지 않은 경우 플래그를 0으로 설정하거나 줄 설정 플래그를 제거합니다. 기본적으로 사용하지 않도록 설정해야합니다.

명확성을 지적 할만한 가치가 있으며, 이는 모두 Paho Embedded C++ MQTTPacket client이 아닌 전체입니다. Paho C++ client.

+0

확인 : data.will.message.cstring과 data.will.topicName.cstring을 설정하면. qos 및 .windFlag = 1 일 때도 성공적으로 연결됩니다. 또는 말했듯이 플래그를 0으로 설정할 수 있습니다. –