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:
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.
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(); }
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.
Partager