Пожалуйста, войдите здесь. Часто задаваемые вопросы О нас
Задайте Ваш вопрос

Покритикуйте пожалуйста следующий код.

1

У меня конкретная задача. Используя базу данных CDR MYSQL которая установлен на сервере asterisk через интерфейс AMI передать в 1С историю звонков за один день. Есть много способов хранения CDR записей и обращения к ним, но в данный момент прошу раскритиковать то что написано ниже. При обращении в переменную v1 мы передаем информацию о канале для которого запрашиваются CDR записи, например "SIP/26". В переменную date1 передаем дату, например "2012-04-12", в переменную numbers список телефонов для которых нам нужно получить историю, например "26-7926524444-90-91-92", номера разделяем знаками "-". За один раз в 1С можно передать определенную порцию данных, в данном примере 20 строк, причем каждая переменная должна быть разделена символом запятая в кавычках, а каждая строка последовательностью из 5 точек. На всякий случай ограничиваем количество записей 200 за день.

Есть ли в коде приведенном ниже грубые ошибки?

exten => 0000555,n,Set(num=0)
exten => 0000555,n,Set(i=0)
exten => 0000555,n,Set(chan=${v1})
exten => 0000555,n,Set(date1=${v2})
exten => 0000555,n,Set(numbers=${v3})
exten => 0000555,n,Set(dbname=${AST_CONFIG(cdr_mysql.conf,global,dbname)})
exten => 0000555,n,Set(user=${AST_CONFIG(cdr_mysql.conf,global,user)})
exten => 0000555,n,Set(password=${AST_CONFIG(cdr_mysql.conf,global,password)})
exten => 0000555,n,Set(tmp_dir=${ASTLOGDIR})
exten => 0000555,n,NoOp()
exten => 0000555,n,Set(packet=20)
exten => 0000555,n,Answer()
exten => 0000555,n(NextNum),Set(i=$[${i} + 1])
exten => 0000555,n,Set(NumFilter=${CUT(numbers,,${i})})
exten => 0000555,n,Gotoif($[ ${LEN(${NumFilter})}=0 ]?SendRequest)
exten => 0000555,n,ExecIf($[${i}>1]?Set(SQLrequest=${SQLrequest} UNION ))
exten => 0000555,n,Set(SQLrequest=${SQLrequest}SELECT calldate,src,dst,channel,dstchannel,billsec,disposition,uniqueid from cdr where (DATE(calldate) BETWEEN DATE(${QUOTE(${date1})}) AND DATE(${QUOTE(${date1})})) AND ((lastapp="Transferred Call" AND lastdata like ${QUOTE(%/${NumFilter}@%)}) OR (lastapp="Dial" AND (channel like ${QUOTE(%/${NumFilter}-%)} OR dstchannel like ${QUOTE(%/${NumFilter}-%)} OR dstchannel like ${QUOTE(%/${NumFilter}@%)} ))))
exten => 0000555,n,ExecIf($[${i}>15]?Hangup())
exten => 0000555,n,Goto(NextNum)
exten => 0000555,n(SendRequest),System( mysql -sse '${SQLrequest} LIMIT 200' -u${user} -p${password} ${dbname}> ${tmp_dir}/${UNIQUEID})
exten => 0000555,n,Set(kls=${SHELL(cat ${tmp_dir}/${UNIQUEID} |wc -l)})
exten => 0000555,n,Gotoif($[ ${kls} = 0 ]?DelTmpFile:SendCDRHistory)
exten => 0000555,n(SendCDRHistory),Set(ostatok=${kls})
exten => 0000555,n(SendNextPacket),Set(packet=${IF($[ ${ostatok} < ${packet}]?${ostatok}:${packet})})
exten => 0000555,n,Set(num=$[${num} + ${packet}])
exten => 0000555,n,UserEvent(FromCDR,Channel: ${chan},Date: ${date1},Lines: ${QUOTE(${SHELL(cat ${tmp_dir}/${UNIQUEID} |head -n '${num}'| tail -n '${packet}'| sed 's/|/'\',\''/g'| sed 's/[\t]/'\',\''/g'|sed 's/$/...../g'|tr "\n" " ")})})
exten => 0000555,n,Set(ostatok=$[${ostatok}-${packet}])
exten => 0000555,n,Gotoif($[ ${ostatok} > 0 ]?SendNextPacket:DelTmpFile)
exten => 0000555,n(DelTmpFile),System(rm ${tmp_dir}/${UNIQUEID})
exten => 0000555,n,ExecIf($[${kls}>0]?UserEvent(Refresh1CHistory,Channel: ${chan},Date: ${date1}))
exten => 0000555,n,Hangup()
удалить закрыть спам изменить тег редактировать

спросил 2012-04-15 18:39:19 +0400

jorikfon Gravatar jorikfon flag of Russian Federation
130 9 1 10
http://www.telefon1c.ru/

обновил 2012-04-15 18:40:24 +0400

6 Ответов

4

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

1) REALTIME используйт, будет мменьше строчек.

2) использование system конкретно замедляет выполнение.

3) почемуто предполагается что выполнение будет продолжено если пользователь положит трубку

4) второй систем вызов требует -f ключа.

5) в цикличных диапланах рекомендуется добавлять wait(0.1)

