Quantcast
Channel: IP АТС Asterisk
Viewing all 1041 articles
Browse latest View live

FreeSWITCH applications

$
0
0

FreeSWITCH applications

namedescriptionikeysyntax
AvoidingDeadlockAvoidmod_dialplan_asteriskAvoid
DialDialmod_dialplan_asteriskDial
GotoGotomod_dialplan_asteriskGoto
answerAnswer the callmod_dptools
att_xferAttended Transfermod_dptools<channel_url>
bgsystemExecute a system command in the backgroundmod_dptools<command>
bind_digit_actionbind a key sequence or regex to an actionmod_dptools<realm>,<digits|~regex>,<string>[,<value>][,<dtmf target leg>][,<event target leg>]
bind_meta_appBind a key to an applicationmod_dptools<key> [a|b|ab] [a|b|o|s|i|1] <app>
blind_transfer_ackmod_dptools[true|false]
block_dtmfBlock DTMFmod_dptools
breakBreakmod_dptools
bridgeBridge Audiomod_dptools<channel_url>
bridge_exportExport a channel variable across a bridgemod_dptools<varname>=<value>
capturecapture data into a varmod_dptools<varname>|<data>|<regex>
check_aclCheck an ip against an ACL listmod_dptools<ip> <acl | cidr> [<hangup_cause>]
clear_digit_actionclear all digit bindingsmod_dptools<realm>|all[,target]
clear_speech_cacheClear Speech Handle Cachemod_dptools
cng_plcDo PLC on CNG framesmod_dptools
conferenceconferencemod_conference
conference_set_auto_outcallconference_set_auto_outcallmod_conference
dbInsert to the dbmod_db[insert|delete]/<realm>/<key>/<val>
decode_videodecode picturemod_fsv[max_pictures]
deduplicate_dtmfPrevent duplicate inband + 2833 dtmfmod_dptools[only_rtp]
deflectSend call deflectmod_dptools<deflect_data>
delay_echoecho audio at a specified delaymod_dptools<delay ms>
detect_speechDetect speechmod_dptools<mod_name> <gram_name> <gram_path> [<addr>] OR grammar <gram_name> [<path>] OR nogrammar <gram_name> OR grammaron/grammaroff <gram_name> OR grammarsalloff OR pause OR resume OR start_input_timers OR stop OR param <name> <value>
digit_action_set_realmchange binding realmmod_dptools<realm>[,<target>]
displace_sessionDisplace Filemod_dptools<path> [<flags>] [+time_limit_ms]
early_hangupEnable early hangupmod_dptools
eavesdropeavesdrop on a uuidmod_dptools[all | <uuid>]
echoEchomod_dptools
enable_heartbeatEnable Media Heartbeatmod_dptools[0|<seconds>]
enable_keepaliveEnable Keepalivemod_dptools[0|<seconds>]
endless_playbackPlayback File Endlesslymod_dptools<path>
enumPerform an ENUM lookupmod_enum[reload | <number> [<root>]]
esf_page_groupmod_esf
evalDo Nothingmod_dptools
eventFire an eventmod_dptools
execute_extensionExecute an extensionmod_dptools<extension> <dialplan> <context>
exportExport a channel variable across a bridgemod_dptools<varname>=<value>
fax_detectDetect faxesmod_dptools
fifoPark with FIFOmod_fifo<fifo name>[!<importance_number>] [in [<announce file>|undef] [<music file>|undef] | out [wait|nowait] [<announce file>|undef] [<music file>|undef]]
fifo_track_callCount a call as a fifo call in the manual_calls queuemod_fifo<fifo_outbound_uuid>
flush_dtmfflush any queued dtmfmod_dptools
gentonesGenerate Tonesmod_dptools<tgml_script>[|<loops>]
groupManage a groupmod_db[insert|delete]:<group name>:<val>
hangupHangup the callmod_dptools[<cause>]
hashInsert into the hashtablemod_hash[insert|insert_ifempty|delete|delete_ifmatch]/<realm>/<key>/<val>
holdSend a hold messagemod_dptools[<display message>]
httapiHT-TAPI Hypertext Telephony APImod_httapi{<param1>=<val1>}
infoDisplay Call Infomod_dptools
interceptinterceptmod_dptools[-bleg] <uuid>
ivrRun an ivr menumod_dptools<menu_name>
jitterbufferSend session jitterbuffermod_dptools<jitterbuffer_data>
limitLimitmod_dptools<backend> <realm> <id> [<max>[/interval]] [number [dialplan [context]]]
limit_executeLimitmod_dptools<backend> <realm> <id> <max>[/interval] <application> [application arguments]
limit_hashLimitmod_dptools<realm> <id> [<max>[/interval]] [number [dialplan [context]]]
limit_hash_executeLimitmod_dptools<realm> <id> <max>[/interval] <application> [application arguments]
logLogs to the loggermod_dptools<log_level> <log_string>
loop_playbackPlayback File looplymod_dptools[+loops] <path>
luaLaunch LUA ivrmod_lua<script>
luaexecute a lua scriptmod_lua<script>
media_resetReset all bypass/proxy media flagsmod_dptools
mkdirCreate a directorymod_dptools<path>
multisetSet many channel variablesmod_dptools[^^<delim>]<varname>=<value> <var2>=<val2>
multiunsetUnset many channel variablesmod_dptools[^^<delim>]<varname> <var2> <var3>
mutexblock on a call flow only allowing one at a timemod_dptools<keyname>[ on|off]
novideoRefuse Inbound Videomod_dptools
pagemod_dptools<var1=val1,var2=val2><chan1>[:_:<chanN>]
parkParkmod_dptools
park_statePark Statemod_dptools
phraseSay a Phrasemod_dptools<macro_name>,<data>
pickupPickupmod_dptools[<key>]
play_and_detect_speechPlay and do speech recognitionmod_dptools<file> detect:<engine> {param1=val1,param2=val2}<grammar>
play_and_get_digitsPlay and get Digitsmod_dptools
<min> <max> <tries> <timeout> <terminators> <file> <invalid_file> <var_name> <regexp> [<digit_timeout>] ['<failure_ext> [failure_dp [failure_context]]']
play_fsvplay a fsv filemod_fsv<file>
play_yuvplay a yvv filemod_fsv<file> [width] [height]
playbackPlayback Filemod_dptools<path>
pre_answerPre-Answer the callmod_dptools
preprocesspre-processmod_dptools
presenceSend Presencemod_dptools<rpid> <status> [<id>]
privacySet privacy on callsmod_dptoolsoff|on|name|full|number
pushSet a channel variablemod_dptools<varname>=<value>
queue_dtmfQueue dtmf to be sentmod_dptools<dtmf_data>
readRead Digitsmod_dptools<min> <max> <file> <var_name> <timeout> <terminators> <digit_timeout>
recordRecord Filemod_dptools<path> [<time_limit_secs>] [<silence_thresh>] [<silence_hits>]
record_fsvrecord an fsv filemod_fsv<file>
record_sessionRecord Sessionmod_dptools<path> [+<timeout>]
record_session_maskMask audio in recordingmod_dptools<path>
record_session_unmaskResume recordingmod_dptools<path>
recovery_refreshSend call recovery_refreshmod_dptools
redirectSend session redirectmod_dptools<redirect_data>
remove_bugsRemove media bugsmod_dptools[<function>]
renameRename filemod_dptools<from_path> <to_path>
respondSend session respondmod_dptools<respond_data>
ring_readyIndicate Ring_Readymod_dptools
rxfaxFAX Receive Applicationmod_spandsp<filename>
saysaymod_dptools<module_name>[:<lang>] <say_type> <say_method> [<say_gender>] <text>
sched_broadcastSchedule a broadcast in the futuremod_dptools[+]<time> <path> [aleg|bleg|both]
sched_cancelcancel scheduled tasksmod_dptools[group]
sched_hangupSchedule a hangup in the futuremod_dptools[+]<time> [<cause>]
sched_heartbeatEnable Scheduled Heartbeatmod_dptools[0|<seconds>]
sched_transferSchedule a transfer in the futuremod_dptools[+]<time> <extension> <dialplan> <context>
send_displaySend session a new displaymod_dptools<text>
send_dtmfSend dtmf to be sentmod_dptools<dtmf_data>
send_infoSend infomod_dptools<info>
session_loglevelsession_loglevelmod_dptools<level>
setSet a channel variablemod_dptools<varname>=<value>
set_audio_levelset volumemod_dptools
set_globalSet a global variablemod_dptools<varname>=<value>
set_media_statsSet Media Statsmod_dptools
set_muteset mutemod_dptools
set_nameName the channelmod_dptools<name>
set_profile_varSet a caller profile variablemod_dptools<varname>=<value>
set_userSet a Usermod_dptools<user>@<domain> [prefix]
set_zombie_execEnable Zombie Executionmod_dptools
sleepPause a channelmod_dptools<pausemilliseconds>
socketConnect to a socketmod_event_socket<ip>[:<port>]
sofia_slaprivate sofia sla functionmod_sofia<uuid>
soft_holdPut a bridged channel on holdmod_dptools<unhold key> [<moh_a>] [<moh_b>]
sound_testAnalyze Audiomod_dptools
spandsp_detect_tddDetect TDD datamod_spandsp
spandsp_inject_tddSend TDD datamod_spandsp
spandsp_send_tddSend TDD datamod_spandsp
spandsp_start_dtmfDetect dtmfmod_spandsp
spandsp_start_fax_detectstart fax detectmod_spandsp<app>[ <arg>][ <timeout>][ <tone_type>]
spandsp_start_tone_detectStart background tone detection with cadencemod_spandsp<name>
spandsp_stop_detect_tddstop sending tddmod_spandsp
spandsp_stop_dtmfstop inband dtmfmod_spandsp
spandsp_stop_fax_detectstop fax detectmod_spandsp
spandsp_stop_inject_tddstop sending tddmod_spandsp
spandsp_stop_tone_detectStop background tone detection with cadencemod_spandsp
speakSpeak textmod_dptools<engine>|<voice>|<text>
start_dtmfDetect dtmfmod_dptools
start_dtmf_generateGenerate dtmfmod_dptools
stopDo Nothingmod_dptools
stop_displace_sessionStop Displace Filemod_dptools<path>
stop_dtmfstop inband dtmfmod_dptools
stop_dtmf_generatestop inband dtmf generationmod_dptools[write]
stop_record_sessionStop Record Sessionmod_dptools<path>
stop_tone_detectstop detecting tonesmod_dptools
stop_video_write_overlayStop video write overlaymod_dptools<path>
stopfaxStop FAX Applicationmod_spandsp
strftimestrftimemod_dptools[<epoch>|]<format string>
systemExecute a system commandmod_dptools<command>
t38_gatewayConvert to T38 Gateway if tones are heardmod_spandsp
three_waythree way call with a uuidmod_dptools<uuid>
tone_detectDetect tonesmod_dptools
transferTransfer a channelmod_dptools<exten> [<dialplan> <context>]
transfer_varsTransfer variablesmod_dptools<~variable_prefix|variable>
txfaxFAX Transmit Applicationmod_spandsp<filename>
unbind_meta_appUnbind a key from an applicationmod_dptools[<key>]
unblock_dtmfStop blocking DTMFmod_dptools
unholdSend a un-hold messagemod_dptools
unloopTell loopback to unfoldmod_loopback
unsetUnset a channel variablemod_dptools<varname>
unshiftSet a channel variablemod_dptools<varname>=<value>
valet_parkvalet_parkmod_valet_parking<lotname> <extension>|[ask [<min>] [<max>] [<to>] [<prompt>]|auto [in|out] [min] [max]]
verbose_eventsMake ALL Events verbose.mod_dptools
video_refreshSend video refresh.mod_dptools
video_write_overlayVideo write overlaymod_dptools<path> [<pos>] [<alpha>]
voicemailVoicemailmod_voicemail[check] [auth] <profile_name> <domain_name> [<id>] [uuid]
wait_for_answerWait for call to be answeredmod_dptools
wait_for_silencewait_for_silencemod_dptools<silence_thresh> <silence_hits> <listen_hits> <timeout_ms> [<file>]

FreeSWITCH


FreeSWITCH API

$
0
0

FreeSWITCH API

