Иногда нужно ограничить количество одновременных вызовов через оператора, например, если к freeswitch подключен GSM-шлюз с 1-й симкой и также есть городской оператор, необходимо вызовы на сотовые телефоны направить на GSM-шлюз, но если уже кто-то разговаривает через него, то остальные вызовы должны пойти через городского оператора.
Во freeswitch есть приложение limit, с помощью которого можно решить эту задачу. Оно имеет следующий синтаксис
limit <backend> <realm> <resource> <max[/interval]> [<transfer_destination_number> [<dialplan> [<context>]]
Полную информацию по данному приложению можно найти здесь https://freeswitch.org/confluence/display/FREESWITCH/Limit
Пример диалплана:
<extension name="gsm"> <condition field="destination_number" expression="^(89\d{9})$"> <action application="limit" data="hash outbound 1 to_operator"/> <action application="bridge" data="sofia/gateway/gsm_gate/$1" /> </condition> </extension> <extension name="to_operator"> <condition field="destination_number" expression="^to_operator$"/> <condition field="rdnis" expression="^(89\d{9})$"> <action application="bridge" data="sofia/gateway/operator/$1"/> </condition> </extension>
Здесь если через extension gsm уже осуществляется вызов, то второй вызов пойдет в extension to_operator
Эту же задачу можно решить и с помощью приложения limit_execute полный синтаксис которого выглядет так
<action application="limit_execute" data="hash <realm> <id> <max>[/<interval>] <application> <data>" />
Диалплан будет выглятеть так:
<extension name="outbound"> <condition field="destination_number" expression="^(89\d{9})$"> <action application="limit_execute" data="hash outbound GSM 1 bridge sofia/gateway/GSM/${destination_number}" /> <action application="bridge" data="sofia/gateway/to_operator/$1" /> </extension>