【ZeroMQ官方指南】
Libzmq - the low level library
本文以最新发布版本为例(截止2022.1.18版本号zeromq-4.3.4)
下载传送门:zeromq-4.3.4.tar.gz
本文移植的目标平台是ARM的cortex-A9,交叉编译工具使用的是:gcc-linaro-arm-linux-gnueabihf-4.8-2014.04_linux.tar.xz
注:交叉编译工具链可根据自己的平台更改
文件及环境准备
下载zeromq-4.3.4.tar.gz后解压到当前文件夹,打开终端,进入该文件夹:
mhming@xz:~/Desktop/ZeroMQ/sources/zeromq-4.3.4$
下载交叉编译工具链解压后根据自己的工具链路径设置环境变量,例如本文:
export PATH=$PATH:/home/mhming/Desktop/ZeroMQ/gcc4.8/bin
编译配置
./configure --host=arm-linux-gnueabihf --prefix=/home/mhming/Desktop/ZeroMQ/sources/arm-zeromq/ --without-libsodium
说明:--host配置ARM目标主机类型(简单点就是交叉编译工具链的前缀),--prefix配置安装路径(我们需要的文件都放在这里)

编译安装
make && make install

环境移植
本文安装目录:/home/mhming/Desktop/ZeroMQ/sources/arm-zeromq/
将安装目录下的include文件夹和lib文件夹内的同文件及库文件拷贝到ARM环境下的/usr/include和/usr/lib目录即可使用
主机安装目录 ARM环境目录
arm-zeromq/ include/* ----> /usr/include
arm-zeromq/ lib/* ----> /usr/lib
使用测试
主机端按装pyzmq:
pip3 install pyzmq
主机端安装zmq:
sudo apt-get install libczmq-dev
上述安装主机环境为ubuntu20.04,其他系统环境请参考官方文档。
C++版本server源码:
注意:正常最小化编译按转的头文件中不包含zmq.hpp头文件,可以将ubuntu20.04安装文件中的zmq.hpp(一般在/usr/include目录下)拷贝至ARM环境
//server.cpp
#include <zmq.hpp>
#include <string>
#include <iostream>
#include <unistd.h>
typedef struct{
uint8_t error;
uint8_t part;
uint8_t action;
uint8_t index;
float times;
}set_action_t;//注意四字节对齐
int main () {
// Prepare our context and socket
zmq::context_t context (1);
zmq::socket_t socket (context, ZMQ_REP);
socket.bind ("tcp://*:5555");
set_action_t actions;
while (true) {
zmq::message_t request;
// Wait for next request from client
socket.recv (&request);
memcpy(&actions.part,request.data(),request.size());
printf("size:%5d,%5d,%5d,%5d,%5d,%5f\n",request.size(),actions.error, actions.part,actions.action,actions.index,actions.times);
// Do some 'work'
sleep (1);
// Send reply back to client
zmq::message_t reply (5);
memcpy ((void *) reply.data (), "World", 5);
socket.send (reply);
}
return 0;
}
C++版本cilent源码:
//client.cpp
#include <zmq.hpp>
#include <string>
#include <iostream>
int main () {
uint8_t data[7] = {0};
uint8_t idx = 0;
float *fp = (float*)(data+3);
data[idx++] = 5;
data[idx++] = 12;
data[idx++] = 123;
*fp = 456.78;
// initialize the zmq context with a single IO thread
zmq::context_t context(1);
// construct a REQ (request) socket and connect to interface
zmq::socket_t socket(context, ZMQ_REQ);
socket.connect("tcp://192.168.50.111:5555");
for(idx = 0; idx < 5; idx++)
{
// send the request message
printf("Sending %d ...\n",idx);
socket.send(data, 0);
// wait for reply from server
zmq::message_t reply;
socket.recv(&reply);
printf("Received reply %d [ ",idx);
std::cout << reply.to_string() << " ]" <<std::endl;
}
return 0;
}
python版本client源码:
#client.py
#coding=utf-8
import struct
import zmq
context = zmq.Context()
print('connect to hello world server')
socket = context.socket(zmq.REQ)
socket.connect('tcp://localhost:5555')
part = 5
action = 12
index = 123
times = 456.78
senbuff = struct.pack("=BBBf",part,action,index,times)
for request in range(1,5):
print('send ',request,'...')
socket.send(senbuff)
message = socket.recv()
print('received reply ',request,'[',message,']')
在ubuntu20.04上测试
编译C++版本server,X86端
g++ -g -Wall server.cpp -o serverX86 -lstdc++ -lzmq
编译生成serverX86可执行文件
编译C++版本client,X86端
g++ -g -Wall client.cpp -o clientX86 -lstdc++ -lzmq
编译生成clientX86可执行文件
运行测试
分别运行serverX86和client.py,server端将收到数据后应答,如下图所示

编译C++版本server,ARM端
export PATH=$PATH:/home/mhming/Desktop/ZeroMQ/gcc4.8/bin
arm-linux-gnueabihf-g++ -I /home/mhming/Desktop/ZeroMQ/sources/arm-zeromq/include -L /home/mhming/Desktop/ZeroMQ/sources/arm-zeromq/lib -g -Wall server.cpp -o serverARM -lstdc++ -lzmq
说明:-I指定包含头文件路径,-L指定包含库文件路径。
编译完成后可以使用file命令查看生成的serverARM文件格式,正确的格式如下:

将上述生成的serverARM拷贝到ARM环境下运行即可。
这里方便测试我们可以将ARM环境和ubuntu20.04主机直连或者连接到同一个网络下,在ubuntu20.04主机下运行client.py客户端程序即可进行测试。
注意:这里需要将client.py中的localhost更改为ARM环境的IP地址。
编译C++版本client,ARM端
export PATH=$PATH:/home/mhming/Desktop/ZeroMQ/gcc4.8/bin
arm-linux-gnueabihf-g++ -I /home/mhming/Desktop/ZeroMQ/sources/arm-zeromq/include -L /home/mhming/Desktop/ZeroMQ/sources/arm-zeromq/lib -g -Wall client.cpp -o clientARM -lstdc++ -lzmq
网友评论