YATE内部的消息机制

Yate软件环境与H323协议部署详解 Yate(Yet Another Telephony Engine)是一个开源的通讯软件,它支持各种通讯协议,如SIP、H323、IAX等,并可以用于构建复杂的通讯系统。Yate具有模块化的设计、灵活的脚本语言支持,并能轻松地与现有系统集成。H323协议是国际电信联盟电信标准部门(ITU-T)在1990年代中期推出的一套用于在分组交换网络上进行实时多媒体通信的协议。它最初是为了支持基于IP网络的视频会议和电话服务。H323定义了一系列用于多媒体通信的网络协议,包括音频、视频以及数据的传输。 阅读详情

一、 消息

消息是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

yate-4.2.0-2-setup.exe Windows操作系统下的sip拨号客户端,适用于ipv4网路,与sip服务器配置使用可搭建sip的测试环境 立即下载

相关推荐

Yate开发简介 VOIP

Yate(Yate Another Telephony Engine)是下一代的电话引擎,目前主要关注VoIP技术和公共电话交换网(PSTN),该系统突出的强项是非常灵活,很容易被扩展。话音、视频、数据和即时信息都可以统一在Yate灵活的引擎之下,使企业通信效率最大化而基础建设的费用最小化

Yate软交换机IPPBX与电话语音网关的初步配合

简单三步启用regexroute.confconf.d修改default路由 亚特yate作为一个IPPBX或者软交换机,内部通话是比较简单的了,怎么快速加入外线和呼叫功能呢? 其实也比较简单,首先我们假设您已经安装了一个简单的yate,有一个深简AIO100这样的适合实验的语音网关。 启用regexroute.conf 首先你要启用regexroute.conf。 conf.d 在conf.d目...

1187

SAP PP模块MRP控制参数实战指南:从NETCH到NEUPL的深度解析

本文深入解析SAP PP模块中MRP控制参数的配置与应用,涵盖NETCH、NETPL和NEUPL三种运行模式的优化策略。通过实战案例和参数对比,帮助用户提升物料需求计划的效率和准确性,优化库存周转率和生产交付能力。

weixin_28419039的博客 244

Yate 的架构

下面图片是 Yate 的架构图,和我公司的软交换系统挺类似的。通过 Message 驱动的架构挺灵活的,如果这个 Message System 支持 TCP/IP,那么就比较容易将一些模块通过 LAN 进行分布扩展。当然每个模块允许配置多个实例,也是扩展的一个方式。Server Engine在实际使用中,并不会有很多的空闲 TCP 连接,网络处理的优化在于提高每秒传输消息的个数,也就是吞吐率,以及

gangban_lau的专栏 1150

Keil MDK 5.37及之后版本 安装AC5(ARMCC)编译器详细步骤

由于Keil 5.37及之后版本不再默认安装AC5(ARMCC)编译器,这就会导致由AC5编译的工程无法正常编译,往往输出窗口会提示以下信息:*** Target ‘STM32xxxx‘ uses ARM-Compiler ‘Default Compiler Version 5‘ which is not available.

s_Modesto的博客 1万+

单细胞专题(1) | 单细胞转录组研究样本准备指南(上)

单细胞RNA测序(scRNA-seq)是目前最前沿,能进行大规模实验的转录组研究技术,为理解细胞组成和动态生物学过程提供了很多新的见解。单细胞研究已经为我们理解发育过程,老化和疾病(如癌症)等提供了大量数据。在这里,小编主要就前期的样本准备与保存需注意问题给大家进行讲解,以备大家在不同的研究场景和研究背景下,走好单细胞转录组学研究的第一步。

bioyigene的博客 4231

YATE实现一号双机业务

一号双机业务就是主叫拨打被叫的一个电话号码,而被叫绑定的两个或多个电话同时振铃,哪个先接听都可以,第一个接听后其他电话停止振铃。传统交换机中实现如此功能大多是采用智能网平台(IN),对于YATE这样的软交换平台可以较容易的实现。具体方法如下。实现原理:还是在路由模块来下手,当路由模块接收到路由请求后,如果符合被叫号码条件,则对被叫绑定的两个电话同时发起呼叫(SIP:Invite),直到其中

