![17280f736e8c8a7a4eb8ccd95add1b23.png](https://img-blog.csdnimg.cn/img_convert/17280f736e8c8a7a4eb8ccd95add1b23.png)
ZeroMQ(简称Zmq)是一个强大的网络通讯库,它让你告别底层的socket套接字,快速完成网络甚至进程间的数据通信。它速度快,跨平台,提供异步I/O模型,方便构建异步消息处理,而且提供了多种语言接口。
![18c152128391b5c231547bded50494a2.png](https://img-blog.csdnimg.cn/img_convert/18c152128391b5c231547bded50494a2.png)
然而悲剧的是,官方没有提供Matlab接口!不用找,Other里也没有。怎么办?
等等,解决办法先放一放,先来思考一个问题:Matlab通过Zmq接收数据,有什么用呢?
举个例子,比如你要开发了一个设备,肯定先开发硬件,然后在上位机上开发软件从硬件采集数据,接着将数据交给算法工程师开发算法,算法形成后再提供给软件使用。这是一个串行的操作,没有软件采集数据,算法工程师就无法开发算法。
但是一定要有软件工程师这个中间商吗?不一定。只要硬件能插上网线,数据就插上了飞翔的翅膀。只需在下位机编写一个简单的数据分发小程序,所有局域网的人足不出工位,就可以在线获取数据,这样就可以同步开发软件界面和功能算法。如果再配合上Matlab的Web App,初步算法完成后,整一个小界面直接部署到服务器,就可以直接在会议室,甚至领导电脑上展示全流程效果(数据采集、预处理、算法效果等)。是不是6的飞起!
解决办法
1、非官方绑定
- zmqmat:一种实现方式,但发布时间是7年前,太老了
- matlab-zmq:对ZeroMQ进行绑定,需要编译,已经5年没更新了
- cosy-zeromq-matlab:提供了对官方ZeroMQ的绑定,但4年前发布了版本1.0,后续就没下文了,其安装需要编译C代码,使用上也有限制;
- jeromq:是纯Java的ZeroMQ实现,而Matlab可以调用Java包,所以有人说可以用这个来实现调用Zmq,但需要使用maven进行编译,麻烦。
2、借助胶水-Python
Matlab不能直接使用,但可以借助万能的胶水语言Python啊!前一篇博文介绍了Matlab调用Python的方法,这里实操一把。
思路
使用Zmq的发布订阅模式实现示例。
- 首先,编写Python的发布数据程序,启动后不断往外发数据;
- 然后,编写Python的接收接口程序,在__main__里有测试代码,直接运行可以查看效果;
- 最后,使用Matlab调用Python接口程序,实现数据获取。
实现
1、发布数据程序
'''
cmd运行,开始不断往外发数据,效果为
>python server.py
[1, 2, 1]
[2, 4, 4]
[3, 6, 9]
[4, 8, 16]
[5, 10, 25]
[6, 12, 36]
[7, 14, 49]
[8, 16, 64]
[9, 18, 81]
[10, 20, 100]
[11, 22, 121]
2、接收接口程序
测试从发布程序中接收数据
'''
直接执行,可以看到能从发布程序中收到数据
py:建立Zmq连接127.0.0.1:4321
0 array('d', [4.0, 8.0, 16.0])
1 array('d', [5.0, 10.0, 25.0])
2 array('d', [6.0, 12.0, 36.0])
3 array('d', [7.0, 14.0, 49.0])
4 array('d', [8.0, 16.0, 64.0])
5 array('d', [9.0, 18.0, 81.0])
6 array('d', [10.0, 20.0, 100.0])
7 array('d', [11.0, 22.0, 121.0])
8 array('d', [12.0, 24.0, 144.0])
9 array('d', [13.0, 26.0, 169.0])
3、Matlab调用Python获取数据
%% 从Zmq读取数据
执行效果,如下Matlab调用Python不断获取了数据
py:建立Zmq连接127.0.0.1:4321
2 4 4
3 6 9
4 8 16
5 10 25
6 12 36
7 14 49
8 16 64
9 18 81
10 20 100
11 22 121