Пользователь
0,0
рейтинг
13 ноября 2014 в 14:34

Разработка → Диалплан на LUA для Asterisk из песочницы

Приветствую всех. Когда-то тема использования языка программирования lua при написании диалплана в Астериске для меня стояла довольно жёстко. Дело в том, что мне сильно не нравится работать с различными GUI (типа FreePBX) при настройке Астериска.

Когда я всё настраивал в первый раз, работал с обычным линейным extensions.conf. Время шло, потребности в функционале телефонии росли. Язык lua постепенно немного изучил. И вот пришёл я работать админом в одну крупную компанию в нашем городе (одно крупное агентство недвижимости) — около 45 филиалов на тот момент было, примерно 650 — 700 пользователей, включая межгород и т.д. Там уже стоял Asterisk, но всё настроено было с использованием FreePBX.

Почти сразу руководство начало меня заваливать различными вопросами по наворотам Астериска. Например, хотели, чтобы при входящем звонке в какой-то филиал, звонки внутри филиала были распределены случайным образом. Хотели иметь запись разговоров в mp3, хотели сделать общую группу, куда можно было бы включить вообще все филиалы и при наборе какого-то номера, чтобы случайно попасть на один из филиалов и т.д. Задачи вроде простые, однако сидеть решать даже такие вопросы средствами графического интерфейса лично мне было не очень интересно.

Был ещё один важный момент — качество работы телефонии в целом на тот момент было просто ужасным. Голос постоянно булькал, звонки разрывались, абонента не слышно, сам астер часто крашился и т.д. Смотрю на файлик диалплана, а он размером в 16 мб. Открыл редактором текста — и что тут делать? Там строк в несколько миллионов.

Решил переделать, перекинув всё на lua. Примерно через пару дней после начала разработки я уже смог представить первый прототип диалплана на lua, вполне рабочий, но без существующих «фишечек» и «рюшечек». Заменил им весь старый конфиг и далее ещё в течение недели накидал основные навороты, которые хотело видеть руководство. Так же обновил самого астера до 11-й версии (на тот момент 11.3.0, кажется). Далее в процессе работы иногда поглядывал в файл диалплана и подпиливал то, что сам хотел или хотело руководство. В итоге астер с диалпланом на lua работал значительно быстрее и более стабильно, чем прошлый.

Условия в которых работала «станция»:

cpu: intel xeon e5520 (если не ошибаюсь)
ram: 24gb
и другие «железные» параметры, включая два гигабитных сетевых интерфейса и рэйд1
количество вн.абонентов: около 700
количество транков: около 10 (из которых 2 это провайдеры, остальные это gsm шлюзы addpack).
количество «городских» номеров: около 200 (150 номеров от одного провайдера и примерно50 или чуть больше от второго).

Городские номера тут были закреплены за каждым филиалом. За некоторыми филиалами даже по два или три номера. Поскольку все звонки из города прилетали в контекст, далее я делал разбор по did и передавал звонок на нужный филиал.

Средствами lua реализовал ring groups, сделал два варианта вызова абонента — случайное и по порядку перечисления в группе (за исключением занятых абонентов). Прикрутил lua-sql для записи собственной базы звонков (дополнение к cdr). Это было сделано вот для чего: сотрудник звонит клиенту на сотовый, клиент сейчас не захотел разговаривать (занят или ещё что); через некоторое время он перезванивает на определённый ранее номер и должен попасть к тому же сотруднику, который ему до этого звонил. Я сделал запись события «звонок на мобильный» в отдельную базу. Когда клиент с сотового перезванивает, я по событию «звонок с сотового» поднимаю прошлый звонок и отдаю клиента на нужного сотрудника. Запоминался только один такой сотрудник. Т.е. если этому клиенту позвонит ещё один сотрудник. то соответственно, звонок вернётся к нему.

Сейчас я уже не работаю в той компании, а там где сейчас — меняю старую АТС на Астериска и, конечно, использую старую свою наработку. Вспомнил, что тема интересна была не только мне. Ну а поскольку по этой теме информации крайне мало, решил накидать вот эту статью, вдруг кому-то пригодится.

Теперь перейду к самой сути темы — кодинг на lua. Описывать стадию включения модуля pbx_lua не буду — информации тут много. Например, сейчас у меня стоит Centos 6.6, там в стоке уже есть lua. Я докинул только пакет lua-devel и включил модуль pbx_lua в menuselect.

Дополнительно, если кто собирается использовать ручное подключение к mysql (или к другой базе), то лучше докинуть пакет lua-sql, предварительно установив luarocks и оттуда закачав это дополнение.

Далее в самом диалплане можно описать пользователей и правила набора, что-то типа того:

extensions = {
    };
    local_ext = {                                -- когда вн.абонент поднял трубку и набрал другого вн.абонента
	h = function()                          -- обработчик конца разговора (hangup)
	    app.stopmixmonitor()
	    d_status = channel["DIALSTATUS"]:get()
	    if d_status ~= nil then
		app.noop("Dial over with status:"..d_status)
-- например, если абонент не дозвонился, тогда затираем имя файла в базе cdr
		if d_status ~= "ANSWER" then channel["CDR(recordingfile)"]:set("") end
		app.noop("Good buy!")
		app.hangup()
	    end;
	    app.hangup()
	end;
	["_14XXX"] = call_local;
	["_21XX"] = call_local;
	["_4595"] = call_all;          -- это описание не номера, а группы номеров. при наборе звоним на случайны номер из группы
	["_*99"] = function()          -- это специально добавлял для принудительного включения dnd (занятно).
	    local cid, dnd
	    app.answer()
	    cid = channel["CALLERID(num)"]:get()
	    dnd = channel["DB(DND/"..cid.."/)"]:get()
	    app.noop("DND:"..dnd)
	    if dnd == "1" then
		channel["DB_DELETE(DND/"..cid.."/)"]:get()
		app.playback("beep")
		app.playback("beep")
		app.hangup()
	    else
		channel["DB(DND/"..cid.."/)"]:set("1")
		app.playback("beep")
		app.wait(1)
		app.hangup()
	    end
	end;
	include = {"mobile_out"};
    };

