# Research_Module_Java_RabbitMQ-MATLAB-Client **Repository Path**: iOceanPlus_Research/Research_Java_Module_RabbitMQ-MATLAB-Client-Java ## Basic Information - **Project Name**: Research_Module_Java_RabbitMQ-MATLAB-Client - **Description**: 该项目是MATLAB与RabbitMQ之间基于Protocol Buffers的数据通信的Java版本实现 - **Primary Language**: Java - **License**: GPL-2.0 - **Default Branch**: develop - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 0 - **Created**: 2017-09-25 - **Last Updated**: 2020-12-20 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # Research_Java_Module_RabbitMQ-MATLAB-Client-Java !!该项目是开源项目,不要在代码中写入账号等信息。 该项目是MATLAB与RabbitMQ之间基于Protocol Buffers的数据通信的Java版本实现 # 功能介绍 * 基于配置文件以Topic模式从消息队列中接收protobuf消息; * 基于软件中采用的PB定义文件对protobuf消息进行解析; * 将解析后的数据以指定的格式传送给调用该包中相关接口的MATLAB程序; # 开发环境 * Java : JDK 1.8.0_111或以上64-bit版本; * RabbitMQ : rabbitmq_server-3.5.7或以上版本; * Protobuf : libprotoc 3.1.0或以上版本; # 运行环境 * Java : JDK 1.8.0_111或以上64-bit版本; * RabbitMQ : rabbitmq_server-3.5.7或以上版本; * MATLAB :MATLAB R2017a # 工作模式 该接口支持基于轮询的主动方式、基于事件的主动方式和基于事件的被动方式。 ## 基于轮询的主动方式 该实现方式中,RabbitMQ-Matlab-Client-Java.jar从RabbitMQ消息队列中收到消息后会在内存中进行缓存,需由MATLAB程序调用RabbitMQ-Matlab-Client-Java.jar中特定的函数获取消息。 ## 基于事件的主动方式 该实现方式中,RabbitMQ-Matlab-Client-Java.jar从RabbitMQ消息队列中收到消息后会在内存中进行缓存,需由MATLAB程序触发消息发送事件,RabbitMQ-Matlab-Client-Java.jar以事件的方式调用MATLAB程序中的回调函数。 ## 基于事件的被动方式 该实现方式中,RabbitMQ-Matlab-Client-Java.jar从RabbitMQ消息队列中收到消息后以事件的方式调用MATLAB程序中的回调函数。在该模式中,RabbitMQ-Matlab-Client-Java.jar不做消息的缓存,需由MATLAB程序进行缓存处理。 # Java接口说明 ## mqwrapper. MessageAccessor类 ### 介绍 消息接收类,RabbitMQ-Matlab-Client-Java.jar中与MATLAB交互的主要类。 ### 字段 ### 方法 | 方法 | 参数 | 返回值 | 功能 | | ---- | ---- | ---- | ---- | |public MessageAccessor(int batchSize)|batchSize:每次获取消息时默认的最大返回数目||构造函数,创建基于轮询方式的Java消息接收对象| |public MessageAccessor(MessagingEvent event, int mode)|event:消息事件;mode:事件触发方式,0-被动,1-主动(主动or被动均是参照调用Java接口的MATLAB程序而言)||构造函数,创建基于事件方式的Java消息接收对象| |public boolean fireMsgInfo()||事件触发是否成功。true-有消息,触发成功;false-没有消息,触发失败|事件触发模式下,用于主动触发消息事件| |ArrayList getMsgInfos()||消息对象列表,实际返回消息的数量小于等于创建对象时指定的默认数量|获取最大数量为默认值的消息列表| |public ArrayList getMsgInfos(int batchSize)|batchSize:最大返回数目|消息对象列表,实际返回消息的数量小于等于参数batchSize指定的数量|获取最大数量为指定参数的消息列表| |public MessageInfo getMsgInfo()||消息对象|获取单条消息| ## mqwrapper.MessagingEvent类 ### 介绍 消息事件类,管理消息事件和注册的侦听对象,调用回调函数通知注册的侦听对象。 ### 字段 ### 方法 | 方法 | 参数 | 返回值 | 功能 | | ---- | ---- | ---- | ---- | |public MessagingEvent()|||构造函数| ## mqwrapper.MessagingEvent.GetMessageEvent类 ### 介绍 事件对象类,解析后的消息作为该类的字段通过回调函数返回给MATLAB调用程序。 ### 字段 | 字段 | 说明 | | ---- | ---- | |public String message|字符串形式的消息,由“~”分隔的各个字段组成| |public MessageInfo msgInfo|消息类对象| ### 方法 ## com.ict.xgs.MessageInfo类 ### 介绍 解析后的消息类,定义了消息的各个字段(具体字段定义可参见源码中的文档/document/消息格式.docx)。 ### 字段 | 字段 | 说明 | | ---- | ---- | |public int meg_type| 1消息类型,一个byte| |public int meg_sour| 2消息来源,一个byte| |public int time| 3目标时间,一个int| |public String number| 4目标编号,20个char| |public int state| 5航行状态,一个char| |public int rotation_rate| 6转向率,一个byte| |public int longitude| 7经度,一个int| |public int latitude| 8维度,一个int| |public int speed| 9航速,一个int| |public int course| 10航向,一个int| |public int heading| 11航首向,一个short| |public String IMO_number| 12IMO编码,9个char| |public String ship_name| 13船名,32个char| |public int ship_type| 14船舶类型,一个byte| |public int goodtype| 15货物类型,一个byte | |public int devi_type| 16电子定位装置类型,一个byte| |public String pre_arri_time| 17预计到达时间,19个char| |public int water_depth| 18最大静电水深,一个int| |public String destination| 19目的地,20个char| |public String country| 20国家名,40个char| |public String call_sign| 21呼号,10个char| |public int ship_length| 22船长,1个short| |public int ship_width| 23船宽,1个byte| |public int ship_accu| 24船位精确度,一个byte| |public int comm_state| 25通信状态,一个byte| # 使用方法 ## 安装配置(Windows环境下) 在MATLAB程序中调用RabbitMQ-Matlab-Client-Java.jar接口需要进行以下配置 1. 安装RabbitMQ-Matlab-Client-Java.jar。 从项目附件中下载RabbitMQ-Matlab-Client-Java_.zip及其依赖的jar包lib.zip,本别解压RabbitMQ-Matlab-Client-Java_.zip和lib.zip,将lib.zip解压得到的所有jar包直接放到RabbitMQ-Matlab-Client-Java.jar所在的目录下,即所有jar包与RabbitMQ-Matlab-Client-Java.jar在同一目录下。 2. 配置javaclasspath.txt文件。(配置完成后,需重启MATLAB配置才能生效) 在MATLAB的preferences folder(MATLAB中执行命令```prefdir```可获取文件夹路径)下创建文件javaclasspath.txt,并加入以下配置(每个路径单独一行) ``` %JAVA_HOME%\lib\dt.jar %JAVA_HOME%\lib\tools.jar \RabbitMQ-Matlab-Client-Java.jar ``` 3. RabbitMQ-Matlab-Client-Java.jar参数配置 在配置文件config.properties中修改RabbitMQ相关参数 * MqIp=< RabbitMQ服务器IP > * MqPort=< RabbitMQ服务端口 > * MqUserName=< RabbitMQ登录用户名> * MqPassword=< RabbitMQ登录密码> * MqExchangeName=< RabbitMQ 消息交换器名> ## 接口调用 在MATLAB程序中可采用以下三种方式调用RabbitMQ-Matlab-Client-Java.jar中的接口。 关于MATLAB调用Java库的相关说明可参见 https://cn.mathworks.com/help/matlab/using-java-libraries-in-matlab.html ### 基于轮询的主动方式 ``` import mqwrapper.*; import com.ict.xgs.*; %% 启动RabbitMQ-Matlab-Client-Java.jar,主动接收RabbitMQ消息 cd 'F:\MyProjects\MyMatlab\TrackAssociation\java\lib'; % 切换当前路径为RabbitMQ-Matlab-Client-Java.jar所在路径 msgAccessor = MessageAccessor(10); % 创建Java消息接收对象,设置每次至多返回的消息数量的默认值为10 start(java.lang.Thread(msgAccessor)); % 启动Java消息接收线程 g_MsgInfo = MessageInfo; % 创建Java消息对象 while 1 g_MsgInfo = getMsgInfo(msgAccessor); % 获取消息 end ``` ### 基于事件的主动方式 ``` import mqwrapper.*; import com.ict.xgs.*; %% 启动RabbitMQ-Matlab-Client-Java.jar,主动(事件请求方式)接收RabbitMQ消息 cd 'F:\MyProjects\MyMatlab\TrackAssociation\java\lib'; % 切换当前路径为RabbitMQ-Matlab-Client-Java.jar所在路径 msgRecvEvent = MessagingEvent; % 创建Java消息事件 h = handle(msgRecvEvent,'CallbackProperties'); % 创建事件对象句柄 set(msgRecvEvent,'ListenCallback',@(h,e)msgRecvCallbackFcn(h,e)); % 设置事件回调函数 msgAccessor = MessageAccessor(msgRecvEvent, 1); % 创建Java消息接收对象,并指定消息事件触发方式为主动 start(java.lang.Thread(msgAccessor)); % 启动Java消息接收线程 while 1 if g_CallbackSyncFlag g_CallbackSyncFlag = 0; % 复位回调同步标志 if ~fireMsgInfo(msgAccessor) % 触发消息事件 g_CallbackSyncFlag = 1; % 置位回调同步标志 end end end %% RabbitMQ消息接收回调函数 function msgRecvCallbackFcn(hObject, eventData) % disp(["myCallbackFcn : ", string(eventData.message)]); global g_MsgInfo; % MATLAB全局变量,用于数据交换 global g_CallbackSyncFlag; g_MsgInfo = struct(eventData.msgInfo); % 接收事件消息,转为MATLAB结构体 g_CallbackSyncFlag = 1; % 置位回调同步标志 end ``` ### 基于事件的被动方式 ``` import mqwrapper.*; import com.ict.xgs.*; %% 启动RabbitMQ-Matlab-Client-Java.jar,被动接收RabbitMQ消息 cd 'F:\MyProjects\MyMatlab\TrackAssociation\java\lib'; % 切换当前路径为RabbitMQ-Matlab-Client-Java.jar所在路径 msgRecvEvent = MessagingEvent; % 创建Java消息事件 h = handle(msgRecvEvent,'CallbackProperties'); % 创建事件对象句柄 set(msgRecvEvent,'ListenCallback',@(h,e)msgRecvCallbackFcn(h,e)); % 设置事件回调函数 msgAccessor = MessageAccessor(msgRecvEvent, 0); % 创建Java消息接收对象,并指定消息事件触发方式为被动 start(java.lang.Thread(msgAccessor)); % 启动Java消息接收线程 %% RabbitMQ消息接收回调函数 function msgRecvCallbackFcn(hObject, eventData) % disp(["myCallbackFcn : ", string(eventData.message)]); global g_MsgInfo; % MATLAB全局变量,用于数据交换 global g_CallbackSyncFlag; g_MsgInfo = struct(eventData.msgInfo); % 接收事件消息,转为MATLAB结构体 g_CallbackSyncFlag = 1; % 置位回调同步标志 end ```