Эмуляция AMI АТСки

Вопросы программирования и использования среды Lazarus.

Модератор: Модераторы

Эмуляция AMI АТСки

Сообщение jsa » 28.01.2021 15:12:00

Не уверен, что в этот раздел форума.

Имеется утилита, которая подключается к AMI атски Asterisk
для этого используется TIdTCPClient
Создается соединение.
Логин пароль доступа к AMI отправляется командой IdTCPClient1.Socket.WriteLn(логин-пароль);
В отдельном потоке с АТС построчно читаются события командой str:=IdTCPClient1.Socket.ReadLn;
и отправляются в другой поток через очередь, на обработку. (обработка в отдельном потоке, т.к. она может не успевать за потоком событий с АТС)
Она работает вопрос не про неё.

Сейчас потребовалось сделать программу которая эмулирует АТС, для основном программы.
Т.к. на реальной АТС неудобно тетсировать и искать затыки, из-за неравномерной нагрузки потока звонков, да и просто не удобно это.
Для этого имеется текстовый файл с логом не обработанных событий (как есть) с АТС за сутки.

Понятно что использовать для этого нужно TTCPServer
Не совсем понимаю как построчно скормить содержимое файла лога событий...
Тоже через событие onExecute по строке на каждом срабатывании?
Или нужно просто в цикле записывать в какой-то буфер строки последовательно? (используя временнУю задержку т.е. не всё сразу)

подскажите пожалуйста.

Добавлено спустя 2 минуты 30 секунд:
Я так понимаю что TTCPServer.onExecute будет происходить только когда клиент пытается считать строку, что не совсем является эмуляцией работы реально АТС. Т.к. в ней события идут сплошным потоком , и видимо в ожидают чтения в каком-то буфере серверной компоненты AMI

Добавлено спустя 21 час 1 минуту 26 секунд:
На форме Memo1 куда поместил несколько блоков из лога AMI

Написал так как понял.
Вроде работает.

Код: Выделить всё

var istr, cntstr:integer;
    CrSection: SyncObjs.TCriticalSection;
   
procedure TForm1.FormCreate(Sender: TObject);
begin
     CrSection := SyncObjs.TCriticalSection.Create;
end;

procedure TForm1.SpButtonServerStartClick(Sender: TObject);
begin
     istr := 0;
     Form1.StatusBar.Panels[0].Text:= '-1';
     cntstr := Form1.Memo1.Lines.Count;
     if Form1.IdTCPServerAMI.Active then
       begin
       Form1.IdTCPServerAMI.Bindings.Clear;
       Form1.IdTCPServerAMI.Active:=false;
       end;
     Form1.IdTCPServerAMI.Bindings.Add.IP:='0.0.0.0';
     Form1.IdTCPServerAMI.Bindings.Add.Port:= StrToInt(trim(EditServerPort.Text)); //5038
     Form1.IdTCPServerAMI.Active:=true;
end;

procedure TForm1.SpButtonServerStopClick(Sender: TObject);
begin
     Form1.IdTCPServerAMI.Active:=false;
     istr:=0;
end;

procedure TForm1.IdTCPServerAMIExecute(AContext: TIdContext);
var msg:string;
    procedure StatusBarWrite();
          begin
          CrSection.Enter;
          Form1.StatusBar.Panels[0].Text:=IntToStr(istr);
          CrSection.Leave;
          end;
    procedure ReadStr();
          begin
          CrSection.Enter;
          msg:= Memo1.Lines[istr];
          CrSection.Leave;
          end;
begin
     if Form1.IdTCPServerAMI.Active then
     begin
     StatusBarWrite();
     ReadStr();
     AContext.Connection.Socket.WriteLn( msg, IndyTextEncoding_UTF8);
     sleep(1000);
     inc(istr);
     if istr=cntstr-1 then istr:=0;
     end;
end;           
jsa
постоялец
 
Сообщения: 261
Зарегистрирован: 28.11.2017 13:46:04

Re: Эмуляция AMI АТСки

Сообщение olegy123 » 29.01.2021 17:51:13

jsa писал(а):TTCPServer
какой версии?
9ка? то там каждое подключение синхронизируется.
в 10ке - TTCPServer отдельно создается нить.
отсюда логика разная.

Как а как идет событие с Астериск? каждый раз он подключается чтобы передать сообщение или весит постоянно в коннекте?

Добавлено спустя 2 минуты 54 секунды:
olegy123 писал(а): if Form1.IdTCPServerAMI.Active then

это лишнее
sleep(1000); тоже
CrSection.Enter; тоже
olegy123
долгожитель
 
Сообщения: 1643
Зарегистрирован: 25.02.2016 12:10:20

Re: Эмуляция AMI АТСки

Сообщение jsa » 29.01.2021 18:29:48

0. "Как а как идет событие с Астериск? каждый раз он подключается чтобы передать сообщение или весит постоянно в коннекте?"
- программа которая цепляется к Астериску и для которой делается этот спам-тестер, подключена постоянно, переподключаясь раз в указанное кол-во часов, считывает построчно ReadLn
1. Indy10
2. if Form1.IdTCPServerAMI.Active then - лишнее - понятно
3. sleep(1000); тоже - это я заменил на условие, вставляю только между блоками-событиями (событие передается блоком строк), блоки разделены пустой строкой. В реальности между событиями имеются задержки.
4. CrSection.Enter; тоже - вот это не понятно.
jsa
постоялец
 
Сообщения: 261
Зарегистрирован: 28.11.2017 13:46:04


Вернуться в Lazarus

Кто сейчас на конференции

Сейчас этот форум просматривают: Google [Bot] и гости: 35

Рейтинг@Mail.ru