тут ["_XXномер"] — шаблон. Т.е. всё тоже самое, что и в обычном extensions.conf.
call_local — функция на которую ссылается данное описание. Т.е. при наборе номера, скажем, 14555, будет вызываться функция call_local. Так же эта функция может вызываться при входящем внешнем звонке.

function call_local(ctx,ext)
    local callerid,cf,uniq,chn
    local n,j,i

    n = string.sub(ext,3)                                           -- взяли последние 2 символа номера
    if n == "90" or n == "79" or n == "80" then         -- если оканчивается на 90 и т.д. тогда это звонок на одну из групп филиалов
	j = channel["CALLERID(num)"]:get()
	app.noop(string.format("Using ring group %s from %s",ext,j))
	dial_rg(shuffle(r_group[ext],nil))                     -- смешать номера в группе и вызвать
    end
-- если пользователь включил режим "отсутствую", тогда звонок полетит к нему на его сотовый
    cf = channel["DB(CF/"..ext.."/"..")"]:get()
    app.noop("CF:"..cf)
    if cf ~= "" then
	app.noop(string.format("Call forward detected from %s to %s",ext,cf))
	app.goto("mobile_out",cf,"1")
    end
    callerid = channel["CALLERID(num)"]:get()
    app.noop(string.format("Trying to local call %s from %s",ext,callerid))
    if ext ~= "4550" and (CheckChannel(ext)) ~= NOT_INUSE then return end
    uniq = channel.UNIQUEID:get()
    chn = channel["CHANNEL"]:get()
    app.noop(string.format("UNIQUEID: %s",uniq))
    app.noop(string.format("CHANNEL: %s",chn))
    app.noop(string.format("CALLERID_name: %s",callerid))
    app.noop(string.format("EXTEN: %s",ext))
    app.noop(string.format("CONTEXT: %s",ctx))
    record(string.format("%s-%s-%s",callerid,ext,uniq))
    if ext == "4550" then
	local support = CallSupport(callerid)
	if support == "failed" then return end
    end
    if ext == "4514" or ext == "4592" then
	app.noop("Redirect!!!")
	app.dial("SIP/4591,60,tT")
    end
    app.dial(string.format("SIP/%s,60,tT",ext))
end

Тут есть несколько проверок на некоторые группы и статусы. Например, 4550 — это группа технической поддержки. Для неё есть отдельная функция, в которой есть обработка занятости сотрудников, информирование «вн.клиента», запись журнала и сброс предупреждения о пропущенном звонке в тех.поддержку через jabber.

Если вызываемый абонент является группой, тогда смешать список и вызвать случайного абонента.

Почему я использую случайный метод вызова абонентов из групп? Филиалы — это, по сути своей, менеджеры продаж. Если включать последовательный вызов сотрудников филиала, то всегда у первых в списке будет продаж больше, чем у других (читинг). Аналогично обстоят дела и с методом mem-primari (кажется), при котором пользователь ответивший в прошлый раз будет игнорирован. Метод случайного смешивания более честный, ставит всех «продажников» в равные условия. Можно сделать конечно call-all (звонить всем одновременно), но тогда филиалы начинают жаловаться, что в филиале все телефоны «орут» одновременно это не удобно, шумно и т.д.

Для случайного вызова можно было бы так же использовать очереди, но я их почти не использую. Не знаю почему, так получилось.

Далее, входящие из города, описание:

from_trunk = {
             h = function()
         	app.noop("BBBBBBBLLLLAAAAHHHHHH!!!!!!!")
	        app.stopmixmonitor()
	        if d_status ~= nil then
		d_status = channel["DIALSTATUS"]:get()
		app.noop("Dial over with status:"..d_status)
		if d_status ~= "ANSWER" then channel["CDR(recordingfile)"]:set("") end
		exten = ""
		uniqid = ""
		app.noop("Good buy!")
		app.hangup()
	    end
	    app.noop("Some problem!!!")
	    app.hangUP()
	end;
	["f1"] = function(e)                                        -- если честно, не помню что я тут делал...
	    app.goto("local_ext",e,1)
	end;
	["_."] = foo;                                                   -- да да, это функция называется типа foobar...
	include = {"local_ext"}
    }


Тут я все внешние входящие я заворачиваю в foo.

function foo(ctx,ext)
    local chn
    tmptab.did = ext
    tmptab.rg = g_tab[ext]
    if tmptab.did == "99051000227736" then              -- тут я делал эксперимент с входящими со Скайпа. работают.
	app.noop("Skype TEST!!!")
	app.dial("SIP/14553,,tT,M(bar)")
    end
    tmptab.callerid = channel["CALLERID(num)"]:get()
    if string.find(tmptab.callerid,"88005550678",1) then app.hungup() end      -- кого-то забанил...
    if string.find(tmptab.callerid,"79",1) then                                  -- тут я тоже подзабыл, что-то связанное с определением сотовых номеров
	tmptab.callerid = "8"..string.sub(tmptab.callerid,2)
	channel["CALLERID(all)"]:set(tmptab.callerid)
    end
    chn = channel["CHANNEL"]:get()
    app.noop("CHANNEL:"..chn)
    if string.find(chn,"SIP/gsm_",1) then                                -- тут я вылавливаю входящие через gsm шлюзы
	app.noop("Found channel "..chn)
 -- через ранее созданную простейшую базу на mysql выловил абонента и отправил ему клиента
	num = sql.mobile_get(tmptab.callerid)
	if num then
	    app.goto("local_ext",num,1)
	end
    end
    app.noop("CallerID(num):"..tmptab.callerid)
    app.noop("by context:"..ctx)
    app.noop("DID:"..tmptab.did)
    app.set("CDR(did)="..tmptab.did)
    if tmptab.did == "4595" then call_all(tmptab.did) end                    -- 4595 это глобальная группа по всем филиалам
    app.answer()
    app.wait(1)

    j = channel["DB(ENUM/"..tmptab.did.."/)"]:get()
    app.noop("tag = "..j)
    if j == "ngs_rec" then
	dial_rg(shuffle(tmptab.rg),1)
    else
	if tmptab.did ~= "3471234" then                                  -- имейте ввиду, все номера тут вымышленные!!!
	    app.playback(mhold.comp_hello)
	    if tmptab.did == "3472345" then app.goto("local_ext","4591",1) end
	    ivr(tmptab.did)                                                      -- да, голосовое меню тут тоже есть, но показывать его не буду...
    	    dial_rg(shuffle(tmptab.rg),nil)
    	else
    	    app.noop("BLAH DETECTED")
    	    dial_rg(tmptab.rg,nil) end
    end
    app.noop("hungup?")
