У меня есть приложение, которое использует программируемый голос Twilio.
Приложение в основном является колл-центром. Развернуто несколько экземпляров, каждый из которых имеет свой собственный номер телефона Twilio и пул доступных операторов-людей, которые могут отвечать на входящие вызовы. Когда от клиента поступает вызов GSM на телефонный номер Twilio, Twilio вызывает WebHook на нашей стороне, а затем мы просто находим доступного человека из пула и возвращаем TwiML следующим образом:
<?xml version="1.0" encoding="utf-8"?>
<Response>
<Say>Hello. Connecting you to the available operator.</Say>
<Dial callerId="{callCenterNumber}">{operatorNumber}</Dial>
</Response>
Сейчасклиент подключен к доступному человеку из пула экземпляра приложения. Пока все хорошо.
Теперь я хочу разобраться со случаем, когда в пуле экземпляра приложения, который был первоначально вызван, не было найдено доступных операторов. В этом случае я хочу, чтобы исходный экземпляр приложения подключался к номеру телефона Twilio другого экземпляра и считался клиентом этого экземпляра, чтобы исходный клиент-человек был подключен к оператору из пула другого экземпляра. Для этого экземпляр A просто возвращает <Dial callerId="{callCenterNumber}">{anotherCallCenterNumber}</Dial>
(набирая anotherCallCenterNumber
вместо operatorNumber
в приведенном выше примере).
Итак, вместо этого соединения: Customer => Call Center A => Operator from A's pool
, у меня есть Customer => Call Center A => Call Center B => Operator from B's pool
соединение.
Он также отлично работает, и я могу связать еще больше экземпляров центра обработки вызовов, пока где-нибудь не будет найден доступный оператор.
Проблема в том, что я хочу использовать протокол SIP для связи между экземплярамивместо телефонных номеров GSM, потому что мне нужно передать некоторые дополнительные данные (язык и т. д.), чтобы следующий экземпляр знал, как обрабатывать вызов, и находил подходящего оператора, чтобы ответить на него. Заголовки SIP выглядят как подходящее решение для передачи этих данных. Все остальное останется прежним.
Итак, я настроил конечную точку SIP для каждого экземпляра приложения и настроил запрос URL-адресов WebHook аналогично обычным URL-адресам телефонных номеров. Теперь, чтобы набрать другой экземпляр центра обработки вызовов через SIP, я возвращаю следующий TwiML:
<?xml version="1.0" encoding="UTF-8"?>
<Response>
<Say>Hello. No available operators were found. Connecting you to Call Center B.</Say>
<Dial>
<Sip>sip:callcenter@instanceB.sip.us1.twilio.com?x-customHeader=customData</Sip>
</Dial>
</Response>
На этом этапе я ожидаю, что Twilio вызовет instanceB
WebHook домена SIP, поэтому я могу обработать вызов инаправьте его так же, как я использовал в обычных телефонных номерах.
Вместо этого вызов немедленно сбрасывается, и в отладчике Twilio я вижу следующее предупреждение:
32009 - The user you tried to dial is not registered with the corresponding SIP Domain
ПослеВ некоторых исследованиях я понял, что конечная точка callcenter
должна быть зарегистрирована в instanceB.sip.us1.twilio.com
домене SIP. Но, похоже, единственный способ сделать это - использовать клиентское приложение софтфона, такое как X-Lite или Jitsi. Я установил X-Lite локально и добавил учетную запись callcenter
. Теперь, когда Call Center A получает вызов и инструктирует Twilio, чтобы он позвонил в Call Center B (sip:callcenter@instanceB.sip.us1.twilio.com
), мой локальный программный телефон начинает звонить, и если я отвечу на него, я буду подключен к клиенту, вызывающему Call Center A. Это не то, чтоЯ вообще хочу!
Кроме того, я обнаружил, что если я позвоню по номеру любому адресу софта, даже незарегистрированному, например sip:unknown@instanceB.sip.us1.twilio.com
, то, как ни странно, Twilio будет без каких-либо жалоб вызывайте WebHook instanceB
SIP Domain. Но это тоже не то, что мне нужно. Мне нужно соединение Twilio => Twilio через SIP таким же образом, как оно работало при использовании телефонных номеров.
Итак, чтобы подвести итог:
- Является ли описанный сценарий с Twilio-to-Twilio через SIP-связь возможна вообще, так же, как Twilio-to-Twilio по телефонным номерам?
- Почему Twilio возвращает ошибку
The user you tried to dial is not registered with the corresponding SIP Domain
, когда он получает TwiML, инструктирующий ему набрать незарегистрированную конечную точку SIP, но прив то же время он не возвращает эту ошибку, когда я набираю ту же незарегистрированную конечную точку из клиента программного телефона?