namedescriptionikeysyntax
consoleConsolemod_consoleloglevel [level]|colorize [on|toggle|off]
enumENUMmod_enum
enum_autoENUMmod_enum
cdr_csvcdr_csv controlsmod_cdr_csvparameters
event_sinkevent_sinkmod_event_socket<web data>
sofiaSofia Controlsmod_sofia<cmd> <args>
sofia_gateway_dataGet data from a sofia gatewaymod_sofia<gateway_name> [ivar|ovar|var] <name>
sofia_username_ofSofia Username Lookupmod_sofia[profile/]<user>@<domain>
sofia_contactSofia Contactsmod_sofia[profile/]<user>@<domain>
sofia_count_regCount Sofia registrationmod_sofia[profile/]<user>@<domain>
sofia_digSIP DIGmod_sofia<url>
sofia_presence_dataSofia Presence Datamod_sofia[list|status|rpid|user_agent] [profile/]<user>@domain
vertoVerto APImod_vertosyntax
verto_contactGenerate a verto endpoint dialstringmod_vertouser@domain
bg_systemExecute a system command in the backgroundmod_commands<command>
systemExecute a system commandmod_commands<command>
aclCompare an ip to an acl listmod_commands<ip> <list_name>
aliasAliasmod_commands[add|stickyadd] <alias> <command> | del [<alias>|*]
coalesceReturn first nonempty parametermod_commands[^^<delim>]<value1>,<value2>,...
bannerReturn the system bannermod_commands
bgapiExecute an api command in a threadmod_commands<command>[ <arg>]
breakuuid_breakmod_commands<uuid> [all]
completeCompletemod_commandsadd <word>|del [<word>|*]
condEvaluate a conditionalmod_commands<expr> ? <true val> : <false val>
console_completemod_commands<line>
console_complete_xmlmod_commands<line>
create_uuidCreate a uuidmod_commands<uuid> <other_uuid>
db_cacheManage db cachemod_commandsstatus
domain_existsCheck if a domain existsmod_commands<domain>
echoEchomod_commands<data>
escapeEscape a stringmod_commands<data>
evaleval (noop)mod_commands[uuid:<uuid> ]<expression>
expandExecute an api with variable expansionmod_commands[uuid:<uuid> ]<cmd> <args>
find_user_xmlFind a usermod_commands<key> <user> <domain>
fsctlFS control messagesmod_commands[recover|send_sighup|hupall|pause [inbound|outbound]|resume [inbound|outbound]|shutdown [cancel|elegant|asap|now|restart]|sps|sps_peak_reset|sync_clock|sync_clock_when_idle|reclaim_mem|max_sessions|min_dtmf_duration [num]|max_dtmf_duration [num]|default_dtmf_duration [num]|min_idle_cpu|loglevel [level]|debug_level [level]]
...Shutdownmod_commands
shutdownShutdownmod_commands
versionVersionmod_commands[short]
global_getvarGet global varmod_commands<var>
global_setvarSet global varmod_commands<var>=<value> [=<value2>]
group_callGenerate a dial string to call a groupmod_commands<group>[@<domain>]
helpShow help for all the api commandsmod_commands
host_lookupLookup hostmod_commands<hostname>
hostnameReturn the system hostnamemod_commands
interface_ipReturn the primary IP of an interfacemod_commands[auto|ipv4|ipv6] <ifname>
switchnameReturn the switch namemod_commands
gethostgethostbynamemod_commands
getenvgetenvmod_commands<name>
hupallhupallmod_commands<cause> [<var> <value>]
in_groupDetermine if a user is in a groupmod_commands<user>[@<domain>] <group_name>
is_lan_addrSee if an ip is a lan addrmod_commands<ip>
limit_usageGet the usage count of a limited resourcemod_commands<backend> <realm> <id>
limit_hash_usageDeprecated: gets the usage count of a limited resourcemod_commands<realm> <id>
limit_statusGet the status of a limit backendmod_commands<backend>
limit_resetReset the counters of a limit backendmod_commands<backend>
limit_interval_resetReset the interval counter for a limited resourcemod_commands<backend> <realm> <resource>
list_usersList Users configured in Directorymod_commands[group <group>] [domain <domain>] [user <user>] [context <context>]
loadLoad Modulemod_commands<mod_name>
logLogmod_commands<level> <message>
md5Return md5 hashmod_commands<data>
module_existsCheck if module existsmod_commands<module>
msleepSleep N millisecondsmod_commands<milliseconds>
nat_mapManage NATmod_commands[status|republish|reinit] | [add|del] <port> [tcp|udp] [static]
originateOriginate a callmod_commands<call url> <exten>|&<application_name>(<app_args>) [<dialplan>] [<context>] [<cid_name>] [<cid_num>] [<timeout_sec>]
pausePause media on a channelmod_commands<uuid> <on|off>
quote_shell_argQuote/escape a string for use on shell command linemod_commands<data>
regexEvaluate a regexmod_commands<data>|<pattern>[|<subst string>][n|b]
reloadaclReload XMLmod_commands
reloadReload modulemod_commands[-f] <mod_name>
reloadxmlReload XMLmod_commands
replaceReplace a stringmod_commands<data>|<string1>|<string2>
say_stringmod_commands<module_name>[.<ext>] <lang>[.<ext>] <say_type> <say_method> [<say_gender>] <text>
sched_apiSchedule an api commandmod_commands[+@]<time> <group_name> <command_string>[&]
sched_broadcastSchedule a broadcast event to a running callmod_commands[[+]<time>|@time] <uuid> <path> [aleg|bleg|both]
sched_delDelete a scheduled taskmod_commands<task_id>|<group_id>
sched_hangupSchedule a running call to hangupmod_commands[+]<time> <uuid> [<cause>]
sched_transferSchedule a transfer for a running callmod_commands[+]<time> <uuid> <extension> [<dialplan>] [<context>]
showShow various reportsmod_commandscodec|endpoint|application|api|dialplan|file|timer|calls [count]|channels [count|like <match string>]|calls|detailed_calls|bridged_calls|detailed_bridged_calls|aliases|complete|chat|management|modules|nat_map|say|interfaces|interface_types|tasks|limits|status
sql_escapeEscape a string to prevent sql injectionmod_commands<string>
statusShow current statusmod_commands
strftime_tzDisplay formatted time of timezonemod_commands<timezone_name> [<epoch>|][format string]
stunExecute STUN lookupmod_commands<stun_server>[:port] [<source_ip>[:<source_port]]
time_testShow time jittermod_commands<mss> [count]
timer_testExercise FS timermod_commands<10|20|40|60|120> [<1..200>] [<timer_name>]
tone_detectStart tone detection on a channelmod_commands<uuid> <key> <tone_spec> [<flags> <timeout> <app> <args> <hits>]
unloadUnload modulemod_commands[-f] <mod_name>
unsched_apiUnschedule an api commandmod_commands<task_id>
uptimeShow uptimemod_commands[us|ms|s|m|h|d|microseconds|milliseconds|seconds|minutes|hours|days]
reg_urlmod_commands<user>@<realm>
url_decodeUrl decode a stringmod_commands<string>
url_encodeUrl encode a stringmod_commands<string>
user_dataFind user datamod_commands<user>@<domain> [var|param|attr] <name>
uuid_early_okstop ignoring early mediamod_commands<uuid>
user_existsFind a usermod_commands<key> <user> <domain>
uuid_answeranswermod_commands<uuid>
uuid_audiouuid_audiomod_commands<uuid> [start [read|write] [mute|level <level>]|stop]
uuid_breakBreak out of media sent to channelmod_commands<uuid> [all]
uuid_bridgeBridge call legsmod_commands
uuid_broadcastExecute dialplan applicationmod_commands<uuid> <path> [aleg|bleg|holdb|both]
uuid_buglistList media bugs on a sessionmod_commands<uuid>
uuid_chatSend a chat messagemod_commands<uuid> <text>
uuid_codec_debugSend codec a debug messagemod_commands<uuid> audio|video <level>
uuid_codec_paramSend codec a parammod_commands<uuid> audio|video read|write <param> <val>
uuid_debug_mediaDebug mediamod_commands<uuid> <read|write|both|vread|vwrite|vboth|all> <on|off>
uuid_deflectSend a deflectmod_commands<uuid> <uri>
uuid_displaceDisplace audiomod_commands<uuid> [start|stop] <path> [<limit>] [mux]
uuid_displayUpdate phone displaymod_commands<uuid> <display>
uuid_drop_dtmfDrop all DTMF or replace it with a maskmod_commands<uuid> [on | off ] [ mask_digits <digits> | mask_file <file>]
uuid_dumpDump session varsmod_commands<uuid> [format]
uuid_existsCheck if a uuid existsmod_commands<uuid>
uuid_filemanManage session audiomod_commands<uuid> <cmd>:<val>
uuid_flush_dtmfFlush dtmf on a given uuidmod_commands<uuid>
uuid_getvarGet a variable from a channelmod_commands<uuid> <var>
uuid_holdPlace call on holdmod_commands[off|toggle] <uuid> [<display>]
uuid_killKill channelmod_commands<uuid> [cause]
uuid_send_messageSend MESSAGE to the endpointmod_commands<uuid> <message>
uuid_send_infoSend info to the endpointmod_commands<uuid> [<mime_type> <mime_subtype>] <message>
uuid_set_media_statsSet media statsmod_commands<uuid>
uuid_video_bitrateSend video bitrate req.mod_commands<uuid> <bitrate>
uuid_video_refreshSend video refresh.mod_commands<uuid>
uuid_outgoing_answerAnswer outgoing channelmod_commands<uuid>
uuid_limitIncrease limit resourcemod_commands<uuid> <backend> <realm> <resource> [<max>[/interval]] [number [dialplan [context]]]
uuid_limit_releaseRelease limit resourcemod_commands<uuid> <backend> [realm] [resource]
uuid_limit_releaseRelease limit resourcemod_commands<uuid> <backend> [realm] [resource]
uuid_loglevelSet loglevel on sessionmod_commands<uuid> <level>
uuid_mediaReinvite FS in or out of media pathmod_commands[off] <uuid>
uuid_media_3pReinvite FS in or out of media path using 3pccmod_commands[off] <uuid>
uuid_media_renegMedia negotiationmod_commands<uuid>[ <codec_string>]
uuid_parkPark channelmod_commands<uuid>
uuid_pausePause media on a channelmod_commands<uuid> <on|off>
uuid_phone_eventSend an event to the phonemod_commands<uuid>
uuid_ring_readySending ringing to a channelmod_commands<uuid> [queued]
uuid_pre_answerpre_answermod_commands<uuid>
uuid_preprocessPre-process Channelmod_commands<>
uuid_recordRecord session audiomod_commands<uuid> [start|stop|mask|unmask] <path> [<limit>]
uuid_recovery_refreshSend a recovery_refreshmod_commands<uuid> <uri>
uuid_recv_dtmfReceive dtmf digitsmod_commands<uuid> <dtmf_data>
uuid_redirectSend a redirectmod_commands<uuid> <uri>
uuid_send_dtmfSend dtmf digitsmod_commands<uuid> <dtmf_data>
uuid_session_heartbeatuuid_session_heartbeatmod_commands<uuid> [sched] [0|<seconds>]
uuid_setvar_multiSet multiple variablesmod_commands<uuid> <var>=<value>;<var>=<value>...
uuid_setvarSet a variablemod_commands<uuid> <var> [value]
uuid_transferTransfer a sessionmod_commands<uuid> [-bleg|-both] <dest-exten> [<dialplan>] [<context>]
uuid_dual_transferTransfer a session and its partnermod_commands<uuid> <A-dest-exten>[/<A-dialplan>][/<A-context>] <B-dest-exten>[/<B-dialplan>][/<B-context>]
uuid_simplifyTry to cut out of a call path / attended xfermod_commands<uuid>
uuid_jitterbufferuuid_jitterbuffermod_commands<uuid> [0|<min_msec>[:<max_msec>]]
uuid_zombie_execSet zombie_exec flag on the specified uuidmod_commands<uuid>
xml_flush_cacheClear xml cachemod_commands<id> <key> <val>
xml_locateFind some xmlmod_commands[root | <section> <tag> <tag_attr_name> <tag_attr_val>]
xml_wrapWrap another api command in xmlmod_commands<command> <args>
file_existsCheck if a file exists on servermod_commands<file>
getcputimeGets CPU time in milliseconds (user,kernel)mod_commands[reset]
jsonJSON APImod_commandsJSON
conferenceConference module commandsmod_conference
dbdb get/setmod_db[insert|delete|select|exists|count|list]/<realm>/<key>/<value>
groupgroup [insert|delete|call]mod_db[insert|delete|call]:<group name>:<url>
strepochConvert a date string into epoch timemod_dptools<string>
pageSend a file as a pagemod_dptools(var1=val1,var2=val2)<var1=val1,var2=val2><chan1>[:_:<chanN>]
strmicroepochConvert a date string into micoepoch timemod_dptools<string>
chatchatmod_dptools<proto>|<from>|<to>|<message>|[<content-type>]
strftimestrftimemod_dptools<format_string>
presencepresencemod_dptools[in|out] <user> <rpid> <message>
exprEval an expressionmod_expr<expr>
fifoReturn data about a fifomod_fifolist|list_verbose|count|debug|status|has_outbound|importance [<fifo name>]|reparse [del_all]
fifo_memberAdd members to a fifomod_fifo[add <fifo_name> <originate_string> [<simo_count>] [<timeout>] [<lag>] [<expires>] [<taking_calls>] | del <fifo_name> <originate_string>]
fifo_add_outboundAdd outbound members to a fifomod_fifo<node> <url> [<priority>]
fifo_check_bridgecheck if uuid is in a bridgemod_fifo<uuid>|<outbound_id>
hashhash get/setmod_hash[insert|delete|select]/<realm>/<key>/<value>
hash_dumpdump hash/limit_hash data (used for synchronization)mod_hashall|limit|db [<realm>]
hash_remotehash remotemod_hashlist|kill [name]|rescan
voicemailvoicemailmod_voicemailrss [<host> <port> <uri> <user> <domain>] | [load|unload|reload] <profile> [reloadxml]
voicemail_injectvoicemail_injectmod_voicemail[group=<group>[@domain]|domain=<domain>|<box>[@<domain>]] <sound_file> [<cid_num>] [<cid_name>]
vm_injectvm_injectmod_voicemail[group=<group>[@domain]|domain=<domain>|<box>[@<domain>]] <sound_file> [<cid_num>] [<cid_name>]
vm_boxcountvm_boxcountmod_voicemail[profile/]<user>@<domain>[|[new|saved|new-urgent|saved-urgent|all]]
vm_prefsvm_prefsmod_voicemail[profile/]<user>@<domain>[|[name_path|greeting_path|password]]
vm_deletevm_deletemod_voicemail<id>@<domain>[/profile] [<uuid>]
vm_readvm_readmod_voicemail<id>@<domain>[/profile] <read|unread> [<uuid>]
vm_listvm_listmod_voicemail<id>@<domain>[/profile] [xml]
vm_fsdb_auth_loginvm_fsdb_auth_loginmod_voicemail<profile> <domain> <user> <password>
vm_fsdb_msg_countvm_fsdb_msg_countmod_voicemail<format> <profile> <domain> <user> <folder>
vm_fsdb_msg_listvm_fsdb_msg_listmod_voicemail<format> <profile> <domain> <user> <folder> <filter> [msg-order = ASC | DESC]
vm_fsdb_msg_getvm_fsdb_msg_getmod_voicemail<format> <profile> <domain> <user> <uuid>
vm_fsdb_msg_deletevm_fsdb_msg_deletemod_voicemail<profile> <domain> <user> <uuid>
vm_fsdb_msg_undeletevm_fsdb_msg_undeletemod_voicemail<profile> <domain> <user> <uuid>
vm_fsdb_msg_emailvm_fsdb_msg_emailmod_voicemail<profile> <domain> <user> <uuid> <email>
vm_fsdb_msg_purgevm_fsdb_msg_purgemod_voicemail<profile> <domain> <user>
vm_fsdb_msg_savevm_fsdb_msg_savemod_voicemail<profile> <domain> <user> <uuid>
vm_fsdb_msg_forwardvm_fsdb_msg_forwardmod_voicemail<profile> <domain> <user> <uuid> <dst_domain> <dst_user> [prepend_file_location]
vm_fsdb_pref_greeting_setvm_fsdb_pref_greeting_setmod_voicemail<profile> <domain> <user> <slot> [file-path]
vm_fsdb_pref_greeting_getvm_fsdb_pref_greeting_getmod_voicemail<format> <profile> <domain> <user> [slot]
vm_fsdb_pref_recname_setvm_fsdb_pref_recname_setmod_voicemail<profile> <domain> <user> <file-path>
vm_fsdb_pref_password_setvm_fsdb_pref_password_setmod_voicemail<profile> <domain> <user> <password>
valet_infoValet Parking Infomod_valet_parking[<lot name>]
httapiHT-TAPI Hypertext Telephony APImod_httapi[debug_on|debug_off]
spandsp_start_tone_detectStart background tone detection with cadencemod_spandsp<uuid> <name>
spandsp_stop_tone_detectStop background tone detection with cadencemod_spandsp<uuid>
start_tdd_detectStart background tdd detectionmod_spandsp<uuid>
stop_tdd_detectStop background tdd detectionmod_spandsp<uuid>
uuid_send_tddsend tdd data to a uuidmod_spandsp<uuid> <text>
opus_debugSet OPUS Debugmod_opus<on|off>
uuid_write_pnggrab an image from a callmod_png
telecasttelecastmod_shout
hup_local_streamSkip to next file in local_streammod_local_stream<local_stream_name>
reload_local_streamReloads a local_streammod_local_stream<local_stream_name>
stop_local_streamStops and unloads a local_streammod_local_stream<local_stream_name>
start_local_streamStarts a new local_streammod_local_stream<local_stream_name>
show_local_streamShows a local streammod_local_stream[local_stream_name [xml]]
luarunrun a scriptmod_lua<script>
luarun a script as an api functionmod_lua<script>

