The OpenNET Project / Index page

[ новости /+++ | форум | теги | ]

форумы  помощь  поиск  регистрация  майллист  вход/выход  слежка  RSS
"CallBack не могу разобраться!"
Вариант для распечатки  
Пред. тема | След. тема 
Форум Маршрутизаторы CISCO и др. оборудование. (Cisco маршрутизаторы)
Изначальное сообщение [ Отслеживать ]

"CallBack не могу разобраться!"  +/
Сообщение от Aidar2010 email(ok) on 25-Ноя-10, 07:33 
Алгоритм такой: абонент А звонит на Циску. Циска кладёт трубку, перезванивает абоненту А и просит ввести номер абонента Б. Абонент А вводит номер и Циска звонит абоненту Б.
не удается перезвонить.. что посоветуете?
вот сам код:

proc do_welcome {} {
    global state
    global prefix
    global account
    global uname
    global pin
    global btelnum
    global telnum
    #global returncode
    #global param1

    set ev [playPrompt param1 info [set prefix]_1.au]
    set ev [authorize [ani] "" "TELNUM" [ani] info]
    set returncode [getVariable radius returnCode]

    set telnum [ani]


    if { $ev == "authorized" } {
       set ev [playPrompt param1 info [set prefix]_1.au]
         set account [ani]
         set uname [ani]
         set pin [ani]
         set btelnum 1
         call close
         set state timerr
         return 0    

   }

    if {$ev == "authorization failed"} {
        set ev [playPrompt param1 info [set prefix]_2.au]
        set state end
        set btelnum 0
        call close
        
        return 0
    }
}

proc do_timerr {} {
global prefix
utimer 10 do_CallBack
return 0
}


proc do_CallBack {} {
    global state
    global telnum
   global new_guid
    global guid
    global ani
set callInfo(guid)         $new_guid
    set callInfo(incomingGuid) $guid
    set callInfo(telnum)   $ani
leg setup $ani callInfo
    


    if {$ev == "active"} {
        set state get_dust

        return 0

}
     else {
        set state end
        }


return 0
}


proc do_get_dest {} {
    global state
    global destination
    global fcnt
    global retryCnt
    global promptFlag2
    global prefix
    global pound
    global destBusy
    global param3
    global prompt
    global newlist
    global numbers
    global len
    global amt
    global gender
    global help
    global amt


    set amt [getVariable radius creditAmount]
#   set amt [getVariable aaa h323-credit-amount creditAmount]

    set prompt ""

    if {$help == 0} {
       lappend prompt "[set prefix]_enter_to_help.au"
       lappend prompt "[set prefix]_or.au"
       set help 1
    }


    lappend prompt "[set prefix]_enter_dest.au"

    if {$fcnt == 0} {
        if {$amt > 999999.99} {
            if {$destBusy == 0} {
            set ev [eval [list playPrompt param3 info ] $prompt]

            } else {
                set destBusy 0
                set ev [playPrompt param3 info [set prefix]_dest_busy.au]
            }
        } elseif {$pound == 1} {
            set pound 0
            set ev [playPrompt param3 info [set prefix]_disconnect.au]
            if {$destBusy == 0} {
            set ev [eval [list playPrompt param3 info ] $prompt]

            } else {
                set destBusy 0
                set ev [playPrompt param3 info [set prefix]_dest_busy.au]
              }
        } elseif {$destBusy == 1} {
             set destBusy 0
             set ev [playPrompt param3 info [set prefix]_dest_busy.au]
        } else {
            if {$destBusy == 0} {
           set ev [eval [list playPrompt param3 info ] $prompt]

            } else {
                set destBusy 0
                set ev [playPrompt param3 info [set prefix]_dest_busy.au]
            }
        }
    } else {
        if {$promptFlag2 == 1} {
            set ev [playPrompt param3 info [set prefix]_reenter_dest.au]
        }
        if {$promptFlag2 == 2} {
            set ev [playPrompt param3 info [set prefix]_author_fail.au]
        }
        if {$promptFlag2 == 3} {
            set ev [playPrompt param3 info [set prefix]_no_dest_entered.au]
        }

    }

    if {$ev == "collect success"} {
        set destination $info(digits)
        set state second_authorize
        return 0
    }

    if {$ev == "collect aborted"} {
        set state get_dest
        return 0
    }

    if {$ev == "collect fail"} {
        incr fcnt
        set promptFlag2 1
        if {$fcnt < $retryCnt} {
            set state get_dest
        } else {
            set state collect_fail
        }
        return 0
    }

   if {$ev == "collect timeout"} {
        incr fcnt
        set promptFlag2 3
        if {$fcnt < $retryCnt} {
            set state get_dest
        } else {
            set state collect_fail
        }
        return 0
   }

    set state end
    return 0
}

