Инструменты пользователя

Инструменты сайта


faq:outbound-round-robin

Равномерное распределение исходящих

Обратно к инструкциям

  1. Откройте на редактирование modules.conf и добавьте в конец файла
    load => func_global.so

    Сохраните изменения

  2. Откройте на редактирование файл extensions.conf
  3. Добавьте следующий код в конец файла:
    [all-outgoing-custom]
    exten => _X!,1,NoOp()
        same => n,Set(NEED_RETURN=0)
        ; Описываем список провайдеров
        same => n,Set(PUSH(rrItem)=SIP-1601534775)
        same => n,Set(PUSH(rrItem)=SIP-1611151795)    
        same => n,Set(PUSH(rrItem)=SIP-1681205343)
        ; Максимальное количество одновременных звонков через линию
        same => n,Set(busyLevel=50)
        
        ; Проверка, есть ли провайдер в списке. 
        same => n,ExecIf($[ "${FIELDNUM(rrItem,\,,${PROVIDER_ID})}" == "0" ]?return)
        ; Если ID приоритетного провайдера определен, то сразу к проверке. 
        same => n,GotoIf($[ "${rrElement}x" != "x" ]?check)
        ; Инициализация массива
        same => n,Set(rrArray=${EMPTY})
        same => n,Set(i=${SHIFT(rrItem)})
        same => n,While(1)
        same => n,ExecIf($[ "${i}x" == "x" ]?ExitWhile())
        same => n,ExecIf($[ "${rrArray}x" != "x" ]?Set(rrArray=${rrArray},))
        same => n,ExecIf($[ "${GLOBAL(${i})}x" == "x" ]?Set(GLOBAL(${i})=0))
        same => n,Set(rrArray=${rrArray}${i}:${GLOBAL(${i})})
        same => n,Set(i=${SHIFT(rrItem)})
        same => n,EndWhile
        ; Поиск элемента с меньшим весом
        same => n,Set(rrArray=${SORT(${rrArray})})
        same => n,Set(rrElement=${SHIFT(rrArray)})
        same => n,While(1)
        same => n,ExecIf($[ $[${GROUP_COUNT(${rrElement})} < ${busyLevel}] ]?ExitWhile())
        same => n,ExecIf($[ "${rrElement}x" == "x" ]?ExitWhile())
        same => n,NoOp( ${rrElement} - is busy)
        same => n,Set(rrElement=${SHIFT(rrArray)})
        same => n,EndWhile
        same => n,NoOp(--- ${rrElement} ---)
        
        ; Проверка совпадает ли провайдер
        same => n(check),ExecIf($[ "${PROVIDER_ID}x" != "${rrElement}x" ]?Set(NEED_RETURN=1))
        same => n,ExecIf($[ "${PROVIDER_ID}x" != "${rrElement}x" ]?return)
        ; Увеличиваем счетчик
        same => n,Set(GLOBAL(${rrElement})=$[${GLOBAL(${rrElement})} + 1])
        ; Счетчик активных звонков через провайдера
        same => n,Set(GROUP()=${rrElement})
        same => n,return
В строках вида «Set(PUSH(rrItem)=SIP-1601534775)» перечисляются идентификаторы провайдеров, среди которых следует равномерно распределять исходящие. Идентификатор можно скопировать в адресной строке браузера при редактировании провайдера.


В переменной «busyLevel» определяется максимально допустимое количество одновременных звонков через провайдера.

Для каждого провайдера потребуется описать исходящий маршрут. Шаблон в маршрутах должен быть одинаковым.

Обратно к инструкциям

faq/outbound-round-robin.txt · Последние изменения: 2023/04/28 10:39 — Портнов Алексей