rabbitmq任务书

吃可爱长大的小学妹 提交于 2020-01-17 01:32:50

消息队列任务书

消息队列是个什么东西

百度百科

这里的消息队列专门指Rabbitmq,消息队列作为一种专门的面向消息的中间件,在很多公司内都有用到,目前我们使用消息队列主要是实现以下一些功能

  1. 跨系统通信
    Rabbitmq的多平台特性使其拥有良好的跨平台通信特性,我们可以使用它与在windows下运行的软件交换数据,在其他master下运行的ros节点交换数据.
  2. 与web界面交换数据
    虽然官方有一个rosbridge的方案给ros与前端通信,但是这个方案耦合性太高,又没有办法实现一个界面对应多台ros master的需求.在一些项目中可以说使用rabbitmq替换掉rosbridge

ps:其他的互联网公司也喜欢把消息队列用作其他方面,请看

消息队列使用的四种场景介绍

RabbitMQ的教程

官网教程

RabbitMQ基础概念详细介绍

需要完成的任务

阶段一:

  1. 自行在Ubuntu下部署rabbitmq服务器
  2. 使用官方例子中的python初体验rabbitmq中发布者、消费者、RPC客户端、PPC服务端
  3. 使用python代码实现ros topic转发器,把std_msgs::String格式的消息转发到rabbitmq中,使用另一个python节点接收这个消息,打印到屏幕上

至此,你们已经掌握了消息队列几种角色的基本使用方法,以及如何用python代码使用它们,接下来的部分,将会使用c++尝试实现这些魔法般的功能。


阶段二:

  1. 使用下面的cpp代码仓库,在cpp上实现rabbitmq中发布者、消费者、RPC客户端、PPC服务
    AMQP CPP支持库
    CPP 例子
  2. 将第一阶段分点3的成果 。使用c++转写。实现一样的功能
  3. 消息队列只能传送字符串,所以需要json数据交换格式。学会使用Jsoncpp库,序列化/反序列化json字符串
  4. 利用jsoncpp工具,对ros server请求进行序列化,写一个server转发转发器。rpc客户端将ros服务转发成rpc服务,随后rpc服务端应答这个服务,返回给rpc客户端,rpc客户端收到应答后,将应答通过ros server响应 回复给调用者 。

至此,你们已经可以利用cpp写一些ros节点用于跨系统交换topic,也可以实现跨系统ros server调用。附加题的部分,我需要你们整理自己的代码,封装成对象


附加题部分:

  1. 需要对消息队列消费者和生产者进行封装,封装后的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;
}
  1. 需要对消息队列消费者和生产者进行封装,封装后的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;
}
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!