[Break Tech] How to establish the communication between two devices / two file of code
Écrit par Florian Dordain, Publié le 01 juillet 2021
For that purpose you need to use QRemoteObjects !
For example, QRemoteObjects is able to manage the communication between a tablet and PC.
What is QRemoteObject ?
Qt Remote Objects (QtRO) is an Inter-Process Communication (IPC) module developed for Qt. This module extends Qt's existing functionalities to enable information exchange between processes or computers, easily.
In a word, QRemoteObject allows to use function in a code file from another devices.
Sources : https://doc.qt.io/qt-5/qtremoteobjects-index.html
How does it work ?
Of course, there is a code in both PCs. For example :
Computer 1 :
- Source.cpp file (automatically generated from Rep file)
- Rep file contains slot and properties - variables
- Client.cpp to connect the replicas
Computer 2:
- Replicas.cpp (automatically generated from Rep file)
- Rep file contains slot and properties - variables
- Gateway.cpp to receive signals/slots
The replicas fil is a copy of source file. A communication (IPC) is automatically generated between both files. So if you use signals or slot in source or replicas file the trigger is sent through the network to other file.
To get more information please see [ How to improve the UX of an industrial robot with Qt ] :
https://resources.qt.io/on-demand/how-to-improve-the-ux-of-an-industrial-robot-with-qt-devdes-2021
For example, in KMeleonBox :
How to set up the PRO file of my project ?
It is necessary to add the following line :
QT += remoteobjects
And in the replica project you need to add this line :
REPC_REPLICA = myfile.rep
In the source project you can use the following lines :
QT += remoteobjects
REPC_SOURCE = myfile_source.rep
How to set up the REP file ?
You need to add a new file in your project with extension .rep.
Use the following line to add a property. For me I see the remoteobject properties like sharde variables.
PROP( type variablename = value )
For example : PROP ( bool ok = false)
Use the following line to declare a SLOT. For me the SLOT opens an acces to a specific function from another device.
SLOT(slot_name(parameter 1, parameter 2, ....))
For example : SLOT( getNumber(int ID))
How to set up the client.cpp file ?
You need to add a nex cpp class in your project source.
In this file, you need to write the slot from REP file like virtual function.
For example :
virtual void getNumber(int ID);
In your cpp file, you need to add the parent myfileSimpleSource and include the file "
rep_myfile_source.h"
How to set up the gateway.cpp file ?
You need to add a nex cpp class in your project replicas.
In this file, you need to write the signals when the properties value changed.
For example :
void okChanged(bool value);
In your cpp file, you need to include the file "rep_myfile_replicas.h" and you need to declare a shared pointer to store the replicas
QSharedPointer<myFileReplica>
Afterwards you need to connect the shared pointer to slots. For example :
connect(myPointer.data(),SIGNAL(mySignal()),this,SLOT(mySlot()));
And finally how to establish the communication between both devices ?
In your main.cpp in your replicas project, accept the connection :
QSharedPointer<SimpleSwitchReplica> ptr; // shared pointer to hold source replica
QRemoteObjectNode repNode; // create remote object node
repNode.connectToNode(QUrl(QStringLiteral("local:switch"))); // connect with remote host node
ptr.reset(repNode.acquire<SimpleSwitchReplica>()); // acquire replica of source from host node
Client rswitch(ptr); // create client switch object and pass reference of replica to it
In your main.cpp in your source project, cast the connection :
SimpleSwitch srcSwitch; // create simple switch
QRemoteObjectHost srcNode(QUrl(QStringLiteral("local:switch"))); // create host node without Registry
srcNode.enableRemoting(&srcSwitch); // enable remoting/sharing
And now you can run both executable, the connection is established !
Please see the example here : https://doc.qt.io/qt-5/remoteobjects-example-static-source.html
Aucun commentaire pour l'instant
Dites-nous ce que vous en pensez