Примеры интеграции | Документация для разработчиков
Примеры интеграции
Обновлено: 25 февраля 2026 г
В этом руководстве объясняется интеграция распространенных VoIP-платформ с API бизнес-звонков WhatsApp.
Данное руководство носит исключительно информационный характер и не предоставляет никаких гарантий или поддержки со стороны Meta или какого-либо поставщика. Существует множество способов интеграции, и в руководстве описан лишь один из них, исключительно в иллюстративных целях.
Asterisk с использованием SIP
Обзор
В этом руководстве объясняется, как настроить API для бизнес-звонков WhatsApp с использованием SIP-сигнализации в Asterisk—открытой АТС (частной телефонной станции). Вы узнаете, как настроить сервер Asterisk, подключить SIP-телефоны и обрабатывать как входящие, так и исходящие звонки WhatsApp.
Звонки, инициированные пользователем
Звонки, инициированные бизнесом
На этапе передачи данных от WA к Asterisk используется SDES для обмена ключами шифрования мультимедиа и Opus для аудиокодека
В соединении Asterisk с SIP UA для обмена ключами шифрования мультимедиа используется SDES, а для аудиокодеков — Opus или G711
Предварительные требования
Сборка и установка Asterisk
Данное руководство было протестировано с использованием Asterisk версии 22.5.2
Конфигурация Asterisk
Эти конфигурационные файлы находятся в каталоге /etc/asterisk/
extensions.conf
Замените следующие заполнители фактическими значениями
[ c2b - sub - dial ]
exten => s , 1 , NoOp ()
same => n , Read ( Digits , incoming_welcome , 0 ,, 5 , 500 )
same => n , Dial ( PJSIP / $ { Digits })
same => n , Hangup () [ whatsapp ]
exten => _10XX , 1 , NoOp ()
same => n , Dial ( PJSIP / $ { EXTEN })
same => n , Hangup () ; Расширение для бизнес - звонков B2C через шлюз Meta SIP exten = > b2c - sip , 1 , NoOp ( )
same = > n , Read ( Digits , outgoing_welcome , 0 , 5 , 500 )
same = > n , Dial ( PJSIP / whatsapp / sip : $ { Digits}@wa.meta.vc ) ; Расширение для обработки входящих запросов приглашения от шлюза Meta SIP на <wa-business-phone-number> @ <asterisk-sip-server-dns> exten = > _ + <wa-business-phone-number> , 1 , Goto ( c2b - sub - dial , s , 1
) Pjsip.conf
Замените следующие заполнители фактическими значениями
Файлы сертификатов следует размещать в папках /var/lib/asterisk/certs/fullchain.cer и /var/lib/asterisk/certs/cer.key
[ transport - tls ]
type = transport protocol = tls bind = 0.0.0.0:5061
cert_file = /var/lib/asterisk/certs/fullchain.cer priv_key_file = /var/lib/asterisk/certs/cer.key method = sslv23 allow_wildcard_certs = yes external_media_address = { external - media - address } ; External address for SIP signalling external_signaling_address = { external - signaling - address } ; Сеть, которую следует считать локальной, используется для целей NAT local_net ={ local - net } [ sdes_endpointtemplate ](!)
type = endpoint context = whatsapp disallow = all allow = OPUS direct_media = no
rtp_symmetric = yes force_rport = yes rewrite_contact = no
media_use_received_transport = yes media_encryption = sdes
[ authtemplate ](!)
type = auth auth_type = userpass password ={ sip - ua - password } [ aortemplate ](!)
type = aor max_contacts = 1
remove_existing = yes
[ aoridentitytemplate ](!)
type = identify match_header = X - FB - External - Domain : wa . meta . vc
; SDES users
[ 1000 ]( sdes_endpointtemplate )
auth = 1000 _auth aors = 1000 [ 1000 _auth ]( authtemplate )
username = 1000 [ 1000 ]( aortemplate ) [ 1000 ]( aoridentitytemplate )
endpoint = 1000 [ 1001 ]( sdes_endpointtemplate )
auth = 1001 _auth aors = 1001 [ 1001 _auth ]( authtemplate )
username = 1001 [ 1001 ]( aortemplate ) [ 1001 ]( aoridentitytemplate )
endpoint = 1001 [ 1002 ]( sdes_endpointtemplate )
auth = 1002 _auth aors = 1002 [ 1002 _auth ]( authtemplate )
username = 1002 [ 1002 ]( aortemplate ) [ 1002 ]( aoridentitytemplate )
endpoint = 1002 [ 1003 ]( sdes_endpointtemplate )
auth = 1003 _auth aors = 1003 [ 1003 _auth ]( authtemplate )
username = 1003 [ 1003 ]( aortemplate ) [ 1003 ]( aoridentitytemplate )
endpoint = 1003 [ 1004 ]( sdes_endpointtemplate )
auth = 1004 _auth aors = 1004 [ 1004 _auth ]( authtemplate )
username = 1004 [ 1004 ]( aortemplate ) [ 1004 ]( aoridentitytemplate )
endpoint = 1004 [ 1005 ]( sdes_endpointtemplate )
auth = 1005 _auth aors = 1005 [ 1005 _auth ]( authtemplate )
username = 1005 [ 1005 ]( aortemplate ) [ 1005 ]( aoridentitytemplate )
endpoint = 1005 ; Эта конечная точка сопоставляется с IVR для вызовов C2B
[ c2b - sip ]( sdes_endpointtemplate ) [ c2b - sip ]( aortemplate ) [ c2b - sip ]
type = identify endpoint = c2b - sip match_header = X - FB - External - Domain : wa . meta . vc
; специальная конечная точка для интеграции
с Meta SIP Gateway ; Эта конечная точка соответствует IVR для звонков B2C
[ b2c - sip ]( sdes_endpointtemplate ) [ b2c - sip ]( aortemplate ) [ whatsapp ]( sdes_endpointtemplate )
type = endpoint transport = transport - tls disallow = all allow = opus , ulaw , alaw aors = whatsapp from_user ={ wa - business - phone - number }
from_domain ={ domain - name }
outbound_auth = whatsapp
[ whatsapp ]
type = aor contact = sip : wa . meta . vc
[ whatsapp ]
type = identify endpoint = whatsapp
[ whatsapp ]
type = auth auth_type = digest password ={ meta - sip - user - password }
username ={ wa - business - phone - number }
realm =*rtp.conf
[ общие ] ;
Имя хоста или адрес STUN-сервера, используемого для определения внешнего IP -
адреса и
порта , по которому можно получить доступ к RTP-сессии . Номер порта является необязательным . Если он опущен , будет использоваться значение по умолчанию 3478. Эта опция отключена по умолчанию . Разрешение имен происходит во время загрузки , и если используется DNS , разрешение имен будет происходить многократно после истечения TTL . ; ; например stundaddr = mystun.server.com:3478 ;
stunaddr = stun.l.google.com:19302 rtpstart = 10000 rtpend = 60000Настройка VoIP-телефона
Загрузите и установите программный телефонный клиент (например, Linphone)для тестирования как деловых, так и пользовательских звонков.
Настройка учетной записи
Итоговый контрольный список
Поиск неисправностей
Не удается зарегистрировать SIP UA
Убедитесь, что SIP-URL указан правильно и домен указывает на сервер Asterisk. Выполните команду `host {domain-name}`, чтобы проверить, что IP-адрес указывает на сервер Asterisk.
Отсутствие подтверждения (ACK) от Meta ИЛИ прерывание звука в Business примерно через 30 секунд ИЛИ Meta возвращает ответ 404 на BYE
При инициированном пользователем вызове Meta отправляет
SIP INVITE вашему SIP-серверу, который затем отвечает кодом 200 OK. Meta подтверждает ваш 200 OK кодом ACK , но вы его никогда не получаете. Поэтому ваш SIP-сервер продолжает повторно отправлять 200 OK , и в конечном итоге диалог SIP завершается из-за истечения времени ожидания ACK (обычно 32 секунды).Наиболее вероятная причина этой проблемы — некорректные
Record-Route в вашем 200 OK на Meta. 200 OK не должен изменять Record-Route , включенные в исходный INVITE. Ваш SIP-сервер может добавлять новые Record-Route , но не может изменять те, которые присутствуют в нашем INVITE.Решение этой проблемы заключается в изменении
параметра rewrite_contact=yes на rewrite_contact=no в конфигурации конечной точки WhatsApp в файле pjsip.conf. После этого убедитесь, что ваш ответ 200 OK содержит следующие заголовки в списке последних двух :Эту проблему сложно обнаружить или диагностировать. Даже при наличии этой ошибки соединение устанавливается, и медиапоток передается с обеих сторон, но примерно через 32 секунды ваш SIP-сервер завершает вызов, и он не передается клиенту WhatsApp, потому что ваш запрос BYE содержит некорректные
Route . Поэтому пользователь WA перестает слышать деловой звук примерно через 32 секунды.Record - Route : < sip : wa.meta.vc ; transport = tls ; lr > Record - Route : < sip : onevc-sip-proxy.fbinfra.net : 8191 ; transport = tls ; lr >FreeSWITCH с использованием SIP
Обзор
В этом руководстве объясняется, как настроить API бизнес-звонков WhatsApp с использованием SIP-сигнализации и FreeSWITCH—коммуникационной платформы с открытым исходным кодом. Вы узнаете, как настроить сервер FreeSWITCH, подключить SIP-телефоны и обрабатывать как инициированные пользователем, так и инициированные компанией звонки WhatsApp.
Звонки, инициированные пользователем
Звонки, инициированные бизнесом
На участке WA — FreeSWITCH для обмена ключами шифрования мультимедиа используется SDES, а в качестве аудиокодека — Opus. На участке FreeSWITCH — SIP UA для обмена ключами шифрования мультимедиа используется SDES, а в качестве аудиокодеков — Opus или G.711
Предварительные требования
Сборка и установка FreeSWITCH
Данное руководство было протестировано с использованием FreeSWITCH версии 1.10.12. FreeSWITCH использует Sofia (библиотеку пользовательских агентов SIP с открытым исходным кодом). Для данного руководства использовалась Sofia версии 1.13.17
Конфигурация FreeSWITCH
Эти конфигурационные файлы находятся в каталоге /usr/share/freeswitch/etc/freeswitch
wa-biz-api-dialplan.xml
Разместите план набора номера в файле /usr/share/freeswitch/etc/freeswitch/dialplan/default/wa-biz-api-dialplan.xml
<include><extensionname="c2b_calls_sip_ivr"><!--Dial plan is selected if the SIP request is coming from Meta--><conditionполе="${sip_from_host}"выражение="^wa.meta.vc$"><!--Verify the IP from where the request is coming, compare the IP with the Meta allowlisted IPs--><actionapplication="check_acl"data="${network_addr} whatsapp_allow normal_clearing"/><!--Enable encrypted media using SDES--><actionapplication="set"data="rtp_secure_media=true"/><actionapplication="answer"/><!--Add silence stream for 1 sec so that the media path is established between whatsapp and freeswitch to avoid audio clipping--><actionapplication="playback"data="silence_stream://1000"/><actionapplication="play_and_get_digits"data="2 5 3 7000 # $${base_dir}/sounds/incoming_welcome.wav $${base_dir}/sounds/incoming_invalid.wav extension \d+"/><!--While the call is being bridged, play a ringtone for the caller--><actionapplication="set"data="ringback=%(2000, 4000, 440.0, 480.0)"/><!--Offer G711 and Opus for FreeSWITCH-SIP UA leg --><actionapplication="export"data="nolocal:absolute_codec_string=PCMA,PCMU,OPUS@48000h@20i"/><actionapplication="bridge"data="user/${extension}"/><actionapplication="hangup"/></condition></extension><extensionname="b2c_calls_ivr"><conditionfield="destination_number"expression="^b2c-sip$"><!--Enable encrypted media using SDES--><actionapplication="set"data="rtp_secure_media=true"/><actionapplication="answer"/><actionapplication="playback"data="silence_stream://1000"/><actionapplication="set"data="caller_id_check=${caller_id_number}"/><actionapplication="play_and_get_digits"data="2 12 3 20000 # $${base_dir}/sounds/outgoing_welcome.wav $${base_dir}/sounds/outgoing_invalid.wav whatsapp_number \d+"/><actionapplication="log"data="INFO [whatsapp_number] is ${whatsapp_number}"/><!--While the call is being bridged, play a ringtone for the caller--><actionapplication="set"data="ringback=%(2000, 4000, 440.0, 480.0)"/><!--Offer only OPUS--><actionapplication="export"data="nolocal:absolute_codec_string=OPUS@48000h@20i,OPUS@8000h@20i"/><!--Bridge the call by calling META SIP with the WA Number--><actionapplication="bridge"data="sofia/gateway/whatsapp/+${whatsapp_number}"/><actionapplication="hangup"/></condition></extension></include>Аудиофайлы следует размещать в папке /usr/share/freeswitch/sounds (не входит в комплект)
whatsapp.xml
Этот файл настраивает шлюз WhatsApp. Скопируйте его в /usr/share/freeswitch/etc/freeswitch/sip_profiles/external/whatsapp.xml
<!--Gateway configuration for Meta SIP--><!--replace {phone-number},{meta-sip-password} and {domain-name} before starting FreeSWITCH--><include><gatewayname="whatsapp"><paramname="username"value="{phone-number}"/><paramname="password"value="{meta-sip-password}"/><paramname="register"value="false"/><paramname="realm"value="wa.meta.vc"/><paramname="from-user"value="{phone-number}"/><paramname="from-domain"value="{domain-name}"/></gateway></include>Замените следующие заполнители фактическими значениями
acl.conf.xml
Откройте файл /usr/share/freeswitch/etc/freeswitch/autoload_configs/acl.conf.xml
Добавьте следующий список в элемент
network-lists.<!--IP addresses from Meta that are allowed to send SIP requests via the gateway. Keep this up to date--><listname="whatsapp_allow"default="deny"><nodetype="allow"cidr="31.13.24.0/21"/><nodetype="allow"cidr="31.13.64.0/18"/><nodetype="allow"cidr="45.64.40.0/22"/><nodetype="allow"cidr="57.141.0.0/21"/><nodetype="allow"cidr="57.141.8.0/22"/><nodetype="allow"cidr="57.141.12.0/23"/><nodetype="allow"cidr="57.144.0.0/14"/><nodetype="allow"cidr="66.220.144.0/20"/><nodetype="allow"cidr="69.63.176.0/20"/><nodetype="allow"cidr="69.171.224.0/19"/><nodetype="allow"cidr="74.119.76.0/22"/><nodetype="allow"cidr="102.132.96.0/20"/><nodetype="allow"cidr="103.4.96.0/22"/><nodetype="allow"cidr="129.134.0.0/16"/><nodetype="allow"cidr="147.75.208.0/20"/><nodetype="allow"cidr="157.240.0.0/16"/><nodetype="allow"cidr="163.70.128.0/17"/><nodetype="allow"cidr="163.77.128.0/17"/><nodetype="allow"cidr="173.252.64.0/18"/><nodetype="allow"cidr="179.60.192.0/22"/><nodetype="allow"cidr="185.60.216.0/22"/><nodetype="allow"cidr="185.89.216.0/22"/><nodetype="allow"cidr="204.15.20.0/22"/></list>vars.xml
Измените файл /usr/share/freeswitch/etc/freeswitch/vars.xml
Добавьте строку < X - PRE - PROCESS cmd = "set" data = "rtp_secure_media=mandatory" /> под Замените < X - PRE - PROCESS cmd = "set" data = "default_password=1234" /> на ( замените { sip_ua_password } на ваш пароль ) < X - PRE - PROCESS cmd = "set" data = "default_password={sip-ua-password}" /> Замените < X - PRE - PROCESS cmd = "set" data = "domain=$${local_ip_v4}" /> на ( замените { domain - name } на DNS вашего SIP-сервера FreeSWITCH ) < X - PRE - PROCESS cmd = "set" data = "domain={domain-name}"/> Замените stun - set " data=" external_sip_ip = stun : stun . freeswitch . org "/> с (замените {external-ip} на ваш публичный IP-адрес FreeSWITCH) set " data=" external_sip_ip ={ external - ip } "/> Замените stun - set " data=" external_rtp_ip = stun : stun . freeswitch . org "/> на (замените {external-ip} на ваш публичный IP-адрес FreeSWITCH) stun - set " data=" external_rtp_ip ={ external - ip } "/><include>внутренний.xml
Измените файл /usr/share/freeswitch/etc/freeswitch/sip_profiles/internal.xml. Найдите:
<paramname="sip-trace"value="no"/>Замените это на
<paramname="sip-trace"value="yes"/>файл
/usr/share/freeswitch/etc/freeswitch/sip_profiles/external.xml
Замените<param name="sip-trace" value="no"/>на<param name="sip-trace" value="yes"/>Замените<param name="tls" value="$${external_ssl_enable}"/>на<param name="tls" value="true"/>Замените<!--<<param name="tls-cert-dir" value=""/>-->с<param name="tls-cert-dir" value="/usr/share/freeswitch/etc/freeswitch/certs"/>Убедитесь, что сертификаты размещены в папке /usr/share/freeswitch/etc/freeswitch/certs
Итоговый контрольный список
Поиск неисправностей
Не удается зарегистрировать SIP UA
Убедитесь, что SIP-URL указан правильно и домен указывает на сервер FreeSWITCH. Выполните команду `host {domain-name}`, чтобы проверить, что IP-адрес указывает на сервер FreeSWITCH.
Отслеживание SIP-сообщений
Запустите CLI (/usr/share/freeswitch/bin/fs_cli), чтобы просмотреть SIP-сообщения
FreeSWITCH использует Graph API с Janus
Обзор
В этом руководстве объясняется, как настроить WhatsApp Business Calling API, используя сигнализацию WhatsApp Cloud API с FreeSWITCH—открытым фреймворком для связи — и Janus—универсальным WebRTC-сервером. Вы узнаете, как настроить сервер FreeSWITCH, подключить SIP-телефоны и обрабатывать как входящие, так и исходящие звонки WhatsApp.

