Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Общие вопросы Delphi
Регистрация

Восстановить пароль

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 20.12.2015, 16:54   #1
le7o
Форумчанин
 
Регистрация: 19.05.2011
Сообщений: 116
По умолчанию Парсинг сообщение idTelnet

В общем ситуация такая: есть АТС Asterisk, пытаюсь сделать управление звонками и мониторинг по предоставленному ATC интерфейсу взаимодействия AMI - по сути представляет собой отправку набора текста по средствам telnet и получение ответов от АТС.

Функционал по отправке и тому подобное реализовал, а вот как грамотно распарсить полученные события без особой нагрузки на клиент, может у кого то есть функции готовые по шаблонам/ключевым словам, или любые идеи по этому поводу?

P.s: действия для одного звонка от регистрации и до полного его завершения занимает порядка ~400-500 строк в зависимости от длительности разговора.


Asterisk Call Manager/1.1

Response: Success

Message: Authentication accepted

Event: FullyBooted
Privilege: system,all
Status: Fully Booted

Ответ на отправленный запрос на звонок:
Event: Newchannel
Privilege: call,all
Timestamp: 1450619024.780615
Channel: SIP/101-0000003f
ChannelState: 0
ChannelStateDesc: Down
CallerIDNum:
CallerIDName:
AccountCode:
Exten:
Context: sip-dual
Uniqueid: 1450619024.63

Event: VarSet
Privilege: dialplan,all
Timestamp: 1450619024.780642
Channel: SIP/101-0000003f
Variable: SIPCALLID
Value: 68df505e3319e24f77f4e90c2852d9d5@19 2.168.4.55:5060
Uniqueid: 1450619024.63

.......


Event: Dial
Privilege: call,all
Timestamp: 1450619034.651891
SubEvent: End
Channel: SIP/101-0000003f
UniqueID: 1450619024.63
DialStatus: ANSWER

Event: Hangup
Privilege: call,all
Timestamp: 1450619034.651931
Channel: SIP/101-0000003f
Uniqueid: 1450619024.63
CallerIDNum: <unknown>
CallerIDName: 101->100
ConnectedLineNum: <unknown>
ConnectedLineName: 101->100
Cause: 16
Cause-txt: Normal Clearing
le7o вне форума Ответить с цитированием
Старый 20.12.2015, 17:20   #2
come-on
Участник клуба
 
Регистрация: 21.10.2015
Сообщений: 1,361
По умолчанию

Цитата:
как грамотно распарсить полученные события без особой нагрузки на клиент
что вы имеете ввиду?
come-on вне форума Ответить с цитированием
Старый 20.12.2015, 17:24   #3
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Ну... Если в кратце то:
Код:
With TStringList.Create do begin
 Text:=StringReplace(Этот текст,': ','=',[rfReplaceAll]);
   Value['Uniqueid'] вернет 1450619024.63
   Value['Event'] вернет VarSet
 ...   
 free;
end;
Только конечно если этот текст не слитно весь приходит.
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 21.12.2015, 05:07   #4
le7o
Форумчанин
 
Регистрация: 19.05.2011
Сообщений: 116
По умолчанию

Цитата:
Сообщение от come-on Посмотреть сообщение
что вы имеете ввиду?
Объемы текста довольно большие..., здесь в качестве теста текст для 2-х зарегистрированных телефонов ~500 строк, телефонов в рабочем варианте: 150*~500(это одно событие)*(количество событий - (прием звонка, перерегистрация, перевод звонка и.т.п.)).

Суть работы в следующем:
1. Оператор отправил заявку на звонок, сформировалось событие сервером и вывелось (пока вывожу в Memo, но тут можно хоть куда его загрузить)
2. Сформировались и вывелись промежуточные события вроде - гудок 1, гудок 2, гудок 3.
3. Оператор ответил или не ответил так же сформировались события.
4. Если какой то оператор завершил звонок то приходит так же событие.