庞景元的技术专栏 2811

【LAMMPS学习】五、LAMMPS命令(1) LAMMPS 输入脚本

本部分描述了 LAMMPS 输入脚本的格式以及其中的命令如何用于定义 LAMMPS 模拟。主要包括以下内容。

荷塘阅色 2645

用yate2实现软VoIP语音通话(SIP协议)

转载   用yate2实现软VoIP语音通话(SIP协议) 阳光男孩 发表于 2009-01-08 2009年1月7日,工业与信息化部发放了三张3G牌照,标志着中国进入了通信技术的新时代。3G的重要特性之一是高速数据链路,移动上网速度大大提高。同时,中国移动也大幅下调了2G网络GPRS上网的资费。可是,语音通话费用仍然按兵不动。作为永远处于弱势的用户,我们却可以通过VoIP网络电话自己

rosekin的专栏 1万+

2019年高教社杯全国大学生数学建模竞赛 C 题:《机场的出租车问题》真题解析与 MATLAB 解决方案

🏆 本文已收录于专栏:《滚雪球学数学建模(含历年真题)》,持续更新最新及历年数学建模竞赛资料,每篇内容力求做到“问题讲透、模型讲清、代码可用、论文可参考”,帮助你从零开始逐步建立完整的数学建模知识体系。

**My Coding Family** 3453

SQL注入详解

SQL注入(SQL Injection)是一种常见的Web安全漏洞,主要形成的原因是在数据交互中,前端的数据传入到后台处理时,没有做严格的判断,导致其传入的“数据”拼接到SQL语句中后,被当作SQL语句的一部分执行。 从而导致数据库受损(被脱库、被删除、甚至整个服务器权限陷)。 即:注入产生的原因是后台服务器接收相关参数未经过滤直接带入数据库查询...

渗透之路,攻防之间皆学问 26万+

插件化开发Yate【1】 - 框架介绍

yate是一个可扩展性的电话引擎,采用观察者(发布-订阅)模式实现消息总线,并通过插件方式对功能模板进行管理,是一个非常灵活有效的应用架构。Yate的架构如图1所示(借用的图像,如侵权请告知)图1 Yate框架组成yate设计为三大部分。

iseelgy的博客 550

多摄像头场景下 ISP 的同步与调度机制实战解析

在智能手机多摄系统中,主摄、广角、长焦、微距等摄像头的协同工作能力直接决定了影像系统的体验上限。而支撑这一能力的核心之一,正是 ISP 的同步与调度机制。ISP 需要处理多个 Sensor 的输入流、统一时序、资源仲裁、并发调度,并支持在不同模式间快速切换(如预览 → 拍照 → 视频)。本文将基于 Qualcomm、MTK、HiSilicon 平台的实际架构,系统性剖析 ISP 在多摄场景下的时序控制、Pipeline 配置、Buffer 管理与故障恢复机制,并分享实战中的典型问题与调试方案。

努力分享一些人工智能、计算机视觉、影像等相关的知识干货! 2347

YATE消息机制

From: http://yate.null.ro/pmwiki/index.php?n=Main.Messages     消息是YATE的一个主要组成部分。所有的模块间通信都使用消息而不使用函数调用,这主要是因为我们考虑当一个模块发生变化的时候不影响或不依赖于其他模块,也因为我们知道模块直接传递的参数,使得我们的调试模块可以更容易些。 一个消息由以下几个部分组成:   

This My Life - chisj 1230

Python 爬虫实战:微博自动化运营工具(点赞 / 转发 / 评论 + 反封号策略)

微博作为中国最大的社交媒体平台之一,拥有庞大的用户群体和丰富的数据资源。通过 Python 爬虫技术,我们可以实现微博的自动化运营,包括点赞、转发、评论等功能,同时采取有效的反封号策略,确保账号的安全和稳定运行。

