如何将数据序列化到C和x2B之间的通信+;zmq客户端和pythonzmq服务器
更新我的问题 如何在python zmq服务器中表示到达的消息以显示其内容 根据这种行为,我是否可以假设btnState数据以任何方式发送到python服务器 背景: 我正在发送一些数据结构 使用C++零卷客户端进程:如何将数据序列化到C和x2B之间的通信+;zmq客户端和pythonzmq服务器,python,c++,serialization,zeromq,Python,C++,Serialization,Zeromq,更新我的问题 如何在python zmq服务器中表示到达的消息以显示其内容 根据这种行为,我是否可以假设btnState数据以任何方式发送到python服务器 背景: 我正在发送一些数据结构 使用C++零卷客户端进程: ZMQComponent.h文件 #include <zmq.hpp> #include <sofa/defaulttype/VecTypes.h> // To Quat datatype #include <sofa/defaulttype/Qu
ZMQComponent.h
文件
#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
然后,接收btnState
int变量的python zmq服务器是:
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))
# Do some 'work'
time.sleep(1)
到达python zmq服务器的输出或消息是result
变量的内容(btnState
turn to string in s content variable+stringtest
concatenated)和以下字符的一些符号:
(cnvss_test) ➜ Python git:(ZMQCommunication) ✗ python server.py
ZMQ Server listening ...
Received message from Sofa: b'\xb0\x1d\x19\xf4\xfd\x7f\x00\x00\x0e\x00\x00\x00\x00\x00\x00\x0045 is a number'
我的ZMQ Python服务器脚本上的前一个输出显示了从沙发上的字符串<代码>结果< /代码>到达服务器,它们的内容也被可视化,但是,这个字符串或字符符号是产品代码或结果的大小:<代码> ZMQ::MeaseGyt请求(30)< /C> >在我的C++客户端中开始。
如果我在请求中分配的值小于30,例如zmq::message\u t request(10)
我的服务器中的输出是:
Received message from Sofa: b'\x90\x94\xa1\x00\xfc\x7f\x00\x00\x0e\x00'
Received message from Sofa: b'\x80$(\xc7\xfc\x7f\x00\x00\x0e\x00\x00\x00\x00\x00\x00\x0045 i
如果我在请求中分配了大于10的值,例如zmq::message\u t request(20)
我的服务器中的输出是:
Received message from Sofa: b'\x90\x94\xa1\x00\xfc\x7f\x00\x00\x0e\x00'
Received message from Sofa: b'\x80$(\xc7\xfc\x7f\x00\x00\x0e\x00\x00\x00\x00\x00\x00\x0045 i
然后,我在服务器端接收的字符串或对象,其长度或大小与分配给zmq::message\u t request
变量的长度或大小相同
根据上面提到的,在我的消息中添加此字符串的ZMQ收到了吗
根据前面的过程,我的消息到达我的服务器,那么正确的尝试是什么样的序列化过程与一些实体像协议缓冲区是必要的?
我知道使用google protocol buffer allow之类的工具可以更好地控制发送的对象与接收的对象之间的相关性,使之与它们的真实内容相关联
在任何情况下,如何删除到达服务器的消息中添加的字符串或字符符号
任何支持或定位都将受到高度赞赏您的系统是异构的,这意味着您需要某种与平台/语言无关的序列化 出于您的目的,最方便使用的可能是
googleprotocolbuffers
。这非常支持C++和Python。这样,您将在模式文件(文件扩展名<代码> PROTO )中定义消息/数据结构,并使用<代码> PrtoCu/Cuff>将其编译为C++源代码和Python源代码。这些类为您提供了可以序列化/反序列化到相同wireformat的类。序列化/反序列化可以很好地与ZMQ消息缓冲区集成
还有其他的,
是一种可能性李>apacheavro
- 我会避免
schema;原则上它们很好,但是找到真正完成正确和完整工作的代码生成器是困难的/昂贵的。例如,<代码> xSD.exe < /C>(从微软)可以编译一个XSD模式到C++类(我想),但是忽略了模式中的约束字段(E.D.Cult:Min包容<代码>)。XSD
- ASN1确实很好,但我还没有找到一个适合Python的实现。有一个针对python的ASN.1的代码优先实现(pyasn),但它忽略了ASN.1模式的全部意义
- 您的系统是异构的,这意味着您需要某种与平台/语言无关的序列化
出于您的目的,最方便使用的可能是
googleprotocolbuffers
。这非常支持C++和Python。这样,您将在模式文件(文件扩展名<代码> PROTO )中定义消息/数据结构,并使用<代码> PrtoCu/Cuff>将其编译为C++源代码和Python源代码。这些类为您提供了可以序列化/反序列化到相同wireformat的类。序列化/反序列化可以很好地与ZMQ消息缓冲区集成
还有其他的,
是一种可能性李>apacheavro
- 我会避免
schema;原则上它们很好,但是找到真正完成正确和完整工作的代码生成器是困难的/昂贵的。例如,<代码> xSD.exe < /C>(从微软)可以编译一个XSD模式到C++类(我想),但是忽略了模式中的约束字段(E.D.Cult:Min包容<代码>)。XSD
- ASN1确实很好,但我还没有找到一个适合Python的实现。有一个针对python的ASN.1的代码优先实现(pyasn),但它忽略了ASN.1模式的全部意义
我在C++中使用类似的ZMQ实现,与Soad框架(与AutoPu插件相关)。 < P>我没有任何问题从ZMQ C++发送到Python ZMQ。 下面是我用python编写的zmq服务器的概述:
import zmq
context = zmq.Context()
socket = context.socket(zmq.SUB)
socket.setsockopt(zmq.SUBSCRIBE, "")
print "Collecting data from c++ ..."
socket.connect ("tcp://127.0.0.1:6000")
while True:
print socket.recv()
以下是结果的概述:
douaille@douaille:~/Documents/zmq$ python zmqClient.py
Collecting data from c++ ...
/colorLight string:'1 1 1 1'
/colorLight string:'1 1 1 1'
/colorLight string:'1 1 1 1'
/colorLight string:'1 1 1 1'
/colorLight string:'1 1 1 1'
/colorLight string:'1 1 1 1'
我使用zmq作为发布者,但它不会根据您的需要更改任何内容。另外,请求客户端的实现几乎相同。
看起来您正在打印请求,而不是消息
您可以在这里找到C++发送器部分的实现:
编辑:
以下是使用zmq请求的示例:
import zmq
context = zmq.Context()
socket = context.socket(zmq.REQ)
print("Collecting data from c++ using REQ ...")
socket.connect("tcp://localhost:6000")
while True:
print("Sending request")
socket.send(b"Hello")
message = socket.recv()
print("Received reply : %s" % message)
结果:
douaille@douaille:~/Documents/zmq$ python zmqClient.py
Collecting data from c++ using REQ ...
Sending request
Received reply : /colorLight string:'1 1 1 1'
Sending request
Received reply : /colorLight string:'1 1 1 1'
Sending request
Received reply : /colorLight string:'1 1 1 1'
我在C++中使用类似的ZMQ实现,与SOAD框架(与AutoPu插件相关)。 < P>我没有任何问题从ZMQ C++发送到Python ZMQ。 下面是我用python编写的zmq服务器的概述:
import zmq
context = zmq.Context()
socket = context.socket(zmq.SUB)
socket.setsockopt(zmq.SUBSCRIBE, "")
print "Collecting data from c++ ..."
socket.connect ("tcp://127.0.0.1:6000")
while True:
print socket.recv()
以下是结果的概述:
douaille@douaille:~/Documents/zmq$ python zmqClient.py
Collecting data from c++ ...
/colorLight string:'1 1 1 1'
/colorLight string:'1 1 1 1'
/colorLight string:'1 1 1 1'
/colorLight string:'1 1 1 1'
/colorLight string:'1 1 1 1'
/colorLight string:'1 1 1 1'
我使用zmq作为发布者,但它不会根据您的需要更改任何内容。另外,请求客户端的实现是almo