Имеется утилита, которая подключается к 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;


