Выполнение оболочки звездочки при входящем звонке просто не подходит мне. Это, вероятно, работает нормально, но разве не должен быть уже известен статус пира звездочке?
Я использую функцию SIPPEER()
с помощью которой вы можете запросить статус пира. Если первые 3 символа (из OK (44 ms)
) в OK
вы можете позвонить партнеру. Все остальные ситуации вы можете переслать другому пэру.
Я делаю что-то вроде этого:
exten => _202,1,Log(NOTICE,Dial Status of ${EXTEN}: ${SIPPEER(${EXTEN},status)})
exten => _202,n,GotoIf($["${SIPPEER(${EXTEN},status):0:3}"="OK "]?ok1:forward)
exten => _202,n(ok1),Log(NOTICE,Calling number is available)
exten => _202,n,Dial(SIP/${EXTEN},50,wW)
exten => _202,n,Hangup()
exten => _202,n(forward),Log(NOTICE,Calling forward number)
exten => _202,n,Dial(SIP/201,50,wW)
exten => _202,n,Hangup()
Это проверяет состояние, прежде чем мы перейдем к Dial()
и переходит к n(forward)
если узел недоступен, занят или иным образом не в порядке.
Однако здесь есть небольшая проблема. Когда партнер отклоняет вызов (или по другой причине недоступен, например, он был в сети до нашей следующей онлайн-проверки), звонок не проходит.
Существует функция DIALSTATUS
мы можем использовать после Dial()
чтобы проверить, был ли вызов успешно принят. Так что используйте это после Dial()
и, если он не ответил, также сделайте пересылку. (Это сработало в тесте, который я сделал. Отрицание звонка дало BUSY
в журнал и перешло к следующему пиру)
Вы получаете что-то вроде этого:
exten => _202,1,Log(NOTICE,Dial Status of ${EXTEN}: ${SIPPEER(${EXTEN},status)})
exten => _202,n,GotoIf($["${SIPPEER(${EXTEN},status):0:3}"="OK "]?ok1:forward)
exten => _202,n(ok1),Log(NOTICE,Calling number is available)
exten => _202,n,Dial(SIP/${EXTEN},50,wW)
exten => _202,n,Log(NOTICE,Dial status: ${DIALSTATUS})
exten => _202,n,GotoIf($["${DIALSTATUS)}"="ANSWER"]?ok2:forward)
exten => _202,n(ok2),Log(NOTICE,Successfull call)
exten => _202,n,Hangup()
exten => _202,n(forward),Log(NOTICE,Calling forward number)
exten => _202,n,Dial(SIP/201,50,wW)
exten => _202,n,Hangup()
Я не тестировал этот последний бит (с DIALSTATUS
) интенсивно, так что вы должны сделать несколько тестов, но здесь, кажется, работает.