Hi, ZMQ people.
Greetings.
I have a C++ zeromq client process in which I am sending some data members
structures
*ZMQComponent.h* file
#include <zmq.hpp>
#include <sofa/defaulttype/VecTypes.h>
// To Quat datatype
#include <sofa/defaulttype/Quat.h>
using sofa::defaulttype::Quat;
using std::string;
namespace sofa
{
namespace component
{
namespace controller
{
/* data structure which I want send data to python zmq server */
struct instrumentData
{
typedef sofa::defaulttype::Vec3d Vec3d;
Vec3d pos;
Quat quat;
int btnState;
float openInst;
bool blnDataReady;
};
class ZMQComponent : public sofa::core::behavior::BaseController
{
public:
SOFA_CLASS(ZMQComponent, sofa::core::behavior::BaseController);
ZMQComponent();
virtual ~ZMQComponent();
/* Conect to ZMQ external python Server */
void setupConnection();
/* Send some data memeber instrumentData structure to ZMQ external Server */
void instrumentDataSend(instrumentData a);
/* initialize function */
void init();
};
} // namespace sofa
} // namespace component
} // namespace controller
The *ZMQComponent.cpp* is:
#include <sofa/core/ObjectFactory.h>
#include <zmq.hpp>
#include <iostream>
#include <string>
#include "ZMQComponent.h"
using namespace std;
namespace sofa
{
namespace component
{
namespace controller
{
/* ZMQ Internal Client context and socket */
zmq::context_t context(1);
zmq::socket_t socket(context, ZMQ_REQ);
ZMQComponent::ZMQComponent(){}
void ZMQComponent::setupConnection()
{
cout << "Connecting to python zeroMQ server ..." << endl;
socket.connect("tcp://localhost:5555");
}
void ZMQComponent::instrumentDataSend(instrumentData a)
{
/* Initialize the data members structure instrumentData */
a.pos = sofa::defaulttype::Vec3d(1.0f, 1.0f, 1.0f);
a.quat = defaulttype::Quat(1.0f, 1.0f, 4.0f, 1.0f);
a.btnState = 5671;
a.openInst = 1.0f;
a.blnDataReady = false;
/* We send the btnState data */
zmq::message_t request(10);
cout << "The data are: " << a.btnState;
/* We ask for the memory address to ge the btnState content and send it. */
memcpy(request.data(), &a.btnState, 10);
socket.send(request);
}
/* In the init function we create the objects to setup connection and send
data */
void ZMQComponent::init()
{
std::cout << "ZeroMQCommunication::init()" << std::endl;
ZMQComponent z;
z.setupConnection();
instrumentData itemp;
z.instrumentDataSend(itemp);
}
/* Other code related .... */
ZMQComponent::~ZMQComponent(){}
// int ZeroMqComponentClass = sofa::core::RegisterObject("This component
does nothing.").add<ZeroMqComponent>();
SOFA_DECL_CLASS(ZMQServerComponent)
int ZMQServerComponentClass = sofa::core::RegisterObject("This component
create a Socket.").add< ZMQServerComponent >();
} // namespace controller
} // namespace component
} // namespace sofa
Then , my python zmq server which receive the *btnState* int variable is:
import time
import zmq
context = zmq.Context()
socket = context.socket(zmq.REP)
socket.bind("tcp://*:5555")
print('ZMQ Server listening ... ')
while True:
# Wait for next request from client
message = socket.recv()
print("Received message from Sofa: {}".format(message))
# print("Received message from c++ %s" % message)
# Do some 'work'
time.sleep(1)
# Send reply back to client
# socket.send(b"Hola cliente, muy bien y tu ?")
# print('Response sent')
The output or the message which arrive to python zmq server is the symbols
characters of the btnState:
(cnvss_test) ➜ Python git:(ZMQCommunication) ✗ python server.py
ZMQ Server listening ...
*Received message from Sofa: b"\x00'\x84)\xff\x7f\x00\x00\x98&*"
Likely, As I in my python server I am representing like a string message
arrived and I am sending from my c++ client a int btnState data,
then I try convert int to string in the python server side:
And I replace this line
print("Received message from Sofa: {}".format(message))
by thiis line
print("Received message from c++ %s" % str(message))
But my output is:
(cnvss_test) ➜ Python git:(ZMQCommunication) ✗ python server.py
ZMQ Server listening ...
*Received message from c++ b'\x00^n&\xff\x7f\x00\x00\xd8\\'*
Traceback (most recent call last):
File "server.py", line 19, in <module>
message = socket.recv()
File "zmq/backend/cython/socket.pyx", line 693, in
zmq.backend.cython.socket.Socket.recv
File "zmq/backend/cython/socket.pyx", line 727, in
zmq.backend.cython.socket.Socket.recv
File "zmq/backend/cython/socket.pyx", line 150, in
zmq.backend.cython.socket._recv_copy
File "zmq/backend/cython/socket.pyx", line 145, in
zmq.backend.cython.socket._recv_copy
File "zmq/backend/cython/checkrc.pxd", line 25, in
zmq.backend.cython.checkrc._check_rc
zmq.error.ZMQError: Operation cannot be accomplished in current state
(cnvss_test) ➜ Python git:(ZMQCommunication) ✗
I follow getting the characters symbolss.
My question is: How to can I represent the arrived message in my python zmq
server to show their content ?
According to this behavior, can I assume that the btnState data is sent to
python server of anyway?
Any support or orientation will be highly appreciated
_______________________________________________
zeromq-dev mailing list
[email protected]
https://lists.zeromq.org/mailman/listinfo/zeromq-dev