MeetMe
概要
MeetMe 会议桥
描述
语法:MeetMe([confno][,[options][,pin]])
用途: 让用户进入一个指定的MeetMe会议。若是省略了会议编号,系统会提示用户选择一个。(注意:MeetMe会议须要一个Zaptel时钟才能工做,你能够不装任何板卡,可是你须要安装Zaptel)
参数:options能够为空,也能够设置一个或者多个参数,参数有以下一些:php
· '1' — 当会议室的第一个成员进入会议时,不向用户提示"you are currently the only person in this conference您是当前会议室惟一的成员" (Asterisk 1.2.11以上版本才支持)git
· 'a' — 设为管理员web
· 'A' — 设为标记成员编程
· 'b' — 运行在${MEETME_AGI_BACKGROUND}指定的AGI脚本网络
o 缺省: conf-background.agi (注意:须要会议室内有ZAP通道才能运行)架构
· 'c' — 加入会议时提示会议成员数量app
· 'd' — 动态加入会议socket
· 'D' — 动态加入会议,提示要求输入密码函数
o 若是用户不想给会议设密码,能够直接按井性能
· 'e' — 选择一个空会议。
· 'E' — 选择一个没密码的空会议。
· 'F' — 在会议中透传DTMF按键,全部成员都能收到DTMF。
· 'i' —提示有成员加入/离开会议with review— 须要chan_zap.so (Asterisk 1.2以上版本才支持)
· 'I' --提示有成员加入/离开会议 without review
· 'M' —当会议室只有一我的的时候放等待音乐
· 'm' —旁听状态(只能听,不能说)
· 'p' —容许用户按井退出会议室
· 'P' — 不管用户是否指定,老是提示用户输入会议密码
· 'q' — 安静模式 (有成员加入/离开会议不作任何提示)
· 'r' — 会议录音 (录音文件名${MEETME_RECORDINGFILE},格式 ${MEETME_RECORDINGFORMAT})。缺省文件名是:meetme-conf-rec-CONFNO−{UNIQUEID} ,缺省格式是wav。 — 这个参数一样须要chan_zap.so。
· 's' —收到*键的时候播放菜单,普通成员是普通菜单,管理员是管理员菜单('send' to menu)
· 't' — 设为只说模式 (只说,不听)
· 'T' — 设置说话人检测 (在manager interface 和 meetme list能够看到)
· 'v' — 视频模式 (目前还不支持)
· 'w' — 等待标记成员进入会议。
o 在标记成员进入会议以前,全部成员只能听音乐。
· ? 'X' — 容许用户输入${MEETME_EXIT_CONTEXT}里面的一个有效的单个数字来退出会议。若是${MEETME_EXIT_CONTEXT}没有定义,则从当前的内容里找有效数字。allow user to exit the conference by entering a valid single digit extension of the context specified in or the current context if that variable is not defined. (此参数不支持Asterisk v1.2.0版本)
· 'x' — 当最后一个标记用户退出会议室的时候,关闭会议。
参数详解
参数 's'
's' 和 'p' 参数不能跟 'X' 参数共同使用。
· 普通成员: 按键*将听到语音菜单"Please press 1 to mute or unmute yourself"; Asterisk v1.2版本如今支持对单独会议的单独成员进行音量调整。
· 管理员(在加入会议的时候使用了 'a' 参数): 按键*将听到语音菜单"Press 1 to mute/unmute yourself, 2 to lock/unlock this conference"
参数 'q'
最好在 Asterisk v1.2以上版本用,早期版本的SIP通道会有延迟。
参数 'r'
在开始MeetMe()录音以前,要指定Set ${MEETME_RECORDINGFILE}的值。
不然,录音文件将存放在/var/lib/asterisk/sounds目录下,该目录是存放系统提示音的,不适合存放录音文件。
例如:
exten => s,1,SetVar(MEETME_RECORDINGFILE=/var/conf_recording-EPOCH−{USER})
exten => s,2,MeetMe(,rD) ;开设一个新会议,对会议录音,
例子
在meetme.conf 中设定一个会议室号为101,密码为123456的会议。
exten => 500,1,MeetMe(101||123456)
受权的会议
exten => 18,1,Answer
exten => 18,2,Wait(1)
exten => 18,3,Authenticate(5678)
exten => 18,4,MeetMe(18|p)
exten => 18,5,Playback(vm-goodbye)
exten => 18,6,Hangup
动态会议室,用户须要按键输入要建立的会议室号
exten => 9999,1,Wait(1)
exten => 9999,2,MeetMe(|Md)
注意:若是你加入参数'e', 按*将选择#会议室
若是你须要为会议室设定一个密码,,请将 'd' 参数改成 'D' 。
动态会议室123设为安静模式。若是用户foo 拨打分机号10,他将成为一个标记用户(’A’),foo离开会议后,会议室将被关闭,其余的拨打11的用户也将被迫离开会议室。
exten => 10,1,MeetMe(123|Aqd)
exten => 11,1,MeetMe(123|xqd)
OEJ发表的回顾 (May 23, 2004)
你发现这个简单得不能再简单的(not-so-simple-anymore)简单MeetMe会议桥了吗?这但是Asterisk的一个杀手级应用哦。它带来丰富的功能应用:
· 多种渠道,包括VoIP 和 PSTN,都能参加的多方会议
· 宣讲模式:一个说话人,众多的旁听者。
· 管理功能:踢用户,让会议静音,锁定会议
· 等待其余成员的时候能够收听等待音乐
· 能够预设会议
· 也能够动态建立会议(第一个成员将被告知会议号码)
更多丰富命令包括:
· MeetMe – 加入会议 (有时候也用于建立新会议)
· MeetMeAdmin – 踢人、锁定会议、让会议静音
· MeetMeCount – 统计会议室内的成员名单
在CLI 下面也能够管理MeetMe:
· Meetme List all conferences
· MeetMe kick 踢一我的
· MeetMe kick 踢全部人
· MeetMe list 列出会议室内的全部成员
· MeetMe lock 锁定会议室,再也不加人
· MeetMe unlock 解锁会议室
· MeetMe mute 禁止某我的发言
· MeetMe unmute 容许某我的发言
OEJ附加说明
· 会议桥默认语音编码格式是ulaw。 若是采用其余编码,将额外占用CPU资源。
· MEETMESECS参数包含了用户参加会议中的时长(以秒为单位)。
· 改动meetme.conf无需从新加载,系统会自动读取
· 在dial plan中,您能够经过meetmecount()和参数来限制参加会议的人数
· MeetMe依赖Zaptel时钟,您须要安装Zaptel驱动,最好有一片Asterisk兼容的语音卡。
· 潜规则
· MeetMe应用须要一个时钟才能工做。 有几种方法能够得到时钟,其中Zaptel卡提供的工做时钟是一个不错的选择,若是你没有Zaptel卡,也可使用ztdummy 时钟。
· 动态会议 的工做方式可能跟你想得不太同样。很明显,动态会议的意思就是建立一个并未存在的会议。因此当用户A建立了一个会议号为200的会议以后,若是用户也来建立一个会议号为200的会议,那么用户B将被直接加入用户A的会议,而不会对用户B提示说已经会议号200已经被人用了。另外,若是用户A建立的这个#200会议有密码,那么用户B将听到密码无效的声音,而后系统会提示用户B从新输入一个要建立的会议号码。要想解决这个问题,咱们能作的就是经过参数 'e' 来让系统自动分配会议号码。
性能方面的考虑
在ISDN PRI环境下开超过10我的的MeetMe会议
我曾经发如今ISDN PRI环境下超过10我的的会议回发生啸叫。人们认为电信运营商已经对ISDN-PRI这样的纯数字化环境作过回声消除了,因此不须要再设置回声消除。然而事实并不是如此。我在配置文件/etc/asterisk/zapata.conf下面增长了下列的参数项,从而解决了这个问题:
echocancel=yes
echocancelwhenbridged=yes
echotraining=yes
架构和局限
在Asterisk 1.2版本中,同时开不少个会议的时候可能会有些局限。目前大部分版本已经升到1.4及以上,也就不存在这些问题了,再也不鏊述。
关于参数'b' (AGI_BACKGROUND)
网友疑问:
我看了论坛上一些老的帖子,可是仍是有个疑问,是关于AGI_BACKGROUND的。若是个人机器上安装了Asterisk兼容板卡可是会议里没有加入Zap通道,只有SIP通道,那么SIP通道上的MEETME_AGI_BACKGROUND脚本能正常工做吗?
回答:
不能正常工做。下面咱们分析一下工做原理:
合并输入的语音包,输出合并后的语音包,这些工做是在Zaptel驱动里面作的。对于真实的Zap通道,这个工做是在驱动层就请所有完成的。而对于非Zap通道,系统会建立一个Zap虚拟通道,而后在非Zap通道和Zap虚拟通道之间双向拷贝语音数据。
看一下这部分源代码(在conf_run()中),咱们会发现,conf_run() 函数要么执行AGI脚本,要么执行虚拟通道拷贝循环,不能同时执行两个。因此当你使用AGI脚本的时候,在非Zap 通道和Zap虚拟通道之间就没有任何链接了。
拥有一块Asterisk卡或者dummy时钟驱动 (好比: ztdummy 或者 zaprtc) 都能使用MeetMe功能,可是这并不意味着你能够在参加会议的SIP通道上使用AGI:他们没有执行任何AGI的能力。你能够试下看,可是最终的结果必定是什么声音也得不到。
还要注意的是,使用AGI将会使其余的一些内置功能,好比说静音、踢人和音乐等待等功能不能使用。
AGI_BACKGROUND Pros/Cons
使用AGI将会使其余的一些内置功能,好比说不用经过命令行实现静音、踢人和音乐等待等功能。
参数 'p' (按#退出) 也不能用。录音功能也不能用。
若是你须要把会议中的某个成员踢出去,首先须要中止该成员的AGI_BACKGROUND 任务。
一旦AGI_BACKGROUND脚本中止,该成员就自动退出会议室了。
全部的DTMF按键事件都被送到AGI_BACKGROUND 进程/脚本。因此你可让你的.agi脚本不停地循环,捕获按键音,来决定怎样处理一个特定的按键。
AGI_BACKGROUND 也开放了不少开发的编程机会。你可使用进程间通信(sockets, signals等等)来远程控制会议室(即: 基于外部时间或用户输入来给会议室放音)。
从普统统话发起多方通话(邀请用户参加会议)
下面我讲一下怎样从一个普统统话(两方通话)发起多方通话。主要是经过MeetMe和ChannelRedirect来实现。
疑问: 在 Asterisk 1.4 版本中,咱们是否须要用'ManagerRedirect'来替换 'ChannelRedirect'?
下面是dialplan 例子:
[default]
exten => _XXX,1,Set(DYNAMIC_FEATURES=nway-start)
exten => _XXX,n,Dial(SIP/${EXTEN})
[dynamic-nway]
exten => _XXX,1,Answer
exten => _XXX,n,Set(CONFNO=${EXTEN})
exten => _XXX,n,Set(MEETME_EXIT_CONTEXT=dynamic-nway-invite)
exten => _XXX,n,Set(DYNAMIC_FEATURES=)
exten => _XXX,n,MeetMe(${CONFNO},pdMX)
exten => _XXX,n,Hangup
[dynamic-nway-invite]
exten => 0,1,Read(DEST,dial,,i)
exten => 0,n,Set(DYNAMIC_FEATURES=nway-inv#nway-noinv)
exten => 0,n,Dial(Local/${DEST}@dynamic-nway-dest,,g)
exten => 0,n,Set(DYNAMIC_FEATURES=)
exten => 0,n,Goto(dynamic-nway,${CONFNO},1)
exten => i,1,Goto(dynamic-nway,${CONFNO},1)
[dynamic-nway-dest]
exten => _XXX,1,Dial(SIP/${EXTEN})
[macro-nway-start]
exten => s,1,Set(CONFNO=${FindFreeConf()})
exten => s,n,ChannelRedirect(BRIDGEPEER,dynamic−nway,{CONFNO},1)
exten => s,n,Read(DEST,dial,,i)
exten => s,n,Set(DYNAMIC_FEATURES=nway-inv#nway-noinv)
exten => s,n,Dial(Local/${DEST}@dynamic-nway-dest,,g)
exten => s,n,Set(DYNAMIC_FEATURES=)
exten => s,n,Goto(dynamic-nway,${CONFNO},1)
[macro-nway-ok]
exten => s,1,ChannelRedirect(BRIDGEPEER,dynamic−nway,{CONFNO},1)
[macro-nway-notok]
exten => s,1,SoftHangup(${BRIDGEPEER})
注意:你须要用 FindFreeConf() 函数 (或者其余方式) 来得到空闲的会议室号码。
此外,还须要修改 features.conf,增长下面的内容:
[applicationmap]
nway-start => *0,caller,Macro,nway-start
nway-inv => **,caller,Macro,nway-ok
nway-noinv => *#,caller,Macro,nway-notok
(译注:事实上,FindFreeConf()这个函数好像须要Trunk版本支持,须要修改一下这个例子的部份内容才能运行。另外,实际测试中咱们也发现,两个按键*0之间的间隔时间不能太长,最好是连续按键。)
工做原理:
普统统话状况下:
当你和别人通话的时候,按*0 (执行宏 nway-start)。 被叫立刻被传递到一个空闲的会议室,而你将听到拨号音,等待你输入你要邀请的电话号码。当被邀请方接通后,你在和这个第三方通话的过程当中,能够按 ** (在features.conf能够定义)加入会议,按 *# 挂掉他而后返回会议。
会议室状况下:
在会议室里面,任何用户能够按0邀请其余用户加入会议,其余的步骤同上。
合并会议
这些可使用使用 Asterisk local channels 和 Asterisk manager API来实现(通常使用AGI 或者Call Files) 。
下面是一个合并会议123和会议124的OriginateAction例子:
在dialplan (context = default):
exten => 7799,1,Meetme(123|qd)
exten => 7798,1,Meetme(124|qd)
在Manager API:
Action: Originate
ActionID: 12345678
Channel: local/7798
Context: default
Exten: 7799
Priority: 1
与某个成员悄悄话
在Meetme中,还有一个相似ChanSpy的悄悄话功能(密谈)。会议成员能够与其余成员经过'whisper'功能来密谈。
我还增长了一个 'z' 标志:
'z' — 全部的DTMF按键事件将被送到manager
用户能够经过对MeetMe系统中的按键进行侦测,而后在决定在manager命令中如何处理。
除了标准MeetMe以外的其余选择
MeetMe2
MeetMe2是在MeetMe基础上增长了Web控制界面的一个变体。
"目的是控制会议室里面的声音和成员。这个功能能够为你提供一个经过网络来控制会议和直观查看会议的方法。app_meetme已经作了大量改动,将一些会议信息写入DB,并检查会议属性是否已经改变。"
Q: 我看到会议中的成员,可是我不能把他们踢出去,也不能将他们的模式从说变成可听可说。没有显示任何错误。
A: 在php中打开register_globals。
你也能够在php文件的顶部加入"extract($_GET);"
(也有网友建议使用MeetMe-Web-Control来替代MeetMe2)
app_conference
另一个变种 app_conference,针对大容量的会议。
http://sourceforge.net/projects/appconference/
有些人认为它比MeetMe更为强大,可是目前尚未人提供详细的比较测试数据。
远程会议主机 经过第三方会议提供商: http://www.junctionnetworks.com,IAX和SIP通道能够加入远程会议。在dialplan里面能够这样写: exten => 7000,1,Dial(IAX2/conference@iax.jnctn.net) exten => 7000,1,Dial(SIP/conference@sip.jnctn.net) 经过拨打7000,您就能够参加他们的会议。 他们提供不少种参加会议的方法,能够经过Web网页来订制,方便了会议