end


В данном случае определяю сотовые номера и внешние номера (did). Если звонящий звонит на местный сотовый (симка в gsm шлюзе), тогда беру последнего звонившего абонента и отправляю этого клиента к нему. Так же есть определение из списка ngs_rec. Тут номера заранее определены как «рекламные». Это был старый метод (потом переделал, но в этой версии файла из которой беру код данной доработки нет). Все рекламные номера отправляю на спец.номера в конторе и делаю отметку в базе, что был звонок на номер, указанный в рекламе.

Пока, думаю, хватит кода на данный момент. Если у кого-то появится интерес к переходу от старого диалплана к lua, думаю, смогу продолжить и разъяснить более детально некоторые вещи. Хотя, если кто-то уже знает, как программировать на Lua, проблем совершенно не будет.

В завершении хочу сказать, что, конечно, на сегодняшний день существует целая пачка разных навороченных решений, типа VoxImplant и подобных. Многим вообще не привычно работать в консоли и что-то своё кодить. Но, хочу заметить, что когда размеры компании большие (от 50 абонентов и выше), то выстраивание логики работы «станции» при помощи кнопочек и галочек в графическом интерфейсе в итоге могут приводить к проблемам. Выше в начале статья я приводил примеры про бульканье и обрывы. Диалплан на lua весит всего 24кб, 968 строк.

На нём работали почти 700 абонентов без каких-то проблем.

Всё. Всем до свиданья!
@Sayman_nsk
карма
6,0
рейтинг 0,0
Реклама помогает поддерживать и развивать наши сервисы

Подробнее
Реклама

Самое читаемое Разработка