proc do_second_authorize {} {
    global state
    global destination
    global account
    global pin
    global creditTime
    global warnTime
    global promptFlag2
    global fcnt
    global retryCnt
    global prefix
    global noPlay
    global param2
    global noTimeLimit
    global len
    global prompt
    global newlist
    global second_auth
    global amt
    global uname

    set seperate [split $destination ""]

    set seperatu [split $account ""]

#    if {([lindex $seperatu 0] == 5)} {
#        set utime "unlimet"
#    } else {
        set utime "nounlimet"
#    }

    if {([lindex $seperate 0] == 4) && ([lindex $seperate 1] == 9) && ([lindex $seperate 2] == 0)} {
    
     set seperate [lreplace $seperate 0 2 49]
     set destination [join $seperate ""]

    }
    if {([lindex $seperate 0] == 8) && ([lindex $seperate 1] == 1) && ([lindex $seperate 2] == 0)} {
     set seperate [lreplace $seperate 0 2]
     set destination [join $seperate ""]
    }
    if {([lindex $seperate 0] == 1) && ([lindex $seperate 1] == 0)} {
     set seperate [lreplace $seperate 0 1]
     set destination [join $seperate ""]
    }

    if {([lindex $seperate 0] == 8) && ([lindex $seperate 1] != 1)&& ([lindex $seperate 1] != 6)&& ([lindex $seperate 1] != 2)} {
     set seperate [lreplace $seperate 0 0 7]
     set destination [join $seperate ""]
    }

    if {([lindex $seperate 0] == 0) && ([lindex $seperate 1] == 0)} {
         #Вход в меню
         set state get_menu        
         set promptFlag2 0
         return 0
    }

#  Проверка на длину набранного номера
    set ev [authorize $account $pin "DESTIN" $destination info]
    if { $ev != "authorized" } {
         set ev [playPrompt param2 info [set prefix]_invalid_digits.au]
         set state get_dest
         return 0
    }


    set ev [authorize $account $pin $destination [ani] info]
    set returncode [getVariable radius returnCode]

    if {$returncode == 13} {
#allow user to make toll-free calls
        set noTimeLimit 1
        set state do_place_call
        return 0
    }

    if {$returncode == 52} {
# Redirect to customer service using redirect number
        set noTimeLimit 1
        set state do_place_call
        return 0
    }

    if {$ev == "authorized"} {
        set creditTime [getVariable radius creditTime]
        if {$utime == "unlimet"} {
           if {$creditTime == "uninitialized"} {
              set ev [ playPrompt param2 info [set prefix]_no_aaa.au]
              set state end
           } elseif {$creditTime == "umlimited"} {
                set noTimeLimit 1
           } elseif {[expr $creditTime - $warnTime] < 20} {
                set noPlay 1
           #     do_creditTime_prompt
           }
        } else {
           if {$creditTime == "uninitialized"} {
              set ev [ playPrompt param2 info [set prefix]_no_aaa.au]
              set state end
           } elseif {$creditTime == "umlimited"} {
                set noTimeLimit 1
           } elseif {[expr $creditTime - $warnTime] < 20} {
                set noPlay 1
                do_creditTime_prompt

           } else {
                do_creditTime_prompt
           }
        }
        set state do_place_call
        return 0
    }

    if {$ev == "authorization failed"} {
        incr fcnt
        set promptFlag2 2

#play prompt base on return code

        if {$returncode == 3} {
            set ev [playPrompt param2 info [set prefix]_account_blocked.au]
            set state end
        }

        if {$returncode == 4} {
            set ev [playPrompt param2 info [set prefix]_zero_bal.au]
            set noTimeLimit 1
            set state do_place_call
        }

        if {$returncode == 5} {
            set ev [playPrompt param2 info [set prefix]_card_expired.au]
            set state end
        }

        if {$returncode == 9} {
            set ev [playPrompt param2 info [set prefix]_dest_blocked.au]
            set state end
        }

        if {$returncode == 7} {
            set ev [playPrompt param2 info [set prefix]_blocked.au]
            set state end
        }

        if {$returncode == 12} {
            set ev [playPrompt param2 info [set prefix]_not_enuf.au]
            set state end
        }

        if {$returncode == "Uknown variable name"} {
            set ev [playPrompt param2 info [set prefix]_no_aaa.au]
            set state end
        }

        if { $fcnt < $retryCnt } {
            set state get_dest
        } else {
            set state second_authorize_fail
        }
        return 0
    }
    set state end
    return 0
}


#proc connectboth { } {
#
#    global incoming
#    global outgoing
#    global state
#    connection create $incoming $outgoing
#    set state do_place_call
#    return 0
#    }