FreeSWITCH

FreeSWITCH

$
0
0

FreeSWITCH

Использование

FreeSWITCH

  • Сервер маршрутизации.
  • Сервер B2BUA.
  • Сервер IVR
  • Сервер Конференций
  • Сервер Голосовой почты
  • SBCСервер
  • Fax сервер
  • И, конечно, АТС!

FreeSWITCH это open source, масштабируемая, кросс-платформенная, телефонная система. Предназначена для маршрутизации и коммутации между большинством современных протоколов передачи аудио, видео, текстовых и других форм медиа данных. В данном разделе собрана русскоязычная документация по установке, настройке и использованию FreeSWITCH и сопутствующих приложений.

Установка FreeSWITCH

Настройка FreeSWITCH

FusionPBX

Скачать Софтфоны

Настроим Asterisk, FreeSWITCH, OpenSIPs.

$
0
0

Настроим Asterisk, FreeSWITCH, OpenSIPs.

Реализуем самые сложные ТЗ.

Удаленно, в любой точке мира.

Установка IP АТС на открытом программном обеспечении включает в себя следующие этапы:

  1. Разработка технического задания с учетом требований заказчика и возможностей IP АТС.
  2. Подготовка договора на установку и настройку и, если требуется, поставку оборудования.
  3. Подготовка счета на оплату с учетом технического задания, согласование сроков и порядка оплаты.
  4. Удаленная установка IP АТС в любой точке мира.
  5. Установка IP АТС с выездом на объект (Санкт Петербург).
  6. Предварительная настройка оборудования в нашем сервисном центре.
  7. Сдача проекта. Проверка работоспособности всех компонентов и алгоритмов работы IP АТС.
  8. Обучение для дальнейшей эксплуатации IP АТС сотрудниками заказчика.
  9. Бесплатная техническая поддержка в течении месяца с момента запуска в эксплуатацию.

Мы находимся в Санкт-Петербурге, но работаем по всему миру!

Решения

VoIPАТС

  • Неограниченное количество VoIPабонентов и транков.
  • Запись разговоров и детализированный отчет о звонках.
  • Факс на е-мэйл.
  • Русскоязычный интерфейс.
  • CTI - Интеграция со сторонними приложениями.

Колл Центр

Дополнительно

  • Аудит и обслуживание уже установленных систем Asterisk, FreeSWITCH и др.
  • Написание кастомизированного диаплана под любые нужды.
  • Интеграция с устаревшими TDMАТС (Avaya, NEC, Nortel, Samsung, Panasonic, LG).
  • Аудит и настройки безопасности VoIPсистем.
  • Биллинг. Многопользовательские системы.
  • SIP proxy, SBC.

Напишите нам!

Свяжитесь с нами для получения подробной информации!
Офисная АТС

Only edit this fieldset if “Функционал” is set to “Офисная АТС”.

Колл Центр

Only edit this fieldset if “Функционал” is set to “Колл Центр”.

Кастомные решения

Only edit this fieldset if “Функционал” is set to “Все сложно”.

SIP TLS SRTP Asterisk

$
0
0

SIP TLS SRTP Asterisk

  mkdir /etc/asterisk/keys
  cd  /usr/src/asterisk-13*/contrib/scripts/
  ./ast_tls_cert -C pbx.asterisk-pbx.ru -O "asterisk-pbx.ru" -d /etc/asterisk/keys
  • -C domain или IP адрес)
  • -O name
  • -d directory (/etc/asterisk/keys)

No config file specified, creating '/etc/asterisk/keys/tmp.cfg'
You can use this config file to create additional certs without
re-entering the information for the fields in the certificate
Creating CA key /etc/asterisk/keys/ca.key
Generating RSA private key, 4096 bit long modulus
..++
........................................................................................................................++
e is 65537 (0x10001)
Enter pass phrase for /etc/asterisk/keys/ca.key:
Verifying - Enter pass phrase for /etc/asterisk/keys/ca.key:
Creating CA certificate /etc/asterisk/keys/ca.crt
Enter pass phrase for /etc/asterisk/keys/ca.key:
Creating certificate /etc/asterisk/keys/asterisk.key
Generating RSA private key, 1024 bit long modulus
.++++++
.........++++++
e is 65537 (0x10001)
Creating signing request /etc/asterisk/keys/asterisk.csr
Creating certificate /etc/asterisk/keys/asterisk.crt
Signature ok
subject=/CN=192.168.251.253/O=bk
Getting CA Private Key
Enter pass phrase for /etc/asterisk/keys/ca.key:
Combining key and crt into /etc/asterisk/keys/asterisk.pem

Задать пароль и повторить три раза.

*CLI> module load res_srtp.so
Loaded res_srtp.so
 Loaded res_srtp.so => (Secure RTP (SRTP))
*CLI> module show like srtp
Module                         Description                              Use Count  Status      Support Level
res_srtp.so                    Secure RTP (SRTP)                        0          Running              core
1 modules loaded

modules.conf

 load = res_srtp.so

*CLI> sip reload
 Reloading SIP
  == Parsing '/etc/asterisk/sip.conf': Found
  == Using SIP TOS bits 96
  == Using SIP CoS mark 4
  == TLS/SSL ECDH initialized (automatic), faster PFS ciphers enabled
  == TLS/SSL certificate ok

sip.conf

[general]
tcpenable=yes
bindaddr=0.0.0.0
tlsenable=yes
tlsbindaddr=0.0.0.0:5061
tlscertfile=/etc/asterisk/keys/asterisk.pem
tlscafile=/etc/asterisk/keys/ca.crt
tlscipher=ALL
tlsclientmethod=tlsv1
tlsdontverifyserver=yes
  • encryption=yes
  • transport=tls

[general]
register => tls://SIPTRUNK:PASSWORD@123.123.123.123:5061

[SIPTRUNK]
type=friend
context=from-TLSTRUNK
host=123.123.123.123
port=5061
secret=PASSWORD
dtmfmode=rfc2833
disallow=all
allow=alaw
fromdomain=123.123.123.123
insecure=port,invite
qualify=yes
canreinvite=no
encryption=yes
transport=tls

Zoiper SRTP TLS

Как настроить Zoiper на Android

Asterisk CLI - интерфейс командной строки

$
0
0

Asterisk CLI - интерфейс командной строки

asterisk -vvvvvv

Командная строка является мощным инструментом для мониторинга и управления работой Asterisk PBX. При запуске asterisk с флагом -r или -c, появиться следующие приглашение:

# asterisk   -vvvr
*CLI> 

Введите core show helpи нажмите enter для получения полного списка команд:

Командная строка поддерживает вывод доступных команд по неполному вводу нажатием 'Tab':

Для получения дополнительной информации о конкретной команде, вы можете ввести core show help<command>. Например:

*CLI> core show help manager
                manager reload Reload manager configurations
    manager set debug [on|off] Show, enable, disable debugging of the manager code
          manager show command Show a manager interface command
         manager show commands List manager interface commands
        manager show connected List connected manager interface users
           manager show eventq List manager interface queued events
         manager show settings Show manager global settings
            manager show users List configured manager users
             manager show user Display information on a specific manager user
*CLI> 

Вот некоторые полезные команды:

Core

  • core set verbose <0-9> - порог отображаемой информации.
  • core reload - перечитать все конфиги
  • core restart gracefullyперезагрузить Asterisk по завершению всех текущих вызовов (свободные каналы закрываются)
  • core restart now Restart перезагрузить Asterisk немедленно
  • core restart when convenientперезагрузить Asterisk если нет разговоров

SIP

  • sip show peersпоказать существующие SIPекстеншены и их статус
  • sip show peer 100 отображает информацию о конкретном SIPекстеншене
  • sip show registryотображает состояние зарегистрированных транков

PJSIP

  • pjsip set logger {on|off|host} – Enable/Disable PJSIP Logger Output
  • pjsip show aors– Show PJSIP Aors

   Aor:  <Aor..............................................>  <MaxContact>
    Contact:  <Aor/ContactUri.................................>  <Status....>  <RTT(ms)..>
 =========================================================================================

      Aor:  1000                                                 1
    Contact:  1000/sip:1000@192.168.1.32:5060;transport=UDP;rin  Avail               9.645

      Aor:  1001                                                 1
  • pjsip show aor– Show PJSIP Aor

localhost*CLI> pjsip show aor 1000

      Aor:  <Aor..............................................>  <MaxContact>
    Contact:  <Aor/ContactUri.................................>  <Status....>  <RTT(ms)..>
 =========================================================================================

      Aor:  1000                                                 1
    Contact:  1000/sip:1000@192.168.1.32:5060;transport=UDP;rin  Avail              13.017


 ParameterName        : ParameterValue
 ==========================================================================================
 authenticate_qualify : false
 contact              : sip:1000@192.168.1.32:5060;transport=UDP;rinstance=56471484e9cd2c68
 default_expiration   : 3600
 mailboxes            :
 max_contacts         : 1
 maximum_expiration   : 7200
 minimum_expiration   : 60
 outbound_proxy       :
 qualify_frequency    : 60
 remove_existing      : true
 support_path         : false

DAHDI

  • dahdi show statusсостояние портов dahdi
  • dahdi show channelsпоказать существующие каналы

Кодеки

  • core show translation recalcрасчет перекодировки кодеков
Spoiler

ещё

  • module show like mysqlотобразить загруженные модули содержащие в названии mysql
  • pri set debug {on|off} span 1 Enables PRI debugging on a span
  • rtp set debug {on|off|ip} Enable/Disable RTP debugging

Простые CLI приемы

Есть несколько трюков, которые помогут вам в интерфейсе командной строки Asterisk. Очень удобно завершение неполного ввода клавишей TAB. Если вы введете начало команды и нажмите клавишу Tab, Asterisk попытается завершить имя команды, или покажет возможные команды, которые начинаются с буквы, которые Вы ввели. Например, введите 'co', а затем нажмите клавишу Tab.

 localhost*CLI> co
 confbridge  config      core
 localhost*CLI> co

Теперь наберите 'cor', и нажмите TAB снова. На этот раз Asterisk завершит слово, т.к. 'core' является единственной командой, которая начинается с 'cor'. Этот трюк также работает с под-командами. Например, наберите 'core show' и нажмите TAB. (Возможно, вам придется дважды нажать вкладку, если вы не поставили пробел после слова 'show'.) Asterisk покажет вам все под-команды.

localhost*CLI> core show [Tab]
application     applications    calls           channel         channels
channeltype     channeltypes    codec           codecs          config
file            function        functions       hanguphandlers  help
hint            hints           image           license         profile
settings        sound           sounds          switches        sysinfo
taskprocessors  threads         translation     uptime          version
warranty
localhost*CLI> core show

Повторение предыдущих команд.

Для просмотра ранее введенных команд, нажмите стрелочку вверх, таким образом можно пролистать всю историю назад и вперед.

Run Linux Shell Commands from The Asterisk CLI

Восклицательный знак перед командой позволяет предавать команды оболочке Linux.

 localhost*CLI> !whoami
 root
 localhost*CLI>

Настройка Asterisk


Asterisk Dialplan - extensions.conf

$
0
0

Asterisk Dialplan - extensions.conf

Диалплан направляет каждый звонок от его источника, с помощью приложений (Dial, Voicemail, Background, ConfBridge и тд), в пункт назначения.

Наиболее важным для понимания Asterisk является план набора (dialplan). Все вызовы, будь-то голосовая почта, конференция, меню автосекретаря или вызов телефона, определяются логикой и концепцией диалплана.

Настройка производится в файле /etc/asterisk/extensions.conf .

Введение в расширения (extensions) и контексты (context)

Каналам назначаются контексты. Контексты определяют правила набора для каналов
План набора состоит из одного или нескольких контекстов. Каждый контекст это просто набор расширений (екстеншенов). Каждый екстеншен в контексте имеет уникальное имя.

Контексты ипользуются для выполнения основных функций АТС:

  • Безопасность: Можно разрешить междугородные/международные вызовы только конкретным абонентам.
  • Маршрутизация вызовов: Маршрутизация вызовов в зависимости от номера абонента.
  • Автосекретарь: Проигрывание приветствия и приглашение ввести добавочный номер.
  • Многоуровневые голосовые меню: Голосовые меню для службы поддержки, отдела продаж и т.д.
  • Авторизация: Запрос пароля для доступа к некоторым екстеншенам.
  • Обратный вызов: Позволяет уменьшить затраты на междугородние/международные вызовы.
  • Списки доступа: Занесение в черные списки надоедливых абонентов, не давая им возможности связаться с Вами.
  • Виртуальные АТС: Вы можете создать «виртуальную АТС» в пределах Вашей основной АТС.
  • Дневной/Ночной режим работы: Вы можете изменять поведение Вашей АТС в зависимости от времени суток.
  • Макросы: Можно создавать скрипты для решения повторяющихся задач в плане набора.

Что такое екстеншен?

В традиционных АТС екстеншен связан с интерфейсом (портом). В Asterisk екстеншен определяется как перечень приложений (applications) и их аргументов, выполняемых в определённом порядке, Порядок выполнения определяется приоритетами (priority). Когда екстеншен набран приоритеты выполняются до разъединения вызова, или перенаправления на другой екстеншен. Каждый шаг записывается следующим образом:

exten => <exten>,<priority>,<application>, [(<args>)]

Пример простого екстеншена

exten => 100,1,Wait(5)
exten => 100,2,Answer
exten => 100,3,Playback(demo-congrats)
exten => 100,n,Hangup

Этот екстеншен состоит из 4-х действий.

