消息队列任务书
消息队列是个什么东西
这里的消息队列专门指Rabbitmq,消息队列作为一种专门的面向消息的中间件,在很多公司内都有用到,目前我们使用消息队列主要是实现以下一些功能
- 跨系统通信
Rabbitmq的多平台特性使其拥有良好的跨平台通信特性,我们可以使用它与在windows下运行的软件交换数据,在其他master下运行的ros节点交换数据. - 与web界面交换数据
虽然官方有一个rosbridge的方案给ros与前端通信,但是这个方案耦合性太高,又没有办法实现一个界面对应多台ros master的需求.在一些项目中可以说使用rabbitmq替换掉rosbridge
ps:其他的互联网公司也喜欢把消息队列用作其他方面,请看
RabbitMQ的教程
需要完成的任务
阶段一:
- 自行在Ubuntu下部署rabbitmq服务器
- 使用官方例子中的python初体验rabbitmq中发布者、消费者、RPC客户端、PPC服务端
- 使用python代码实现ros topic转发器,把std_msgs::String格式的消息转发到rabbitmq中,使用另一个python节点接收这个消息,打印到屏幕上
至此,你们已经掌握了消息队列几种角色的基本使用方法,以及如何用python代码使用它们,接下来的部分,将会使用c++尝试实现这些魔法般的功能。
阶段二:
- 使用下面的cpp代码仓库,在cpp上实现rabbitmq中发布者、消费者、RPC客户端、PPC服务
AMQP CPP支持库
CPP 例子 - 将第一阶段分点3的成果 。使用c++转写。实现一样的功能
- 消息队列只能传送字符串,所以需要json数据交换格式。学会使用Jsoncpp库,序列化/反序列化json字符串
- 利用jsoncpp工具,对ros server请求进行序列化,写一个server转发转发器。rpc客户端将ros服务转发成rpc服务,随后rpc服务端应答这个服务,返回给rpc客户端,rpc客户端收到应答后,将应答通过ros server响应 回复给调用者 。
至此,你们已经可以利用cpp写一些ros节点用于跨系统交换topic,也可以实现跨系统ros server调用。附加题的部分,我需要你们整理自己的代码,封装成对象
附加题部分:
- 需要对消息队列消费者和生产者进行封装,封装后的MQProxy对象使用方式类似如下:
int main(int argc , char ** argv){
//使用如下格式的地址,提交账号密码,ip,交换机名连接消息队列
MQProxy proxy("amqp://kungfu:kungfu123@192.168.1.205/");
//使用consume方法直接绑定消息队列,绑定回调函数,路由键,收到消息之后会自动调用
proxy.consume("ctc.mm_log", boost::bind(&CTCS::messageCB, this, _1, _2, _3), "#.mm_log.#");
}
//回调函数部分
void CTCS::messageCB(const AMQP::Message &message, uint64_t deliveryTag, bool redelivered) {
std::cout << "message = " << message.body() << std::endl;
}
- 需要对消息队列消费者和生产者进行封装,封装后的MQProxy对象使用方式类似如下:
int main(int argc , char ** argv){
//使用如下格式的地址,提交账号密码,ip,交换机名连接消息队列
MQProxy proxy("amqp://kungfu:kungfu123@192.168.1.205/");
//使用consume方法直接绑定消息队列,绑定回调函数,路由键,收到消息之后会自动调用
std::string str = VSmqProxy.call("message","queue_name");
std::cout << "response :" << str << std::endl;
}
来源:CSDN
作者:hongge_smile
链接:https://blog.csdn.net/hongge_smile/article/details/104010057