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網頁來訂製,方便了會議