Jump to content

Записи звонков Asterisk


Recommended Posts

Здравствуйте. Появилась потребность в подключении Asterisk к UBilling с возможностью записи разговоров.

Данный функционал(со стороны Asterisk) выполнил через MixMonitor.

exten => _XXX,1,MixMonitor(/var/records/${STRFTIME(${EPOCH},,%Y%m%d-%H%M%S)}_${CALLERID(num)}_${CALLERID(dnid)}.wav)

Сделал базу CDR, привязал к UBilling'у, но вот прослушать/скачать записи не получается.
Хочется понять в каком формате(имя и расширение) сохранять, чтобы он мог их прочитать.
P.S. В alter.ini аргументы ASTERISK_ENABLED=1, ASTERISK_CALLRECS_PATH=<папка>(права есть, группы назначены).

2021-02-08_21-23.png

Link to post
Share on other sites
9 минут назад, bos сказал:

Если есть возможность можете связать их через  поле filename в астере это допиливается легко 
или использовать готовый инструмент  http://prog-it.github.io/Asterisk-CDR-Viewer-Mod/ 

 

 

CDR Viewer Mod - это весьма заманчиво. Ранее рассматривал этот вариант. Оставил, как запасной) Есть ведь встроенная функция в UBilling, поэтому хочется воспользоваться ею.
Про поле filename, правильно ли понимаю, что при вызове, вместе с записью, добавляется запись в таблицу, где указано полученное имя?
Что-то вроде:

exten => 100,1,Set(filename="...")

 

Edited by progxaker
Link to post
Share on other sites

в зависимости от версии астера, начиная, по-моему, с 13го:
1) same => n,Set(CDR(filename)=${STRFTIME(${EPOCH},,%Y%m%d-%H%M%S)}_${CALLERID(num)}_${CALLERID(dnid)}.wav);

2)  нужно создать такое поле  в самой таблице ))
3*)   иногда, если вы пишите через cdr_adaptive_odbc в разделе  добавить алиасов) 

table=cdr

alias start => calldate

alias filename => filename

  • Thanks 1
Link to post
Share on other sites
22 минуты назад, bos сказал:

в зависимости от версии астера, начиная, по-моему, с 13го:
1) same => n,Set(CDR(filename)=${STRFTIME(${EPOCH},,%Y%m%d-%H%M%S)}_${CALLERID(num)}_${CALLERID(dnid)}.wav);

2)  нужно создать такое поле  в самой таблице ))
3*)   иногда, если вы пишите через cdr_adaptive_odbc в разделе  добавить алиасов) 

table=cdr

alias start => calldate

alias filename => filename


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

Link to post
Share on other sites

К сожалению без проблем не обошлось)

Запись разговора есть, запись в БД есть, но UBilling продолжает игнорировать файл.
Выставлял и 777, и запись менял(с .wav и без), однако не помогло.

2021-02-09_16-27.png

Link to post
Share on other sites

1) посмотрите код веб страницы которую вы используете для просмотра в ubilling, думаю вопрос в том что при выборке он ищет определенный столбец  где находится имя записи
2) как я вижу еще может тянутся название с СEL(но опять таки нужно понимать какое поле используется) что-то мне подсказывает что ориентироваться ubilling хочет на UNIQUEID
но без исходного кода страницы сказать что либо сложно

Link to post
Share on other sites
1 час назад, progxaker сказав:

и запись менял(с .wav и без)

ASTERISK_CALLRECS_FORMAT

 

1 час назад, progxaker сказав:

запись в БД есть, но

ASTERISK_CALLRECS_CEL_TAB_NAME

 

И вообще это все скорее вопросы к Pautiina.

Link to post
Share on other sites
2 часа назад, bos сказал:

1) посмотрите код веб страницы которую вы используете для просмотра в ubilling, думаю вопрос в том что при выборке он ищет определенный столбец  где находится имя записи
2) как я вижу еще может тянутся название с СEL(но опять таки нужно понимать какое поле используется) что-то мне подсказывает что ориентироваться ubilling хочет на UNIQUEID
но без исходного кода страницы сказать что либо сложно

 

2 часа назад, nightfly сказал:

ASTERISK_CALLRECS_FORMAT

 

ASTERISK_CALLRECS_CEL_TAB_NAME

 

И вообще это все скорее вопросы к Pautiina.

 

