YATE内部的消息机制

来源:互联网 发布:手机淘宝体检中心 编辑:程序博客网 时间:2024/05/17 23:51

一、 消息

消息是YATE的一个主要组成部分。所有的模块间通信都使用消息而不使用函数调用,这主要是因为我们考虑当一个模块发生变化的时候不影响或不依赖于其他模块,也因为这样让我们的模块调试可以更容易些。一个消息是几个组件的容器:

  • 名字(name)——消息类型的标识,允许消息处理器通过名字进行匹配
  • 返回值(return value)—— 一个用字符串表示的返回值
  • 时间(time)—— 消息被创建的时间;这对于排队的消息检查等待时长非常重要
  • 参数(parameters)—— 有字符串、值对构成的参数。每个处理器都能根据参数进行不同的动作,或者修改参数本身。不知道的参数必须忽略。
所有的消息在YATE内部是二进制形式的。然而我们可以通过rmanager模块提供一个对人友好的形式。

二、 消息传递

YATE内部消息传递通过内存共享(memory sharing)。在这种方式下,可以提高系统的性能。其他可以考虑的形式如管道或Sockets,没有内存共享灵活和高效。当被传递到外部模块(external modules)时,消息被转换成字符串编码的形式,这样所有能处理文本的外部模块都可以处理消息了。

三、 消息处理流程

消息会被消息处理器处理。消息处理器会注册要处理的消息和优先级,当消息被处理时会根据优先级依次调用消息处理器。消息处理器可以修改消息包含的组件(参数,返回值,甚至名称),并且能够决定要不要把消息传递到下一个消息处理器还是终结消息的处理。如果返回true终结消息,false继续下一个模块。

一个消息处理的很好的例子是“call.route”消息:

当一个呼叫到达到某个点时,一个消息像下面这样产生:

&Message *m = new Message("call.route");  m->addParam("driver","iax");  if (e->ies.calling_name)      m->addParam("callername",e->ies.calling_name);  else    m->addParam("callername",e->session->callerid);  if (e->ies.called_number)    m->addParam("called",e->ies.called_number);  else    m->addParam("called",e->session->dnid);

我们把消息发送到引擎,然后检查是否有模块(module)接收并处理了,最后将消息消灭。

if (Engine::dispatch(m))    Output("Routing returned: %s",m->retValue().c_str());  else    Output("Nobody routed the call!");  m->destruct();

引擎在接收到上面的消息后,会把它根据优先级发送到注册了此消息的模块。

我们也可以让消息排队,让引擎内部的线程池进行调度。此时我们不用主动销毁消息,由引擎代劳。

Message *m = new Message("alert");  m->addParam("reason","Hardware malfunction");  Engine::enqueue(m);

四、 消息处理器

消息处理器的构成

消息处理器必须从MessageHandler继承,然后自己实现里面的received函数。

class RouteHandler : public MessageHandler{public:    RouteHandler(int prio)        : MessageHandler("call.route",prio) { }    virtual bool received(Message &msg);};bool RouteHandler::received(Message &msg){   const char *driver = msg.getValue("driver")   Debug(DebugInfo,"Route for driver %s",driver);   // don't actually route anything, let message continue   return false;}

最后在插件(模块)初始化方法内安装此处理器。

void RegfilePlugin::initialize(){m_route = new RouteHandler(priority);   Engine::install(m_route); }

五、 标准消息

1. Engine messages

2. Channel messages

3. Call messages

4. User messages

5. Resource subscribe/notify messages

6. SIP messages

7. Encode or decode protocol specific messages

8. Socket operation messages

9. Clustering related messages

10. Instant messaging related messages

11. Jabber / XMPP messages

12. Miscellaneous messages