вообще все это зло. правильно сделать скрипт который будет передавать.

ссылка удалить спам редактировать

ответил 2012-04-15 19:01:51 +0400

meral Gravatar meral flag of Ukraine
23347 24 20 177
http://pro-sip.net/

обновил 2012-04-15 19:02:29 +0400

Comments

  1. Вы имеете в виду http://voip.rus.net/tiki-index.php?page=Asterisk+cmd+MYSQL или что то другое?
  2. Скорость не критична, если это до 5 секунд.
  3. Звонит не пользователь. Оригинация из одного Local канала в другой.

exten => 0000999,1,NoCDR()

exten => 0000999,n,Answer()

exten => 0000999,n,Wait(60)

exten => 0000999,n,Hangup()

............. .............

Action: Originate

Channel: Local/0000999@mikoajamdll

Context: mikoajamdll

Exten: 0000555

Priority: 1

Variable: v1=SIP/26

Variable: v2=2012-04-12

Variable: v3=26-7926524444-90-91-92

4 и 5. Ок изучу этот момент.

Пока придумался вот такой скрипт. Есть рекомендации генерировать XML и передавть через http, но пока требование чистый AMI интерфейс.
Работает мгновенно, но база записей очень малеькая, около 5000 строк пока.

jorikfon ( 2012-04-15 19:31:30 +0400 )редактировать

нет. я имею в виду realtime. именно то что сказал.

meral ( 2012-04-15 21:06:03 +0400 )редактировать

Не пойму как связать таблицу CDR и Realtime. Намекните хоть куда копать.

jorikfon ( 2012-04-15 21:52:02 +0400 )редактировать

добавить класс в extconfig. откройте новый вопрос "как смотреть таблицу CDR через Realtime", напишу.

meral ( 2012-04-16 09:52:32 +0400 )редактировать
1

Использованиее такого - есть большая грубая ошибка.

Чем не программится для AGI ?

Такое использование system вообще кощуство, особенно с таким количество пайпов того же sed , использованию которому Вам нужно либо поучится , либо (что лучше) отказаться. Да еще всё для одного экстеншена в одном контексте.

Судя по всему снюхано прилично было прежде такое родить.

ссылка удалить спам редактировать

ответил 2012-04-15 19:26:48 +0400

zzuz Gravatar zzuz flag of Russian Federation
7174 2 6 75
http://line24.ru/

Comments

Можете по существу без эмоций? Как мне поможет в данном случае AGI? Какую именно часть туда перенести?

jorikfon ( 2012-04-15 20:43:04 +0400 )редактировать

все туда перенести

meral ( 2012-04-15 21:05:36 +0400 )редактировать

В диалпане должен быть в диаплан , в скриптах должны быть скрипты.

zzuz ( 2012-04-15 21:40:53 +0400 )редактировать

Как мне при помощи AGI выполнив запрос разбить его на порции и отправить userevent обратно. Все AGI команды просмотрел, ничего похожего на UserEvent нет. Ткните носом кто в курсе.

jorikfon ( 2012-04-15 21:57:39 +0400 )редактировать

Посомтрел маны по Mysql, похоже от сидов я могу отказаться используя запрос, который правильно разобъет поля и стоки с нужными символами.

