瀑布线指标(pbx指标源码)
第一买点的技术特征为:瀑布线最低位置白线开始掉头向上,MACD绿柱缩短,CJDX底背离。此时为反弹期,可能突破蓝线和0轴,也可能无法突破。
第二买点的技术特征为:瀑布线成为多头排列,MACD金叉突破0轴红柱不断延长,CJDX第一波上涨后回调到0轴再次爆发向上。
用法:
(1)当MACD出现金叉买入信号时,关注CJDX,CJDX出现金叉可买入;
(2)先于CJDX出现死叉卖出信号时卖出。
根据MACD趋势线在0轴上下方运行的具体情况又有以下四种情况,做短线时一定要将CJDX与MACD结合运用:
(1)MACD趋势线在0轴上方运行,并且走势是朝上方向,表明股票走势强势,可以根据CJDX买卖信号进行操作。此种情况操作最为有效。
(2)MACD趋势线在0轴上方运行,但走势是朝下方向的,表明股票走势开始由强势转为弱势,这时运用CJDX就要小心了。有的时候,CJDX走上去了,而股价K线连续几天还是走平的,上下波动幅度非常小。可以根据CJDX买卖信号进行操作,一定要谨慎,而且操作时间必须要非常短。
(3)MACD趋势线在0轴下方运行,但走势是朝上方向,表明股票走势由弱势走强,可以根据CJDX买卖信号进行操作,也会出现(2)中CJDX和股价K线运行方向不一样的情形。同样也要谨慎操作,有时候此种情况是等待时间最长但获利最多的时候。
(4)MACD趋势线在0轴下方运行,而且走势是朝下方向,表明股票渐走渐弱,此种情况同样可以根据CJDX买卖信号进行操作抓个反弹小波段,但最好是不要操作
黑马股票池每周发布,快用微信关注股票操盘手微信公众号"hujiangsimu01"(就是沪江私募01的拼音), 有惊喜,偶尔有点有用的消息。(cjh)
黄金交易的一个高胜率技巧,没基础也能学
这个方法,通过长时间复盘可以看到其较高的准确率和实用价值,不仅仅可以运用于黄金交易。用到的是瀑布线(PUBU)和修改过参数之后的KD指标(MT4里STOCH指标)。
一 使用前的调试准备
1.不改参数的PUBU,要会辨认什么叫一点式金死叉,我们要用到。
2.将KD参数修改为(13,3,3),原默认参数是(9,3,3)
3.使用原则,考虑到信号丰富,止损大小,以及空间性,稳定性等各角度,建议在黄金15-60分钟级别多运用,5分钟及60分钟级别以上辅助使用。
二 使用方法
KD先行金死叉,死叉尽量高,在80轴以上最好,金叉尽量低,在20轴以下最好
KD金死叉的时候,瀑布线还处于粘合状态,越粘合越好,后面尽量交于一点金死叉
KD可以是一次金死叉,也可以很短时间内的二次金死叉,二次金死叉比一次的效果更好。
在瀑布线后发生一点相交的金叉后做多,止损在最近的一个明显低点。
在瀑布线后发生一点相交的死叉后做空,止损在最近的一个明显高点。
看简单的一个黄金30分钟图
三 补充说明
KD的金死叉一定要注意位置,在50轴以上的金叉和50轴以下的死叉谨慎操作。
瀑布线的金死叉一定要注意方式,散乱式的交叉不要做,要一点金死叉,起码是P1-P4这几条线的交叉。
KD金死叉的时候,瀑布线越粘合越好,这样瀑布线一旦发生金死叉,必定是一点式的金死叉
如果KD金叉够低,死叉够高,瀑布线粘合程度非常好,这种时候甚至可以不等瀑布线金死叉,直接做多做空。
止损就是附近很明显的一个高点或者低点,一般而言在15-60分钟黄金的图里,这样的位置都不会太远,也就保证了短线止损不会太大,甚至是很小的。
看简单的一个黄金15分钟图
大家多在黄金的小级别图里做复盘加深理解,这个方式简单易懂,相信很多没什么基础的朋友应该也能用得上。
ISMS
ISMS是组织开展并改进安全工作的系统的一套思路、方法。(PDCA)
项目准备
项目范围确定
- 组织部门
- 无理地点
- IT资源
初次做不建议做特别大,尽量周期比较快
项目的组织
- 高管
- 重点参与部门
- 协作部门
项目沟通机制
- 高层领导
- 各个部门
ISMS实施注意事项
现状调研
首先
- 业务特征、组织结构及职责
- 组织文化与管控模式
其次
- IT规划、IT制度文件、IT基础设施资料、IT应用系统资料、IT运维程序等
- 信息安全与相关的政策、策略、程序、记录及相关报告
现状
- 控制措施有没有
- 是否充分
- 是否有效
期望
调研方式
- 文档审查
- 问卷调查
-
人员访谈
- 覆盖面
- 访谈提纲
- 现场走查必要性
- 技术评估
调研的范围不宜过大,时间跨度不宜过长
调研内容不仅14个域和114个控制项
把握访谈时间
访谈纪要
是否有补偿控制
调研报告的内容与形式:先写总结。领导一般就看看总结
风险管理
风险管理是信息安全的基础
基于资产的风险评估
资产评估与资产价值
- 分类的意义
- 关于人员、服务、无形资产
- 资产相对价值的确定
资产的意义
资产价值不同不能划为同一资产组
评估的不同层次与方法
层次
- 战略与治理
- 组织与管理
- 项目执行
- 日常运行方面
方法
- 基于详细资产
- 基于合规标准
- 基于应用系统
- 基于IT流程
- 基于数据分析
风险评估建议由客户主导,机构为辅
不要期望一次发现所有风险
前几次风险评估效果不佳是正常的
风险是动态的:需要风险监控
风险评估不是目的:需要进行风险处置
风险处置与安全规划
体系建立
SOA适用性声明
- 根据业务需求选择试用项
- 适用项最好映射到文件框架
文件框架
- 按照27001各个域来组织
- 按照企业的各个部门来组织
体系融合
- ISO2W
- CMMI
- ISO9001
- 等保
- 其他规范
制度文件最好自己写,乙方协助
并非越复杂越好,言简意赅最好
不要追求太完美
策略
- 方针、策略、政策
- 四级文件体系
- 正式发布
- 传达相关人
- 更新与评审
安全组织
- 没有最好的,只有适合的安全组织
- 安全处(部)≠安全组织
- 通常的安全组织形态
- 安全自责落实到部门和岗位(最好与考核指标相关联)
- 关注职责分离与补偿控制
- 与外部机构建立联系(政府机构、监管机构、安全厂商、服务商、协会、论坛)
密码管理
- 分析针对哪些信息在什么环节采用密码保护
- 选择密码算法要考虑合规性(对称、非对称、哈希)
- 选择第三方或自建CA中心
- 针对密钥管理
人力资源安全
任用前
- 安全职责包含在岗位说明中
- 背景调查的必要性及成本控制
- 劳动合同中的条款与保密协议
任用中
- 入职培训时强调安全政策
-
制定一个提升人员安全意识和能力的计划
- 针对安全从业人员提供专业培训
- 针对安全联络员开展必要的技能培训
- 针对全员开展安全意识宣教工作
- 处理好全体员工开展安全意识宣教工作
开展网络安全意识和教育工作
网络安全法案
人是最薄弱的环节——社会工程学
安全培训≠意识宣教工作
安全意识宣教是安全投入性价比最高的
要系统、生动、持之以恒
任用变更与离职
- 违规处理的必要性
- 违规处理需要结合具体情况而定
- 注意权限蔓延问题
- 信息资产回收
- 账号与权限及时清除
- 强调保密责任,竞业限制协议
访问控制
原则
- 访问控制的申请与授权
- 知所必须
- 最小特权
- 职责分离
- 针对管理员实施安全控制
- 阶段性进行检查
内容
- 身份识别
- 身份验证(鉴别)
- 授权管理
- 审计
范围
- 网络
- 应用、中间件、数据库
- 主机
- 终端、移动智能设备
- 物理
综合信息资产分类分级、在不同层面上建立访问控制策略
删除或禁用不必要的实用工具软件
对于源代码的控制
通过技术手段落实口令策略!!!!!!
身份管理解决方案的难点(4A)
通信安全
网络管理安全性
- 网络协议
- 网络流量
- 网络设备
- 人员管理
网络服务安全性
- 接入服务
- 网络运维服务
- 安全服务
网络隔离
- 内外网隔离
- WLAN划分
- 准入控制
信息传输安全
- site to site VPN
- SSL VPN
- 信息交换
网络安全控制
- 下一代防火墙、WAF
- 网闸、信息交换系统
- 防垃圾邮件、病毒网关、UTM
- 网络沙箱、防APT攻击
- 上网行为管理、非法外联检测
- IDS/IPS、攻击诱捕(蜜罐)
- 抗DDOS
无限安全
- 安全配置
- 热点检测
- IDS/IPS
传统通信
- PBX
- 电话
- 传真
操作安全
文件操作规程
- 三四级文件
变更流程
- 有变更走流程
容量管理
开发、测试和运行环境分离
防恶意代码
- 终端、移动设备、服务器
安全配置
- 建立安全配置基线
备份
- 与灾难恢复一起考虑
日志
- 日志保护
时钟同步
- 设置时钟服务器
限制软件安装
- 建立软件白名单
安全检查审计
- 基线配置
- 权限
- 违规操作
- 后续处理
管理漏洞
- 漏扫工具
- 漏洞挖掘
- 补丁流程
监控
- 威胁情报
- 态势感知
- 事件处理
物理安全
物理安全范畴
- 物理位置选择
- 建造安全
- 场所周边安全
- 内部区域划分与控制
- 线缆安全
-
设备安全
- 场内设备
- 场外设备
- 无人值守设备
-
环境安全
- 雷击
- 火灾预防与扑灭
- 温湿度
- 通风
- 电力供应
- 防干扰
物理计划要素
- 通过威慑预防犯罪和破坏
- 通过使用延迟机制减少损失(多重控制措施)
- 犯罪或破坏检测
- 安全事故评估
- 物理安全事件响应
常见的控制措施
- 门
- 锁
- 玻璃
- 栅栏
- 照明
- 文件柜
- 保安
- 门禁系统
- CCTV
- 屏蔽线缆和机房
- 入侵检测系统
- 防雷击
- HVAC(暖通空调)
- 水灾、火灾探测器
- 灭火系统
- UPS和发电机(偶尔启动确定可用性)
- 场所撤离计划(需进行演练)
- 物理安全审计
信息系统获取,开发和运维
漏洞的成因
- 只关注功能实现,忽略安全需求
- 团队的安全开发经验欠缺
- 缺乏安全开发流程,或项目管理流程未包含安全机制
- 缺乏安全部署标准或部署
- 缺乏安全开发规范或安全开发规范没有融入项目
- 缺乏评审环节,没有人对交质量把关
- 缺乏上线、发布流程,未执行安全部署,验收审核
- 安全上缺少投入,寄希望于后期补救
安全开发过程SDL
- 安全需求
- 安全设计
- 安全编码
- 安全测试
- 安全上限
识别安全需求
-
业务特点
- 交易安全
- 防欺诈
- 合规需求
- 通用需求
-
威胁设计
- 威胁建模
- 攻击面缩减
-
安全开发
- 编码规范
-
安全测试
- 代码审核
- 模糊测试
-
安全发布
- 上线安全检查
- 渗透测试、众测
建立基本安全设计原则
建立安全开发环境
人
过程
技术
管理及监视外包开发
严格管理变更
保护测试数据
资产管理和供应关系
信息资产识别
建立信息资产分类分级标准
- 分类与分级的意义
- 简单性原则
- 是否与保密、商业秘密保护相结合
通过建立资产清单识别信息资产
- 明确所有者
建立信息资产管理流程
信息资产标记
- 物理资产贴标签
- 非结构化数据、结构化数据标记的问题
信息资产权限梳理
- 实施DLP的前提
介质管理
- 技术控制方法
- 管理的难点
- 介质在传输中的安全控制
- 介质的销毁
识别供应商
-
供应商服务
- ISP提供商
- 网络提供商
- 网络安全服务
- IT维护
- 支持服务
- IT设备外包和运行外包
- 管理与业务咨询顾问及审计师
- 开发人员和测试人员
- 清洁工、餐饮人员及其他外包服务支持人员
- 临时人员、学生实习及其他人员
供应商管理
- 针对供应商工作场景建立安全策略
-
其他注意事项
- 供应商分类与筛选
- 招投标管理、供应商协议
- 人员管理、变更管理、风险管理、应急管理
- 管理供应商服务交付
- 供应商评价
信息安全事件管理
事件响应是一种能力
-
事件响应的重要性
- 安全模型的演进
- 自适应的安全机构
-
事件响应能力的要素
- 最关键:人
- 技术、工具、流程、写作
事件管理
- 信息安全事件分类分级
- 应鼓励人员报告可疑事件
-
建立安全事件处理流程
- 预案-检测-评估-响应-恢复-总结
- 注意事件升级与汇报渠道
- 注意证据收集
- 注意多方协作
业务连续性
在业务连续性中考虑安全问题
管理恢复过程
- 确定灾难恢复时的安全服务需求和级别
- 确定信息安全服务恢复方案并落实
- 开发恢复计划并纳入到BCP/DRP中
- 在演练过程中检验信息安全服务恢复
符合性
- 法律法规、行业监管、组织要求、相关合同
- 符合性清单建立与维护
- 理解符合性要求落实到ISMS制度要求
- 针对相关记录、表单、电子日志等提供必要的保护
保护知识产权
- 识别组织相关版权、商标、专利
- 文件、邮件等增加声明或水印等
- 防止盗版软件、建立软件白名单
- 建立组织商业秘密规范
-
落实商业秘密保护
- DRM、DLP、云桌面≠DLP
- 数据安全、商业秘密保护项目成功的关键
保护隐私
- 确定负责人、识别隐私范围
- 建立组织内的隐私声明
- 落实隐私保护控制
- 内外部环境变化时开展隐私评估
- 大数据平台带来的新问题
符合性检查
- 多标准合规体系的必要性
- 针对集团行组织、建立信息安全管理工作平台的必要性
-
组织定期的安全检查
- 技术性检查(渗透测试、众测)
- 第三方审核
体系运行
试运行启动
- 制定详细的试运行计划
-
召开试运行启动会
- 组织级领导、各部门领导、及信息安全联络员
落实相关工作
- 基于前期现状调研发现的问题和风险评估的结果,落实处置计划
- 相关任务落实到部门和责任人
-
对于整改任务进行跟踪
- 配置基线、资产标签、物理安全区域
- 定期向管理小组汇报整改进展
- 各部门按照文件体系要求执行
- 反馈文件执行结果进行修订
体系测量
-
指定适合的测量指标
- 年度、季度、月、周
- 整体、部门、个人
- 指标的多或少
- 不能照搬别人的指标体系
- 指标不是一成不变的
- 指标必须要有数据来源
全员安全意识宣教
- 如何选择安全意识服务商
- 确定本年度安全意识宣教的内容与形式
- 针对管理层进行开展意识培训
- 开展安全意识宣传周
- 发放安全手册、安全台历
- 动画、宣传片、微电影、课件、电子期刊、知识图片
- 海报、易拉宝、展板、现场培训、测试系统
内审
内审的目的
- 验证安全控制的有效性,发现问题
- 确保ISMS体系正常运转
内审过程
- 计划
- 准备
- 实施
- 报告
- 跟踪
确定内审范围与时间
根据被审对象制定内审检查表
组件内审团队、进行内审培训、交叉审核
管理评审
- 纳入安全组织决策层职责中
- 评审的评率
- 评审的内容
- 管理评审报告
评审的内容
- 内部审核或外部审核的结果
- 以往管理评审的跟踪措施
- 有效性测量的结果
- 合规与隐私符合情况
- 安全任务完成的情况
- 重大安全事件及处理情况
- 风险评估结果及整改落实状况
- 信息安全管理体系的变更
- 业务变化引出新的安全需求
- 安全架构变化
- 安全预算及资源需求
认证
- 认证机构的选择(国际,国内)
- 认证的范围与证书
- 认证的费用
- 认证审核阶段
- 审核前的准备
现场审核注意事项
- 首末次会议
- 时间安排
- 审核陪同
- 后勤保障
- 面对不满足项
- 与审核员的关系
- 年度复审
建筑架构和软件架构有很多共同点,但是建筑师在学习期间会观察数以千计的建筑,并研究大师们对这些建筑的评论。相比之下,大多数软件开发设计人员只熟悉少数大型程序——通常是他们自己编写的程序——而很少研究历史上伟大的程序。结果,他们重复彼此的错误,而不是在彼此成功的基础上再接再厉。
本文为《The Architecture of Open Source Applications》的学习笔记,四十多个著名开源软件的作者深度剖析他们的作品,讲述系统如架构如何设计,为什么这么设计,以及从中获得的经验教训。
Asterisk 1是基于GPLv2协议发布的一款开源电话应用平台。简单地说,这是一个服务端程序,用于处理电话的拨出、接入以及自定义流程。Asterisk得名于Unix通配符:*,该项目的宗旨是能做所有与电话相关的事情。如今的Asterisk已经支持一系列用于接拨电话的技术。这些技术包括诸多VoIP(Voice over IP,语音IP)协议,与传统电话网络的模/数连接性,以及PSTN(Public Swithed Telephone Network,公共交换电话网络)。
1.1 关键架构概念
本节讨论一些跟Asterisk每一部分息息相关的概念。这些思想是Asterisk架构的基础。
1.1.1 通道
通道表示Asterisk系统与某电话端点的一条连接(如图1)。一路电话呼叫接入了Asterisk系统,就用通道表示这一连接。在Asterisk代码中,通道是数据结构ast_channel的实例。图中这个呼叫场景可以视为呼叫方与某一系统应用(比如语音信箱)的交互。
图1.1 一个通道表示一条呼叫线路
1.1.2 通道桥接
更熟悉的一个呼叫场景是两个电话之间的连接:一个人使用电话A呼叫另一个使用电话B的人。在此场景下,连接到Asterisk系统的有两个电话终端,因而分配了两个通道(如图1.2)。
图1.2 两个通道表示两条呼叫线路
如上图连接的通道称之为通道桥接。为了实现在通道间传输媒体的目的而把通道连接起来,称为通道桥接。然而,在电话呼叫过程中也可能有视频流或文本流。即使有多种类型的媒体流,也是由Asterisk系统中负责连接两端的通道独立处理。
有两种方法可以完成两个通道的桥接:通用桥接和本地桥接。通用桥接时,无论通道使用什么技术都能够工作,它上层通过Asterisk抽象通道接口传输所有的音频和信号。尽管这是一种最灵活的桥接方式,却是最低效的,因为完成桥接必须有多层抽象。图1.2描述的就是通用桥接。
本地桥接是面向特定技术的通道连接方式。如果连接到Asterisk的两个通道使用相同的媒体传输技术,则势必有一种比通过抽象层更为高效的连接方式,因为抽象层是为使用不同技术的通道之间连接而准备的。例如,如果使用相同专用硬件连接的电话网络,则可以在硬件上直接桥接,这样根本不必通过应用程序向上流动,只有呼叫信号流经Asterisk,通话的媒体流直接连接,高效的多。
在桥接两个通道的时候,系统通过比较两通道的连接技术来决定使用通用桥接还是本地桥接。如果两通道都标识出支持相同的连接方式,那么就用本地桥接;反之使用通用方式。图1.3描述的是本地桥接的一个实例,呼叫信号流经Asterisk传递,媒体流建立直接连接。
图1.3 本地桥接实例
1.1.3 帧
在呼叫过程中,Asterisk帧来通信使用帧,帧是数据结构ast_frame的实例。帧可以是媒体帧,也可以是信号帧。在一个基本的呼叫过程中,媒体帧的流包含音频,是通过系统传输的。信号帧则用于发送呼叫事件相关的消息,如按下数字键,挂起电话,挂断电话等。
可用的帧类型是静态定义的。帧由一个编码类型和一个子类型表示。完整列表可在源码文件include.asterisk/frame.h中找到。下面举几个例子:
- VOICE:这类帧携带一部分音频流。
- VIDEO:这类帧携带一部分视频流。
- MODEM:这类帧数据部分使用的编码,如用于通过IP协议发送传真的T.38编码;其主要用途就是处理传真。对于这类帧的处理,保证原始数据完好无损是很重要的,这样另一端才能被成功解码。AUDIO帧不一样,因为转码到其他音频编解码器的时候,牺牲音频质量以节省带宽是可接受的做法。
- CONTROL:这类帧表示呼叫信号,用于指示呼叫信号事件,包括电话接通,挂断、挂起等等。
- DTMF_BEGIN:开始的数字键。当呼叫者按下电话上的DTMF键时,发送此帧(DTMF 代表双音多频,当按下电话上的某个键时在电话音频中发送的音调)。
- DTMF_END:结束的数字键。当呼叫者停止按电话上的DTMF键时,发送此帧。
1.2 Asterisk组件抽象
Asterisk是一款高度模块化的软件。其内核程序可由源码树上的main/目录的源码构建而成。但是内核程序本身作用不大,其主要作用是模块注册。系统还有一些代码负责连接所有抽象接口,使电话呼叫工作起来。这些接口的具体实现是由一些可载入模块在运行时完成注册的。
默认状态下,出于简便性的考虑,当主程序启动时,Asterisk会在文件系统上一个预先指定的目录下找到所有模块,并加载。还有一个可更改的配置文件,可具体指定加载哪些模块及其加载顺序。如果一个模块可从网络接受连接,但实际并不需要用它,那么最好还是不要加载它。
1.2.1 通道驱动
通道驱动接口是Asterisk提供的最复杂且最重要的接口。Asterisk通道API提供了电话协议抽象层,使得其它所有Asterisk特性能够独立于所使用的电话协议而工作。此组件负责在Asterisk通道抽象层与其实现的电话技术细节层面进行转换。
Asterisk通道驱动接口定义称为ast_channel_tech接口。它定义了通道驱动必须实现的一组方法。通道驱动须实现的第一个方法是ast_channel工厂方法,也是ast_channel_tech中的requester方法。当Asterisk为一个接入或拨出的电话呼叫建立通道后,该通道类型对应的ast_channel_tech实现方法负责对ast_channel进行实例化和初始化。
ast_channel实例创建完成后,有一个对其创建者ast_channel_tech的引用,因为还有其他一些针对具体技术的操作需要处理,这些操作必须由*ast_channel*执行,但是实际的处理就需要由ast_channel_tech的适当方法来完成。图1.2表示Asterisk中的两个通道,在图1.4中进行拓展,表示两个桥接通道,以及图中对应的通道技术实现。
图1.4 通道技术层和抽象通道层
ast_channel_tech中最重要的方法有:
- requester:回调函数,用于请求某个通道驱动实例化一个ast_channel对象,并针对其类型进行初始化。
- call:回调函数,用于从端点(由ast_channel表示)发起一个拨出呼叫。
- answer:Asterisk决定对接入的呼叫进行应答时调用。
- hangup:系统决定应该挂断呼叫时调用。调用后,通道驱动以基于某种协议的方式通知端点:呼叫结束。
- indicate:呼叫接通后,有可能产生许多其它的事件,需要给端点发信号。例如,如果电话被挂起,此回调函数将被调用,以通知此事件。通知呼叫挂起事件的方法可以是基于协议的,也可能只是由通道驱动简单发起播放挂起音乐的操作。
- send_digit_begin:调用此函数的作用是指示数字按键(DTMF)的开始发送至设备。
- send_digit_end:调用此函数的作用是指示数字按键(DTMF)的结束发送至设备。
- read:此函数由Asterisk内核调用,用于从端点读回*ast_frame*。*ast_frame*是1.1.3节中提到Asterisk的一个用于封装媒体(如音频或视频)以及触发事件的帧。
- write:此函数用于向设备发送*ast_frame*。通道驱动取得数据,按照其实现的电话协议做适当的打包,并传送至端点。
- bridge:针对通道类型的本地桥接回调函数。如前所述,通道驱动使用本地桥接,可以为两个同类型通道实现更高效的桥接方法,而没必要让这两个通道的信号和媒体流都通过额外的抽象层。从性能原因考虑,这是极为重要的。
呼叫结束后,Asterisk内核中负责抽象通道处理的代码调用*ast_channel_tech*的hangup回调函数,销毁*ast_channel*对象。
1.2.2 拨号计划
Asterisk管理员使用Asterisk拨号计划(存于
/etc/asterisk/extensions.conf文件)来设置呼叫路由表。拨号计划是由一系列被称为扩展规则的呼叫规则组成。当有一个电话呼叫接入,系统用被叫号码在拨号计划中查找扩展规则,用以处理本次呼叫。扩展规则包括一组拨号计划应用,由通道执行。拨号计划中可用于执行的应用由一个应用注册表维护,在运行期间,模块被加载填充至注册表。
Asterisk内置近200个应用。应用定义非常松散,并可任意使用系统内部API与通道交互。有些应用执行单个任务,如回放(用于向呼叫方回放一个音频文件);还有一些应用则复杂得多,要执行大量操作,如语音信箱。
你可以集成诸多使用Asterisk拨号计划的应用,用于自定义呼叫处理。如果你需要对内置拨号计划语言的能力做些自定义扩展,系统也有脚本接口,允许使用任意编程语言做自定义呼叫处理。即使通过另一编程语言使用这些脚本接口,也需要调用拨号计划应用来实现与通道交互。
举例说明之前,我们先看一个Asterisk拨号计划的语法,此拨号计划用于处理对号码1234的呼叫。共有3个拨号程序被调用:首先,应答呼叫;其次,回放音频文件;最后,挂断呼叫。
; Define the rules for what happens when someone dials 1234. ; exten => 1234,1,Answer() same => n,Playback(demo-congrats) same => n,Hangup()
关键字exten用于定义扩展。在exten一行的右侧,1234的意思是我们为呼叫1234定义了一组处理规则;紧接着,1的意思是此号码被拨叫后的第一个处理步骤;最后,Answer指示系统应答此呼叫。下面两行都以关键字same起始,是为最后一个扩展(此例指1234)指定的规则。n是下一步(next)的简写;该行的最后一项指定了采取的动作。
下面是一个Asterisk拨号计划的应用示例。此例做的事情是应答接入的一个呼叫,向呼叫方播放蜂鸣音,然后从呼叫方读入最多4个数字,存入变量DIGITS,接着读入的数字重复播放给呼叫方,最后结束呼叫。
exten => 5678,1,Answer() same => n,Read(DIGITS,beep,4) same => n,SayDigits(${DIGITS}) same => n,Hangup()
如前所述,应用定义得非常松散--注册原型非常简单:
int (*execute)(struct ast_channel *chan, const char *args);
应用的实现可以使用/asterisk/目录下几乎所有的API。
1.2.3 拨号计划函数
大多数拨号计划应用接受字符串参数。其中有些值是硬编码,但在某些地方的行为需要有更多的动态处理,这时应使用变量。下面这个例子是一个拨号计划的代码片段,其作用是设置一个变量,并使用Verbose应用在Asterisk命令行界面上打印这个变量值。
exten => 1234,1,Set(MY_VARIABLE=foo) same => n,Verbose(MY_VARIABLE is ${MY_VARIABLE})
调用拨号计划函数的语法与应用相同。Asterisk模块可注册拨号计划函数,取得一些信息并返回给拨号计划;反之,函数也可以从拨号计划中取数据并有所动作。一个通用规则是:拨号计划可设置或获取通道的元数据,但不发任何信号,也不做任何媒体处理,这些工作留给拨号计划应用来做。
下面这个例子展示了拨号计划函数的用法。此函数首先向Asterisk命令行界面打印当前通道的CallerID,然后调用Set应用更改CallerID。此例中,Verbose和Set是应用,CALLERID是函数。
exten => 1234,1,Verbose(The current CallerID is ${CALLERID(num)}) same => n,Set(CALLERID(num)=<256>555-1212)
CallerID信息存于数据结构*ast_channel*的实例中,不仅仅是一个变量,更多是一个用于信息存储的数据结构。拨号计划函数中的代码能够从这些数据结构中存取数据。
还有一个拨号计划函数的用法示例--在呼叫日志中添加自定义信息,即CDR(呼叫详细记录)。CDR函数允许获取呼叫详细记录信息以及添加自定义信息。
exten => 555,1,Verbose(Time this call started: ${CDR(start)}) same => n,Set(CDR(mycustomfield)=snickerdoodle)
1.2.4 编解码转换器
在VOIP领域有许多编解码器用于媒体编码及跨网络发送。多种技术选择为媒体质量、CPU消耗、带宽需求等方面提供了折中方案。Asterisk支持多种不同的编解码器,必要时能够在它们之间进行转码。
Asterisk设置完呼叫后,将会尝试使用公共媒体编解码器来沟通两个端点,这样就不需要转码。然而实际上这种情况不太可能发生。即使使用公共编解码器,也可能需要转码。比如,如果通过配置使Asterisk对流经系统的音频做信号处理(如增大或减小音量),就需要将音频转换为未压缩形式之后,才能执行信号处理。也可以通过配置使Asterisk做呼叫录音。如果配置的录音格式与呼叫的音频格式不同,也需要转码。
编解码的协商
用于协商媒体流将使用哪个编解码器的方法和连接到asterisk的通信技术密切相关。在某些情况下,例如在传统电话网络 (PSTN) 上的呼叫,可能不需要进行任何协商。然而,在其他情况下,尤其是使用 IP 协议时,会使用一种协商机制来根据能力和偏好需求就编解码器达成一致。
例如,对于SIP(最常用的VOIP协议),从高层视角来看,当呼叫送达Asterisk系统时,编解码器的协调执行如下:
- 端点向Asterisk发送呼叫请求中包含其优先使用的编解码器列表。
- Asterisk查询管理员提供的配置文件,配置文件中包含一个支持编解码器的列表,按优先级排序。随后Asterisk从配置文件的列表中选择优先级最高(基于配置文件中的优先级设置)、同时也包含在请求方所支持的列表中的编解码器,供应答使用。
对于更复杂的编解码,尤其是视频方面,Asterisk对此领域处理得还不够好。在过去十年里,编解码器协商需求变得更加复杂。我们还有更多的工作要做,才能更好的处理最新的视频编解码,才能使系统对视频的支持比现在更好。
1.3 线程
Asterisk是多线程应用程序,使用POSIX线程API来管理线程,并使用了相关服务,如加锁。所有与线程相关的调用的 Asterisk 代码都会被包装一层,这样调试会更方便。Asterisk的大多数线程可归类为网络监视线程或通道线程(有时亦称为PBX线程)。
1.3.1 网络监视线程
Asterisk的每个主要通道驱动程序中都存在网络监视线程,负责监视任何网络(IP网络,或PSTN,等等)连接,以及接入的呼叫或其它类型的请求。这类线程还要处理连接的建立和初始工作,如认证及拨号验证。呼叫建立完成后,监视线程将创建Asterisk通道(ast_channel)的一个实例,并启动一个通道线程在其生命周期的剩余时间内处理该呼叫。
1.3.2 通道线程
前面讨论过,通道是Asterisk的基本概念。通道有入站通道和出站通道之分。当有呼叫接入Asterisk系统时,就创建一个入站通道,执行拨号计划。Asterisk为每个入站通道创建一个线程来执行拨号计划。这类线程即被称为通道线程。
拨号计划应用一定是在通道线程的环境中执行。拨号计划函数亦如此。尽管也可能从诸如Asterisk CLI的异步接口读写拨号计划函数,但通常情况下,通道线程仍是ast_channel结构的拥有者,控制着其对象的生命周期。
1.4 呼叫场景
前两节介绍了Asterisk组件的重要接口以及线程执行模型。本节将分解一些常见的呼叫场景演示 Asterisk 组件如何协同工作来处理电话呼叫。
1.4.1 检查语音信箱
有这样一个呼叫场景的示例:呼叫接入电话系统,检查语音信箱。此场景涉及的第一个主要组件是通道驱动。通道驱动负责处理接入系统的电话呼叫请求,此动作发生在通道驱动的监视线程中。实现对系统的呼叫依赖于所使用的电话技术,因而可能会要求某种协商机制来设置呼叫。建立呼叫的另一个步骤是确定呼叫的预期目的地。这通常由呼叫者拨打的号码指定。但是,在某些特殊情况下,没有可用的特定号码,因为用于传递呼叫的技术不支持拨打指定的号码。
如果拨号计划(呼叫路由配置)为拨叫的号码定义了扩展,而通道驱动也查到了Asterisk配置有这样的扩展,系统将分配一个Asterisk通道对象(*ast_channel*),并创建一个通道线程。通道线程主要负责处理呼叫的余下动作。
图1.5 创建呼叫的时序图
通道线程的主循环用于处理拨号计划的执行,按照拨号扩展定义的规则执行。下面是一个扩展示例,用拨号计划的语法编写,存于extension.conf文件。有人拨叫**123*时,此扩展应答呼叫,并执行应用VoicemailMain。用户调用此应用就能检查邮箱里的信息。
exten => *123,1,Answer() same => n,VoicemailMain()
当通道线程执行应用Answer时,Asterisk就会应答接入的呼叫。应答呼叫除了一些通用的接听处理之外,还需调用关联ast_channel_tech结构中的回调来处理电话接听,这可能会涉及通过 IP 网络发送特殊数据包、将模拟线路连通等操作。
下一步就是由通道线程执行应用VoicemailMain(如图1.6)。此应用是由*app_voicemail*模块提供的。需要注意:虽然Voicemail代码处理大量呼叫交互,但它对用于将呼叫传送到 Asterisk 系统的技术一无所知,它只负责语音信箱相关的处理。Asterisk通道的抽象对语音邮件的实现隐藏了这些细节。
为呼叫方提供对语音信箱的访问涉及很多系统功能。然而,所有这些功能主要都实现为读写音频文件响应呼叫方的输入(主要是以数字按键的形式输入)。DTMF数字可以通过多种不同的方式发送给Asterisk系统。同样,这些实现细节都由通道驱动处理。当读入一个按键输入时,Asterisk将其转换为一个通用按键事件,传递给语音信箱代码。
我们讨论过,Asterisk重要接口之一是编解码转换器接口。编解码的实现对于这类呼叫场景而言非常重要。语音信箱代码向呼叫方回放一个音频文件时,Asterisk系统与呼叫方通信使用的音频格式不一定和该音频格式相同。如果需要音频转码,系统会生成一个转码路径,从源格式经一个或多个编解码转换器到目标格式。
图1.6 VoicemailMain的调用
在某一时刻,呼叫者完成与语音信箱的交互,挂断了呼叫。这时通道驱动检测到此动作的发生,并将其转换为Asterisk通道的一个通用信号事件。语音信箱代码接收到这一信号事件后退出,因为呼叫方挂断后就没有什么可执行的了。然后通道线程中的控制流程将返回到主循环,继续执行拨号计划。
1.4.2 呼叫桥接
Asterisk中还有一个很常用的呼叫场景叫做两通道间的呼叫桥接。此场景即一方电话通过系统呼叫另一方电话。呼叫的初始设置过程与前例相同。呼叫设置完毕,通道线程开始执行呼叫计划,之后的处理流程是不同的。
下面这个拨号计划是呼叫桥接的一个简单示例。如果系统使用了此扩展,当一方电话拨叫1234时,拨号计划执行应用Dial,这正是发起出站呼叫的主应用。
exten => 1234,1,Dial(SIP/bob)
Dial应用的参数SIP/bob的含义是,系统应发起一个出站呼叫,发送到设备SIP/bob。此参数的SIP部分指定了传送呼叫应使用SIP协议,bob部分由实现SIP协议的通道驱动*chan_sip*负责解释。假设此通道驱动有一个叫做bob的账户已经配置正确,那么它就知道如何将呼叫送达Bob的电话。
首先,应用Dial要求Asterisk内核根据SIP/bob标识符分配一个新的Asterisk通道。然后,内核请求SIP通道驱动执行针对所用技术的初始化操作。通道驱动也会发起出站呼叫过程。随着请求操作的继续执行,将会有事件传回给Asterisk内核,并由Dial应用接收。这些事件包括呼叫响应、目标忙、网络拥塞、呼叫被拒,或者其它很多可能的响应。理想情况下,呼叫会被应答。当两个通道都有应答时,通道桥接就开始了(如图1.7)。
图1.7 普通呼叫桥接的组件图
通道桥接过程中,音频和信号事件由一个通道不断传送至另一通道,直到发生某些导致桥接终止的事件,如一方呼叫挂断。图1.8所示的顺序图阐释了通过呼叫桥接传输音频帧的执行过程。
图1.8 桥接中处理音频帧的顺序图
呼叫完成时,挂断流程与前例很相似。主要不同之处在于此处涉及两个通道。通道线程结束之前,两个通道都要执行对应技术的挂断处理操作。
1.5 结论
迄今为止,Asterisk的架构已有十年以上的历史。然而,尽管这个行业在不断发展,Asterisk的一些东西,如通道的基本概念、使用拨号计划进行灵活的呼叫处理,仍然支持着复杂电话系统的开发。有一个领域Asterisk的架构还没有处理的太好,即如何使系统在多服务器间可伸缩。Asterisk开发社区正在开发一个叫做Asterisk SCF(可伸缩通信框架)的伙伴项目,目的就是解决可伸缩性的课题。未来几年,我们期待看到Asterisk以及Asterisk SCF继续称雄电话市场,包括更大型的系统项目。
脚注
- http://www.asterisk.org/
- DTMF表示多频双音,即按下一个电话键发送的呼叫音。