u014481728的博客 1179

pscad IEEE标准系统搭建说明

pscad IEEE标准系统搭建说明,包含典型的IEEE 9节点、14节点、30节点、39节点和118节点系统。内含标准测试系统的原始数据和潮流结果。

Yate教程1

From:http://yate.null.ro/pmwiki/index.php?n=Main.CppTutorial1Yate可分为两个部分     * Yate内核     * Yate模块     *Yate内核提供基础,辅助API以及消息系统     *Yate模块使用Yate内核实现特定的功能 Yate模块的类型 Yate模块可分为一下几种     1.通道     2.路由器     3.电话历史记录(Call Detail Recorder)     4.计费程序   

热爱工作,快乐生活 5339

廖雪峰Python教程[完整版]

廖雪峰的python教程整理的,已经排好版了,而且还是完整的,适合小白

Yate开发向导

<br /><br />Yate开发向导(整理版)<br />涂远东  tuyuandong@gmail.com<br />1.Yate框架设计<br />Yate的设计是为了提供一个可扩展性的电话引擎,试图以最简简洁的代码,在扩展所需功能与性能、稳定性之间达到最佳平衡。<br /><br /><br /> <br />Yate设计分为三大部分:<br />(1)引擎(Engine)<br />该引擎已Yate C++类为基础,将把所有模块组件连接在一起,上图描述了各组件之间的交互过程。<br />(2

热爱工作,快乐生活 9208

Camera2Demo

在Camera2 的基础上进行封装,使得Camera2一堆初始化逻辑与Activity分离,降低耦合度,完成预览拍照并保存的操作

老版QQ原生表情gif动态

这是老版的QQ表情,不过全是动态的的,Windows照片查看器是不会动的,可以右击用浏览器打开查看,再说一遍是老版的,只是分享给宁愿用老版也要动态的人。

Yate使用文档

Yate使用文档整理

山不在高有仙则灵,水不在深有龙则灵 478

yate教程

From:http://yate.null.ro/pmwiki/index.php?n=Main.CppTutorial1   Yate可分为两个部分     * Yate内核     * Yate模块     *Yate内核提供基础,辅助API以及消息系统     *Yate模块使用Yate内核实现特定的功能 Yate模块的类型 Yate模块可分为一下几种   

This My Life - chisj 1982

yate 指南

1.Yate 框架设计 Yate 的设计是为了提供一个可扩展性的电话引擎,试图以最简简洁的代码,在扩展所需功能与性能、稳定性之间达到最佳平衡。   Yate 设计分为三大部分: (1) 引擎( Engine ) 该引擎已 Yate C++ 类为基础

RTC hacker 5049

Yate架构分析概要

1.Yate 框架设计 Yate 的设计是为了提供一个可扩展性的电话引擎,试图以最简简洁的代码,在扩展所需功能与性能、稳定性之间达到最佳平衡。     Yate 设计分为三大部分: (1) 引擎( Engine ) 该引擎已 Yate C++ 类为基础,将把所有模块组件连接在一起,上图描述了各组件之间的交互过程。 (2) 模块( Modules ) 大部分功能由运行时加载的模块

阿利的技术积累 1660

yate开发向导

Yate 开发向导(整理版) 涂远东   tuyuandong@gmail.com 1.Yate 框架设计 Yate 的设计是为了提供一个可扩展性的电话引擎,试图以最简简洁的代码,在扩展所需功能与性能、稳定性之间达到最佳平衡。     Yate 设计分为三大部分: (1) 引擎( Engine ) 该引擎已 Yate C++ 类为基础,将把所有模块组件连接在一起,上图描述了各组

This My Life - chisj 1459

Yate设计

The purpose of Yate's design is to provide an extensible telephony engine. Holding the base code as simple as possible and adding functionality as needed allows one to find the best balance between desired functionality, performance and stability.

热爱工作,快乐生活 1891
上一篇: Python中使用中文
下一篇: 两个YATE服务器互联的实现
kernelspirit
博客等级 码龄25年 135粉丝 92原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值