Что хорошо, у каждой группы событий есть уникальных идентификатор - ActionID, а плохо то что пока все события приходят ПОСТРОЧНО, по этому поводу можно решить формированием пакетов, т.к. в начале и в конце встречается не более 3-4 ключевых слов с которых они могут начинаться и заканчиваться.

А получить данные необходимо приблизительно такого формата:
Event: Newchannel - новый вызов
Channel: SIP/101-0000003f - инициатор вызова
Exten: 100 - назначение вызова
ActionID: XXXXXXXXXXXXXX123445 - Это уникальный для каждой группы событий идентификатор - его я формирую сам и буду передавать в событие...

В итоге хочу сделать таблицу вида:
1. ID (ActionID)
2. время начала
3. Инициатор
4. Назначение
5. Состояние (идет вызов, абонент ответил, вызов завершен)
6. Время завершения
le7o вне форума Ответить с цитированием
Старый 21.12.2015, 05:09   #5
le7o
Форумчанин
 
Регистрация: 19.05.2011
Сообщений: 116
По умолчанию

Цитата:
Сообщение от Stilet Посмотреть сообщение
Ну... Если в кратце то:
Код:
With TStringList.Create do begin
 Text:=StringReplace(Этот текст,': ','=',[rfReplaceAll]);
   Value['Uniqueid'] вернет 1450619024.63
   Value['Event'] вернет VarSet
 ...   
 free;
end;
Только конечно если этот текст не слитно весь приходит.
Текст приходит не слитно, но построчно, пакеты разделяются - CRLF + CRLF.
le7o вне форума Ответить с цитированием
Старый 21.12.2015, 12:31   #6
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

А-а-а, ну тогда разделяй пакеты и мой способ по идее подойдет.
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 24.12.2015, 22:54   #7
le7o
Форумчанин
 
Регистрация: 19.05.2011
Сообщений: 116
По умолчанию

Дабы не плодить новых тем, задам связанный вопрос здесь...

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

Последний раз редактировалось le7o; 24.12.2015 в 23:16.
le7o вне форума Ответить с цитированием
Старый 24.12.2015, 23:14   #8
IvaniuS
Форумчанин
 
Аватар для IvaniuS
 
Регистрация: 16.04.2007
Сообщений: 225
По умолчанию

в смысле, они существуют с 2001го года в делфи в виде компонента, на сколько я знаю, рекомендую почитать Википедию по поводу Регексов, но область применимая их достаточно ограниченая т.е. я использовал при парсинге сайтов и проверки на соответсвие шаблону.
IvaniuS вне форума Ответить с цитированием
Старый 24.12.2015, 23:45   #9
le7o
Форумчанин
 
Регистрация: 19.05.2011
Сообщений: 116
По умолчанию

Цитата:
Сообщение от IvaniuS Посмотреть сообщение
в смысле, они существуют с 2001го года в делфи в виде компонента, на сколько я знаю, рекомендую почитать Википедию по поводу Регексов, но область применимая их достаточно ограниченая т.е. я использовал при парсинге сайтов и проверки на соответсвие шаблону.
То, что они достаточно старые я понял когда на сайт перешел)))

В стандартной палитре компонентов их ни разу не видел, ни в одной из версий от 7 до XE8.

Как Вы считаете при построчном поступлении текста достаточно большого объема - помогут отбросить лишние строки?
le7o вне форума Ответить с цитированием
Старый 25.12.2015, 00:02   #10
come-on
Участник клуба
 
Регистрация: 21.10.2015
Сообщений: 1,361
По умолчанию

Они все могут.
come-on вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
idTelnet/idTelnetServer (delphi) dyonysos Работа с сетью в Delphi 0 05.02.2010 18:05
Сообщение HellMercenariess Свободное общение 1 21.11.2009 04:42
Сообщение... KoBRaAndrey Общие вопросы Delphi 8 02.10.2009 18:56
Сообщение Shevali Общие вопросы Delphi 3 07.06.2009 19:53
IdTelnet ][-Wizzard Работа с сетью в Delphi 1 10.07.2008 11:11