SELECT a,b,a+b INTO OUTFILE "/tmp/result.text"

FIELDS TERMINATED BY ',' OPTIONALLY ENCLOSED BY '"'

LINES TERMINATED BY "\n"

FROM test_table;

jorikfon ( 2012-04-15 21:59:12 +0400 )редактировать

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

Для эвентов нужно использовать обьекты класса AMI.Manager , которые реализованы в соответствующих библиотеках. для pyasterisk это обьект класса manager.Manager

zzuz ( 2012-04-15 22:37:56 +0400 )редактировать

Вот что то похожее нашел в интернетах, оно?

$agi->exec("UserEvent", "UserDeviceAdded|Data:{$user},{$device}");.

jorikfon ( 2012-04-15 23:06:44 +0400 )редактировать

это тоже самое exten=0000555,n,UserEvent(), типа оно.

zzuz ( 2012-04-15 23:32:13 +0400 )редактировать

Ок попробуем через AGI. То что получилось выложу поругаете :)

jorikfon ( 2012-04-16 08:47:38 +0400 )редактировать

Зачем вам AGI??? Какой сакральный смысл? Сделайте отдельный скрипт на стороне астериска, который по хттп будет возвращать вам всю нужную информацию.

switch ( 2012-04-16 11:40:45 +0400 )редактировать

Так мне надо в  AMI передать, других каналов нет, для других каналов может потребоваться отдельную библиотеку для 1С писать, это очень жирно для этой конкретной задачи.

jorikfon ( 2012-04-16 12:11:30 +0400 )редактировать

ну так смултиплексируйте. короче пока нормально не сделаете, так и будет у вас все глючить.

meral ( 2012-04-16 12:18:50 +0400 )редактировать

Блин, в Askozia нет библиотеки для исполнения запросов к sqlite3 через php. Красоты не получится. Пойду в Asterisk + FreePBX поковыряю что там по есть.

jorikfon ( 2012-04-16 12:23:56 +0400 )редактировать

meral да у меня не глючит пока, работает норм. Но хочется сделать правильно. Ищу варианты.

jorikfon ( 2012-04-16 12:26:26 +0400 )редактировать

А что, на Askozia свет клином сошелся? Это дистрибутив для слабых и тощих систем, ваши мудреные обработки будут для них непосильной ношей. Может проще в аскозию добавить модуль PHP для sqlite и не париться? Кстати с PHP вы умеете работать?

switch ( 2012-04-16 20:38:49 +0400 )редактировать
1

Ух, какие жаркие обсуждения здесь у вас!!! :-)
Это даже хорошо, что такие жаркие баталии разыгрались
«В спорах рождается истина»
Хочется подытожить все здесь сказанное и прочитанное.
1.Представленный код все забраковали.
2.Приложение, претендующее на массовость должно быть несложным в установке и настройке
ибо, судя по форуму, как работает Asterisk изнутри разбираются, три четыре
человека, а у остальных стоит Elastic, TrixBox и.д.
3.Приложение должно мягко интегрироваться без грубого вмешательства в уже работающую систему.
4. Приложение должно легко взаимодействовать со всеми реинкарнациями 1С, а этого как я
понял можно достичь путем применении механизма Web-сервисов.
P.S.
Дополняйте если я что-то забыл, или в чем то заблуждаюсь! ;-)

ссылка удалить спам редактировать

ответил 2012-04-18 06:55:57 +0400

bolshoy_plohish Gravatar bolshoy_plohish
1388 25 20 38

