pythonzeromqmsgpack

msgpack over zeromq : c++ sender python receiver, how can I receive below message in python


C++ sending below struct msgpack over zeromq.

How can I deserialize from Python?

msgpack::sbuffer serialize(cv::Mat &img, std::string &msg)
{
    Image img_data;
    img_data.matrix = std::vector<uchar>(img.data, img.data + (img.rows * img.cols * img.channels()));
    
    img_data.rows = img.rows;
    img_data.cols = img.cols;
    img_data.type = img.type();
    img_data.msg  = msg;
    
    msgpack::sbuffer serialized_img;
    msgpack::pack(&serialized_img, img_data);
    
    return serialized_img;
}

Receiving bytes:

import zmq
import msgpack

from io import BytesIO

context = zmq.Context()
socket = context.socket(zmq.SUB)
socket.connect('tcp://10.144.207.139:5555')

socket.setsockopt(zmq.SUBSCRIBE, b"")

while True:
print ("Waiting for message")
message = socket.recv()
print ("message received: " + str(message) )

Solution

  • key is the :

    print ("Waiting for message")
    message = socket.recv()
    
    deser_message = msgpack.unpackb(message, raw=False)
    
    image = np.array(Image.open(io.BytesIO(deser_message[0])))
    cv2.imshow("received image" , image)
    cv2.waitKey(1)
    
    print ("message received: "  , counter)
    counter += 1