Насчёт CEL думал, но это уже более подробная таблица, и в документации указано что "ASTERISK_CALLRECS_CEL_TAB_NAME" необязательна(т.е. и так работать может). Про "ASTERISK_CALLRECS_FORMAT" в самом конфиге прописано, что "можете оставить пустым и тогда буду смотреть все файлы", но попробую снова.
Про исходный код, вроде PHP и JS не шифровал, но когда сам разбирал ногу сломал, вот и пришёл лечиться)

Link to post
Share on other sites
2 часа назад, bos сказал:

я в пхп не очень силен, может поправите, но селект идет к cel
https://github.com/nightflyza/Ubilling/blob/887dc31198f1b402bbf800806da1ce4be763affc/api/libs/api.asterisk.php#L842

 

Пытался разобраться в коде, и запутался.
 

if (!empty($this->recordingsPath)) {
	if (isset($each['app_data']) and in_array($each['app_data'], $allVoiceFiles)) {
		$fileUrl = self::URL_ME . '&astercallrecs=' . urlencode($each['app_data']);
		$data[] = $this->getSoundcontrols($fileUrl);
	} elseif (isset($each['recordingfile']) and in_array($each['recordingfile'], $allVoiceFiles)) {
		$fileUrl = self::URL_ME . '&astercallrecs=' . urlencode($each['recordingfile']);
		$data[] = $this->getSoundcontrols($fileUrl);
	} else {
		$data[] = '';
	}
}

 

recordingPath у меня есть, значит выясняем allVoiceFiles. В нём записывает ответ getCallsDir, но вот что ему пихать и что получается на выходе - загадка)

Link to post
Share on other sites
2 часа назад, bos сказал:

http://ubilling.net.ua/api_doc/classes/Asterisk.html#source-view
есть еще такой документ) и как вариант все же назвать имя файла ${UNIQUEID} и подключить CEL - о чем написано в святом писании документации 

 

Хех. Похоже, что придётся) О результатах отпишусь завтра. Или сегодня, если просто ${UNIQUEID} зайдёт)

Link to post
Share on other sites
2 часа назад, nightfly сказал:

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

 

 

Ха-ха) Переходим на китайскую поделку?) Если серьёзно, то что же, придётся использовать CDR Viewer.

Вам спасибо за потраченое время. Может позже кто заменит на HTML5)

Link to post
Share on other sites
годину тому, progxaker сказав:

Может позже кто заменит на HTML5)

Я у себя сегодня, уже быстренько все мигрировал на html5 audio :P

Причем оно сложноее, так как пришлось еще на лету конвертировать gsm в OGG чтобы оно игралось в браузере. С голым астериском все должно быть радикально проще.

spacer.png

 

пинайте Pautiina либо bobr-kun - всякое про астериск, это их психоделическое творчество.

Link to post
Share on other sites
2 часа назад, nightfly сказал:

Я у себя сегодня, уже быстренько все мигрировал на html5 audio :P

Причем оно сложноее, так как пришлось еще на лету конвертировать gsm в OGG чтобы оно игралось в браузере. С голым астериском все должно быть радикально проще.

spacer.png

 

пинайте Pautiina либо bobr-kun - всякое про астериск, это их психоделическое творчество.


Хм-м) Окей, буду пинать)

Link to post
Share on other sites
  • 3 weeks later...

Разобравшись в коде(две недели назад, хех), узнал то, что было необходимо - в каком формате необходимо подавать записи БД. На самом деле в любом, главное, чтобы столбец с названием файла назывался app_data или recordingfile. Дабы не пересоздавать базу, добавил в else изменённую запись.

if (!empty($this->recordingsPath)) {
    if (isset($each['app_data']) and in_array($each['app_data'], $allVoiceFiles)) {
        $fileUrl = self::URL_ME . '&astercallrecs=' . urlencode($each['app_data']);
        $data[] = $this->getSoundcontrols($fileUrl);
    } elseif (isset($each['recordingfile']) and in_array($each['recordingfile'], $allVoiceFiles)) {
        $fileUrl = self::URL_ME . '&astercallrecs=' . urlencode($each['recordingfile']);
        $data[] = $this->getSoundcontrols($fileUrl);
    } elseif (isset($each['filename']) and in_array($each['filename'], $allVoiceFiles)) {
        // То, что в each - это название столбца, в моём случае у меня всё было в filename
        $fileUrl = self::URL_ME . '&astercallrecs=' . urlencode($each['filename']);
        $data[] = $this->getSoundcontrols($fileUrl, urlencode($each['filename']));
    } else {
        $data[] = '';
    }
}