Comments

  1. Ну судя по всему да.

  2. Именно так, сейчас настройка это скопировать файл miko_extensions.conf и проинклюдить его. Многих даже эта опреация вводит в ступор :( Куда уж там советовать перекомплить asterisk....

  3. В точку.
  4. Веб сервисы полноценно не доступны без сервера 1С, а имея Сервер 1С + Вебсервисы, это все не нужно. Мы будем напрямую ловить CDR записи, и складывать в регистр сведений. Сервер 1С стоит 36 и 74 рубля, не каждая контора на эти траты идет. А использовать локальную версию 1С + вебсервисы, этот тот же костыль, как говорил мерел из костей мамонта в мегаполисе.
jorikfon ( 2012-04-18 08:55:08 +0400 )редактировать

А как ваш продукт будет взаимодействовать с 1С на Linux при использовании тонких клиентов?

А еще есть такая экзотика как etersoft.

Что касается цены на 1С….

Так кто не может купить серверную 1С у вас точно покупать ничего не станут!

bolshoy_plohish ( 2012-04-18 10:49:12 +0400 )редактировать

Тем не мение покупают многие при отсутствии сервера 1С. Для Linux мы будем писать компонент после того как 1С анонсирует и выложит технологию внешних компонент и саму платформу под Linux. Обещали до конца квартала. Под web для Linux после того как напишем для толстого. Под wine и etersoft не будем ничего делать точно.

jorikfon ( 2012-04-18 11:06:26 +0400 )редактировать

---А как ваш продукт будет взаимодействовать с 1С на Linux при использовании тонких клиентов? В офисе МИКО все клиенты тонкие и работают на Linux, но 1С запущено в терминальном режиме в Win 2008 R2. Что вы имеете ввиду под 1С на Linux? wine или Web?

jorikfon ( 2012-04-18 11:12:24 +0400 )редактировать
1

+приложение должно быть МОДУЛЕМ для freepbx. чтоб его можно было через веб поставить и все работало. что кстати не так уж и сложно.

meral ( 2012-04-18 12:29:07 +0400 )редактировать

А еще надо чтобы этот модуль мог открывать интерфейс AJAM, т.е. вносил изменения в manager.conf и http.conf ну и в iptables )

jorikfon ( 2012-04-18 16:52:31 +0400 )редактировать

легко. стоимость разработки возрастает всего в 50000 раз.

meral ( 2012-04-18 17:26:54 +0400 )редактировать
1

По мотивам темы: подключился к одному из серваков и вспомнил что он с 1С связан по SOAP. Привожу код, может кому-то пригодится:

Скрипт, который делает SOAP запрос

<?php

//$anum=111;
//$bnum=222;

$data= '<?xml version="1.0" encoding="UTF-8"?>
<soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/">
    <soap:Header/>
    <soap:Body>
        <m:WebLNR xmlns:m="http://www.sample-package.org">
            <m:pn xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">'.$bnum.'</m:pn>
            <m:id xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">'.$anum.'</m:id>
        </m:WebLNR>
    </soap:Body>
</soap:Envelope>';
$host = "192.168.1.12";
$url = "WebLNR.1cws";

$opts = array('http' =>
                array(
                    'method'  => 'POST',
                    'header'  => 'Content-type: text/xml',
                    'content' => $data
                )
);

$context  = stream_context_create($opts);
$result = file_get_contents("http://$host/$url", false, $context);

echo $result;

Так он используется в диалплане