proc do_place_call {} {
    global state
    global destination
    global account
    global prefix
    global param2
    global param4

    #set number $info(digits)
#    puts ">>>>>>>>>>SCRIPT SPRO 3.5<<<<<<<<<<<<< Destination -----> $destination"
    set callInfo(accountNum) $account
    set ev [placeCall $destination callInfo info]

    if {$ev == "active"} {
        set state active

        return 0
    }

    if {$ev == "call fail"} {    
        set state place_fail
    if {($info(code) == 28)} {
              set ev [playPrompt param3 info [set prefix]_no_telnumber.au]
          return 0    
    }
    if {($info(code) == 3)} {
              set ev [playPrompt param3 info [set prefix]_tel_not_available.au]
          return 0    
    }
    if {($info(code) == 18) ||($info(code) == 19)} {
              set ev [playPrompt param3 info [set prefix]_no_answer.au]
          return 0
    }
    if {($info(code) == 21) ||($info(code) == 34) ||($info(code) == 52) } {
              set ev [playPrompt param3 info [set prefix]_overload.au]
             return 0    
    }
    if {($info(code) == 17) } {
              set ev [playPrompt param3 info [set prefix]_dest_busy.au]
              return 0
    }
#    if {($info(code) != 17) && ($info(code) != 28) && ($info(code) != 18) && ($info(code) != 19)  && ($info(code) != 21)  && ($info(code) != 34) && ($info(code) != 52) } {
        set ev [playPrompt param3 info [set prefix]_temp_no_service.au]

#    }

    return 0
    }
    set state end
    return 0
}

proc do_active_notimer {} {
    global state

    set ev [waitEvent]
    while { $ev == "digit" } {
        set ev [waitEvent]
    }
    set state end
    return 0
}

proc do_active_last_timer {} {
    global state
    global warnTime
    global creditTime
    global fcnt
    global noPlay
    global prefix
    global pound

    if { $noPlay == 1} {
        set ev [startTimer [expr $creditTime -1] info]
    } else {
        set ev [startTimer [expr $warnTime - 4] info]
    }

    while { $ev == "digit"} {
            set ev [startTimer $info(timeLeft) info]
    }

    if { $ev == "longpound" } {
            set fcnt 0
            set noPlay 0
            set pound 1

            clearOutgoingLeg info
            #set state first_authorize
            set state get_dest
            return 0
    } elseif { $ev == "timeout" } {
        clearOutgoingLeg info
        set state out_of_time
    } else {
        set state end
    }
    return 0
}

proc do_active_timer {} {
    global state
    global warnTime
    global creditTime
    global prefix
    global fcnt
    global noPlay
    global pound
    global param4

    set delay [expr $creditTime - $warnTime]
    set ev [startTimer $delay info]

    while {$ev == "digit"} {
        set ev [startTimer $info(timeLeft) info]
    }
        if { $ev == "longpound" } {
            set fcnt 0
            set noPlay 0
            set pound 1

            clearOutgoingLeg info
            #set state first_authorize
            set state get_dest
            return 0
        }

        if {$ev == "outgoing disconnected"} {
            set fcnt 0
            set pound 1
            #set state first_authorize
            set state get_dest
            return 0
        }

        if  { $ev == "timeout" } {
            if {$noPlay == 1} {
                do_active_last_timer
            } else {
                set ev [playPrompt param4 info [set prefix]_you_have_less_min.au]
                do_active_last_timer
            }
        } else {
            set state end
        }
    return 0
}

proc do_active {} {
    global state
    global creditTime
    global warnTime
    global noTimeLimit

    if { ($noTimeLimit == 1) || ( $creditTime == "umlimited") ||
         ( $creditTime == "uninitialized") } {
             do_active_notimer
    } else {
             if {$creditTime <$warnTime} {
                do_active_last_timer
             } else {
                do_active_timer
             }
    }
    return 0
}

proc do_out_of_time {} {
    global state
    global prefix
    global param2

    set ev [playPrompt param2 info [set prefix]_disconnect.au]
    set ev [playPrompt param2 info [set prefix]_zero_bal.au]
    set state end
    return 0
}

proc do_first_authorize_fail {} {
    global state
    global prefix
    global param2

    set returncode [getVariable radius returnCode]
    set ev [playPrompt param2 info [set prefix]_final.au]
    set state end
    return 0
}

proc do_second_authorize_fail {} {
    global state
    global prefix
    global param2

    set returncode [getVariable radius returnCode]
    set ev [playPrompt param2 info [set prefix]_final.au]
    set state end
    return 0
}

proc do_collect_fail {} {
    global state
    global prefix
    global param2

    set ev [playPrompt param2 info [set prefix]_final.au]
    set state end
    return 0
}

proc do_place_fail {} {
    global state
    global destBusy
    global help

    set destBusy 0

    set state get_dest
    set help 0        
    return 0
}