Звонки, инициированные пользователем
Звонки, инициированные бизнесом
Сервер Janus находится между WA и FreeSWITCH и преобразует медиафайлы из WA (совместимые с WebRTC и использующие обмен ключами DTLS) в медиафайлы, согласованные с FreeSWITCH (использующие обмен ключами SDES).
FreeSWITCH - Sip UA будет использовать SDES для обмена ключами шифрования мультимедиа и Opus или G711 для аудиокодеков
Предварительные требования
Интеграция с сигнализацией Cloud API
Вам потребуется реализовать интеграционный модуль, который будет выступать посредником между WA и Janus и преобразовывать сообщения Cloud API Signalling в сообщения плагина Janus SIP и наоборот.
Вам понадобится
Звонки, инициированные бизнесом
Звонки, инициированные пользователем
Сборка и установка системы Janus
См. https://github.com/meetecho/janus-gateway.
Данное руководство было протестировано с использованием версии 1.2.3.
Конфигурация Януса
janus.jcfg
Измените файл janus.jcfg, который находится по адресу /usr/share/janus/etc/janus/janus.jcfg. Установите параметр nat_1_1_mapping на публичный IP-адрес сервера Janus
Чтобы начать работу с Янусом
/ usr / share / janus / bin / janus --debug - level = 6 --libnice - debug = on - S stun.l.google.com:19302 --log - file = / var / log / janus.log --config = / usr / share / janus / etc / janus / janus.jcfgСборка и установка FreeSWITCH
Данное руководство было протестировано с использованием FreeSWITCH версии 1.10.12. FreeSWITCH использует Sofia (библиотеку пользовательских агентов SIP с открытым исходным кодом). Для данного руководства использовалась Sofia версии 1.13.17
Конфигурация FreeSWITCH.
Эти конфигурационные файлы находятся в каталоге /usr/share/freeswitch/etc/freeswitch.
wa-biz-api-dialplan.xml
Разместите план набора номера в файле /usr/share/freeswitch/etc/freeswitch/dialplan/default/wa-biz-api-dialplan.xml
<include><extensionname="c2b_calls_ivr"><conditionfield="destination_number"expression="^c2b-sip$"><actionapplication="set"data="rtp_secure_media=true"/><actionapplication="answer"/><!--Add silence stream for 1 sec so that the media path is established between whatsapp and freeswitch to avoid audio clipping. TODO: Investigate if silence can be removed--><actionapplication="playback"data="silence_stream://1000"/><actionapplication="play_and_get_digits"data="2 5 3 7000 # $${base_dir}/sounds/incoming_welcome.wav $${base_dir}/sounds/incoming_invalid.wav extension \d+"/><!--While the call is being bridged, play a ringtone for the caller--><actionapplication="set"data="ringback=%(2000, 4000, 440.0, 480.0)"/><!--WA calls bridged via Janus through extension 1000 only support OPUS. However, the callee might be restricted to other codecs for example G722--><!--Therefore , don't restrict to OPUS for C2B calls and offer more codecs to the caller. Transcoding between OPUS and the negotiated codec by the caller--><!--will happen in freeswitch--><actionapplication="export"data="nolocal:absolute_codec_string=PCMA,PCMU,OPUS@48000h@20i,G722"/><actionapplication="bridge"data="user/${extension}"/><actionapplication="hangup"/></condition></extension><extensionname="b2c_calls_ivr"><conditionfield="destination_number"expression="^b2c-sip$"><actionapplication="set"data="rtp_secure_media=true"/><actionapplication="answer"/><actionapplication="playback"data="silence_stream://1000"/><actionapplication="set"data="caller_id_check=${caller_id_number}"/><actionapplication="log"data="INFO [caller id ] is ${caller_id_check}"/><actionapplication="play_and_get_digits"data="2 12 3 20000 # $${base_dir}/sounds/outgoing_welcome.wav $${base_dir}/sounds/outgoing_invalid.wav whatsapp_number \d+"/><actionapplication="log"data="INFO [whatsapp_number] is ${whatsapp_number}"/><!--Add the whatsapp number entered by the user as a custom SIP header, Janus will use this WA user number in API request to Meta--><actionapplication="export"data="sip_h_X-WhatsApp-Number=${whatsapp_number"/><!--While the call is being bridged, play a ringtone for the caller--><actionapplication="set"data="ringback=%(2000, 4000, 440.0, 480.0)"/><!--WA calls bridged via Janus through extension 1000 only support OPUS. However, the caller might be restricted to other codecs for example G722--><!--Therefore , don't restrict to OPUS for B2C calls and let caller select other codecs--><!--However, force transcoding to OPUS by only offering OPUS to Janus--><actionapplication="export"data="nolocal:absolute_codec_string=OPUS@48000h@20i,PCMU,PCMA"/><!--Bridge the call to extension 1000 to which capi-calling is registered via Janus to route calls to WhatsApp--><actionapplication="bridge"data="user/1000"/><actionapplication="hangup"/></condition></extension></include>Аудиофайлы следует размещать в папке /usr/share/freeswitch/sounds (не входит в комплект)
внутренний.xml
Измените файл /usr/share/freeswitch/etc/freeswitch/sip_profiles/internal.xml. Найдите:
<paramname="sip-trace"value="no"/>Замените это на
<paramname="sip-trace"value="yes"/>Настройка VoIP-телефона
Обратитесь к предыдущему разделу.
Итоговый контрольный список
Поиск неисправностей
Не удается зарегистрировать SIP UA
Убедитесь, что SIP-URL указан правильно и домен указывает на сервер FreeSWITCH. Выполните команду `host {domain-name}`, чтобы проверить, что IP-адрес указывает на сервер FreeSWITCH.
Отслеживание SIP-сообщений
Запустите CLI (/usr/share/freeswitch/bin/fs_cli), чтобы просмотреть SIP-сообщения
Asterisk с использованием Graph API и RtpEngine
Обзор
В этом руководстве объясняется, как настроить WhatsApp Business Calling API с использованием сигнализации WhatsApp Cloud API в сочетании с Asterisk—открытой АТС (PBX) — и RtpEngine—открытым прокси-сервером, используемым для ретрансляции, обработки и управления потоками RTP. Вы узнаете, как настроить сервер Asterisk, подключить SIP-телефоны и обрабатывать как входящие, так и исходящие звонки WhatsApp.
Звонки, инициированные пользователем
Звонки, инициированные бизнесом
RtpEngine выступает в роли медиапрокси и находится между потоком данных от WA (совместимого с WebRTC протокола с обменом ключами DTLS) и Asterisk (обмен ключами SDES)
Предварительные требования
Интеграция с сигнализацией Cloud API
Вам потребуется реализовать интеграционный модуль, который будет выступать в качестве моста между WhatsApp и Asterisk. Этот модуль будет:
Для данной настройки вам потребуются следующие компоненты, входящие в состав модуля интеграции