Первым выполняется приложение Wait c приоритетом 1 - ждать 5 секунд (время задаётся аргументом (5).
Вторым приложение Answer - поднять трубку.
Затем Playback - проиграть звуковой файл; аргумент задает имя файла (demo-congrats) в директории по умолчанию.
Последним выполняется приложение Hangup - повесить трубку. Приоритет 'n' означает next (следующий) и может использоваться вместо любого приоритета кроме 1-го.

Например:

[default]
exten => 100,1,Wait(5)
exten => 100,n,Answer
exten => 100,n,Playback(demo-congrats)
exten => 100,n,Hangup

Использование приоритета 'n' позволяет легко редактировать отдельные строки не переписывая все приоритеты.

Набор номера

Чаще всего вызывается другой интерфейс. Вызов осуществляется командой Dial.

[default]
exten => 100,1,Dial(DAHDI/1,20)
exten => 100,2,Voicemail(u100@default)
exten => 100,102,Voicemail(b100@default)

Этот пример иллюстрирует разные варианты действий в случае, если на вызов не ответили. Сначала вызывается канал DAHDI/1, если через 20 секунд никто не ответил вызов пренаправляется на VoiceMail()с объявлением «абонент не отвечает»(u100), Если же абонент занят, вызов перейдет на приоритет N+101, в нашем случае это приоритет 102.

Маршрутизация по CallerID

Пример маршрутизации по номеру вызывающего абонента.

[default]
exten => 100/1234567,1,Congestion
exten => 100,1,Dial(DAHDI/1,20)
exten => 100,2,Voicemail(u100)
exten => 100,102,Voicemail(b100)

Если вызывается екстеншен 100 вызов направляется на интерфейс DAHDI/1, кроме случая если вызов осуществляет абонент 1234567. В этом случае вызов отклоняется. На примере видно, что идентификатор вызывающего абонента задается формой '/1234567'.

Ещё один пример маршрутизации, теперь по отсутствию CallerID.

[default]
exten => 100/,1,Zapateller
exten => 100,1,Wait(0)
exten => 100,2,Dial(DAHDI/1)

В данном примере если поступает звонок без CallerID, вызов блокируется с помощью приложения Zapateller()

Вызов группы телефонов

Часто требуется чтобы вызов по неответу перешел на другой телефон. Рассмотрим как это сделать на примере «оператор».

[operator]
exten => 0,1,Dial(DAHDI/1,15)
exten => 0,2,Dial(DAHDI/1&DAHDI/2&DAHDI/3,15)
exten => 0,3,Playback(companymailbox)
exten => 0,4,Voicemail(100)
exten => 0,5,Hangup

Вызов поступает на DAHDI/1, в случае если телефон занят или не отвечает в течении 15 секунд, звонок переходит на группу телефонов, включая и DAHDI/1. Если и на этот раз никто не поднимает трубку, вызов переходит на голосовую почту.



Интерактивное Голосовое меню

Голосовое меню как правило задается в собственном контексте.

[sales]
exten => s,1,Background(welcome-sales)
exten => 1,1,Goto(default,100,1)
exten => 2,1,Goto(default,101,1)
[mainmenu]
exten => s,1,Background(welcome-mainmenu)
exten => 1,1,Goto(sales,s,1)
exten => 2,1,Dial,DAHDI/2
exten => 9,1,Directory(default)
exten => 0,1,Dial,DAHDI/3

Объявление проигрывается на расширении 's' (смотри Стандартные расширения). В объявлении предлагается набрать '1' для вызова отдела продаж (производится переход в контекст 'sales'). Набрать '2' - вызов DAHDI/2. Набор '9' - вызов каталога (смотри Directory ) и '0' вызов DAHDI/3


Использование переменных

В Asterisk существуют глобальные и специфичные для каналов переменные, используемые в качестве аргументов для команд. Переменные записываются в диалплане в виде ${foo}, где 'foo' это имя переменной. Имена должны начинаться с буквы и могут состоять из любых цифр и букв, но существуют предопределенные имена, вот некоторые из них:

${CONTEXT}Текущий контекст.
${EXTEN}Текущий екстеншен.
${EXTEN:x}Текущий екстеншен с удалением первых цифр(где х кол-во удаляемых цифр)
${PRIORITY}Текущий приоритет
${CALLERID}Текущий CallerID (имя и номер)
${CALLERIDNUM}Текущий номер Caller ID
${CALLERIDNAME}Текущее имя Caller ID
${RDNIS}перенаправление DNIS

Глобальные переменные назначаются в секции [globals] диалплана. Рассмотрим следующий пример:

[globals]
MARK => DAHDI/1
GREG => DAHDI/2&SIP/telephone
WIL => DAHDI/3
JUDY => DAHDI/4
[mainmenu]
exten => 1,1,Dial(${GREG}&${MARK})
exten => 2,1,Dial(${WIL}&${JUDY})
exten => 3,1,Dial(${JUDY}&${MARK})

Организуя диалплан таким образом, можно быстро и легко переназначать физические интерфейсы для конкретных пользователей, часто используемых в контекстах.

смотри подробнее Использование переменных в плане набора Asterisk

Вложенные контексты

Один контекст может включать другие контексты, обрабатываемые в порядке перечисления. Смотри также Порядок выбора нужного екстеншена при использовании шаблонов.

include => <context>[|<hours>|<weekdays>|<monthdays>|<months>]
Где <context> - включаемый контекст
опционально:
<hours> - часы в которые действителен контекст (например рабочее время 9:00-17:00)
<weekdays> -дни недели (mon-fri)
<monthdays> - дни
<month> - месяцы

Пример:

[local]
exten => _[0-79].,1,Dial(SIP/trunk/${EXTEN})
[long]
exten => _8.,1,Dial(SIP/trunk/${EXTEN})
[local_long]
include => local
include => long
[local_only]
include => local
В этом примере контекст 'local_long'' включает два других контекста для городской и междугородней связи, а контекст 'local_only' только для городской.

Дневной / Ночной режимы. Маршрутизация по времени

Вложенные контексты можно использовать для реализации дневного, ночного и празничного режимов. Рассмотрим следующий пример:

[newyears]
exten => s,1,Playback(happy-new-years)
[daytime]
exten => s,1,Dial(DAHDI/1,20)
[nighttime]
exten => s,1,Playback(after-hours-msg)
[default]
include => newyears||||1|jan
include => daytime|9:00-17:00|mon-fri
include => nighttime
В этом примере заданы дневной, ночной и праздничный режимы прихода звонков.

Исходящие вызовы

Направление исходящей связи можно реализовать определением короткого кода доступа (например '9'), или определить полностью шаблон набираемых номеров.

[international]
ignorepat => 9
exten => _9810.,1,Dial(DAHDI/g2/${EXTEN:1})
exten => _9810.,2,Congestion
include => longdistance

[longdistance]
ignorepat => 9
exten => _98[02-9]XXXXXXXXX,1,Dial(DAHDI/g2/${EXTEN:1})
exten => _98[02-9]XXXXXXXXX,2,Congestion
include => local

[local]
ignorepat => 9
exten => _9[02-79]XXXXXX,1,Dial(DAHDI/g2/${EXTEN:1})
exten => _9[02-79]XXXXXX,2,Congestion
include => default

В этом примере рассматриваются 3 контекста с различными правами доступа к Телефонной сети Общего Пользования .

Конструкция 'ignorepat ⇒ 9 ' говорит Астериску не отключать тон готовности после набора заданной цифры.

  • Контекст [international] позволяет набрать международный номер с любым количеством цифр.
  • Контекст [longdistance] - междугородний номер до 11-ти цифр.
  • Контекст [local] - городской номер длинной до 7-ми цифр.

Переменная ${EXTEN:1} удаляет префикс:

${123456789:1} - возвращает строку 23456789
${123456789:-4} - возвращает строку 6789
${123456789:0:3} - возвращает строку 123
${123456789:2:3} - возвращает строку 345
${123456789:-4:3} - возвращает строку 678

Шаблоны Patterns

Екстеншены могут сопоставляться шаблону, вместо однозначно заданных цифр. Шаблон должен начинаться с символа подчеркивания ( _ ) и может использовать любой из следующих символов:

  • X– любая цифра от 0-9
  • Z– любая цифра от 1-9
  • N– любая цифра от 2-9
  • [14-6]– цифры 1,4, 5 и 6
  • .– любые возможные символы.

Резервные транки и LCR (выбор направления с наименьшей стоимостью)

Весьма полезно настроить LCR (Least Coast Routing) и перенаправление в случае отказа внешней линии.

[tolllongdistance]
exten => _98XXXXXXXXXX,1,Dial(DAHDI/g2/${EXTEN:1})
exten => _98XXXXXXXXXX,2,Congestion
[low_rate_moscow]
exten => _98495XXXXXXX,1,Dial(IAX/trunk/${EXTEN:1})
exten => _98495XXXXXXX,2,Dial(DAHDI/g2/${EXTEN:1})
exten => _98495XXXXXXX,3,Congestion
[longdistance]
include => low_rate_moscow
include => tolllongdistance

В этом примере междугородние вызовы направляются на DAHDIинтерфейс, но звонки в Москву направляются через более выгодного провайдера на IAXтранк. В случае же недоступности IAXтранка, вызовы перенаправляются через DAHDI.

Использование Макросов

Вам может потребоваться создать множество екстеншенов (расширений) очень похожих друг на друга. Чтобы упростить работу с диалпланом используются Макросы. Для создания макроса используется контекст имя которого начинается с «macro-» и далее уникальное имя макроса. Выполнение макроса начинается с ектеншена 's'. В макросах используются локальные переменные:

${MACRO_EXTEN} – Екстеншен вызываемый макросом ${MACRO_CONTEXT} – Контекст вызываемый макросом ${MACRO_PRIORITY} – активный приоритет вызываемый макросом ${MACRO_OFFSET} – если установлено вызывает смещение n + ${MACRO_OFFSET} ${ARGn} – аргумент 'n' в макросе.

[macro-oneline]
;
; Однолинейный телефон
;
; ${ARG1} – Телефон
;
exten => s,1,Dial(${ARG1},20)
exten => s,2,Voicemail(u${MACRO_EXTEN})
exten => s,3,Hangup
exten => s,102,Voicemail(b${MACRO_EXTEN})
exten => s,103,Hangup
[macro-twoline]
;
; Двухлинейный телефон
;
; ${ARG1} – Телефон (линия) 1
; ${ARG2} – Телефон (линия) 2
;
exten => s,1,Dial(${ARG1},20)
exten => s,2,Voicemail(u${MACRO_EXTEN})
exten => s,102,Dial(${ARG2},20)
exten => s,103,Voicemail(b${MACRO_EXTEN})

[default]
exten => 1000,1,Macro(oneline,DAHDI/1)
exten => 1001,1,Macro(oneline,SIP/1001)
exten => 1002,1,Macro(twoline,DAHDI/3,DAHDI/4)

Когда макросы [macro-oneline] и [macro-twoline] созданы, в контексте [default] надо написать только одну сроку для выполнения нескольких стандартных действий.

[from-phones1]
exten => _X.,1,Dial(SIP/sip_trunk/${EXTEN},180,)
exten => _X.,n,Macro(dialstatus,s,1)

exten => _X.,1,Dial(DAHDI/g2/${EXTEN},180,)
exten => _X.,n,Macro(dialstatus,s,1)

[macro-dialstatus]
exten => s,1,Answer
exten => s,n,Goto(s-${DIALSTATUS},1)
exten => s-NOANSWER,1,Hangup
exten => s-CONGESTION,1,Congestion
exten => s-CANCEL,1,Hangup
exten => s-BUSY,1,Playtones(425/375,0/375)
exten => s-BUSY,n,Busy(7)
exten => s-BUSY,n,Hangup
exten => s-CHANUNAVAIL,1,Hangup

Приложение Macro объявлено устаревшим, вместо него рекоммендуется использовать GoSub.

Синтаксис Gosub

  Gosub([[context,]exten,]priority[(arg1[,...][,argN])])

[sub-test]
exten => _X.,1,Dial(${ARG1}/${ARG2},20,)
exten => _X.,n,Playback(tt-weasels)
exten => _X.,n,Hangup

[test]
exten => _X.,1,Gosub(sub-test,${EXTEN},1(SIP/trunk,${EXTEN}))

Запись разговоров

[macro-mixmonitor]
exten => s,1,Set(RECORD_FILENAME=${STRFTIME(${EPOCH},,%Y%m%d-%H%M%S)}-${CALLERID(num)})
        same => n,MixMonitor(${RECORD_FILENAME}.wav,b)
        same =>  n,Dial(${ARG1},180,) 
[outbound_route1]
exten => _9.,1,Macro(mixmonitor,PJSIP/sipprovider/${EXTEN:1})

В данном примере вызов с префиксом '9', должен быть скоммутирован через SIPтранк ITSP. Разговор будет записан в формате 'wav' и сохранен в директорию по умолчанию «/var/lib/asterisk/monitor/ГодМесяцДень-ЧасыМинутыСекунды-НомерВызывающего Абонента.wav

Структура same ⇒ позволяет сократить код, избежав многочисленных повторений «exten ⇒ s,» в данном случае.

Хорошая мысль поэкспериментировать и с другими переменными в имени файла, например ${UNIQUEID}.

Настройка Asterisk

IP АТС Asterisk

$
0
0

IP АТС Asterisk

Мы предлагаем услуги по установке,
настройке и обслуживанию Asterisk.
За годы работы, мы накопили внушительный опыт внедрения открытых
и проприетарных телекоммуникационных платформ.
Это позволяет, предлагать нашим клиентам самые оптимальные решения.
Приобретая базовую установку Asterisk вы гарантировано получаете:

Программное обеспечение и функционал:

  • Asterisk 13
  • FreePBX 13 - веб интерфейс настройки Asterisk
  • CDR-viewer - веб интерфейс записи и детализации вызовов
  • ARI (RESTful) и AMI - интерфейсы приложений.
  • Протоколы связи: SIP, IAX2, h323, DAHDI
  • Функции: Очереди, Группы приема вызовов, Телеконференции, Автосекретарь, Маршрутизация вызовов, Переадресация вызовов, Факс-на-ЕМайл.
  • Операционная система: Centos 7 (Centos 6, Ubuntu или Debian - по требованию)

Базовую настройку IP АТС Asterisk:

  • Создание требуемого кол-ва IP абонентов
  • Подключение требуемого кол-ва SIP (или h323) транков к провайдеру IP телефонии.
  • Настройку входящей/исходящей маршрутизации по вашему ТЗ.
  • Настройку дневного/ночного режима
  • Настройка голосового меню (IVR)
  • Настройка групп приема вызовов.
  • Базовые настройки безопасности (IPtables и fail2ban)
  • Настройка приобретенного у нас оборудования (VoIPшлюзов, IP телефонов, Плат DAHDI).
  • Консультации по настройке вашего оборудования.
  • Базовое обучение использования FreePBX для настройки Asterisk (Подключение IP абонентов, IP транков; создание очередей, телеконференций, голосовых меню, групп приема вызовов; использование сервисных кодов и отчетов о звонках.)
  • Бесплатную тех. поддержку в течении месяца с момента ввода в эксплуатацию.

Варианты установки:

  1. Продажа сервера с установкой и настройкой системы.
  2. Установка на сервере заказчика.
  3. Удаленная установка/настройка на сервере заказчика.
  4. Установка на VPS хостинге
  5. Установка на embedded устройства (например роутеры поддерживающие работу с OpenWRT, функционал может быть ограничен)

Также мы предлагаем установку и настройку дополнительного ПО и функционала:

Call Center на Asterisk

Описание работ:

  • Настройка очередей колл-центра на Asterisk
  • Установка Asternic Call Center Stats (приложение статистики очереди колл центра)

Подробнее о Call Center на Asterisk

Интеграция Asterisk и Vtiger CRM

Описание работ:

  • Установка VTiger CRM.
  • Настройка модуля PBXв VTiger CRMдля взаимодействия с Asterisk.
  • Настройка Asterisk AMIдля взаимодействия с Asterisk.
  • Настройка Asterisk Dialplan.

Подробнее о Vtiger >>>

Интеграция Asterisk и Sugar CRM

Описание работ:

  • Установка Sugar CRM.
  • Настройка модуля PBXв Sugar CRMдля взаимодействия с Asterisk.
  • Настройка Asterisk AMIдля взаимодействия с Asterisk.
  • Настройка Asterisk Dialplan.

Web Callback - звонок с сайта

Описание работ:

  • Php код - форма для обратного вызова с сайта
  • Настройка Asterisk manager Interface
  • Настройка IPtables

Подключение 3G модемов для голосовых вызовов VoIP > GSM

Описание работ:

  • Установка драйвера канала chan_dongle.
  • Настройка требуемого кол-ва GSM модемов.
  • Для старых версий Linux может понадобится перекомпиляция ядра.

Система автоматического обзвона абонентов на Asterisk

Описание работ:

  • Скрипт генерации call файлов по списку абонентов.
  • Настройка Asterisk Dialplan.

Смотрите также решение для автообзвона абонентов на FreeSWITCH >>>

Fax сервер на Asterisk

Описание работ:

  • Установка Hylafax.
  • Настройка требуемого кол-ва виртуальных факсов.
  • Настройка отправки факсов через драйвер виртуального принтера WinPrintHylafax
  • Настройка отправки факсов через email
  • Прием факcов на email
  • Настройка почтового клиента Postfix.

Полнофункциональный веб-интерфейс для настройки, обслуживания и получения информации о вызовах.

 

Call Center на Asterisk

$
0
0

Call Center на Asterisk

Базовые функции:

  • голосовое меню (IVR);
  • маршрутизация вызовов по времени;
  • очередь центра обработки вызовов
  • группы приема вызовов;
  • переадресации на внутренних или внешних абонентов;
  • голосовые конференции;
  • запись переговоров;
  • статистика звонков.

ПО

  • Asterisk 13.xx
  • FreePBX 13 - Русифицированный, интуитивно понятный веб-интерфейс для настройки Asterisk.
    • Asterisk CDR viewer - Детализированный отчет о звонках, прослушивание записанных разговоров
  • Call Center Stats - Статистика очередей колл-центра
  • FOP2 - Панель оператора

Работы:

  • Инсталляция и базовые наcтройки безопасности.
  • Настройка по согласованному ТЗ.

Колл Центр или Центр Обработки Вызовов (ЦОВ)

Asterisk прекрасно справляется с организацией как небольших колл центров, так и более мощных систем.
Приложение queue обеспечивает постановку абонента в очередь по принципу FIFO (первый вошел, первый вышел).

Агенты могут быть статическим (закрепленными за определенными очередями) и динамическими (подключатся к обслуживанию очереди набором сервис кода).

Реализацию функционала колл-центра в Asterisk можно условно разделить на уровень АТС, уровень приложений АТС и уровень приложений 3-й стороны (3rd party) :

Базовые функции маршрутизации и обработки вызовов реализованы непосредственно в Asterisk:

  • Организация очереди (обработка вызовов в порядке поступления).
  • Маршрутизация вызова по номеру абонента.
  • Интерактивные Голосовые Сообщения / IVR.
  • Распределение вызовов среди агентов по занятости или по порядку.

asterisk freepbx queue

Гибкое распределение вызовов между агентами колл центра в соответствии с заданной политикой.

  • Звонят все агенты
  • Звонят наименее занятые
  • Вызываются по кругу с последнего ответившего.
  • Линейно (в порядке перечисления)
  • Случайным образом

asterisk freepbx queue strategy

Параметры времени и операторов

Так же «очередь» имеет множество опций обработки вызова и работы агентов:

  • Приветствие оператору — проигрывается агенту прежде чем, тот соединиться с позвонившим из очереди (например: «звонок из очереди «Продажи» - при обработке одним агентом звонков из нескольких очередей).
  • Приветствие позвонившему — проигрывается один раз при попадании в очередь.
  • Музыка на удержании — проигрывается при ожидании в очереди, можно заменить на рекламную информацию.
  • Максимальное время ожидания в очереди или неограниченно.
  • Максимальная длина очереди - максимальное количество позвонивших или неограниченно.
  • Стратегия дозвона (смотри выше: тип выбора свободного агента)
  • Таймаут — время вызова свободного оператора или неограниченно
  • Повтор — время повторения вызова операторов.
  • Передышка — пауза для оператора завершившего разговор вызов.
  • Сообщение о позиции в очереди
  • Сообщение о среднем времени ожидания в очереди.
  • Вставка сообщения авто-секретаря с возможностями прямого набора номера или системы голосовых меню.

asterisk freepbx timers

Рассчитывается среднее время ожидания в очереди и ожидающий абонент информируется о номере в очереди и оставшемся времени ожидания.

Параметры ёмкости очереди

Все разговоры могут быть записаны в формате wav или gsm, с возможностью последующего поиска и скачивания записи в детализированном отчете о звонках (CDR) Детализированный отчет о звонках (CDR) храниться в базе данных MySQL. Доступ к отчетам осуществляется через веб-интерфейс и предоставляет возможности для поиска, сортировки и сравнения вызовов за разные периоды времени.

В информации о входящем вызове сохраняются

  • Дата и время звонка
  • Продолжительность вызова
  • Номер позвонившего
  • Номер оператора или агента.
  • Номер очереди
  • Ссылка на запись разговора.

Функции регистрации вызовов, информации о состоянии вызовов и агентов и запись переговоров, также реализованы средствами АТС, но требуют взаимодействия базами данных для хранения информации и последующего извлечения для создания отчетов:

  • Регистрация всех входящих и исходящих вызовов
  • Запись переговоров
  • Статус оператора (свободен, занят, пауза)

Веб-интерфейс для статистики очередей и агентов.

  • Количество принятых вызовов за указанный период времени
  • Количество отвеченных вызовов
  • Количество не отвеченных вызовов
  • Среднее время разговора

Следующие отчеты интегрированы в Asternic Call Center Stats :

Распределение: по очередям, по месяцам, по неделям, по дням, по часам.

Отвеченные вызовы: по очередям, по времени ожидания, по агентам, Причина разъединения, продолжительность вызова (в том числе средняя продолжительность по очередям и агентам).

Неотвеченные вызовы: по очередям, по времени ожидания, по агентам, Причина разъединения, продолжительность вызова (в том числе средняя продолжительность по очередям и агентам).

Текущее состояние агентов: продолжительность работы или простоя, состояние текущего вызова, текущее кол-во вызовов в очереди)

