yate学习笔记
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
ubuntu安装编译运行
可以使用telnet 5038 登录到yate
输入可以显示支持的命令
连按tab键可以补全命令
先debug on 然后再debug level 10,可以打开log
编译步骤
要先安装apt-get install libqt4-dev
在yate project的根目录下
./autogen
./configure
make install
然后在clients目录下运行./run-qt4 脚本,会调用同样目录下的yate-qt4,这个是编译生成的。
wimdows安装编译运行yate client
安装安装了这2个软件后就可以使用vs2010 vs2005了,下面的不走可以不用做,但要设置环境变量。
在环境变量中的系统环境变量增加:
QTDIR= C:\Qt\ = C:\Qt\用vs2005打开的文件有错误,需要改成
class WinClientPlugin : public Plugin
{
public:
WinClientPlugin()
: Plugin("winyateclient"),m_thread(0)
{ }
virtual void initialize(void);
virtual bool isBusy() const
{ return true; }
private:
WinClientThread* m_thread;
};
Qt4相关的几个工程和_customtable _customtable _customtext _clientarchive需要加上qt库和头文件的路径。
然后挨个编译每个工程,然后把中的release改成debug,然后双击之,就会运行yate client了。
Yate代码学习笔记
Yate 开发向导
框架设计
Yate 的设计是为了提供一个可扩展性的电话引擎,试图以最简简洁的代码,在扩展所需功能与性能、稳定性之间达到最佳平衡。
Yate 设计分为三大部分:
(1) 引擎( Engine )
该引擎已 Yate C++ 类为基础,将把所有模块组件连接在一起,上图描述了各组件之间的交互过程。
(2) 模块( Modules )
大部分功能由运行时加载的模块来实现。这些模块以动态链接库为载体,作为插件被引擎或外部程序的特定模块加载。被外部程序特定模块加载时,需能够与引擎或其他模块之间相互交互(通信)。
(3) 消息( Messages )
Yate 模块(包括插件和外部模块)之间的交互是依靠消息实现的。消息提供了一种可扩展,可定制,并且与具体技术无关的交互机制。每个模块在需要得到信息或者需要通知其他模块时只需要创建并向引擎提交消息,引擎负责会将消息传递给合适的目标。
Yate 以 Class Engine 为核心,构建了插件式的管理体系,按照观察者(发布 - 订阅)的设计模式来处理数据流。
Engine 类根据配置文件加载插件,缺省参数的情况下,会加载指定目录下所有的插件。然后运行插件的初始化函数 initialize() 完成插件的初始化。
Class Yate 提供了一些 API (静态函数)用于加载分析配置参数,加载特定模块,和指定目录下的所有模块。
Message *m = new Message("");
2. m->addParam("driver","iax");
3. if (e->
4. m->addParam("callername",e->;
5. else
6. m->addParam("callername",e->session->callerid);
7. if (e->
8. m->addParam("called",e->;
9. else
10. m->addParam("called",e->session->dnid);
然后我们将消息发送给引擎,检查是否有模块( module )接收并处理了,最后必须将消息销毁。
1.if (Engine::dispatch(m))
2. Output("Routing returned: %s",m->retValue().c_str());
3.else
4. Output("Nobody routed the call!");
5.m->destruct();
上面的处理方式是阻塞式的,模块发送消息之后需要等待该消息被发送之后才进行后续的处理。 Yate 中还有一种“发射后忘记”( fire-and-forget )的消息机制,非阻塞式消息机制,这种消息被存储在引擎中的一个队列中,当消息被分发后,由引擎负责释放。这种消息一般都是事关系统全局的重要消息,例如错误报警,如下代码所示:
1.Message *m = new Message("alert");
2.m->addParam("reason","Hardware malfunction");
3.Engine::enqueue(m);
如果我们编写的模块需要处理一个路由请求(极有可能是其他模块产生的),我们首先需要声明一个名为RouteHandler 的类,并从MessageHandler 基类继承。
1.class RouteHandler : public MessageHandler
2.{
3.public:
4. RouteHandler(int prio)
5. : MessageHandler("",prio) { }
6. virtual bool received(Message &msg);
7.};
然后,由于在 received 方法中实现,他是类 MessageHandler 中是纯虚函数,我们必须重载。
1.bool RouteHandler::received(Message &msg)
2.{
3. const char *driver = ("driver")
4. Debug(DebugInfo,"Route for driver %s",driver);
5. return false;
7.}
最后,在插件的 initialized 方法中,安装此消息处理器
1.void RegfilePlugin::initialize()
2.{
3.m_route = new RouteHandler(priority);
4. Engine::install(m_route);