[macro-url-call]
exten => s,1,noop(${CURL(http://127.0.0.1/soap.test.php?anum=${ARG2}&bnum=${ARG1})})

[from-internal-custom]
exten => _00XXX,1,Macro(url-call,${EXTEN:2},${CALLERID(num)})
exten => _00XXX,n,Dial(LOCAL/${EXTEN:2}@from-internal,30,T)
exten => _00XXXX,1,Macro(url-call,${EXTEN:2},${CALLERID(num)})
exten => _00XXXX,n,Dial(LOCAL/${EXTEN:2}@from-internal,30,T)

В группах или очередях FreePBX перед нужным номером подставляем 00 и тогда звонок направляется с вызовом CURL

ссылка удалить спам редактировать

ответил 2012-04-23 08:43:30 +0400

switch Gravatar switch
8334 11 7 92
http://lynks.ru/

обновил 2012-04-23 08:46:34 +0400

Comments

я вот недавно использовал curl в 1.8 для отмечаний конца звонка(ну атк было уже написано). заметил что начиная от 20cps или 150 звонков он по кактойто странной причине начинал откладывать выполнение, вплоть до 10 минут разницы. короче убрал эту часть в fastagi.

meral ( 2012-04-23 12:18:39 +0400 )редактировать

ну у меня нагрузки меньше на порядок и версия 1.4, такого не заметил.

switch ( 2012-04-23 12:23:12 +0400 )редактировать

на малых нагрзуках все ок. тестировали на стресс тест. fastagi выдает 600+ звонков с временем 15 секунд,а вот curl из астериска резко затыкается на какомто количестве.

meral ( 2012-04-23 12:26:31 +0400 )редактировать

ну вот, а я подумывал CURL использовать для получения данных о маршрутизации в нагруженной системе ;)

switch ( 2012-04-23 13:54:52 +0400 )редактировать

ну пока лучшим методом является perl Asterisk::Fastagi. токо вот памяти жрет многовато. вообще наверно в curl гдето в исходниках лимит есть. ибо оно очень четко после какогото предела начианет расти. но мне было проще в перл перенести. можно еще userevens слать и там уже их в очереди пулом через curl отправлять. но лучше конечно использовать прямые инсерты в базу.

meral ( 2012-04-23 14:49:06 +0400 )редактировать

Я остановился на FuncODBC, вроде работает... Но пока не тестил под большой нагрузкой.

switch ( 2012-04-23 15:02:14 +0400 )редактировать

ну там тоже есть ограничения. на количетсво одновременных коннектов к базе. правда большое и задается resodbc.conf. я обычно REALTIMEHASH использую. он в 1.8 вменяемый.

meral ( 2012-04-23 15:05:25 +0400 )редактировать

Я так понимаю коннект один от астериска, не? баз у меня немного, две-три. REALTIME_HASH врядли подойдет, т.к. запросы некоторые достаточно сложные.

switch ( 2012-04-23 15:13:23 +0400 )редактировать

нет,конектов много. но не неограниченно(массив там).

meral ( 2012-04-23 15:37:11 +0400 )редактировать

Интересно как отнесется  Asterisk если я таким образом по номеру абонента буду у 1С спрашивать его название и затем отображать как CallerID на телефоне. Реально?

jorikfon ( 2012-05-16 15:49:30 +0400 )редактировать

астериску пофигу.

meral ( 2012-05-16 18:19:34 +0400 )редактировать
0

Если у вас CDR записи лежат в базе Mysql, то зачем вообще для выгрузки списка звонков обращаться к Asterisk? В смысле, какие преимущества у этой схемы перед скриптом на Perl, Shell, PHP с выборкой в Mysql?

ссылка удалить спам редактировать

ответил 2012-04-17 12:18:08 +0400

matperez Gravatar matperez
255 18 6 19

Comments

они похоже просто не имеют 1c программиста. смотри коментарии.

meral ( 2012-04-17 12:21:04 +0400 )редактировать

В данной задаче нам необходимо получать данные от Asterisk используя ТОЛЬКО интерфейс AMI.

jorikfon ( 2012-04-17 14:28:16 +0400 )редактировать
-2

jorikfon, моему мнению не поверили??? Мы с Николаем обсуждали ваш быдлокод в марте. На всякий случай выложу сюда часть переписки, которая имеет отношение к теме:

Мы старались делать нативно и все в рамках функционала голого asterisk

Ну, ребят, вы не ленивые... Конечно не мне советовать, но я бы сделал по-другому (готовьтесь к критике ). Куча диапланов, вызывающих обработку в астериске выглядит как-то аляповато. Ладно еслиб там была обработка звонковых сущностей, но там вызывается множество раз шелл. К примеру в обработках факсов - аж восемь раз. Почему бы это просто не запихать в один шелл скрипт? Списывать это на то, что есть только голый астериск?

Плотно косяки не искал, но глянул, к примеру, на процедуру поиска файла записи. Она не подходит в принципе: 1) На один uniqueid или запись CDR может быть несколько файлов записей. 2) Де-факто астериск не хранит в БД имя файла в поле userfield. У меня это поле вообще используется для других целей. Равно как и не существует поля recordingfile. 3) Конструкция SHELL(find ${monitor_path} -name... убьет сервак на мертво если записей будет 100...200 тыщ. Если, конечно, этот сервак не двухпроцессорный восьмиядерный ксеон, обслуживающий 50 абонентов. А у меня миллион файлов записей - это нормальное явление. Поиск по такому массиву при соответствующем оснащении происходит в течении долей секунды. Дальше косяков тоже навалом. Например получение списка звонков - тоже кошмар. в запросе везде применяется Like. Даже при полумиллионе записей это даст серьезные тормоза. А ведь в это самое время сервер телефонии должен обрабатывать звонки...

Питон или перл есть почти везде. В 99% случаев есть или можно поставить php (тем более раз подразумевается наличие MySQL). Для работы пхп не нужен httpd. Он может работать как шелл скрипт, а в вашем случае - как AGI скрипт. Из пхп можно поднимать соединение к SOAP сервису в 1С. И все.

У меня это реализовано просто: астериск во время звонка запрашивает URL. если этот URL напрямую целевой системой не поддерживается, то делается примитивная проставка, которая POST запросы конвертит в SOAP и располагается на локальной машине. Обратная связь так же делается проще всего через http сервис но уже на стороне VoIP сервера.

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


Александр, приветсвую. Спасибо за критику, возможно где-то вы правы, и нам стоит доработать изменить наши скрипты, но давайте по порядку.

Мы старались делать нативно и все в рамках функционала голого asterisk

Ну, ребят, вы не ленивые... Конечно не мне советовать, но я бы сделал по-другому (готовьтесь к критике ). Куча диапланов, вызывающих обработку в астериске выглядит как-то аляповато. Ладно еслиб там была обработка звонковых сущностей, но там вызывается множество раз шелл. К примеру в обработках факсов - аж восемь раз. Почему бы это просто не запихать в один шелл скрипт? Списывать это на то, что есть только голый астериск?

Не задумывались над тем что 8 раз вызывать шел хуже чем один раз большой.

Где-то есть по этому поводу изыскания иди сугубо личное мнение?

Вообще это известная истина. Дело в том, что при каждом вызове шелла запускается интерпретатор sh со всеми вытекающими. Вы его вызываете в 8 раз чаще, чем могли бы. Такой подход грозит утечкам памяти при сколь-нибудь серьезной нагрузке. Ну а то, что не

задумывались это отягчающее обстоятельство ;) Избаловали вас быстрые процессоры ;) кстати, на какой системе тестировалась производительность рассматриваемой процедуры?