Звонки, инициированные бизнесом
Звонки, инициированные пользователем
Сборка и установка Asterisk
См. https://docs.asterisk.org/Getting-Started/Installing-Asterisk/Installing-Asterisk-From-Source/Building-and-Installing-Asterisk/
Данное руководство было протестировано с использованием Asterisk версии 22.5.2
Сборка и установка RtpEngine
обратитесь к https://github.com/sipwise/rtpengine. Данное руководство было протестировано с использованием версии RtpEngine 13.3.1.4.
Подробную информацию о протоколе управления ng можно найти по ссылке https://rtpengine.readthedocs.io/en/latest/ng_control_protocol.html
Для запуска RTPEngine выполните команду
/usr/ bin / rtpengine --listen - ng = { local - ip } : 22222 --interface ={ local - ip } \ ! { public - ip } -f - EЗаменять
Конфигурация Asterisk.
Эти конфигурационные файлы находятся в каталоге /etc/asterisk/
extensions.conf
Замените следующие заполнители фактическими значениями
[ handler ] ; Установить заголовки для канала вызываемого абонента exten => addheader , 1 , Set ( PJSIP_HEADER ( add , X - WhatsApp - Number )= $ { DIGITS })
same => n , Return () [ default ]
exten => _10XX , 1 , NoOp ()
same => n , Dial ( PJSIP / $ { EXTEN })
same => n , Hangup ()
exten => b2c - sip , 1 , NoOp ()
same => n , Read ( Digits , outgoing_welcome , 0 , 5 , 500 )
same => n , Set ( GLOBAL ( DIGITS )= $ { Digits }) ; Перед началом бизнес - звонка добавьте заголовок WA клиента для хранения номера пользователя WA, полученного из цифр, введенных агентом ( DTMF ):
same => n , Dial ( PJSIP / 1000 , b ( handler ^ addheader ^ 1 ))
same => n , Hangup ()
exten => c2b - sip , 1 , NoOp ()
same => n , Read ( Digits , incoming_welcome , 0 , 5 , 500 )
same => n , Dial ( PJSIP / $ { Digits })
same => n , Hangup ()pjsip.conf
Замените следующие заполнители фактическими значениями
Примечание:
Добавочный номер 1000 используется для соединения вызовов WA с Asterisk (см. раздел « Интеграция с сигнализацией Cloud API»).
[ global ]
type = global
debug = yes ; Включить / отключить отладку SIP . Допустимые параметры: yes | no [transport-tcp] type = transport protocol = tcp bind = 0.0.0.0; Внешний IP - адрес для обработки RTP
external_media_address = { external - media - address } ; Внешний адрес для сигнализации SIP external_signaling_address = { external - signaling - address } ; Сеть , которую следует считать локальной для целей NAT local_net = { local - net } [ endpointtemplate ] ( ! ) type
= endpoint context = default
disallow = all allow = OPUS , g722 , g729 , ulaw
; Нет звука , если direct_media установлено на yes direct_media = no
rtp_symmetric = yes use_avpf = yes media_encryption = sdes media_use_received_transport = yes rtcp_mux = yes
[ authtemplate ](!)
type = auth auth_type = userpass password ={ sip - ua - password } [ aortemplate ](!)
type = aor max_contacts = 1
remove_existing = yes
[ 1000 ]( endpointtemplate )
disallow = all
; расширение 1000 используется RtpEngine для организации звонков WhatsApp
; WhatsApp поддерживает только OPUS. allow = OPUS auth = 1000 _auth aors = 1000 [ 1000 _auth ]( authtemplate )
username = 1000 [ 1000 ]( aortemplate ) [ 1001 ]( endpointtemplate )
auth = 1001 _auth aors = 1001 [ 1001 _auth ]( authtemplate )
username = 1001 [ 1001 ]( aortemplate ) [ 1002 ]( endpointtemplate )
auth = 1002 _auth aors = 1002 [ 1002 _auth ]( authtemplate )
username = 1002 [ 1002 ]( aortemplate ) [ 1003 ]( endpointtemplate ) )
auth = 1003 _auth aors = 1003 [ 1003 _auth ]( authtemplate )
username = 1003 [ 1003 ]( aortemplate ) [ 1004 ]( endpointtemplate )
auth = 1004 _auth aors = 1004 [ 1004 _auth ]( authtemplate )
username = 1004 [ 1004 ]( aortemplate ) [ 1005 ]( endpointtemplate )
auth = 1005 _auth aors = 1005 [ 1005 _auth ]( authtemplate )
username = 1005 [ 1005 ]( aortemplate )Настройка VoIP-телефона
Обратитесь к предыдущему разделу.
Итоговый контрольный список
Поиск неисправностей
Не удается зарегистрировать SIP UA
Убедитесь, что SIP-URL указан правильно и домен указывает на сервер Asterisk. Выполните команду `host {domain-name}`, чтобы проверить, что IP-адрес указывает на сервер Asterisk.
Asterisk со встроенным WebRTC, использующий Graph API
Этот подход аналогичен использованию Asterisk Graph API с RtpEngine,
за исключением того, что он использует встроенную поддержку WebRTC в Asterisk и, следовательно, не требует RtpEngine.
Таким образом, компонент RtpEngineClient в этом подходе не требуется
В плане конфигурации и настройки единственное отличие заключается в конфигурации расширения 1000, которая приведена ниже
... ; Остальное содержимое опущено для краткости
[ 1000 ]( endpointtemplate )
disallow = all
; расширение 1000 используется SIP UA модуля интеграции для организации звонков
WhatsApp ; WhatsApp поддерживает только OPUS allow = OPUS auth = 1000 _auth aors = 1000
dtls_auto_generate_cert = yes webrtc = yes
; Установка webrtc = yes — это сокращение для установки следующих параметров : ; use_avpf = yes
; media_encryption = dtls
; dtls_verify = fingerprint
; dtls_setup = actpass
; ice_support = yes
; media_use_received_transport = yes
; rtcp_mux = yes
Комментарии отсутствуют
Комментарии отсутствуют