Приложения использующие информацию о вызовах сохраненную в БД и логах (CDRстатистика, Статистика очереди ):

  • Приложения для создания отчетов о входящих/исходящих вызовах и поиска записей.
  • Приложения для создания отчетов о качестве работы операторов(качество обслуживания.

Приложения в режиме реального времени получающие информацию о статусе агентов, длине очередей и загруженности каналов.

  • Real Time статус операторов, очередей и каналов.

FOP2 - Flash Operator Panel

Приложения контроля интеллектуального набора. Хотя набор номеров и маршрутизацию осуществляет сам Asterisk, для интеллектуального дозвона требуется приложение которое инициировало бы вызовы по заданному списку и управляло алгоритмом набора.

  • Автоматизированный набор номера (predictive dialer)

Приложения визуализации данных о клиенте, только получают данные о номере вызывающего абонента от Asterisk и далее, сверяя поступившую информацию с собственной БД открывают существующую или предлагают агенту создать новую карточку клиента. Таким образом эти приложения являются по сути обособленными системами, использующими Asterisk только для получении информации о номере вызывающего абонента.

  • Визуализация данных о клиенте (карточка клиента) на основании номера абонента (CallerID)

Услуги по установке и настройке IP АТС Asterisk.

 

tcpdump

$
0
0

tcpdump

 tcpdump -nqt -s 0 -A -vvv -i eth0 port 5063

FreeSwitch Centos7 autostart systemd

$
0
0

FreeSwitch Centos7 autostart systemd

FreeSWITCH Centos 7 install

  cd /usr/local/src/freeswitch/build
  cp freeswitch.service /etc/systemd/system/
  cd /etc/systemd/system/multi-user.target.wants/
  ln -s /etc/systemd/system/freeswitch.service freeswitch.service
  nano /etc/systemd/system/freeswitch.service

[Unit]
Description=FreeSWITCH
After=syslog.target network.target
After=postgresql.service postgresql-9.3.service postgresql-9.4.service mysqld.service httpd.service

[Service]
User=asterisk
EnvironmentFile=-/etc/sysconfig/freeswitch
# RuntimeDirectory is not yet supported in CentOS 7. A workaround is to use /etc/tmpfiles.d/freeswitch.conf
#RuntimeDirectory=/run/freeswitch
#RuntimeDirectoryMode=0750
WorkingDirectory=/usr/local/freeswitch
ExecStart=/usr/local/freeswitch/bin/freeswitch -nc -nf $FREESWITCH_PARAMS
ExecReload=/usr/bin/kill -HUP $MAINPID

[Install]
WantedBy=multi-user.target
  cp freeswitch.sysconfig /etc/sysconfig/freeswitch

cat >> /etc/sysconfig/freeswitch <<EOT
PID_FILE=/var/run/freeswitch/freeswitch.pid
FS_USER=freeswitch
FS_FILE=/usr/local/freeswitch/bin/freeswitch
FS_HOME=/usr/local/freeswitch
EOT
 cd /usr/local/bin/
 ln -s /usr/local/freeswitch/bin/fs_cli fs_cli

FreeSWITCH

FreeSWITCH applications

$
0
0

FreeSWITCH applications

namedescriptionikeysyntax
AvoidingDeadlockAvoidmod_dialplan_asteriskAvoid
DialDialmod_dialplan_asteriskDial
GotoGotomod_dialplan_asteriskGoto
answerAnswer the callmod_dptools
att_xferAttended Transfermod_dptools<channel_url>
bgsystemExecute a system command in the backgroundmod_dptools<command>
bind_digit_actionbind a key sequence or regex to an actionmod_dptools<realm>,<digits|~regex>,<string>[,<value>][,<dtmf target leg>][,<event target leg>]
bind_meta_appBind a key to an applicationmod_dptools<key> [a|b|ab] [a|b|o|s|i|1] <app>
blind_transfer_ackmod_dptools[true|false]
block_dtmfBlock DTMFmod_dptools
breakBreakmod_dptools
bridgeBridge Audiomod_dptools<channel_url>
bridge_exportExport a channel variable across a bridgemod_dptools<varname>=<value>
capturecapture data into a varmod_dptools<varname>|<data>|<regex>
check_aclCheck an ip against an ACL listmod_dptools<ip> <acl | cidr> [<hangup_cause>]
clear_digit_actionclear all digit bindingsmod_dptools<realm>|all[,target]
clear_speech_cacheClear Speech Handle Cachemod_dptools
cng_plcDo PLC on CNG framesmod_dptools
conferenceconferencemod_conference
conference_set_auto_outcallconference_set_auto_outcallmod_conference
dbInsert to the dbmod_db[insert|delete]/<realm>/<key>/<val>
decode_videodecode picturemod_fsv[max_pictures]
deduplicate_dtmfPrevent duplicate inband + 2833 dtmfmod_dptools[only_rtp]
deflectSend call deflectmod_dptools<deflect_data>
delay_echoecho audio at a specified delaymod_dptools<delay ms>
detect_speechDetect speechmod_dptools<mod_name> <gram_name> <gram_path> [<addr>] OR grammar <gram_name> [<path>] OR nogrammar <gram_name> OR grammaron/grammaroff <gram_name> OR grammarsalloff OR pause OR resume OR start_input_timers OR stop OR param <name> <value>
digit_action_set_realmchange binding realmmod_dptools<realm>[,<target>]
displace_sessionDisplace Filemod_dptools<path> [<flags>] [+time_limit_ms]
early_hangupEnable early hangupmod_dptools
eavesdropeavesdrop on a uuidmod_dptools[all | <uuid>]
echoEchomod_dptools
enable_heartbeatEnable Media Heartbeatmod_dptools[0|<seconds>]
enable_keepaliveEnable Keepalivemod_dptools[0|<seconds>]
endless_playbackPlayback File Endlesslymod_dptools<path>
enumPerform an ENUM lookupmod_enum[reload | <number> [<root>]]
esf_page_groupmod_esf
evalDo Nothingmod_dptools
eventFire an eventmod_dptools
execute_extensionExecute an extensionmod_dptools<extension> <dialplan> <context>
exportExport a channel variable across a bridgemod_dptools<varname>=<value>
fax_detectDetect faxesmod_dptools
fifoPark with FIFOmod_fifo<fifo name>[!<importance_number>] [in [<announce file>|undef] [<music file>|undef] | out [wait|nowait] [<announce file>|undef] [<music file>|undef]]
fifo_track_callCount a call as a fifo call in the manual_calls queuemod_fifo<fifo_outbound_uuid>
flush_dtmfflush any queued dtmfmod_dptools
gentonesGenerate Tonesmod_dptools<tgml_script>[|<loops>]
groupManage a groupmod_db[insert|delete]:<group name>:<val>
hangupHangup the callmod_dptools[<cause>]
hashInsert into the hashtablemod_hash[insert|insert_ifempty|delete|delete_ifmatch]/<realm>/<key>/<val>
holdSend a hold messagemod_dptools[<display message>]
httapiHT-TAPI Hypertext Telephony APImod_httapi{<param1>=<val1>}
infoDisplay Call Infomod_dptools
interceptinterceptmod_dptools[-bleg] <uuid>
ivrRun an ivr menumod_dptools<menu_name>
jitterbufferSend session jitterbuffermod_dptools<jitterbuffer_data>
limitLimitmod_dptools<backend> <realm> <id> [<max>[/interval]] [number [dialplan [context]]]
limit_executeLimitmod_dptools<backend> <realm> <id> <max>[/interval] <application> [application arguments]
limit_hashLimitmod_dptools<realm> <id> [<max>[/interval]] [number [dialplan [context]]]
limit_hash_executeLimitmod_dptools<realm> <id> <max>[/interval] <application> [application arguments]
logLogs to the loggermod_dptools<log_level> <log_string>
loop_playbackPlayback File looplymod_dptools[+loops] <path>
luaLaunch LUA ivrmod_lua<script>
luaexecute a lua scriptmod_lua<script>
media_resetReset all bypass/proxy media flagsmod_dptools
mkdirCreate a directorymod_dptools<path>
multisetSet many channel variablesmod_dptools[^^<delim>]<varname>=<value> <var2>=<val2>
multiunsetUnset many channel variablesmod_dptools[^^<delim>]<varname> <var2> <var3>
mutexblock on a call flow only allowing one at a timemod_dptools<keyname>[ on|off]
novideoRefuse Inbound Videomod_dptools
pagemod_dptools<var1=val1,var2=val2><chan1>[:_:<chanN>]
parkParkmod_dptools
park_statePark Statemod_dptools
phraseSay a Phrasemod_dptools<macro_name>,<data>
pickupPickupmod_dptools[<key>]
play_and_detect_speechPlay and do speech recognitionmod_dptools<file> detect:<engine> {param1=val1,param2=val2}<grammar>
play_and_get_digitsPlay and get Digitsmod_dptools
<min> <max> <tries> <timeout> <terminators> <file> <invalid_file> <var_name> <regexp> [<digit_timeout>] ['<failure_ext> [failure_dp [failure_context]]']
play_fsvplay a fsv filemod_fsv<file>
play_yuvplay a yvv filemod_fsv<file> [width] [height]
playbackPlayback Filemod_dptools<path>
pre_answerPre-Answer the callmod_dptools
preprocesspre-processmod_dptools
presenceSend Presencemod_dptools<rpid> <status> [<id>]
privacySet privacy on callsmod_dptoolsoff|on|name|full|number
pushSet a channel variablemod_dptools<varname>=<value>
queue_dtmfQueue dtmf to be sentmod_dptools<dtmf_data>
readRead Digitsmod_dptools<min> <max> <file> <var_name> <timeout> <terminators> <digit_timeout>
recordRecord Filemod_dptools<path> [<time_limit_secs>] [<silence_thresh>] [<silence_hits>]
record_fsvrecord an fsv filemod_fsv<file>
record_sessionRecord Sessionmod_dptools<path> [+<timeout>]
record_session_maskMask audio in recordingmod_dptools<path>
record_session_unmaskResume recordingmod_dptools<path>
recovery_refreshSend call recovery_refreshmod_dptools
redirectSend session redirectmod_dptools<redirect_data>
remove_bugsRemove media bugsmod_dptools[<function>]
renameRename filemod_dptools<from_path> <to_path>
respondSend session respondmod_dptools<respond_data>
ring_readyIndicate Ring_Readymod_dptools
rxfaxFAX Receive Applicationmod_spandsp<filename>
saysaymod_dptools<module_name>[:<lang>] <say_type> <say_method> [<say_gender>] <text>
sched_broadcastSchedule a broadcast in the futuremod_dptools[+]<time> <path> [aleg|bleg|both]
sched_cancelcancel scheduled tasksmod_dptools[group]
sched_hangupSchedule a hangup in the futuremod_dptools[+]<time> [<cause>]
sched_heartbeatEnable Scheduled Heartbeatmod_dptools[0|<seconds>]
sched_transferSchedule a transfer in the futuremod_dptools[+]<time> <extension> <dialplan> <context>
send_displaySend session a new displaymod_dptools<text>
send_dtmfSend dtmf to be sentmod_dptools<dtmf_data>
send_infoSend infomod_dptools<info>
session_loglevelsession_loglevelmod_dptools<level>
setSet a channel variablemod_dptools<varname>=<value>
set_audio_levelset volumemod_dptools
set_globalSet a global variablemod_dptools<varname>=<value>
set_media_statsSet Media Statsmod_dptools
set_muteset mutemod_dptools
set_nameName the channelmod_dptools<name>
set_profile_varSet a caller profile variablemod_dptools<varname>=<value>
set_userSet a Usermod_dptools<user>@<domain> [prefix]
set_zombie_execEnable Zombie Executionmod_dptools
sleepPause a channelmod_dptools<pausemilliseconds>
socketConnect to a socketmod_event_socket<ip>[:<port>]
sofia_slaprivate sofia sla functionmod_sofia<uuid>
soft_holdPut a bridged channel on holdmod_dptools<unhold key> [<moh_a>] [<moh_b>]
sound_testAnalyze Audiomod_dptools
spandsp_detect_tddDetect TDD datamod_spandsp
spandsp_inject_tddSend TDD datamod_spandsp
spandsp_send_tddSend TDD datamod_spandsp
spandsp_start_dtmfDetect dtmfmod_spandsp
spandsp_start_fax_detectstart fax detectmod_spandsp<app>[ <arg>][ <timeout>][ <tone_type>]
spandsp_start_tone_detectStart background tone detection with cadencemod_spandsp<name>
spandsp_stop_detect_tddstop sending tddmod_spandsp
spandsp_stop_dtmfstop inband dtmfmod_spandsp
spandsp_stop_fax_detectstop fax detectmod_spandsp
spandsp_stop_inject_tddstop sending tddmod_spandsp
spandsp_stop_tone_detectStop background tone detection with cadencemod_spandsp
speakSpeak textmod_dptools<engine>|<voice>|<text>
start_dtmfDetect dtmfmod_dptools
start_dtmf_generateGenerate dtmfmod_dptools
stopDo Nothingmod_dptools
stop_displace_sessionStop Displace Filemod_dptools<path>
stop_dtmfstop inband dtmfmod_dptools
stop_dtmf_generatestop inband dtmf generationmod_dptools[write]
stop_record_sessionStop Record Sessionmod_dptools<path>
stop_tone_detectstop detecting tonesmod_dptools
stop_video_write_overlayStop video write overlaymod_dptools<path>
stopfaxStop FAX Applicationmod_spandsp
strftimestrftimemod_dptools[<epoch>|]<format string>
systemExecute a system commandmod_dptools<command>
t38_gatewayConvert to T38 Gateway if tones are heardmod_spandsp
three_waythree way call with a uuidmod_dptools<uuid>
tone_detectDetect tonesmod_dptools
transferTransfer a channelmod_dptools<exten> [<dialplan> <context>]
transfer_varsTransfer variablesmod_dptools<~variable_prefix|variable>
txfaxFAX Transmit Applicationmod_spandsp<filename>
unbind_meta_appUnbind a key from an applicationmod_dptools[<key>]
unblock_dtmfStop blocking DTMFmod_dptools
unholdSend a un-hold messagemod_dptools
unloopTell loopback to unfoldmod_loopback
unsetUnset a channel variablemod_dptools<varname>
unshiftSet a channel variablemod_dptools<varname>=<value>
valet_parkvalet_parkmod_valet_parking<lotname> <extension>|[ask [<min>] [<max>] [<to>] [<prompt>]|auto [in|out] [min] [max]]
verbose_eventsMake ALL Events verbose.mod_dptools
video_refreshSend video refresh.mod_dptools
video_write_overlayVideo write overlaymod_dptools<path> [<pos>] [<alpha>]
voicemailVoicemailmod_voicemail[check] [auth] <profile_name> <domain_name> [<id>] [uuid]
wait_for_answerWait for call to be answeredmod_dptools
wait_for_silencewait_for_silencemod_dptools<silence_thresh> <silence_hits> <listen_hits> <timeout_ms> [<file>]

FreeSWITCH

FreeSwitch:multy-domain pbx configuration example

$
0
0

FreeSwitch:multy-domain pbx configuration example

under construction!

vars.xml

<X-PRE-PROCESS cmd="set" data="external_ip=123.123.123.123"/><X-PRE-PROCESS cmd="set" data="domain=$${local_ip_v4}"/>

Internal:Sip profile local network

файл: ../conf/sip_profiles/internal.xml

Профиль для регистрации пользователей из локальной сети, в примере - 192.168.0.0/16

  • <param name="apply-inbound-acl" value="192.168.0.0/16"/>
  • <param name="apply-register-acl" value="192.168.0.0/16"/>

Обратите внимание, что устройства из этих подсетей, смогут звонить (apply-inbound-acl) и регистрироваться (apply-register-acl) - без указания пароля.

  • <param name="auth-calls" value="true"/>

Параметр auth-callsвключает проверку ACL, т.е. разрешает использование параметров apply-inbound-aclи apply-register-acl.

<profile name="internal"><gateways><X-PRE-PROCESS cmd="include" data="internal/*.xml"/></gateways><settings><param name="apply-inbound-acl" value="192.168.0.0/16"/><param name="apply-register-acl" value="192.168.0.0/16"/><param name="auth-calls" value="true"/><param name="debug" value="1"/><param name="sip-trace" value="no"/><param name="dialplan" value="XML"/><param name="context" value="default"/><param name="codec-prefs" value="$${global_codec_prefs}"/><param name="rtp-ip" value="$${local_ip_v4}"/><param name="sip-ip" value="$${local_ip_v4}"/><param name="ext-rtp-ip" value="auto-nat"/><param name="ext-sip-ip" value="auto-nat"/><param name="sip-port" value="5060"/><param name="rtp-autofix-timing" value="false"/></settings>

sip profile for outbound reg

<profile name="external"><gateways><X-PRE-PROCESS cmd="include" data="external/*.xml"/></gateways><settings><param name="auth-calls" value="false"/><param name="debug" value="3"/><param name="sip-trace" value="no"/><param name="dialplan" value="XML"/><param name="context" value="public"/><param name="codec-prefs" value="$${global_codec_prefs}"/><param name="rtp-ip" value="$${local_ip_v4}"/><param name="sip-ip" value="$${local_ip_v4}"/><param name="ext-rtp-ip" value="auto-nat"/><param name="ext-sip-ip" value="auto-nat"/><param name="sip-port" value="$${external_sip_port}"/><param name="rtp-autofix-timing" value="false"/></settings></profile>

sip profile for external inbound reg

<profile name="external5090"><gateways><X-PRE-PROCESS cmd="include" data="internal/*.xml"/></gateways><settings><param name="auth-calls" value="false"/><param name="debug" value="3"/><param name="sip-trace" value="no"/><param name="dialplan" value="XML"/><param name="context" value="default"/><param name="codec-prefs" value="$${global_codec_prefs}"/><param name="rtp-ip" value="$${local_ip_v4}"/><param name="sip-ip" value="$${local_ip_v4}"/><param name="ext-rtp-ip" value="$${external_ip}"/><param name="ext-sip-ip" value="$${external_ip}"/><param name="sip-port" value="5090"/><param name="rtp-autofix-timing" value="false"/></settings></profile>

gsm gateway

../external/addpac.xml

<include><gateway name="addpac1"><param name="username" value=""/><param name="password" value="register:false"/><param name="proxy" value="192.168.1.2:5060"/><param name="expire-seconds" value="800"/><param name="register" value="false"/><param name="register-transport" value="udp"/><param name="context" value="default"/><param name="caller-id-in-from" value="false"/></gateway></include>

sip itsp

../sip_profiles/external/itsp.xml

<include><gateway name="itsp"><param name="username" value="7777777_trunk"/><param name="realm" value="pbx.itsp.tld"/><param name="from-user" value="7777777_trunk"/><param name="from-domain" value="pbx.itsp.tld"/><param name="password" value="Very_Strong_pasword)"/><param name="proxy" value="pbx.itsp.tld"/><param name="expire-seconds" value="3600"/><param name="register" value="true"/><param name="register-transport" value="udp"/><param name="retry-seconds" value="60"/><!--param name="ping" value="60"/--><param name="context" value="public"/><param name="caller-id-in-from" value="false"/></gateway></include>

directory for externalreg5090

../directory/externalreg.xml

<include><!--the domain or ip (the right hand side of the @ in the addr--><domain name="$${external_ip}"><params><param name="dial-string" value="{^^:sip_invite_domain=${dialed_domain}:presence_id=${dialed_user}@${dialed_domain}}${sofia_contact(*/${dialed_user}@${dialed_domain})},${verto_contact(${dialed_user}@${dialed_domain})}"/></params><variables></variables><groups><group name="externalreg"><users><X-PRE-PROCESS cmd="include" data="externalreg/*.xml"/></users></group></groups></domain></include>

../directory/externalreg/100.xml

<include><user id="100"><params><param name="password" value="user_password"/></params><variables><variable name="user_context" value="default"/><variable name="effective_caller_id_name" value="user100"/><variable name="effective_caller_id_number" value="100"/></variables></user></include>

../directory/default/100.xml

<include><user id="100"><params><param name="password" value="user_password"/></params><variables><variable name="user_context" value="default"/><variable name="effective_caller_id_name" value="user100"/><variable name="effective_caller_id_number" value="100"/></variables></user></include>

VoIP-GSM шлюз USB HUAWEI E1550

$
0
0

VoIP-GSM шлюз USB HUAWEI E1550

Использование USB 3G модема в качестве медиа шлюза для голосовой связи из VoIPв GSM сеть и обратно. Голосовой модуль по умолчанию активирован только в модемах МТС.
Рекомендованное ядро Linux 2.6.33+
Asterisk 1.6.+
USB 2.0

Заведомо рабочие прошивки (firmware - не путать с dashboard):
МТС 11.608.12.00.143
11.608.14.15.311

Нерабочая firmware:
Мегафон 11.608.12.10.209 -при активированном голосе из под винды звонит, из под Linux - нет.

Активировать голосовую функцию можно программой DC-UNLOCKERза 4 кредита - 4 евро.

набор утилит для активации голоса

Установка asterisk из исходников

# wget http://downloads.asterisk.org/pub/telephony/asterisk/asterisk-1.6.2-current.tar.gz
# tar zxvf asterisk-1.6.2-current.tar.gz
# cd asterisk-1.6.2-current.tar.gz
# apt-get install g++ libncurses-dev libxml2-dev subversion
# ./configure
# make install
# make config
# make samples

Установка модуля канала chan_datacard для Huawei

Файл datacard.confиз ~/chan_datacard/etcкопируем в каталог /etc/asterisk

# svn co http://www.makhutov.org/svn/chan_datacard/trunk/ chan_datacard
# cd ~/chan_datacard/
# ./configure
# make install
# cp ~/chan_datacard/etc/datacard.conf /etc/asterisk
usb modeswitch (не обязательно)

задание прав и пользователя устройства (Huawei E1550)

Предположим, по умолчанию так:

# ls -al /dev | grep ttyS
crw-rw----   1 root     dialout    4,  64 Сен 23 15:14 ttyUSB0
crw-rw----   1 root     dialout    4,  65 Сен 23 15:14 ttyUSB1
crw-rw----   1 root     dialout    4,  66 Сен 23 15:14 ttyUSB2

А Asterisk запущен из под одноименного пользователя

в консоли увидим:

chan_dongle.c: unable to open /dev/ttyUSB1: Permission denied

создадим правило udev

 nano /etc/udev/rules.d/e173.rules
 KERNEL=="ttyUSB[012]", OWNER="asterisk", GROUP="asterisk", MODE="0660"
 # /sbin/start_udev  
 # ls =la /dev | grep ttyUSB

crw-rw--   1 asterisk asterisk   4,  64 Сен 23 15:25 ttyUSB0
crw-rw--   1 asterisk asterisk   4,  65 Сен 23 15:25 ttyUSB1
crw-rw--   1 asterisk asterisk   4,  66 Сен 23 15:25 ttyUSB2

Настройка модулей

Канальный модуль Huawei настраивается в datacard.conf.

[datacard0]
audio=/dev/ttyUSB1   ; tty for audio connection
data=/dev/ttyUSB2   ; tty for AT commands

context=datacard-incoming       ; context for incoming calls
group=1                         ; calling group

rxgain=3                        ; increase the incoming volume
txgain=3                        ; increase the outgoint volume



[datacard1]
context=datacard-incoming	; context for incoming calls
audio=/dev/ttyUSB4		; tty port for audio connection
data=/dev/ttyUSB5		; tty port for AT commands
group=2				; calling group
rxgain=3			; increase the incoming volume
txgain=3			; increase the outgoint volume
autodeletesms=yes		; auto delete incoming sms
resetdatacard=yes		; reset datacard during initialization
u2diag=0			; set U2DIAG parameter (0 = disable everything except modem function)
usecallingpres=yes		; use the caller ID presentation or not
callingpres=allowed_passed_screen ; set caller ID presentation

Проверим состояние модема из командной строки Asterisk (CLI).
Перегрузить asterisk можно командой core restart now,
а если система рабочая и идут вызовы, то core restart gracefully.
Запущенные модули каналов просмотрим командой module show like chan_

asterisk*CLI> datacard show devices
ID           Group State      RSSI Mode Submode Provider Name  Model      Firmware          IMEI             IMSI       Number        
datacard1    2     Free       13   3    3       MTS RUS        E1550      11.608.12.00.143  352......        25....... Unknown       
datacard0    1     Free       15   3    3       TELE2          E1550      11.608.14.15.311  359......        25....... Unknown 

Для входящих вызовов, sms и ussd запросов настроим extensions.conf:

[datacard-incoming]
exten => sms,1,Verbose(Incoming SMS from ${CALLERID(num)} ${SMS})
exten => sms,n,System(echo '${STRFTIME(${EPOCH},,%Y-%m-%d %H:%M:%S)} - ${DATACARD} - ${CALLERID(num)}: ${SMS}' >> /var/log/asterisk/sms.txt)
exten => sms,n,Hangup()

exten => ussd,1,Verbose(Incoming USSD: ${USSD})
exten => ussd,n,System(echo '${STRFTIME(${EPOCH},,%Y-%m-%d %H:%M:%S)} - ${DATACARD}: ${USSD}' >> /var/log/asterisk/ussd.txt)
exten => ussd,n,Hangup()

exten => s,1,Dial(SIP/100,,)
exten => s,n,Hangup()

Для исходящей связи

exten => _X.,1,Dial(Datacard/g1/${EXTEN})
или
exten => _X.,1,Dial(Datacard/datacard0/${EXTEN})

Отключение функций CD-ROM и card reader

Отключим ненужные функции.

# minicom -s

            +-----[configuration]------+
            | Filenames and paths      |
            | File transfer protocols  |
            | Serial port setup        |
            | Modem and dialing        |
            | Screen and keyboard      |
            | Save setup as dfl        |
            | Save setup as..          |
            | Exit                     |
            | Exit from Minicom        |
            +--------------------------+
Выбираем Serial port setup и жмем ENTER. Жмем 'А' Редактируем порт:
    +-----------------------------------------------------------------------+
    | A -    Serial Device      : /dev/ttyUSB0                              |
    | B - Lockfile Location     : /var/lock                                 |
    | C -   Callin Program      :                                           |
    | D -  Callout Program      :                                           |
    | E -    Bps/Par/Bits       : 115200 8N1                                |
    | F - Hardware Flow Control : Yes                                       |
    | G - Software Flow Control : No                                        |
    |                                                                       |
    |    Change which setting?                                              |
    +-----------------------------------------------------------------------+
            | Screen and keyboard      |
            | Save setup as dfl        |
            | Save setup as..          |
            | Exit                     |
            | Exit from Minicom        |
            +--------------------------
Жмем ENTER 2 раза и выбираем Exit.

После подключения вводим команду:AT^U2DIAG=0

Welcome to minicom 2.4

OPTIONS: I18n                                                                
Compiled on Jan 25 2010, 06:49:09.                                           
Port /dev/ttyUSB0                                                            
                                                                             
Press CTRL-A Z for help on special keys                                      
                                                                             
AT S7=45 S0=0 L1 V1 X4 &c1 E1 Q0                                             
OK
AT^U2DIAG=0
OK                                                                           
Выходим Ctrl-A Q

AT^U2DIAG=0 (девайс в режиме только модем)
AT^U2DIAG=1 (девайс в режиме модем + CD-ROM)
AT^U2DIAG=255 (девайс в режиме модем + CD-ROM + Card Reader)
AT^U2DIAG=256 (девайс в режиме модем + Card Reader)
AT^CARDLOCK=«NCK-code» (разблокировка модема)
Ещё команды:

Команды AT, USB модемов HUAWEI

How To

FreeSWITCH: mod_shout error

$
0
0

FreeSWITCH: mod_shout error

При компиляции с модулем mod_shout, возникает ошибка:

make[4]: Entering directory /usr/src/freeswitch/src/mod/formats/mod_shout'
Makefile:803: *** You must install libmpg123-dev to build mod_shout. Stop.
make[4]: Leaving directory/usr/src/freeswitch/src/mod/formats/mod_shout'
make[3]: *** [mod_shout-all] Error 1
make[3]: Leaving directory /usr/src/freeswitch/src/mod'
make[2]: *** [all-recursive] Error 1
make[2]: Leaving directory/usr/src/freeswitch/src'
make[1]: *** [all-recursive] Error 1
make[1]: Leaving directory `/usr/src/freeswitch'
make: *** [all] Error 2

несмотря на то, что libmpg123-develустановлен.

Укажите путь к директории pkgconfig

export PKG_CONFIG_PATH=/usr/local/lib/pkgconfig:/usr/lib64/pkgconfig

./configure

making all mod_shout

Asterisk:Лог очереди (queue) в mysql

$
0
0

Asterisk:Лог очереди (queue) в mysql

создайте таблицу в БД asterisk.

CREATE TABLE IF NOT EXISTS `queue_log` (
`time` varchar(32) DEFAULT NULL,
`callid` char(64) DEFAULT NULL,
`queuename` char(64) DEFAULT NULL,
`agent` char(64) DEFAULT NULL,
`event` char(32) DEFAULT NULL,
`data` char(64) DEFAULT NULL,
`data1` char(64) DEFAULT NULL,
`data2` char(64) DEFAULT NULL,
`data3` char(64) DEFAULT NULL,
`data4` char(64) DEFAULT NULL,
`data5` char(64) DEFAULT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
в файле /etc/asterisk/logger.conf выключите лог в файл:
 queue_log_to_file = no

в файле /etc/asterisk/asterisk.conf

 [options]
 queue_adaptive_realtime = yes

в файле /etc/asterisk/extconfig.conf

 queue_log => odbc,asterisk,queue_log

где asterisk ваше db конфиг в /etc/asterisk/res_odbc.conf

[asterisk]
enabled => yes
dsn => asterisk
username => dbuser
password => dbpass
pre-connect => yes

Настройка Asterisk

$
0
0

Настройка Asterisk

Документация по настройке Asterisk на русском языке.
Диалплан, SIPи DAHDIканалы, очереди, конференции, CDRи др.

Asterisk Настройка - Диалплан, Контексты, Екстеншены

Для понимания Asterisk очень важен - план набора (диалплан). Диалплан направляет каждый звонок от его источника, с помощью различных приложений, в пункт назначения. Все вызовы, будь-то голосовая почта, конференция, меню автосекретаря или вызов телефона, определяются логикой и концепцией диалплана. Русская документация мануал по dialplan Asterisk

* Asterisk Dialplan - extensions.conf

* Использование переменных в плане набора Asterisk

Команды или по другому приложения (applications) диалплана Asterisk

Функции диалплана Астериск

Asterisk Dialplan functions

Функции Asterisk используются в диалплане. Это не командыдиалпланаи не могут быть использованы прямо. Функции возвращают значение для дальнейшего использования в логике диалплана.

NAT

Конфигурационные файлы Asterisk

Большинство настроек Asterisk контролируются с помощью конфигурационных файлов, расположеных в директории /etc/asterisk. Синтаксис конфигурационных файлов был разработан для упрощенного взаимодействия с ПО (например FreePBX) или же редактирования вручную.

Каналы SIP, IAX2, DAHDI и H.323 и др.

Каналы в asterisk - это внешние или внутренние соединения, по которым производиться доставка вызовов в АТС Asterisk. Каналом может быть соединение с обычным телефонным аппаратом или с обычной телефонной линией, или он может быть виртуальным (логическим) каналом для совершения вызовов (как, например, совершение телефонных вызовов через Интернет). Сервер Asterisk не делает различий между классами каналов «FXO» и «FXS» (это значит, что он не делает различий между телефонными линиями и телефонными аппаратами). Каждый совершаемый или принимаемый вызов производиться через какой-либо определенный канал.

Шифрование в Asterisk

Очереди и Агенты Asterisk

В Asterisk поддерживается несколько очередей вызовов. Их определения находятся в файле Настройка очереди в Asterisk - queues.conf, имена очередей вызовов используются в качестве аргумента команды Queue в файле конфигурации плана набора extensions.conf. Агенты, которые обрабатывают вызовы, поступающие в очередь, описываются в файле /etc/asterisk/agents.conf.

Конференции

Asterisk позволяет организовать телеконференции с неограниченным числом пользователей.

Коды Asterisk - Абонентские функции и их свойства - feartures.conf

В файле features.conf назначаются пользовательские коды абонентских функций Asterisk и опции абонентских функций, такие как:
Переадресация вызова(transfer), перехват вызова (pickup), запись по требованию (record on demand), таймауты между набора и переадресации (digit timeout), паркинг (park) и др.

CDR

Детализированный отчет о звонках (CDR) backend для сохранения данных о входящих, исходящих и внутренних вызовах Asterisk. Полное описание на русском языке CDR, MySQL, ODBC etc.

logger

CLI - интерфейс командной строки Asterisk.

Командная строка является мощным инструментом для мониторинга и управления работой Asterisk PBX

Asterisk AMI

Asterisk manager Interface - интерфейс управления.

Asterisk ARI

FreePBX Call Recordings + Asternic CDR Stats 1.5.1

$
0
0

FreePBX Call Recordings + Asternic CDR Stats 1.5.1

Данная модификация включает отображение записей разговоров FreePBX
в модуле Asterisk CDR Stats Скачать asternic_cdr-1.5.1.tgz исправленный Скачать asternic_cdr-1.5.1.tgz исправленный

код модификации

Замените файл:

/var/www/html/admin/modules/asternic_cdr/functions.inc.phpмодуля Asternic.

на файл именем с модифицированным кодом:

[root@localhost asternic_cdr]# ls -la | grep fu
-rw-r--r--  1 asterisk asterisk 16431 Feb 13 16:17 functions.inc.php
-rw-r--r--  1 asterisk asterisk 16163 Feb 13 16:16 functions.inc.php.bk

<?php

if(isset($_SERVER['PATH_INFO'])) {
    define("SELF",  substr($_SERVER['PHP_SELF'], 0, (strlen($_SERVER['PHP_SELF']) - @strlen($_SERVER['PATH_INFO']))));
} else {
    define("SELF",  $_SERVER['PHP_SELF']);
}

function asternic_cdr_get_config($engine) {
    // Executed on APPLY in FreePBX, we regenerate the fop2buttons if needed
    global $amp_conf, $db, $active_modules;


}

function asternic_cdr_query() {

    global $active_modules, $amp_conf, $db;

    $sql = "SELECT exten,privacy,label,`group`,email,channel,queuechannel,originatechannel,customastdb,spyoptions,external FROM fop2buttons";
    $results = $db->getAll($sql, DB_FETCHMODE_ASSOC);
    if(DB::IsError($results)) {
        die($results->getMessage());
    }
    foreach ($results as $result) {
        $fopprivacy[$result['exten']]   = $result['privacy'];
        $foplabel[$result['exten']]     = $result['label'];
        $fopgroup[$result['exten']]     = $result['group'];
        $fopemail[$result['exten']]     = $result['email'];
        $fopchannel[$result['exten']]   = $result['channel'];
        $fopqchannel[$result['exten']]  = $result['queuechannel'];
        $fopochannel[$result['exten']]  = $result['originatechannel'];
        $fopcustastdb[$result['exten']] = $result['customastdb'];
        $fopspyoption[$result['exten']] = $result['spyoptions'];
        $fopexternal[$result['exten']]  = $result['external'];
    }

}

function return_timestamp($date_string)
{
  list ($year,$month,$day,$hour,$min,$sec) = preg_split("/-|:| /",$date_string,6);
  $u_timestamp = mktime($hour,$min,$sec,$month,$day,$year);
  return $u_timestamp;
}

function swf_bar($values,$width,$height,$divid,$stack)
{
    global $config;

    if ($stack==1) {
        $chart = "images/barstack.swf";
    } else {
        $chart = "images/bar.swf";
    }
    $return = "<div id='$divid'>\n";
    $return.= "</div>\n";
    $values = html_entity_decode($values);
    $return.= "<script type='text/javascript'>\n";
    $return.='$(document).ready(function() {'."\n";

    $variables = split("&",$values);
    if(isset($config['no_animation'][''])) {
        $variables[] = "noanimate=1";
    }

    $return .= "var flashvars = {\n";
    $param = Array();
    foreach($variables as $deauna) {
        $pedazos = split("=",$deauna);
        $param[]="'$pedazos[0]': '$pedazos[1]'";
    }
    $texti = implode(",\n",$param);
    $return.=$texti;
    $return.=" };\n";

    $return.= "swfobject.embedSWF('$chart', '$divid', '$width', '$height', '9.0.0', '#336699', flashvars, {wmode:'transparent'});\n";
    $return.= "});</script>\n";
    echo $return;
}

function print_exports($header_pdf,$data_pdf,$width_pdf,$title_pdf,$cover_pdf) {
        global $lang;
        global $language;
        $head_serial = serialize($header_pdf);
        $data_serial = serialize($data_pdf);
        $width_serial = serialize($width_pdf);
        $title_serial = serialize($title_pdf);
        $cover_serial = serialize($cover_pdf);
        $head_serial = rawurlencode($head_serial);
        $data_serial = rawurlencode($data_serial);
        $width_serial = rawurlencode($width_serial);
        $title_serial = rawurlencode($title_serial);
        $cover_serial = rawurlencode($cover_serial);

        $complete_self = $_SERVER['REQUEST_URI'];
                //echo "<br/><form method=post action='modules/asternic_cdr/export.php'>\n";
        echo "<br/><form method='post' action='$complete_self'>\n";
        foreach($_REQUEST as $kkey=>$vval) {
                echo "<input type='hidden' name='$kkey' value='".$vval."' />\n";
        }
                echo "<input type='hidden' name='action' value='export' />\n";
                echo "<input type='hidden' name='head' value='".$head_serial."' />\n";
                echo "<input type='hidden' name='rawdata' value='".$data_serial."' />\n";
                echo "<input type='hidden' name='width' value='".$width_serial."' />\n";
                echo "<input type='hidden' name='title' value='".$title_serial."' />\n";
                echo "<input type='hidden' name='cover' value='".$cover_serial."' />\n";
                echo "<a href='javascript:void()' class='info'><input type=image name='pdf' src='images/asternic_pdf.gif' style='border:0;'><span>";
                echo _('Export to PDF');
                echo "</span></a>\n";
                echo "<a href='javascript:void()' class='info'><input type=image name='csv' src='images/asternic_excel.gif' style='border:0;'><span>";
                echo _('Export to CSV/Excel');
                echo "</span></a>\n";
                echo "</form>";
}

function seconds2minutes($segundos) {
    $horas    = intval($segundos / 3600);
    $minutos  = intval($segundos % 3600 ) / 60;
    $segundos = $segundos % 60;
    $ret = sprintf("%02d:%02d:%02d",$horas,$minutos,$segundos);

//    return "$minutos:$segundos";
    return $ret;
}

function remove_quotes($argument) {
    return substr($argument,1,-1);
}

function asternic_download($file) {
    include("download.php");
}

function asternic_getrecords( $MYVARS ) {
    global $active_modules, $amp_conf, $db;

    $channel = $MYVARS['channel'];
    $start   = $MYVARS['start'];
    $end     = $MYVARS['end'];
    $gtype    = $MYVARS['direction'];
    $condicionextra="";

    if($gtype=='outgoing') {
        $chanfield = "channel";
        $otherchanfield = "dstchannel";
    } else {
        $chanfield = "dstchannel";
        $otherchanfield = "channel";
    }

$query = "SELECT substring($chanfield,1,locate(\"-\",$chanfield,length($chanfield)-8)-1) AS chan1,";
//$query = "SELECT IF($chanfield like 'Local/%',CONCAT('SIP',RIGHT(substring(replace($chanfield,'-','/'),1,instr($chanfield,'@')-1),instr(reverse(substring(replace($chanfield,'-','/'),1,instr($chanfield,'@')-1)),'/'))),substring($chanfield,1,locate(\"-\",$chanfield,length($chanfield)-8)-1)) as chan1, ";
//$query.= "billsec,duration,duration-billsec as ringtime,src,";
//изменение
$query.= "billsec,duration,duration-billsec as ringtime,src,recordingfile,";
$query.="IF(dst='s',dcontext,dst) as dst,calldate,disposition,accountcode,userfield,uniqueid FROM asteriskcdrdb.cdr ";
$query.= "WHERE calldate >= '$start' AND calldate <= '$end' AND (duration-billsec) >=0 $condicionextra ";
$query.= "HAVING chan1 IN ('$channel') ORDER BY calldate";


$me=true;

$res = $db->query($query);

if(DB::IsError($res)) {
    die($res->getMessage());
}

$ftype = $_REQUEST['type'];
$fdisplay = $_REQUEST['display'];
$ftab = $gtype;

$cont=0;
while ($res->fetchInto($row, DB_FETCHMODE_ASSOC)) {

      if (!(substr($row['accountcode'],0,5)=='Local' && $dispo[$row['disposition']]=='BUSY' && $row[9]=='ResetCDR')) {
         $cont++;
         $disposition = $row['disposition'];

         if(!isset($detail[$row['chan1']])) {
             $detail[$row['chan1']]="";
         }

         $me = ! $me;
         if($me==true) {
             $odclass="class='odd'";
         } else {
             $odclass="";
         }
         $bill_print = seconds2minutes($row['billsec']);

         $detail[$row['chan1']].= "<tr $odclass>\n<td>$cont</td>\n";
         $detail[$row['chan1']].= "<td style='text-align: center;' >".$row['calldate']."</td>\n";
         $detail[$row['chan1']].= "<td>".$row['src']."</td><td>".$row['dst']."</td>\n";
         $detail[$row['chan1']].= "<td align=right>".$bill_print."</td>\n";
         $detail[$row['chan1']].="<td align=right>".$row['ringtime']." "._('secs')."</td>\n";
         $detail[$row['chan1']].= "<td style='text-align: center;'>";

         if($row['disposition']=="NO ANSWER" || $row['disposition']=="FAILED") {
            $detail[$row['chan1']].="<span style='color: red;'>";
         } elseif($row['disposition']=="BUSY") {
            $detail[$row['chan1']].="<span style='color: orange;'>";
         } else {
            $detail[$row['chan1']].="<span style='color: green;'>";
         }

          $detail[$row['chan1']].= $row['disposition'];
          $detail[$row['chan1']].= "</span></td>";
//изменение
if ($row['recordingfile']) {
            $rec_parts = explode('-',$row['recordingfile']);
            $fyear = substr($rec_parts[3],0,4);
            $fmonth = substr($rec_parts[3],4,2);
            $fday = substr($rec_parts[3],6,2);
            $monitor_base = $amp_conf['MIXMON_DIR'] ? $amp_conf['MIXMON_DIR'] : $amp_conf['ASTSPOOLDIR'] . '/monitor';
            $recordingfile = "$monitor_base/$fyear/$fmonth/$fday/" . $row['recordingfile'];
            if (!file_exists($recordingfile)) {
                $recordingfile = '';
                $detail[$row['chan1']].= "\n<td>";
            }
            else {
            $detail[$row['chan1']].= "\n<td style='text-align: center;' title=\"$row[recordingfile]\"><a href=\"".$PHP_SELF."?getRec=".base64_encode($recordingfile)."\" target=\"_blank\"><img src=\"images/asternic_playicon.png\" alt=\"Call recording\" /></a>";
            }
        } else {
            $recordingfile = '';
            $detail[$row['chan1']].= "\n<td>";
        }
          $detail[$row['chan1']].= "</td>\n";


//изменение
//          $detail[$row['chan1']].= "\n<td>";
//
//          $uni = $row['uniqueid'];
//          $uni = str_replace(".","",$uni);
//
//             if($row['userfield']<>"") {
//              $detail[$row['chan1']].="<a href=\"javascript:void(0);\" onclick='javascript:playVmail(\"".$row['userfield']."\",\"play".$uni."\");'>";
//              $detail[$row['chan1']].="<div class='playicon' title='Play' id='play".$uni."'  style='float:left;'>";
//              $detail[$row['chan1']].="<img src='images/blank.gif' alt='pixel' height='16' width='16' border='0'>";
//              $detail[$row['chan1']].="</div></a>";
//              $detail[$row['chan1']].="<a href=\"javascript:void(0); return false;\" onclick='javascript:downloadVmail(\"".$row['userfield']."\",\"play".$uni."\",\"$ftype\",\"$fdisplay\",\"$ftab\"); return false;'>";
//              $detail[$row['chan1']].="<div class='downicon' title='Download' id='dload".$uni."'  style='float:left;'>";
//              $detail[$row['chan1']].="<img src='images/blank.gif' alt='pixel' height='16' width='16' border='0'>";
//              $detail[$row['chan1']].="</div></a>";
//          } else {
//              $detail[$row['chan1']].= "&nbsp;";
//          }
//          $detail[$row['chan1']].= "</td>\n";
          $detail[$row['chan1']].= "\n</tr>\n";
      }

}

echo "<table width='99%' cellpadding=3 cellspacing=3 border=0 id='table${channel}' class='sortable'>\n";
echo "<thead><tr><td bgcolor='#ddcc00'>#</td>";
echo "<td bgcolor='#ddcc00' align='center'>"._('Date')."</td>\n";
echo "<td bgcolor='#ddcc00'>"._('From')."</td>\n";
echo "<td bgcolor='#ddcc00'>"._('To')."</td>\n";
echo "<td bgcolor='#ddcc00' align='right'>"._('Billable Time')."</td>\n";
echo "<td bgcolor='#ddcc00' align='right'>"._('Ring Time')."</td>\n";
echo "<td bgcolor='#ddcc00' align='center'>"._('Disposition')."</td>\n";
echo "<td bgcolor='#ddcc00' align='center'>"._('Listen')."</td></tr></thead>\n";
echo "<tbody>".$detail[$channel]."</tbody>\n";
echo "</table>\n";


$complete_self = $_SERVER['REQUEST_URI'];
echo "<form id='downloadform' method='get' action='$complete_self'><input type=hidden name='file' id='downloadfile' value=''><input type=hidden name='action' value='download'><input type='hidden' name='type' id='dtype' value=''><input type='hidden' id='idisplay' name='display' value=''> <input type='hidden' id='itab' name='tab' value=''></form>";

}


define('FPDF_FONTPATH',dirname(__FILE__).'/lib/font/');
include_once(dirname(__FILE__) . "/lib/fpdf.php");

class PDF extends FPDF
{

function Footer()
{
    global $lang;
    global $language;
    //Go to 1.5 cm from bottom
    $this->SetY(-15);
    //Select Arial italic 8
    $this->SetFont('Arial','I',8);
    //Print centered page number
    $this->Cell(0,10,$lang["$language"]['page'].' '.$this->PageNo(),0,0,'C');
}

function Cover($cover)
{
    $this->SetFont('Arial','',15);
    $this->MultiCell(150,9,$cover);
    $this->Ln();
}

function Header()
{
    global $title;
    //Select Arial bold 15
    $this->SetFont('Arial','B',15);
    //Move to the right
    $this->Cell(85);
    //Framed title
    $this->Cell(30,10,$title,0,0,'C');
    //Line break
    $this->Ln(10);
}

function TableHeader($header,$w)
{
    $this->SetFillColor(255,0,0);
    $this->SetTextColor(255);
    $this->SetDrawColor(128,0,0);
    $this->SetLineWidth(.3);
    $this->SetFont('','B',11);

    for($i=0;$i<count($header);$i++)
        $this->Cell($w[$i],10,$header[$i],1,0,'C',1);
    $this->Ln();
}

//Colored table
function FancyTable($header,$data,$w)
{

    $this->TableHeader($header,$w);

    //Color and font restoration
    $this->SetFillColor(224,235,255);
    $this->SetTextColor(0);
    $this->SetFont('');
    //Data
    $fill=0;
    $supercont=1;
    foreach($data as $row)
    {
        $contador=0;
        foreach($row as $valor) {
            $this->Cell($w[$contador],6,$valor,'LR',0,'C',$fill);
            $contador++;
        }
        $this->Ln();
        $fill=!$fill;
        if($supercont%40 == 0) {
            $this->Cell(array_sum($w),0,'','T');
            $this->AddPage();
            $this->TableHeader($header,$w);
            $this->SetFillColor(224,235,255);
            $this->SetTextColor(0);
            $this->SetFont('');
        }
        $supercont++;
    }
    $this->Cell(array_sum($w),0,'','T');
}
}

function asternic_export_csv($header,$data) {
    header("Content-Type: application/csv-tab-delimited-table");
    header("Content-disposition: filename=table.csv");

    $linea="";
    foreach($header as $valor) {
        $linea.="\"$valor\",";
    }
    $linea=substr($linea,0,-1);

    print $linea."\r\n";

    foreach($data as $valor) {
        $linea="";
        foreach($valor as $subvalor) {
            $linea.="\"$subvalor\",";
        }
        $linea=substr($linea,0,-1);
        print $linea."\r\n";
    }
}

function asternic_export($REQ) {

    $header = unserialize(rawurldecode($REQ['head']));
    $data   = unserialize(rawurldecode($REQ['rawdata']));
    $width  = unserialize(rawurldecode($REQ['width']));
    $title  = unserialize(rawurldecode($REQ['title']));
    $cover  = unserialize(rawurldecode($REQ['cover']));

    if(isset($_REQUEST['pdf']) || isset($REQ['pdf_x'])) {
        $pdf=new PDF();
        $pdf->SetFont('Arial','',12);
        $pdf->SetAutoPageBreak(true);
        $pdf->SetLeftMargin(1);
        $pdf->SetRightMargin(1);
        $pdf->AddPage();
        if($cover<>"") {
            $pdf->Cover($cover);
        }
        $pdf->AddPage();
        $pdf->FancyTable($header,$data,$width);
        $pdf->Output("export.pdf","D");
    } else {
        asternic_export_csv($header,$data);
    }
}

//изменение
function recordfile_uri($path) {
    $size = filesize($path);
    $name = basename($path);
    $extension = strtolower(substr(strrchr($name,"."),1));
    // This will set the Content-Type to the appropriate setting for the file
    $ctype ='';
    switch( $extension ) {
        case "WAV":
            $ctype="audio/x-wav";
            break;
        case "wav":
            $ctype="audio/x-wav";
            break;
        case "ulaw":
            $ctype="audio/basic";
            break;
        case "alaw":
            $ctype="audio/x-alaw-basic";
            break;
        case "sln":
            $ctype="audio/x-wav";
            break;
        case "gsm":
            $ctype="audio/x-gsm";
            break;
        case "g729":
            $ctype="audio/x-g729";
            break;
        default: //not downloadable
            // echo ("<b>404 File not found! foo</b>");
            // TODO: what to do if none of the above work?
        break ;
    }

  $fp=fopen($path, "rb");
  if ($size && $ctype && $fp) {
    header("Pragma: public");
    header("Expires: 0");
    header("Cache-Control: must-revalidate, post-check=0, pre-check=0");
    header("Cache-Control: public");
    header("Content-Description: audio file");
    header("Content-Type: " . $ctype);
    header("Content-Disposition: attachment; filename=" . $name);
    header("Content-Transfer-Encoding: binary");
    header("Content-length: " . $size);
    $chunksize = 1*(1024*1024);
    while (!feof($fp)) {
        $buffer = fread($fp, $chunksize);
        echo $buffer;
        ob_flush();
        flush();
    }
    fclose($fp);
  }
}
if(isset($_GET['getRec'])){
    recordfile_uri(base64_decode($_GET['getRec']));
    die();
}

?>

Источник, с подробными разъяснениями

FreePBX

Viewing all 1041 articles
Browse latest View live


<script src="https://jsc.adskeeper.com/r/s/rssing.com.1596347.js" async> </script>