Плотно косяки не искал, но глянул, к примеру, на процедуру поиска файла записи. Она не подходит в принципе:

1) На один uniqueid или запись CDR может быть несколько файлов записей. У меня такого не встречается, обычно один звонок одна длинная запись,

а если записей много, то уже никак это через CDR не сделать, нужно что-то изобретать, или у вас другое мнение?

2) Де-факто астериск не хранит в БД имя файла в поле userfield. У меня это поле вообще используется для других целей. Равно как и не существует поля recordingfile.

Дефакто, не хранит, но добавляем одну строчку в диалплан и начинает хранить. Поле recordingfile появилось в последней версии freepbx и

заполняет поле именем файла записи!

А у нас далеко не последний freepbx :)

3) Конструкция SHELL(find ${monitor_path} -name... убьет сервак на мертво если записей будет 100...200 тыщ. Если, конечно, этот сервак не двухпроцессорный восьмиядерный ксеон, обслуживающий 50 абонентов. А у меня миллион файлов записей - это нормальное явление. Тут я пока не столкнулся с проблемой, про количество файлов записей в нашей системе я не в курсе. Эту конструкцию приходится применять, потому что файлы записи ночью конвертируются в mp3 и раскладываются по папкам, благо эта операция очень редко вызывается, когда пользователь хочет прослушать свой разговор. Проблем не было, но наверное подумать стоит.

Поиск по такому массиву при соответствующем оснащении происходит в течении долей секунды.

Это где в вашей сиситеме?

У нас сделано так: при запуске интерфейса отчетов запускается переиндексация тех файлов, которые хранятся в ../monitor. данные сохраняются в БД. Каждую ночь система все эти файлы раскладывает по каталогам, по одному на каждый день. При переиндексации не учитываются те каталоги, которые уже обработаны ранее. Так как за день редко набегает больше 10 тыс. файлов, все это происходит быстро и незаметно для пользователя. Отчет о звонках в нашей системе открывается почти мгновенно даже на младших системах, каждому звонку ставится соответствие записи разговоров, даже если их несколько. Соответственно для внешних систем эти данные доступны через БД

Дальше косяков тоже навалом. Например получение списка звонков - тоже кошмар. в запросе везде применяется Like. Даже при полумиллионе записей это даст серьезные тормоза. А ведь в это самое время сервер телефонии должен обрабатывать звонки..

Тут все зависит от конкретной инсталяции, в нашем случае проблем нет, возможно при более мение нагруженной системе проблемы будут, потому для этого режима как раз и планируется вынос CDR или через ODBC или синхронизация с историей звонков хранящихся в регистре 1С.

Ваш случай это лично ваш ;). у клиентов что только не бывает. Лучший способ - хранить данные строго в одном месте, либо в астериске, либо в какой-то внешней БД. Опять же: нужно учитывать нагрузку. По-умолчанию во freepbx нету индекса в таблице CDR, что даст сильную нагрузку из-за тупого перебора всех записей. Ну а применение LIKE добьет систему если полезет несколько юзерей. Кстати, вы применяете LIKE везде. Зачем?

