в итоге задача решилась установкой FeeSWITCH с небольшим патчем:
Код: Выделить всё
diff --git a/src/mod/endpoints/mod_sofia/mod_sofia.c b/src/mod/endpoints/mod_sofia/mod_sofia.c
--- a/src/mod/endpoints/mod_sofia/mod_sofia.c
+++ b/src/mod/endpoints/mod_sofia/mod_sofia.c
@@ -1075,6 +1075,11 @@ static switch_status_t sofia_send_dtmf(switch_core_session_t *session, const swi
switch_yield(500000);
} else if (dtmf->digit == 'W') {
switch_yield(1000000);
+ } else if (dtmf->digit == 'F') {
+ snprintf(message, sizeof(message), "Signal=hf\r\n");
+ switch_mutex_lock(tech_pvt->sofia_mutex);
+ nua_info(tech_pvt->nh, SIPTAG_CONTENT_TYPE_STR("application/hook-flash"), SIPTAG_PAYLOAD_STR(message), TAG_END());
+ switch_mutex_unlock(tech_pvt->sofia_mutex);
} else {
snprintf(message, sizeof(message), "Signal=%c\r\nDuration=%d\r\n", dtmf->digit, dtmf->duration / 8);
switch_mutex_lock(tech_pvt->sofia_mutex);
в сторону DVG создается отдельный sofia-профиль с <param name="dtmf-type" value="info"/>
сильно упрощенный диалплан:
Код: Выделить всё
<?xml version="1.0" encoding="utf-8"?>
<include>
<context name="default">
<extension name="Outbound">
<condition field="destination_number" expression="^(10[0-9]|11[0-6])$">
<action application="export" data="dialed_extension=$1"/>
<action application="bind_meta_app" data="9 a o send_dtmf::F"/> <!-- Send hook-flash INFO -->
<action application="bridge" data="sofia/gateway/dvg/$1"/>
</condition>
</extension>
</context>
<context name="public">
<extension name="Incoming">
<condition field="destination_number" expression="^(10[01][0-9])$">
<action application="bind_meta_app" data="9 b o send_dtmf::F"/> <!-- Send hook-flash INFO -->
<action application="bridge" data="user/$1"/>
</condition>
</extension>
</context>
</include>
hook-flash передается на шлюз после нажатия *9 дальше донабор нужного номера
если подключен шлюз с FXS, то срабатывает и кнопка FLASH аппарата
решение позволяет делать перевод как на стороне Freeswitch, так и на стороне внешней станции