Bonsoir à tous amis développeurs et autres visiteurs,


Je viens aujourd'hui vous demander votre aide en essayant d'être le plus clair possible. Voici donc mon parcours:

1- J'ai en effet un projet à réaliser dans le cadre de mon BTS et ai pour but de développer une application graphique, permettant de lancer un serveur Bluetooth lors d'un clic de bouton.

2- J'ai réussi à établir une client et un serveur Bluetooth avec deux machines distinctes mais, après isolation d'un problème de freeze, c'est la fonction "listen()" qui semblait en être la responsable.

3- Je me suis donc documenté au sujet des Thread "classiques" et des QThread, mais n'est pas réussi à faire coïncider mon programme (freeze de la fenêtre toujours présent).

4- Mon professeur m'a alors épinglé en m'envoyant un exemple de code utilisant les QTcpServer et QTcpSocket et ai pu rapidement découvrir les classes QBluetoothServer et QBluetoothSocket, à quelques choses prêt identiques mais mieux adaptées dans mon cas.


Contenu du fichier graphical_multiclients_tcpserver.pro:

Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
 
TEMPLATE = app
CONFIG += console c++11
CONFIG -= app_bundle
CONFIG -= qtcore
TARGET = multi_TCPServer
 
QT += core network widgets gui bluetooth
 
SOURCES += \
    tcpserver.cpp \
    main_multi_TCPServer.cpp
 
HEADERS  += \
    tcpserver.h
 
DEPENDPATH += .
INCLUDEPATH += \
    "C:/Qt/Qt5.5.1/5.5/mingw492_32/include/QtCore" \
    "C:/Qt/Qt5.5.1/5.5/mingw492_32/include/QtNetwork" \
    "C:/Qt/Qt5.5.1/5.5/mingw492_32/include/QtWidgets" \
    "C:/Qt/Qt5.5.1/Tools/mingw492_32/i686-w64-mingw32/include" \
    "C:/Qt/Qt5.5.1/5.5/mingw492_32/i686-w64-mingw32/include"
 
LIBS += \
    "C:/Qt/Qt5.5.1/Tools/mingw492_32/i686-w64-mingw32/lib/libws2_32.a" \
    "C:/Qt/Qt5.5.1/Tools/mingw492_32/i686-w64-mingw32/lib/libiphlpapi.a"

Contenu du fichier tcpserver.h:

Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
 
#ifndef TCPSERVER_H
#define TCPSERVER_H
 
#include <QWidget>
#include <QFormLayout>
#include <QApplication>
#include <QPushButton>
#include <QTextEdit>
#include <QString>
#include <QtGui>
#include <QtNetwork>
#include <QFormLayout>
#include <iostream>
#include <qbluetoothserviceinfo.h>
#include <qbluetoothaddress.h>
#include <QBluetoothServer>
 
using namespace std;
 
class QBluetoothServer;
class QBluetoothSocket;
class QPushButton;
class QTextEdit;
 
class BluetoothServer : public QWidget
{
    Q_OBJECT
public:
    explicit BluetoothServer(QWidget *parent = 0);
private:
    QBluetoothServer *server;
    QBluetoothServiceInfo serviceInfo;
    QList<QBluetoothSocket*> sockets;
 
    QPushButton *control;
    QTextEdit *trace;
public slots:
    void start(const QBluetoothAddress &localAdapter = QBluetoothAddress());
    void processNewConnection();
    void readClient();
};
#endif // TCPSERVER_H

Contenu du fichier tcpserver.cpp:

Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
 
#include "tcpserver.h"
 
BluetoothServer::BluetoothServer(QWidget *parent) : QWidget(parent) {
 
    setWindowTitle("multi-clients -> BluetoothServer <-");
 
    server=new QBluetoothServer(QBluetoothServiceInfo::RfcommProtocol, this);
    connect(server, SIGNAL(newConnection()), this, SLOT(processNewConnection()));
 
    QFormLayout *layout=new QFormLayout(this);
 
    control = new QPushButton("Start", this);
    connect(control, SIGNAL(clicked()), this, SLOT(start()));
    layout->addWidget(control);
 
    trace=new QTextEdit(this);
    trace->setReadOnly(true);
    layout->addWidget(trace);
}
 
void BluetoothServer::start(const QBluetoothAddress& localAdapter){
    if(server->isListening()) return;
 
    if(!server->listen(localAdapter))
        trace->append("Failed to listen!");
    else trace->append("Listening!");
}
 
void BluetoothServer::processNewConnection(){
 
    while(server->hasPendingConnections()){
        //trace->append("Accepting connection!");
        trace->append("demande de connexion provenant d'un client acceptee ... !");
        QBluetoothSocket *socket=server->nextPendingConnection();
        connect(socket, SIGNAL(readyRead()), this, SLOT(readClient()));
        sockets.append(socket);
    }
}
 
void BluetoothServer::readClient(){
    QBluetoothSocket *socket = dynamic_cast<QBluetoothSocket*>( sender() );
    trace->append(socket->readAll());
    // Sinon utiliser toStdString(), toLatin1(), toUtf8(), toLocal8Bit() (ou qPrintable()) <--- toAscii()
    // socket->write(QString("Hello Client").toAscii());
    socket->write(QString("Hello le Client ... message envoye par le serveur ...").toLocal8Bit());
}

Contenu du fichier main_multi_TCPServer.cpp:

Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
 
#include "tcpserver.h"
 
int main(int argc, char *argv[])
{
    QApplication a(argc, argv);
    BluetoothServer s;
    s.show();
 
    return a.exec();
}
5- Je suis désormais confronté au fait que le listen ne semble pas s'effectuer de la bonne manière et le programme refuse de poursuivre.


Je ne comprend pas d'où peut bien venir mon erreur, m’empêchant de poursuivre le développement de mon projet.
Je vous remercie d'avance si vous avez prit le temps de lire mon post. Cordialement.



PS: J'utilise une clé USB D-LINK DBT-122 de stack windows et est bien appareillée à mon ordinateur.