Питон или перл есть почти везде. В 99% случаев есть или можно поставить php (тем более раз подразумевается наличие MySQL) В аскозии мы используем Sqlite, а MySQL он привычно при установке астера и фрипбикс. И да, пхп там есть. Для работы пхп не нужен httpd. Он может работать как шелл скрипт, а в вашем случае - как AGI скрипт Ну я понимаю так что вам близок php и perl и вам кажется что используя их можно добиться каких то лучших вариантов... спроно :)

Спорно или нет, но задачи нужно решать грамотно, и не беда, если для этого нужно изучить еще один язык программирования. Вероятность найти в на линуксе перл, питон или пых намного выше, чем, к примеру java. Годный специалист должен разбираться во многих инструментах и применять наиболее подходящие для этого.

Из пхп можно поднимать соединение к SOAP сервису в 1С. И все. Тут вы меня в который раз не слышите :). Что все то, SOAP в 1С есть только на сервере предприятия, и толку от него большого нет. Вы не можете отправить SOAP запрос такого вида: "Эй 1С, у пользователя с номером 26 входящий звонок, помаши ему ручкой. " Нифига не получится. В 1С нет взаимодействия от сервера к клиенту, только через такие костыли, которые только в старшных >> снах снятся. На сервере 1С можно собирать сатитстику звонков, писать историю CDR, да, тут все будет работать, если не нужно взаимодействовать с клиентским сеансом. А единственный способ как можно оповестить пользователя о звонке, это использовать компонент запущенный в ПОЛЬЗОВАТЕЛЬСКОМ сеансе в виде внешней компоненты, которую мы сделали. По другому ну ни как.

Я не специалист в 1С. Но мои клиенты как-то решают эту проблему, причем получается у них неплохо.

У меня это реализовано просто: астериск во время звонка запрашивает URL. если этот URL напрямую целевой системой не поддерживается, то делается примитивная проставка, которая POST запросы конвертит в SOAP и располагается на локальной машине. Обратная связь так же делается проще всего через http сервис но уже на стороне VoIP сервера.

Это красивый и простой подход, наверняка с sugarcrm, mscrm, salesforce сработает, но пока в 1С нельзя вызвать всплывающее окошко или новый документ испльзуя запрос в адресной строке или SOAP. К сожалению приходится писать проставки по определенной технологии. Говоря грубо из 1С можно инициировать звонок через POST запрос, но не получится никак получить обратной связи...

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

Ну за советы всеравно спасибо, попробуем со скриптами поработать, нам они тоже не нравятся :

Ну дык надо было сразу делать по-людски. К примеру я не продавал свои решения до тех пор, пока их не стало не стыдно показывать людям ;)


На этом обсуждение данных костылей закончилось, наверно обиделись. Но видимо умудрились продать и столкнулись с проблемами, теперь нахаляву хотят их решить. Между тем PBXware ихний партнер, а помочь не хочет/не может...

ссылка удалить убрать флаг спам (1) редактировать

ответил 2012-04-16 06:41:41 +0400

switch Gravatar switch
8334 11 7 92
http://lynks.ru/

Comments

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

jorikfon ( 2012-04-16 08:46:24 +0400 )редактировать

