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 nightfly
      Ubilling 1.5.9 rev 9525 The Perfect Lock
       
      Зміни в структурі БД. alter.ini: нова опція GENERATORS_ENABLED, що вмикає модуль моніторингу генераторів. alter.ini: нова опція TB_GENERATORS_NOTIFY, що вмикає нотифікацію про запущені генератори в області сповіщень. alter.ini: нова опція PON_ONU_UNI_STATUS_COMPACT, що вмикає компактне відображення стану мідних портів на ONU. alter.ini: нова опція PONBOXES_MINIMAP, що дозволяє вмикати та вимикати міні-мапу, при редагування ПОН коробки. Новий модуль Єдинорожий телепорт: дозволяє просто та зручно переносити ваш робочий білінг на новий сервер. Модуль “Реєстрація користувачів”: виправлено проблеми сумісності з PHP 8.5. Модуль “Останні події”: викинуто дубову статку на мороз. Askozia PBX: інтеграція була давно непідтримуваною, викинуто на мороз, разом зі всіма опціями. Модуль Mapon: тепер використовує OmaeURL для взаємодії з API. Модуль “Мапа ONU”: в черговий раз покращення навігації між мапою та іншими модулями системи. Новий модуль Генератори: дозволяє моніторити стан генераторів, базово облікувати мотогодини, пальне та планувати ТО. Модуль ПОНізатор: тепер причини останньої дереєстрації ONU можуть визначатись також по серійнику ONU а не тільки за MAC. Модуль “ПОН Коробки”: покращено продуктивність відмальовки зв'язків коробок на мапах. Глобально: проведено чергову спробу зробити логування подій, що відбуваються навколо користувачів, якимось трішки більш притомним. RemoteAPI: новий виклик generators, що запускає скрипти обробки станів генераторів з автоматичним запуском. RemoteAPI: новий виклик gencontrol, для примусового запуску/зупинки генераторів за допомогою зовнішнього ПЗ. Бібліотека UbillingCache: виправлено проблеми сумісності з PHP 8.5. Бібліотека OmaeURL: виправлено проблеми сумісності з PHP 8.5. Бібліотека UbillingTelegram: вся робота з CURL перенесена до одного методу, покращено сумісність з PHP 8.5. Кабінет користувача: виправлено проблеми сумісності з PHP 8.5. UBinstaller: тепер при встановленні попередньо розгортає та конфігурує SphinxSearch. UBinstaller: Зібрано бінарні пакунки для FreeBSD 14.3 amd64 + PHP 8.5. UBinstaller: Зібрано бінарні пакунки для FreeBSD 15.0 amd64 + PHP 8.5.  
      Повний чейнджлог
      Оновлена демка
       
       

    • By maxkorn
      Доброго дня!
      На Mikrotik NAS, створив нову підмережу для клієнтів, все наче порядок, тільки помітив, що не створюються шейпери в Queues для клієнтів цієї підмережі.
      В логах Stargazer наступне:
      2025-12-29 09:05:57 - [Ubilling] - OnConnect started for user `xxasdb5rzm`:
      2025-12-29 09:05:57 - [Executer] - Success: Firewall entry was updated/created
      2025-12-29 09:05:57 - [Executer] - Error: Queue entry can't be updated, missing
      2025-12-29 09:05:57 - [Executer] - Success: Queue_tree entry was updated/created
      2025-12-29 09:05:57 - [Executer] - Success: DHCP entry was updated/created
      2025-12-29 09:05:57 - [Executer] - Success: ARP entry was updated/created
      2025-12-29 09:05:57 - [Ubilling] - QC: 6, elapsed time: 0.064 sec.
       
      При чому, на тому ж мікротіку є ще кілька підмереж, в яких все проходить нормально:
       
      2025-12-29 08:30:17 - [Ubilling] - OnConnect started for user `22zxp7u58x`:
      2025-12-29 08:30:17 - [Executer] - Success: Firewall entry was updated/created
      2025-12-29 08:30:17 - [Executer] - Success: Queue entry was updated/created
      2025-12-29 08:30:17 - [Executer] - Success: Queue_tree entry was updated/created
      2025-12-29 08:30:17 - [Executer] - Success: DHCP entry was updated/created
      2025-12-29 08:30:17 - [Executer] - Success: ARP entry was updated/created
      2025-12-29 08:30:17 - [Ubilling] - QC: 6, elapsed time: 0.602 sec.
       
      Налаштування аналогічні, в чому може бути причина?
    • By ProstoName
      Змінювали мережеву карту. Здається все поправив. Працює. Але є невелика проблема - після внесення коштів (коли абонент був відключений), інет в нього не з'являється. Тільки після заміни тарифу на інший (і потім вернувши тариф) в абонента з'являється інет. 
    • By ppv
      Собака-посилака перестала відправляти повідомлення. Підкажіть де шукати.
      Можливо таке після пропадання світла, сервер ребутнувся, але я не впевнений. Візуально все працює, крон працює, а повідомлення висять в черзі, смс така ж картина.

    • By camchatix
      Привіт!
       
      Є багато запитів, щоб інтернет не виключався у північ, а скажімо в день (сигналізації, камери під охороною і тд)
      При щоденній абонплаті - як знімати гроші не у 12:00 у північ, а наприклад у 11 годин дня ?
×
×
  • Create New...