Комментарии (54)

  • 0
    На VoxImplant работают 10ки тысяч абонентов без проблем :) а выстраивать работу можно с помощью кода на Javascript
    • –1
      это вы наверно про операторов связи, говоря о десятках тысяч абонентов. собственно, местный оператор связи startel использует, как это не странно Asterisk. Но дело не в этом. От JavaScript многие плюются — она сложнее, чем тот же lua, она медленнее и т.д. Кроме того, если в конторе всего 50 — 100 абонентов или как в моём примере под тысячу, зачем утруждать себя сложностями типа VoxImplant, когда можно всё собрать куда быстрее и проще, а главное бесплатно. Например, компания где сейчас работаю — тут около 20 абонентов. Согласитесь — ваять станцию из монстра voximplant или freeswitch будет себе дороже. астера я скидал за один рабочий день. Ещё один день потратил на вывод старых глюков, всё связал с голосовыми шлюзами и т.д. по мелочи. До этого тут стояла старая древняя Panasonic kx-ta6xx.
      • –2
        На VoxImplant это делается за 10 минут, примерно.

        github.com/voximplant/pbx

        Про тысячи абонентов — VoxImplant, например, используется в Bitrix24 для телефонии, а там много абонентов. Ну и вы никогда не сможете доказать, что развернуть и настроить Астерикс быстрее, чем сделать то же самое на VoxImplant. Уже не раз и не два проверяли. Про плюющихся от Javascript — это уже совсем странный аргумент, если языком пользуются миллионы разработчиков, то понятное дело, что от него могут плеваться больше, чем от менее популярного языка.
        • +2
          как я уже сказал — астериск решение бесплатное. в моём случае я потратил средства только на голосовые шлюзы для преобразования аналог <-> SIP. Сейчас во многих компаниях практикуется тема виртуалок. Засунуть тот же астериск в «своё облако» не составляет труда. таким образом экономия средств на отдельной железке по станцию. ещё момент — ваша облачная pbx это внешняя среда, которая требует для работы с собой постоянный выделенный канал. фактически, идеальным решением было бы купить ещё один канал от другого провайдера только для работы с voximplant. наличие только одного интернет канало будет сильно накладным и не безопасным. особенно в моменты. когда этот канал падает.
          не забываем, что в условиях «кризиса» все эти лишние затраты совершенно ни к чему. собственно, вот и ваши 10 минут + финансовые затраты.
          Если говорить про действительно крупный бизнес, где есть армия админов и разработчиков, то ваше решение скорей всего лучше Астериска. Учитывая то, что я в сфере недвижимости уже поработал и знаю основных (местных) игроков (из потребности. возможности и прочее), думаю, ваше решение сегодня будет не самым популярным. Можно вкратце глянуть на среднестатистического «потребителя» — это компания с численностью до 100 человек, штат ит из 1 или двух сотрудников, руководство «жадное» (денег не дают на всякие рюшечки), но при этом хотят получить много этих самых рюшечек. вот и получается, что решение на астериске да ещё и с Lua будет сильно шоколадно выглядить.

          • 0
            Когда денег не дают, но хотят их получать, то тут что-то неправильно. Админы же этому только способствуют поначалу: «да я все настрою, и бесплатно», не понимая, что тем самым взваливаю на себя за ту же з/п еще одну ношу.

            Не то чтобы я агитирую за VoxImplant (и уже тем более за голосовые фичи Битрикса24, точнее, за тех, у кого Битрикс войс OEM-но покупает, если не ошибаюсь), я лишь предлагаю трезво смотреть на вещи. Жадность собственника бизнеса и чересчур оптимистичные обещания не всегда суперопытного админа порой дают неприятные момент в дальнейшем.

            Смотря с позиций бизнеса, лучше понимать: хочешь телефонию — понимай, что она не бесплатна, если не в смысле цены АТС, то в цене дальнейшей поддержки, а также в затратах при смене админа (мало ли, уволится — у жадных хозяев и не такое бывает), разберется ли новый спец в том, что понастроил предыдущий.
            • +1
              да дело-то не в том, что админ наобещал, а в том, что у руководство свои взгляды на целесообразность тех или иных решений. Особенно в которые нужно вложить финансы. Уж извините, Астериску уже много лет, решение проверенное временем. Документации просто тонны, обновления и фиксы выходят регулярно. Да тут только ленивый не знает, что это такое и как с этим работать. Ну а раз админ ленивый, то на кой фиг такой нужен?

              Вопрос о том, что админ за туже зп взваливает на себя до кучи ещё работу — ну мне лично не сложно. Местами даже интересно. А проявив «лояльность» есть риск получить в какой-то момент прибавку к зп или стабильную премию и другие не материальные блага.

              Про какую цену дальнейшей поддержки речь? Какие затраты вы несёте при работе с Астериском? Какие затраты на его содержание? Уволился админ умеющий готовить астера — найдите ему достойную замену, а не всякое нубьё. Если взамен-таки приняли нуба, то он и с voximplant`ом делов там наделает.

              Если бы voximplant был бы в виде open source и его можно было бы как астера пихать на свои «железки», то скорей всего он был бы интересным решением.
              • 0
                > обновления и фиксы выходят регулярно
                и
                > Какие затраты вы несёте при работе с Астериском

                Кажется, Вы сами себе ответили :) Надо просто положить себе, что даже обновление, прилетевшее юзеру по автоматически включенному Windows Update-у, и вставшее само, небесплатно: они отвлекает предложением перегрузить машину (причем это нетрудно сотворить, просто промахнувшись мышью мимо «позже»), оно не умеет грамотно при этом закрыть документы и программы, оно может довести машину «до ручки» (а через сутки MS извинится и выпустит фикс, чтобы откатить прошлый бажный фикс). И это — примеры из десктопной жизни, где цена простоя — только неработа 1 человека (и связанных с ним).

                Что-то корежить на сервере — это работа админа. Непоставленная заплатка — не есть хорошо, с Астером-то. Поставленная — это время, нервы и знания. Вот это и есть расходы. Не надо просто считать, что то, чем Вы владеете (даже ваш телефон в кармане) для Вас бесплатно. Телефон есть эл-во и амортизируется, сервер с астером имеет риски взлома, риски нецелевого использования, риски выхода из строя, и требует внимания оплачиваемых сотрудников.

                А что Вам за Астер материальные и не очень блага упали — я за Вас рад. Спросите тут аудиторию: не все за такое плюшки получили ))
                • 0
                  Да о чём вы говорите, какие обновления на «живую»? Про cron слышали? Я вас уверяю — никто даже не заметит, что сервис обновился.

                  Зачем содержать в канторе нубо-админа? Вы считаете, что это дешёвое решение? Я вас уверяю — нуб админ это лишние затраты!

                  Я не знаю как вам сказать — ваше решение предполагает разовый и постоянные платежи, при чём не маленькие. В совокупности это дороже, чем платить хорошему админу его зп, платить оператору связи и платить за электричество.
                  На моей памяти уже есть пример, когда кантора отдала 600т.р. за облачную pbx, а получила сплошную проблему и геморой. Это ещё при том, что саппорт не постоянный, только на пол года, а дальше — как хотите так и крутитесь.

                  > что Вам за Астер материальные и не очень блага упали
                  а это тут вообще не причём. Я говорил не в контексте внедрения астера, а в общем. Если вас руководство не поощряет за хорошую работу — ну или вы так работаете или руководство у вас такое хорошее.
                  • +1
                    Вы меня путаете с ребятами из VoxImplant! :) Я никакого отношения к ней (ним) не имею, я только о том писал, что расходы нужно считать, и от того плясать.
                    • 0
                      хорошо.
                • 0
                  > Windows Update-у, и вставшее само, небесплатно: они отвлекает предложением перегрузить машину
                  ну вот видите, вы даже решения этой «проблемы» не знаете. А тем временем это давно решено и давно не есть проблема. Даже в винде такое пролетает совершено не заметно для юзера. Он никогда не будет отвлечён на нажатие кнопки «потом»…
                  • 0
                    Вы мне что пытаетесь доказать менторским тоном? Что вы знаете этот «секрет»? ) А я — должен его знать? А многие ли из тех, кто на Хабре читают и пишут? ))

                    Каждому свое. Но время — тоже небесплатно. Запуск платной АТС иногда выгоднее, чем запуск бесплатной, в которой долго пришлось разбираться.

                    Есть такая разработка ЕКБ-ная, АТС «Говорун» ( www.pragmatech.ru/ ) — ценник минимальный, зато поддержка и круг решаемых задач закроют запросы многих. Вам подойдет ли — вряд ли, думаю, привожу здесь лишь как пример. Но у них за исходные деньги клиента полный сервис вплоть до настройки. Т.е. тот же админ меньше сил убьет сразу при запуске, а далее мышкой разберется с мелочами. Опять повторюсь — для вас не факт что пойдет. У них маршрутизация забавная есть, по гео-признаку, кстати.
                    • 0
                      > Что вы знаете этот «секрет»? ) А я — должен его знать?
                      Ну конечно, а «админа» нанимают только чтобы винду переставлять))

                      Посчитаем? voximplant при круглосуточной поддержке с временем реакции в 1час ежемесячно просит 20т.р. (5000$ в год, да?) + нужно платить ещё 20т.р./м плохому админу, который сам никогда там ничего не решит, т.к. его наняли чисто чтобы винду переставлять (утрирую конечно, совсем немного). Не шибко ли многовато? Нормальный свой админ реагирует на появление проблемы в разы быстрее. Вы представляете себе, продажники будут сидеть час (а то и больше) без звонков, клиенты будут типа ждать да, руководство пусть вообще и не спрашивает что там случилось. Нормально так, за 5 тысяч зелёных, отличное решение. Вы знаете что такое SLA? В прошлой канторе я бы без зарплаты работал, если бы у меня такая реакция была. При SLA всего в 40м в месяц на все сервисы, а на некоторые и того меньше.
                      • +1
                        Первый абзац — ни о чем, я не «админ», и именно на это вам намекаю.

                        Второй — вы лучше адресуйте aylarov :), я НЕ агитирую за облачные решения. Вы только учитывайте цену админа не 20К, а поболее, и не одного, а хотя бы трех-четырех, если они в отпуск ходят и болеют иногда. ))

                        Еще раз — я НЕ продаю вам облачный сервис, и даже не агитирую за него!
                        • 0
                          > Вы только учитывайте цену админа не 20К, а поболее
                          я учитываю в данном случае оценку админа по своему региону — Новосибирск его окрестности. 20т.р. это зп очень посредственного админа, очень и очень. Можно сказать, приближенного к эникейщику (к переставлятелю винды).

                          >я не «админ»,
                          >я НЕ продаю вам облачный сервис
                          хорошо, а то мне «показалось» на мгновение, что вы агитируете за эту тему.
                        • +3
                          Правило астериска
                          берите только опенсурс решения под ваш астериск. Там тоже всё мышкой управляется
                          Нужно больше доп фич? Допишите 20 строк в диалплан. Забудьте на 5 лет.
                          Ездите в отпуска, делайте что хотите. Если вы не продаете телефонию, а используете для внутренних целей — любой фрилансер-админ решит все ваши проблемы.

                          Мы 5 лет продаем телефонию. Построена на астериске. Продаем в малых количествах.
                          Обновлялись 1 раз за 5 лет. Обновлялись когда вышел хороший фикс T38.
                          На самом деле астериск используется у нас не по назначению — Sip router с авторизацей.
                          В то время знал астериск, opensip не знал. За запуск получил немного денег. Потом процент с продаж. Вот вам вся поддержка.

                          Основные проблемы Fax, Nat, зависшая оконечка.
                          Боитесь. Воткните в офисе proxmox. Сделайте себе 1 рабочий и 9 резервных астерисков. Прикрутите к ним опенсорсную статистику. Уезжайте хоть на год. Один сломался — запустил второй и т.д.
    • +2
      Астериск в плане нагрузок ничем не хуже — переваривает при правильной настройке тысячи соединений.
      Стоимость владения и соотнесение их с возможностями — вот основной вопрос для бизнеса. На том же битриксе все работает крайне ограниченно по функционалу, о персонализации маршрутных карт можно даже и не мечтать. При этом выставляете такой ценник, что не каждая компания потянет. А главное — разбираться в настройках все равно нужно. Среднестатистический пользователь там явно закопается.
    • 0
      voxlplan/about — 2014 year — 500K calls/month / 10ки тыщ абонентов ( пусть 2 десятка ) = 25 звонков в месяц с абонента. Такие десятки тыщ и на астериске можно поднять :)
      • 0
        да, пожалуйста, поднимайте. Только не забываем, что нагрузки не распределяются равномерно и каждый второй заказчик, который решает переехать на VoxImplant с Asterisk делает это именно по причине нестабильности работы последнего. А остальные из-за скорости и функционала. Я же вам не доказываю, что все выберут VoxImplant, я объясняю, что он предлагает достаточно привлекательное соотношение цена/функциональность/скорость/масштабируемость.
        • 0
          вы просто не умеете их готовить. Думаю не стоит дальше продолжать, просто циферки из открытых источников ваши решил сопоставить, выходит не так круто.
        • 0
          А что не так с масштабируемостью? Вы меня извините, но даже операторы связи пользуется астером с числом абонентов под сотню тысяч и имеет несколько регионов. функциональность — название темы ещё раз прочтите, там язык программирования как бы указан. как говорится — любой каприз за ваши деньги. я не нашёл какой-то мегакрутой функционал у vox`а, который я бы не смог выполнить на астере. пример сложного функционала на примере диалплана в студию. отдельные фишки в виде web sdk в рассмотрение не берём.
          Про цены вообще смешно — я так же привёл в пример сопоставление цены и качества. В компаниях с жёстким SLA, voximplant будет сильно ущербен.
          • 0
            Ущербен будет Asterisk, если будет жесткий SLA и сотни тысяч абонентов, которые активно им пользуются. Вы сначала приведите примеры таких инсталляций и цифры по availability, а то очень много общих слов при отсутствии цифр, а как только начинаешь стыковаться с нормальными операторами, то там почему-то хотя бы Broadsoft да стоит, а не Asterisk. Если бы ваш любый бородатыми админами Asterisk был бы таким великолепным, то не было бы других продуктов в этой области — он же такой бесплатный и восхитительный, наверное, идиоты работают в компаниях, которые не пользуются. А теперь сходите в любой нормальный телеком, а не захудалый региональный, и посмотрите что там стоит и работает, думаю на этом будет вопрос исчеран.
            • 0
              Пожалуйста, РосТелеком — Сибирский округ — оборудование Nortel.
              Startel — Asterisk (+ael).
              Ребята из Ростелекома постоянно огребают. Качество связи — ацтой! но тут скорей всего проблема в головах/руках.
              У стартела за почти 3 года работы с ними, ни разу не было отвалов. Брали у них пул из 150 номеров.
              И что в вашем понимании значит захудалый региональный телеком?
              хотите цифр? астериск на рынке сколько лет? сколько народу им уже пользуется. Там количество в несколько миллионов.
              Я конечно согласен, что не любой open source продукт является 146% верным решением. Но астериск прекрасно вписывается. Если для вас «бородатый админ» значит умный и опытный, то у вас не верное представление о таких специалистах. или вы думаете, что админ должен только уметь винду переставить? о чём мы тогда говорим? у меня со sla нет проблем. как я уже сказал — аптайм вечный, доступность сервиса всегда была 100%. это ваша проблема (а не астериска), что вы не можете так работать.
              И приведите какие-то примеры, пожалуйста, мегафункционала, который нельзя реализовать на астере? примеры всяких web sdk в рассмотрение не берём.
              • 0
                Пример очень банальный — веб-разработчику (не администратору) нужно сделать телефонный сервис, тут астериск никак не поможет.
                аптайм вечный, доступность сервиса всегда была 100%
                — уже даже после этого серьезно не о чем разговаривать. Даже у железок не бывает 100% аптайм по опыту, а у вас и Астериск, и сеть, и железо — аптайм вечный, такие заявления не соответствуют вашей попытке выдать себя за мега крутого админа.
                У стартела за почти 3 года работы с ними, ни разу не было отвалов. Брали у них пул из 150 номеров.
                — детский сад. Мы работаем с Voxbone, у которых сотни тысяч номеров по всему миру, и да там Астериск и да там бывают проблемы, но очень редко, потому что у людей там действительно ровные руки. Просто ваше представление о мире где Астериск — это каждой бочке затычка, мягко говоря, неверное.
                • 0
                  веб-разработчику (не администратору) нужно сделать телефонный сервис

                  про какой телефонный сервис речь? можно более подробно?
                  Даже у железок не бывает 100% аптайм по опыту

                  по какому опыту? давайте откинем различные регламентные перезапуски, переносы и прочее. в моём случае для повышения аптайма оборудования у меня и 3 — 5 киловатные бесперебойники стояли и 10кВт генератор. На астере за последние полтора года я закрыл все обновления и прочие фиксы, поэтому там никаких ребутов не производилось. аптайм был прерван только в момент переноса серверной на новое место. поэтому я и говорю — у меня аптайм вечный. я сплю спокойно и да, я мега крутой админ.
                  и да там бывают проблемы, но очень редко,

                  вот видите, вы сами привели пример компании с сотнями тысяч абонентов. что не так? всё вписывается в мои представления которые я изложил.
                  • 0
                    про какой телефонный сервис речь? можно более подробно?
                    — про любой, хоть callback, хоть IVR, хоть IP PBX.

                    повышения аптайма оборудования у меня и 3 — 5 киловатные бесперебойники стояли и 10кВт генератор.
                    — причем тут электричество, то есть у вас само железо имеет вечный аптайм, ок :) поэтому становится понятно почему
                    давайте откинем различные регламентные перезапуски, переносы и прочее


                    На астере за последние полтора года я закрыл все обновления и прочие фиксы
                    — о, значит у вас очень новая версия с кучей функционала, баг фиксы, наверное, просто так называются баг фиксами. Не, ну если аптайм 100%, то действительно зачем баги фиксить.

                    Разработчики Астериска просто так, от нечего делать решили переехать на новый SIP-стэк, но вашему 100% аптайму это не важно. Ну и телефония — это не только номера и сигнализация.
                    • 0
                      про любой, хоть callback, хоть IVR, хоть IP PBX.

                      я извиняюсь. а вы астериск в глаза вообще видели? IP PBX — это, в том числе, Asterisk. Поэтому, какие, собственно, мега сложные функции можно реализовать на voximplant, а на астериске нет? вот мой пример — интегрируйте, пожалуйста, voximplant с 1С. всё ровно какая конфигурация, хоть комплекная, хоть самописная, хоть какая. Для астериска мне известно минимум два решения, одно платное, другое бесплатное. Бесплатное — ROM-Asterisk.
                      Всякие Битриксы давно умеют работать с астером, но они не интересны.
                      причем тут электричество, то есть у вас само железо имеет вечный аптайм

                      ВНЕЗАПНО, электричество влияет на аптайм, а при наличии в компании SLA ещё и на вашу заработную плату.
                      о, значит у вас очень новая версия с кучей функционала, баг фиксы, наверное, просто так называются баг фиксами

                      после обновления до 11.5 (на тот момент) я вырубил все обновления и прочие мероприятия на этом сервисе, т.к. в этой версии был нужный мне фикс. чтобы избежать варианта потери этого фикса (как часто бывает у кодеров — одно починили, другое сломали) я и вырубил все обновы. ни грамма не пожалел.
                      от нечего делать решили переехать на новый SIP-стэк,

                      извиняюсь за вопрос — от старого стэка они отказались? где офицальное заявление от разработчиков? они поддержали в своём проекте новый, да, и что? когда-нибудь я тоже у себя его внедрю, а пока поработаю на старом…
                      это не только номера и сигнализация.

                      конечно нет, вы почитайте ещё две мои статьи, там и ивр и межгород и def коды есть и всё остальное.
                      а по поводу того, что кроме астера есть и другие решения — конечно. Это называется конкуренция.
                    • +1
                      У любого сервиса/ПО/Железки всегда были есть и будут проблемы независимо от того NorTel это, Ваш любимый voximplant, или Asterisk. Вcе они выпускают обновления, кто то об этом говорит. Кто-то нет. Сообщество астериска открыто и если баг есть его не замалчивают, а открыто говорят- да есть- исправим. и исправляют. Вы хоть раз натыкались на баги CUCM? Я — да. Только вот чтобы получить обновление или фикс -необходимо платить за поддержку. И платить много. С астериском даже если проблема есть то в 99% случаев существует 3-5путей ее обхода.

                      Вы хоть раз пробовали сделать хоть одно нестандартное решение на Вендорском оборудовании? Все что я видел на VoiceImplant — это стандартные вещи для любой IP PBX, которые на том же астериске настраиваются 2 строчками, а не десятками строк джаваскрипта. Что уже касается железа типа cisco или panasonic — так тут вообще кастомизацией даже не пахнет. А если и пахнет, то тянет за собой еще и кучу денег потому что вендор вам просто так в своей железке возиться не даст бесплатно, потому что может дать это за деньги. И кстати не удивлюсь если у того же voximplant на бэкенде стоит тот же freeswitch и kamailio…

                      Что касается отказоустойчивости и многого многого другого — Вы просто действительно не умеете их готовить. Астериск или тот же FS это медиасерверы в первую очередь завязаные на обслуживание клиентов приложениями- хотите повысить работоспособность- вынесите авторизацию с Астериска на Kamailio/Opensips. масштабируйте сколько душе угодно. Не хотите/не умеете заморачитваться? платите деньги вендору, он заморочится за вас.

                      • –1
                        Все что я видел на VoiceImplant — это стандартные вещи для любой IP PBX, которые на том же астериске настраиваются 2 строчками
                        , да, конечно, 2мя строчками. Ну сделайте на Asterisk автоматизированный обзвон со собором результатов с нормальным TTS 2мя строчками или может быть outbound call-центр с предиктивным обзвоном вы 2мя строчками сделаете? Интересно было бы посмотреть. То что вы чего не видели на VoxImplant не означает, что этого нет или это нельзя/сложно сделать.

                        И кстати не удивлюсь если у того же voximplant на бэкенде стоит тот же freeswitch и kamailio…
                        Придется удивиться, не стоит.
                        • 0
                          может быть outbound call-центр с предиктивным обзвоном вы 2мя строчками сделаете?

                          вы реально никогда астериска в глаза не видели, а судите о его возможностях по надписи «open source».
                          количество строк для предиктивного набора, ну где то 6 или 8… примерно. для всяких обзвонов аналогично, ещё и sql (хоть какой) прикручу (строчек чуть по-больше будет, ну там на 10 или 15). загуглите тему циклов for и while, чтобы понять про что идёт речь и в целом взгляните на функционал астера и фс.
                          • 0
                            вы реально никогда астериска в глаза не видели
                            видел, и не один раз.

                            оличество строк для предиктивного набора, ну где то 6 или 8… примерно
                            понятно, дальнейших вам успехов.
                            • 0
                              и вам не хворать...)))
                        • 0
                          автоматизированный обзвон со собором результатов

                          4-7 строк диалплана
                          с нормальным TTS

                          1 строчка диалплана

                          • 0
                            Да-да, видимо, у нас разные понятия о нормальном TTS, тут пример нормального TTS — 84996775609. По поводу сбора результатов, видимо, мы про разные вещи.

                            P.S. Можете продолжать верить в исключительность Астериска пока веб-разработчики не начнут отнимать ваши рабочие места. Я тут никому ничего не доказываю, а просто объясняю, что есть и другой путь.
                            • 0
                              Да-да, видимо, у нас разные понятия о нормальном TTS

                              TTS библиотек куча. И как ни крути на астериске все их можно запустить одной командой.
                              Видимо вы сюда еще и IVR примешиваете… Ну тем печальнее.

                              Исключительностей не бывает. Астериск как и многие другие сервисы- всего лишь платформа. Если вы не умеете работать с какими либо платформами- это не значит что Ваша — исключительна. Это значит что вы шагаете по узкой дорожке- веб разработчик вы или Backend программист — не важно.

                              Важно понимать, что технологий тьма и представленная вами Voximplant не панацея. Да и по гибкости пока что далеко не лидер… Зрите в корень. Не могу не признать значимости frontend решений, но не web'oм единым живем.
                              • 0
                                пля… тут есть тег facepalm? причем тут frontend, вы хоть знаете как устроен VoxImplant? почитайте сайт на досуге как-нибудь. Он дает тот же TTS out-of-the-box, поэтому ну нужно никаких лишних комманд и плясок с бубном. Хотите плясать — пляшите дальше :) Я не могу тут ничем помочь.
                                • 0
                                  Он дает тот же TTS out-of-the-box

                                  Это для вас он такой

                                  Мне же как разработчику интересно использовать сторонние решения например.

                                  Вся соль спора в том что вы с Voximplant за рамки продукта никогда не выйдете, а я с моим asterisk/freeswitch/kamailio выйду. То есть вы будете существовать внутри системы как пользователь, а я же буду манипулировать системой добавляя то что мне нужно и убирая то что мне не интересно как разработчик.

                                  Все это ведет к тому многолетнему спору межу вендорскими решениями за кучу денег и ограниченными возможностями и открытыми системами, которые можно использовать как платформу.

                                  Voximplant останется сервисом, asterisk/freeswitch/ + kamailio/opensips останутся системами на которых строятся такие сервисы.
                              • 0
                                ivr:
                                function ivr(d)
                                    app.background(mhold.can_menu,"","","menu")
                                    app.waitexten(3)
                                    return
                                end
                                
                                -- some code here
                                
                                menu = {
                                	["1"] = function(c,e)
                                	    app.noop("Calling from menu by 1")
                                	    app.playback(mhold.m_thx)
                                	    CallSKS()
                                	end;
                                	["2"] = function(c,e)
                                	    app.noop("Calling from menu by 2")
                                	    app.playback(mhold.m_thx)
                                	    app.goto("local_ext","4690",1)
                                	end;
                                	["3"] = function(c,e)
                                	    app.noop("Calling from menu by 3")
                                	    app.playback(mhold.m_thx)
                                	    app.goto("local_ext","4579",1)
                                	end;
                                	["4"] = function(c,e)
                                	    app.noop("Calling from menu by 4")
                                	    app.playback(mhold.m_thx)
                                	    CallSKS()
                                	end;
                                    };
                                

                                в соседней теме подсказали как можно оптимизировать через read(), точнее, наворотить…
                                • 0
                                  И что это? :) Куда попадают результаты и в каком формате?

                                  P.S. мы могли бы устроить состязание — реализация какого-нибудь функционала обзвона на VoxImplant и Asterisk (голый, только что поставленный из пакета) и немножко логики добавить, чтобы в зав-ти от выбранного варианта делался куда-нибудь запрос по HTTP или переводился звонок на другой номер (типа на оператора).
                                  • 0
                                    Куда попадают результаты и в каком формате?

                                    какие результаты? все результат любого звонка или выбора клиента астер сам прекрасно пишет в cdr. зная номера любого оператора «КЦ» можно получить любую статистику за любой период, включая внешние номера на которые звонили клиенты, номера клиентов и номера операторов, ещё и с файлами записи разговора и со статусом разговора/звонка. У меня на прошлой работе такая статистика от КЦ прекрасно собиралась прям в 1С.

                                    мы могли бы устроить состязание

                                    я подумаю над вашим предложением, а пока сформулируйте более точно «свою хотелку».
                                  • 0
                                    Вы понимаете что вы хотите сопоставить сервис и платформу? Зачем использовать голый астериск когда на негоможно кучу всего навертеть? В этомего суть, что если чего то нет в готовом функционале- вот бери, допиши свой, Возьми API и прикрути. Базы данных (SQL,NoSQL), языки программирования (AMI,ARI,AGI интерфейсы, встроенный быстрыйпо стравнению с тем же javascript lua). И все это бесплатно. Да я потрачу время на создание того что я хочу, но зато в итоге я буду иметь в 10 раз более навороченную систему с любыми хотелками, которые только возможны. То же касается и freeswitch и kamailio/opensips (да, это ПО для несколько других вещей, но тем не менее гибкости его может позавидовать любой вендор)
                                    • 0
                                      С таким же успехом, можно взять SIP-стек и на нем все накрутить, и Астериск тогда тоже не нужен.
                                      • 0
                                        Ну так речь то о томи идет — кто во что горазд. Речь идет о таких вещах как нестандартное использование каких то вещей. IVR, очереди, конференции, звонки — это все стандартно. И чтобы это стандартное запустить ни на одной из платформ особого ума не надо. что на Voximplant, что на asterisk, что на freeswitch. Про какие баги вы там говорили я не знаю. Я несколько лет работаю с астериском и повидал довольно много интересного в силу больших проектов, в которых его функционал выжимается на 100%. Да- баги есть. но они есть далеко не на тривиальных вещах. Они есть там куда заглядывает 3% разработчиков. И я больше чем уверен- залезть в Voximplant и поковырять его — баги так же найдутся. Более того — Баги появляются с внедрением чего то нового. Нет нового нет багов. вот у Panasonic нет багов. Они 10 лет назад платформу разработали и сейчас продажи у них падают потому что за рынком они не успевают.

                                        В больших конторах ставятся платные АТС потому, что никто не хочет сам возиться с их проблемами, а проблемы есть, просто решает их ТП… Ну как решает… Делает тикет и так же корячится… просто перед руководством всегда можно отчитаться что мол вот, поломалось, производителю сказали — бейте производителя, не меня.

                                        Я в общем то к чему это все: Мы можем тут еще долго мериться — какой продукт лучше.

                                        Я предлагаю все таки понимать разницу между уровнями продуктов и прекратить этот никому не нужный спор. Так как в общем и целом мы все равно придем к тому, что в стандартных вещах у всех все примерно одинаково. Разные языки, разные API, но простота исполнения у всех примерно одного уровня. что IVR на VoxImplant построить, что на asterisk/freeswitch, только если вот захотеть как то IVR переделать так чтобы ни у кого не было такого проще все таки на asterisk/freeswitch так как API для разработки и дополнений там гораздо больше.


                                      • 0
                                        для этого и существует OpenSER, OpenSIP, Kalimo, а у asteriska более юрез френдли функции. Тот же синтез голоса, работа с кодеками (любыми), гоняние видео и т.д.

                                        Вы говорите «зачем 1С», если есть математика?
                                        1С — гибкая платформа
                                        Какой нибудь Рарус 1С дает конкретное решение на платформе 1С
                                        математика — основа
                          • 0
                            да ну чё говорить, человек с астером не работал. вот пример примитивной логики:
                            habrahabr.ru/post/159503/

                            касательно tts «всё украдено до нас» (с):
                            www.voip-info.org/wiki/view/Text-to-Speech+(TTS)
                        • 0
                          Берем женщину, платим 1000р за запись нескольких фраз.
                          Зачем текст ту спеч?
                          Берем любой язык(PHP, JAVA, C++), делаем свою логику, пихаем в dialplan астериска(asterisk AGI, Dead-AGI).
                          Всяких библиотек для правильных окончаний на русском и подобной ерези в свободном доступе много.

                          делали автообзвон в свое время, устраивал на 100%
                          И вообще зачем вести разговор о 2х строках?
                          Вы на 100% доверяете вашему ПО (точнее не вашему), у вас 50% кода будут проверки и тесты.
                          • 0
                            Можно по подробнее про С++ с астером? вы про диалплан на С++ или...?
                            • 0
                              www.voip-info.org/wiki/view/Asterisk+AGI
                              Возьмите за правило пользоваться этим ресурсом при возникновении вопросов по астериску :)
                              The AGI script communicates with Asterisk by sending AGI commands on standard output and receiving responses on standard input

                              Тут уже от творчества зависит. Можно насоздавать конечных контекстов под ключевые операции, а вот эти операции можно уже на своем языке.
                              За основу берите php-agi examples
                              Например:
                              habrahabr.ru/sandbox/45937/
                              • 0
                                ну я пока в сторону agi вообще не смотрю. особенно если это php. наслышан о тормознутости php-agi. к тому же имея в наличии lua, никакие agi уже как бы не требуются. но вот c++ это уже интересно…
                                • 0
                                  Вы предвзято относитесь к PHP, вам больше алгоритмистика нужна, нежели его функции.

                                  А STDIN читать и в STDOUT писать можно на любом языке.
                • 0
                  мой астериск «на продажу» как sip router и auth agent + billing
                  hsto.org/files/5f9/bae/614/5f9bae61419b415c9a0fc08635e2a24e.png

                  Нужно правильно всё делать.
                  А вообще когда речь идет о 1000 абонентах, то тут в сторону openSIP(openSER) нужно смотреть, а для спец фич можно использовать несколько asterisk'ов и балансировать нагрузку.

                  Телефония — дорогая штука.
                  Мы в нашу вложили железо (50к серверный 2U) + 35к за поднятие астериска + % админу с прибыли.
  • 0
    Зря фрисвич кстати монстром обозвали в комментах. Лично мне он больше астера нравится, он стабильнее в целом, тянет бОльшие нагрузки, а конфигать его не сложнее астера, в т.ч. и LUA поддерживается.
    Советую попробовать при случае для самообразования.
    • 0
      давно собираюсь его потрогать. монстр он в плане наворотов — например xml выглядит даже в примерах как-то монструозно. но руки боятся, а глаза… на оборот т.е.))))
      • 0
        Да вот я тоже так думал, а в итоге оказалось что этот хмл вполне удобен, конфиг получается более структурирован. Да, сначала разобраться конечно сложнее чем с extensions.conf (который, кстати, тоже поддерживается, можно использовать как временное решение),
        но зато потоооом… :)

Только зарегистрированные пользователи могут оставлять комментарии. Войдите, пожалуйста.