Я сделал что-то плохое? переписка не содержит ничего такого, что могло бы ухудшить вашу репутацию. Наоборот, это здоровая критика, которая должна улучшить ваш проект. По большому счету ваша Wiki лучше говорит о том, что в * и linux вы понимаете мало и что следовало бы сначала испытать, многосторонее протестировать продукт, проконсультироваться со специалистами в конце концов. Тут ребята не лаптем щи хлебают, цену коду знают, так что не надо давить на совесть. Лучше примите к сведению и доведите то, что продаете до ума. По большому счету я и другие участники могли бы вам вообще ничего не говорить или дезинформировать: "парни, все верно делаете - так держать", в итоге убрать/затормозить конкурента. Однако вам указали на недостатки, методы как их исправить, но вы включили уязвленную гордыню (ну как же, вы же мегапрограммисты!) вместо того чтоб засучить рукава и приняться за работу.

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

switch ( 2012-04-16 09:01:33 +0400 )редактировать

Я не против того, что вы выложили переписку, просто можно было предварительно написать об этом в личку.
Скрипт пробуем переписать через  AGI, что получится выложу тут на растерзание! :)

jorikfon ( 2012-04-16 09:54:07 +0400 )редактировать

вы вроед сами попросили покритиковать? он и выложил критику.

meral ( 2012-04-16 09:55:09 +0400 )редактировать

тут сама идея неправильна. вы грузите астриск(голосовую часть) тем что должна делать база и API. тоесть налицо отсутвие проектирования и непонимание принципев создания програмного кода.

meral ( 2012-04-16 09:56:59 +0400 )редактировать

>>Я не против того, что вы выложили переписку

Однако вы заминусовали пост, не так ли? И потом, лички тут нет.

switch ( 2012-04-16 11:34:24 +0400 )редактировать

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

jorikfon ( 2012-04-16 12:03:00 +0400 )редактировать

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

meral ( 2012-04-16 12:06:52 +0400 )редактировать

А extensions.lua и extensions.conf совместимы?

Можно в lua вызвать контекст из extensions.conf ?

bolshoy_plohish ( 2012-04-17 14:29:19 +0400 )редактировать

да. полностью совместимы. можно вызвать позвонив в Local/ или выйдя из скрипта и продолжаьт в extensions.conf

meral ( 2012-04-17 16:19:33 +0400 )редактировать

> Мы с Николаем обсуждали ваш быдлокод в марте

Ключников, ты ХАМЛО!!!

> Между тем PBXware ихний партнер, а помочь не хочет/не может...

Нет такого слова - ихний. Не дождались МИКО от нас помощи в оптимизации, мы обсудили потенциальные решения, потом я уехал и все заглохло. Наш косяк. Люди вышли на сайт за помощью коллективного разума, а ты!? Засранец ты, вот кто!

litnimax ( 2012-04-17 16:28:37 +0400 )редактировать

Я мог бы сказать этим ребятам "все делаете правильно", пустить их по ложному пути. Однако я потратил время на разбор ихней писанины, и выдал рекомендации как лучше поступить. При этом я не партнер и вообще никто для них, ничего не обещал, а сходу взял и посмотрел. А вот ты что сделал? Уехал. Как обычно. Так что уж определись, засранец я или хамло.

switch ( 2012-04-17 16:51:00 +0400 )редактировать

Ты и то, и другое. Лично мне, и как мне кажется по реакции, jorikfon'у нах такая помощь не нужна. Лучше уж вообще не помогать, чем в такой манере.

litnimax ( 2012-04-17 16:58:03 +0400 )редактировать

не ругайтесь ). лично мне вообще кажется что этим ребятам помощь не нужна. у них же куча программистов.

meral ( 2012-04-17 17:02:24 +0400 )редактировать

Они оптимизируют код коллективным разумом)

zzuz ( 2012-04-17 17:06:40 +0400 )редактировать

Ваш ответ

Please start posting your answer anonymously - your answer will be saved within the current session and published after you log in or create a new account. Please try to give a substantial answer, for discussions, please use comments and please do remember to vote (after you log in)!
[скрыть предварительный просмотр]

Закладки и информация

Добавить закладку
2 закладки

подписаться на rss ленту новостей

Статистика

Задан: 2012-04-15 18:39:19 +0400

Просмотрен: 3,543 раз

Обновлен: Apr 23 '12

Проект компании "АТС Дизайн"
Asterisk® и Digium® являются зарегистрированными торговыми марками компании Digium, Inc., США.
IP АТС Asterisk распространяется под лицензией GNU GPL.