Дальше проблемы с плеером. У меня версия UBilling 1.0.6(не обновлял, потому что на тестовом стенде, хех), поэтому он не работает(может сейчас работает в новых версиях). Переписал на HTML5:
 

protected function getSoundcontrols($fileUrl, $filename) {
    $result = '';
    if (!empty($fileUrl)) {
        $playableUrl = $fileUrl . '&playable=true';
        $playerId = 'player_' . wf_InputId();
        $playControlId = 'controller_' . wf_InputId();
        if($filename != "" && file_exists($this->recordingsPath . $filename))
            $result .= wf_tag('audio', false, '', 'controls="" id="' . $playerId . '" preload="none" style="width:
 200px;"') . wf_tag('source', false, '', 'src="' . $playableUrl . '" type="audio/wav"') . wf_tag('audio', true);
    }
}


Можно ещё дописать проверку на то, указано ли расширение в alter.ini и другие аспекты, но думаю этим уже займутся сопровождающие.

Итого:
image.png.fee5426783b063255bf9822c28e63661.png

Edited by progxaker
Link to post
Share on other sites
5 минут назад, Ромка сказал:

2021-02-26_17-26.thumb.png.4ae1c417fefc55a8b18ade42d44673d6.png

Модуль Askozia монитор ... А топик называет "... Asterisk"... Хотя да, мне известно, что теперь используется одна функция для воспроизведения записей, но для понимания кода, оставил здесь своё решение. Да и в документацию неплохо бы добавить, что необходимо писать имена файлов в ранее указанные столбцы, а то не все шарят в PHP)

Edited by progxaker
Link to post
Share on other sites
  • 2 months later...

@nightfly "поклеил, как есть", а сам не дожидаясь, проверил у себя. Можно было не 300px, 285, потому что при диагонали 4:3 и "лупы" 80% есть небольшой отступ, но это лишь детали. Основной вопрос закрыт, тему можно закрывать.

Link to post
Share on other sites
7 минут назад, progxaker сказав:

потому что при диагонали 4:3

spacer.png

 

Только вчера мне втирали, что при разрешении 800*600 на ЭЛТ мониторе интерфейс не достаточно контрастно выглядит и не всюду помещается. Пощадите.

ЗЫ и да, я знаю что с аксессибилити в контексте экранных ридеров тоже пизец полный. А еще есть протанопия, дейтеранопия, тританопия etc...

