2017-04-11 5 views
0

GitHub (https://github.com/emqtt/qmqtt)에서 가져온 mqtt-client 용 라이브러리를 사용하는 데 문제가 있습니다. 윈도우 10에서는 MinGW 5.3.0로 이미 인터넷에서 몇 가지 다른 답변을 보았다Qt 및 qmqtt 클라이언트 라이브러리가 Windows에서 작동하지 않습니다.

를 컴파일하지만 대부분이며, Qt는 버전 Qt는 5.7.0과 Qt는 창조주 4.0.3을 사용하여

임 컴파일 또는 링크 오류에 대해.
제 문제는 코드가 예상 한대로 작동하지 않는다는 것입니다 (아무 것도하지 않습니다).

서버/브로커에 연결하는 제목 화면 (위 링크)의 예제에 이미 문제가 있습니다. 그것은 단순히 아무것도하지 않습니다, 나는 심지어 오류 메시지 또는 다른 피드백을받지 않습니다.

내 코드 : 나는 클라이언트 개체

QScopedPointer<QMQTT::Client> client(new QMQTT::Client(QHostAddress("192.168.8.50"), 1883)); 

주소로 Smartpointer을 가지고 포트가 올바른지, 나는 이미 구글 크롬에 대한 MQTTlens으로이 테스트.

그렇다면 입력과 출력을 처리 할 별도의 클래스가 있습니다 (멀티 스레딩 사용). 이 클래스는 신호를받는 &을 전송하여 클라이언트를 제어하거나 콘솔 출력을 통해 사용자에게 피드백을 제공 할 수 있습니다.

class MainIO : public QObject 
{ 
Q_OBJECT 
public: 
    explicit MainIO(QString clientId = "", QObject *parent = 0); 

    void mainMenue(); 
private: 
    QVector<QString> m_mainMenueStrings; 

    QString m_clientId; 

signals: 
    void connectToHost(); 
    void disconnectFromHost(); 

    void subscribe(const QString &topic, const quint8 qos); 
    void unsubscribe(const QString &topic); 
    void publish(const QMQTT::Message &message); 

public slots: 
    void onClientConnected(); 
    void onClientDisconnected(); 
    void onClientPublished(); 
    void onClientError(const QMQTT::ClientError error); 

    void onClientReceived(const QMQTT::Message &message); 

    void add(); 
    void subtract(); 
}; 

은 내 주

QThread mainIOThread; 
IoTClient::MainIO control(clientId); 
control.moveToThread(&mainIOThread); 

에 스레드 클래스의 객체를 이동하고 난 스레드

QObject::connect(&mainIOThread, &QThread::started 
       , &control,  &IoTClient::MainIO::mainMenue); 
/* Control -> Client */ 
QObject::connect(&control,  &IoTClient::MainIO::connectToHost 
       , client.data(), &QMQTT::Client::connectToHost); 
QObject::connect(&control,  &IoTClient::MainIO::subscribe 
       , client.data(), &QMQTT::Client::subscribe); 
QObject::connect(&control,  &IoTClient::MainIO::unsubscribe 
       , client.data(), &QMQTT::Client::unsubscribe); 
QObject::connect(&control,  &IoTClient::MainIO::publish 
       , client.data(), &QMQTT::Client::publish); 
/* Client -> Control */ 
QObject::connect(client.data(), &QMQTT::Client::connected 
       , &control,  &IoTClient::MainIO::onClientConnected); 
QObject::connect(client.data(), &QMQTT::Client::disconnected 
       , &control,  &IoTClient::MainIO::onClientDisconnected); 
QObject::connect(client.data(), &QMQTT::Client::error 
       , &control,  &IoTClient::MainIO::onClientError); 
QObject::connect(client.data(), &QMQTT::Client::published 
       , &control,  &IoTClient::MainIO::onClientPublished); 
QObject::connect(client.data(), &QMQTT::Client::received 
       , &control,  &IoTClient::MainIO::onClientReceived); 
mainIOThread.start(); 

mainMenue 메소드를 시작하기 전에 슬롯에 신호를 연결 다음과 같습니다 :

void MainIO::mainMenue() 
{ 
    std::system("cls"); 
    qDebug().noquote().nospace() << (tr("clients/") + m_clientId + 
    tr("/state")); 
    /* Print Menue */ 
    qDebug().noquote().nospace() << "QMQTT-Client"; 
    for (int i = 0; i < m_mainMenueStrings.size(); i++) 
    { 
     qDebug().noquote().nospace() << "\t(" << i+1 << ") " << 
     m_mainMenueStrings[i]; 
    } 
    qDebug().noquote().nospace() << "Ihre Auswahl: "; 

    /* select choice */ 
    int option = -1; 
    while ((option >= m_mainMenueStrings.size()) || (option < 0)) { 
     std::cin >> option; 
    } 
    option--; 

    switch(option) { 
    case 0: emit this->connectToHost(); 
      break; 
    case 1: add(); 
      break; 
    case 2: subtract(); 
      break; 
    case 3: emit this->disconnectFromHost(); 
      break; 
    default: 
     qDebug().noquote().nospace() << "Fehlerhafte Eingabe"; 
    } 
} 
내가 (연결 1) 일부 입력을 보낸 후 아무 반응이 없습니다 _

: (1) (2) ... 를 쓰세요 연결 : 다음 좀처럼 1,363,210

콘솔 출력이 보인다. 나는 어떤 에러 (클라이언트로부터의 에러 신호를 에러 슬롯에 연결했다) 또는 다른 신호를 얻지 못한다.

나는 이미이 연결을 소스 코드에서 테스트 했으므로 결론을 내릴 수 없다. 클라이언트가 브로커에 연결하지 않는다는 것을 (나에게) 이해하지 못하기 때문이다.

코드는 Windows에서만 실패하고 Linux에서는 작동합니다.

답변

0

이 문제를 해결했습니다. Windows 용 배포 후 프로젝트의 qmake 버전이 제대로 작동하지 않았습니다. Qbs 버전을 사용했지만이 버전을 배포 할 수 없습니다. 필자는 그것을 생성하고 필요한 파일 (.dll 등)을 내 컴퓨터의 해당 Qt 디렉토리에 복사했습니다.