#-------------------------------------------------------
# main
#
acceptCall
set fcnt 0
set count 0
set counter 0
set promptFlag 0
set promptFlag2 0
set noPlay 0
set prefix "audio/ru"
set pound 0
set destBusy 0
set noTimeLimit 0
set help 0
set uname 0

set param1(interrupt) true
set param1(abortKey) *
set param1(terminationKey) #

set param2(interrupt) true
set param2(abortKey) *
set param2(terminationKey) #
set param2(playComplete) true

set param3(interrupt) true
set param3(abortKey) *
set param3(terminationKey) #
set param3(dialPlanTerm) true

set param4(interrupt) true
set param4(abortKey) *
set param4(terminationKey) #
set param4(playComplete) true
set param4(insertMessage) true


#install params
set accountLen [getVariable config uidLen]
set pinLen [getVariable config pinLen]
set retryCnt [getVariable config retryCount]
set operatorNum [getVariable config redirectNumber]
set warnTime [getVariable config warningTime]
set preLanguage [getVariable radius preferredLang]
setVariable longPound true
set totalLang [getVariable local totalLanguages]

if {$totalLang == 0} {
    set state end
    return 0
} else {
   set state welcome
}

while {$state != "end"} {

    if {$state == "welcome"} {
        do_welcome
    } elseif {$state == "timerr"} {
        do_timerr
    } elseif {$state == "CallBack"} {
        do_CallBack
    } elseif {$state == "get_account"} {
        do_get_account
    } elseif {$state == "get_pin"} {
        do_get_pin
    } elseif {$state == "first_authorize"} {
        do_first_authorize
    } elseif {$state == "second_authorize"} {
        do_second_authorize
    } elseif {$state == "second_authorize_pass" } {
        do_second_authorize_pass
    } elseif {$state == "get_dest"} {
        do_get_dest
    } elseif {$state == "place_call"} {
        do_place_call
    } elseif {$state == "active"} {
        do_active
    } elseif {$state == "first_authorize_fail" } {
        do_first_authorize_fail
    } elseif {$state == "second_authorize_fail" } {
        do_second_authorize_fail
    } elseif {$state == "collect_fail" } {
        do_collect_fail
    } elseif {$state == "place_fail"} {
        do_place_fail
    } elseif {$state == "out_of_time"} {
        do_out_of_time
    } elseif {$state == "get_menu"} {
        do_get_menu
#    } elseif {$state == "deblock_account"} {
#        deblock_account
#    } elseif {$state == "do_deblock"} {
#        do_deblock
#    } elseif {$state == "block_account"} {
#        block_account
#    } elseif {$state == "do_block"} {
#        do_block
    } else {
        break
    }
}

Ответить | Правка | Cообщить модератору

Оглавление

Сообщения по теме [Сортировка по времени | RSS]


1. "CallBack не могу разобраться!"  +/
Сообщение от tanker (ok) on 26-Ноя-10, 23:18 
В свое время тоже пытался сделать CALLBACK на Cisco и TCL,
плюнул, и сделал на Asterisk
Ответить | Правка | ^ к родителю #0 | Наверх | Cообщить модератору

2. "CallBack не могу разобраться!"  +/
Сообщение от Aidar2010 email(ok) on 29-Ноя-10, 09:21 
> В свое время тоже пытался сделать CALLBACK на Cisco и TCL,
> плюнул, и сделал на Asterisk

как сделать на астерикс? что понадобится?

Ответить | Правка | ^ к родителю #1 | Наверх | Cообщить модератору

3. "CallBack не могу разобраться!"  +/
Сообщение от tanker (ok) on 29-Ноя-10, 10:05 
>> В свое время тоже пытался сделать CALLBACK на Cisco и TCL,
>> плюнул, и сделал на Asterisk
> как сделать на астерикс? что понадобится?

Да по большому счету ничего особенного, какой ни будь старый комп р3-р4 и небольшой опыт Unix/Asterisk

Т.к. циска у Вас уже есть, с нее заворачиваете по SIP звонок на Asterisk и точно так же разрешите на циске прием звонков по SIP c Asterisk.

На Asterisk нужно будет описать в extensions.conf секцию, отвечающую за CALLBACK
и написать небольшой agi скрипт, в котором происходит авторизация тех, кому можно и нужно перезванивать.

Ответить | Правка | ^ к родителю #2 | Наверх | Cообщить модератору

Архив | Удалить

Рекомендовать для помещения в FAQ | Индекс форумов | Темы | Пред. тема | След. тема




Партнёры:
PostgresPro
Inferno Solutions
Hosting by Hoster.ru
Хостинг:

Закладки на сайте
Проследить за страницей
Created 1996-2025 by Maxim Chirkov
Добавить, Поддержать, Вебмастеру