Edited by nightfly
  • Haha 2
Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now
  • Recently Browsing   0 members

    No registered users viewing this page.

  • Similar Content

    • By mac
      Глюк в тому, що один (так - тільки один) mac адрес onu існує в білінгу у вигляді строки. Це трохи заважає.
      olt - bdcom gepon.
      Наскільки зрозумів, це виключно проблема реалізації snmpwalk у freebsd, де snmpwalk може на свій розсуд віддати mac адресу не як hex-string, а як звичайний string.
      Можливо snmpwalk тригериться на якомусь символі, мені невідомо.
       
      # tcpdump -vv -i em0 udp port 161 and host olt and host ub | grep "3320.101.10.4.1.1.241 ... olt.snmp > ub.47940: [udp sum ok] { SNMPv2c C="*****" { GetResponse(44) R=93278354 E:3320.101.10.4.1.1.241="8LO"W*" } } ub.47940 > olt.snmp: [udp sum ok] { SNMPv2c C="*****" { GetNextRequest(34) R=93278355 E:3320.101.10.4.1.1.241 } } snmpwalk -c***** -v2c -t5 olt .1.3.6.1.4.1.3320.101.10.4.1.1 SNMPv2-SMI::enterprises.3320.101.10.4.1.1.241 = STRING: "8LO\"W*" snmpwalk -Ox -c***** -v2c -t5 olt .1.3.6.1.4.1.3320.101.10.4.1.1 SNMPv2-SMI::enterprises.3320.101.10.4.1.1.241 = Hex-STRING: 38 4C 4F 22 57 2A  
      Це стосується таких параметрів у snmp конфізі bdcom
       
      [signal] MACINDEX=".1.3.6.1.4.1.3320.101.10.4.1.1" [misc] ONUINDEX=".1.3.6.1.4.1.3320.101.11.1.1.3"  
      За для усунення глюку спробував трошки змінити код і завдати тип snmp параметру явно у ./api/libs/api.ponbdcom.php у function collect()
      Це працює. Мабуть станеться у нагоді:
       
      # diff api.ponbdcom.php{.new,.bak} 37c37 < $onuIndex = $this->snmp->walk('-Ox ' . $oltIp . ':' . self::SNMPPORT, $oltCommunity, $onuIndexOid, self::SNMPCACHE); --- > $onuIndex = $this->snmp->walk($oltIp . ':' . self::SNMPPORT, $oltCommunity, $onuIndexOid, self::SNMPCACHE); 91c91 < $macIndex = $this->snmp->walk('-Ox ' . $oltIp . ':' . self::SNMPPORT, $oltCommunity, $macIndexOID, self::SNMPCACHE); --- > $macIndex = $this->snmp->walk($oltIp . ':' . self::SNMPPORT, $oltCommunity, $macIndexOID, self::SNMPCACHE);  
      P.S. Створив тему, а зараз міркую: а може це глюк у ПЗ olt. Оновлю фірмваре olt та перевірю...
       

    • By Plastilin
      Вітаю. Маю наступний комплект. Ubilling на Debian + Mikrotik CHR як маршрутизатор. Наче все запустилось, але виникло питання яке не вдається розрулити. Читав Wiki, ковиряв, читав знову Wiki, знову ковиряв - не допомогло.
      Чи можливо якось визначити конкретну IP адресу з пулу який видає Mikrotik клієнту через Radius? Мені пропонує обрати наступну вільну адресу з пулу при спробі зміни адреси?
      З цього з'являється додаткове питання, чи можливо контролювати доступ користувачам у яких IP назначений статично, тобто прописаний вручну? Наприклад при зміні статусу не активний - пхати до Firewall Mikrotik правила заборони доступу з IP адреси визначеної вручну, навіть якщо вона не отримана по DHCP.
       
      UPD: з першою частиною знайшов: IP_CUSTOM=1 в alter.ini 
    • By ppv
      Потрібно було витерти одну мережу, всі абоненти з неї були перенесені в іншу. Але світить що 6 IP зайняті, хоча вона повністю вільна.
       
      ID    Мережа/CID           RВсього IP        Використано IP ▾           Вільно IPСервіс
      6      172.16.70.0/23        506                    6                                       500
       
      Підкажіть як правильно це підчистити щоб видалити мережу.
    • By a_n_h
      Всем доброго дня и мирного неба!
        После многочисленных экспериментов выяснил, что на последних версиях freebsd  максимум удавалось прокачать до 14 ГБт суммарно трафика со 100% загрузкой процессора. На том-же железе но с установленной freebsd 11.2 прокачивается до 20-ти ГБт суммарно тестового трафика с загрузкой процессора около 50%. 
        Подскажите, что можно убрать или наоборот добавить в систему с freebsd 13,3 для получения аналогичного результата...
    • By sanyadnepr
      Приветствую всех.
      Подскажите пожалуйста где копнуть и нет ли проблемы со стороны протокола взаимодействия сити24 или возможно не учтена необходимая проверка в модуле сити24 в Ubilling, пока писал понял что похоже в проверке payID, но это не точно.  
      Недавно обнаружилось с сити24 начали прилетать дубликаты платежей, в целом платежей мало, два одинаковых запроса Pay с одинаковым transactionID и payID в одну секунду одному платежному ID при этом биллинг "думает" примерно чуть больше минуты и отвечает одним ответом <result>0</result>, сити24 утверждает что ответ они не получили и по протоколу дальше повторяет запросы дублем, биллинг ответ и так по кругу, сити24 спрашивает каким образом с одинаковым payID от сити24 билл продолжает обрабатывать запросы и пополнять абоненту счет раз в 5 минут примерно, на одну и туже сумму, ведь этот payID уже был обработан предполагают сити24 согласно протоколу.
      Конечно есть вопрос к сити24 зачем они дублем присылают два запроса, но они отвечают что эта ситуация учтена в протоколе и проблема на стороне биллинга, потому что он пополняет счет по уже обработанному одинаковому payID.
      При этом transactionID в дублях одинаковый, но с каждым новым дублем разный.
      Если зафаерволить запросы от сити24, но оставить возможность отвечать то после блокировки билл отправляет 2-3 минуты 6 ответов <account>0001</account>  <result>0</result>.
      После снятия блокировки, дубли и платежи нескольких проблемных абонентов прилетают так же по кругу, при этом и с некоторыми новыми пополнениями происходит аналогичная ситуация.
      В openpayz в платежах transactionID и не видно payID.
×
×
  • Create New...