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