Ir para conteúdo
  • Cadastre-se

dev botao

  • Este tópico foi criado há 3106 dias atrás.
  • Talvez seja melhor você criar um NOVO TÓPICO do que postar uma resposta aqui.

Recommended Posts

Postado

Olá Pessoal,

Estou tendo problemas na leitura da resposta do ACBrMonitorPlus via sockets.

Envio o comando e ele executa corrertamente, porém na hora que leio o retorno ele para antes da mensagem, como se o terminador estivesse em lugar errado.

Para enviar o comando e ler a resposta faço assim:

var
   Retorno : AnsiString;
   cmdTCP: TTCPBlockSocket;

begin

   cmdTCP:= TTCPBlockSocket.Create;
   try
      cmdTCP.Connect(fsHost, IntToStr(fsPort));

      sleep(1000);

      cmdTCP.SetSendTimeout(1000);
      cmdTCP.SendString(fsPrefixo + Comando + chrTerminador);

      Retorno := AnsiToUtf8(cmdTCP.RecvTerminated(1000, #03));

   finally
      cmdTCP.Free;
   end;

Ele executa o comando, no painel do Monitor aparece a resposta, mais dentro da minha variável Retorno aparece apenas:

"ACBrMonitor/ACBrNFeMonitor PLUS Ver. 0.1.7.3
Conectado em: 27/08/15 08:48:44
Máquina: 127.0.0.1
Esperando por comandos."

Como se o terminador estivesse em local errado.

Anexo o log do monitor para auxiliar.

LOG.TXT

Postado

Você está com a versão atualizada do MonitorPLUS? Subi a versão 1.0.08.09 mais cedo, baixe e faça o teste, com ela.

--
Isaque Pinheiro
Aracruz/ES - Brasil
___________________________________________________________________________
Site Oficial: www.isaquepinheiro.com.br 
Youtube: youtube.com/isaquepinheirooficialbr
Facebook: facebook.com.br/isaquepinheirooficialbr
Instagram: instagram.com/isaquepinheirooficialbr
Linkdin: https://www.linkedin.com/in/isaquepinheirooficialbr

Conheça o Projeto ORMBr Framework for Delphi - https://www.ormbr.com.br

 

Postado

Bom dia Isaque,

Estou com a ultima versão disponível no Trunk2 pelo SVN. ( Revision: 9824 - Author: dopi - Date: quinta-feira, 27 de agosto de 2015 01:10:52)

Tanto no caption quanto nos logs mostram a versão ACBr Monitor Ver.0.1.7.3.

E continua dando esse mesmo problema, estava dando ontem e hoje com a nova versão continua o problema.

AcbrSVN.png

  • Fundadores
Postado

Muito provavelmente o Isaque não está atualizando o TXT com o número da Versão...

Como podemos simular o problema ?

Usando Telnet funciona normalmente... Parece ser algo do seu lado... Certeza que você configurou o Terminador em ETX (#03)... Você não está com um TimeOut muito baixo ?

 

Veja trecho do código que envia a resposta:

  if rbTCP.Checked then
  begin
    if Assigned(Conexao) then
    begin
      Resposta := StringReplace(Resposta, chr(3), '', [rfReplaceAll]);
      Conexao.SendString(Resposta);
      Conexao.SendByte(3);
    end;
  end;     

Repare que o ETX sempre será enviado...... Experimente ainda mudar nos fontes para:

  if rbTCP.Checked then
  begin
    if Assigned(Conexao) then
    begin
      Resposta := StringReplace(Resposta, chr(3), '', [rfReplaceAll]);
      Conexao.SendString(Resposta + chr(3));
    end;
  end;     

 

Consultor SAC ACBr

Daniel Simões de Almeida
O melhor TEF, é com o Projeto ACBr - Clique e Conheça
Ajude o Projeto ACBr crescer - Assine o SAC

Projeto ACBr     Telefone:(15) 2105-0750 WhatsApp(15)99790-2976.

Postado

Sim Daniel exatamente isso, não estou atualizando, devido várias compilações semanais.

Arquivo de versão atualizado no SVN.

--
Isaque Pinheiro
Aracruz/ES - Brasil
___________________________________________________________________________
Site Oficial: www.isaquepinheiro.com.br 
Youtube: youtube.com/isaquepinheirooficialbr
Facebook: facebook.com.br/isaquepinheirooficialbr
Instagram: instagram.com/isaquepinheirooficialbr
Linkdin: https://www.linkedin.com/in/isaquepinheirooficialbr

Conheça o Projeto ORMBr Framework for Delphi - https://www.ormbr.com.br

 

Postado

Boa tarde Daniel,

Estou enviando o EXT sim e meu TimeOut está em 1000 :

      cmdTCP.SetSendTimeout(1000);
      cmdTCP.SendString(fsPrefixo + Comando + chrTerminador);

      Retorno := AnsiToUtf8(cmdTCP.RecvTerminated(1000, #03));

Agora adicionei a unit ACBrConsts em e usei a constante EXt direto de lá para garantir:

    Resposta := AnsiToUtf8(fsSock.RecvTerminated(1000, ETX));

Mais o problema não está ai, pois o código encontra o Terminador, o meu problema é que ele encontra o Terminador na linha errada, ele está pegando todo o conteúdo que fica no Monitor, quando eu Abro a conexão com o Monitor via socktes ele aparece no quadro de Respostas Enviadas do Monitor:


    ACBrMonitor/ACBrNFeMonitor PLUS Ver. 0.1.7.3
    Conectado em: 27/08/15 08:48:44
    Máquina: 127.0.0.1
    Esperando por comandos.

Na sequencia eu envio meu comando para o Monitor e no quadro de Respostas Enviadas do Monitor aparece meu comando enviado e a resposta corretamente, ficando no quadro o seguinte texto:

    ACBrMonitor/ACBrNFeMonitor PLUS Ver. 0.1.7.3
    Conectado em: 27/08/15 08:48:44
    Máquina: 127.0.0.1
    Esperando por comandos.
    ECF.Ativo

    OK: False

O problema é que quando pela minha aplicação eu faço a leitura do retorno ele para no final da linha "Esperando por comandos." como se ele encontrasse o terminador ali.

Também não sei se está correto minha aplicação ler essa informação inteira como está fazendo, talvez realmente tenha esse terminador ali no entanto minha aplicação esteja iniciando a captura no momento errado.

Já tentei de tudo, mudei a conexão para indy e mesmo assim não foi.

Não acredito que o problema esteja no Monitor e sim na minha aplicação, mais realmente não sei mais onde alterar meu código para acertar isso.

  • Fundadores
Postado

Adicionei no SVN um exemplo bem simples de comunicação em Lazarus...

 

Basicamente:

unit Unit1;

{$mode objfpc}{$H+}

interface

uses
  Classes, SysUtils, FileUtil, Forms, Controls, Graphics, Dialogs, StdCtrls,
  ExtCtrls, blcksock;

type

  { TForm1 }

  TForm1 = class(TForm)
    bEnviar: TButton;
    bConectar: TButton;
    edIP: TEdit;
    Label1: TLabel;
    mEnviar: TMemo;
    mResposta: TMemo;
    Panel1: TPanel;
    procedure bConectarClick(Sender: TObject);
    procedure bEnviarClick(Sender: TObject);
    procedure FormCreate(Sender: TObject);
    procedure FormDestroy(Sender: TObject);
  private
    { private declarations }
    fSocket : TBlockSocket;

    procedure AguardaReposta;
  public
    { public declarations }
  end;

var
  Form1: TForm1;

implementation

{$R *.lfm}

{ TForm1 }

procedure TForm1.FormCreate(Sender: TObject);
begin
  fSocket := TBlockSocket.Create;
end;

procedure TForm1.FormDestroy(Sender: TObject);
begin
  fSocket.Free;
end;

procedure TForm1.bConectarClick(Sender: TObject);
begin
  fSocket.Connect(edIP.Text, '3434');
  AguardaReposta;
end;

procedure TForm1.bEnviarClick(Sender: TObject);
begin
  fSocket.SendString(mEnviar.Lines.Text + #13+#10+'.'+#13+#10);
  AguardaReposta;
end;

procedure TForm1.AguardaReposta;
var
  Resposta: String;
begin
  Resposta := fSocket.RecvTerminated(5000, #3);
  mResposta.Lines.Add('===================');
  mResposta.Lines.Add(Resposta);
end;


end.

 

  • Curtir 2
Consultor SAC ACBr

Daniel Simões de Almeida
O melhor TEF, é com o Projeto ACBr - Clique e Conheça
Ajude o Projeto ACBr crescer - Assine o SAC

Projeto ACBr     Telefone:(15) 2105-0750 WhatsApp(15)99790-2976.

Postado

Olá Daniel,

Desculpa a demora no retorno, é que tive uns problemas que acabaram me afastando um pouco do projeto.

Bom, continuo tendo o mesmo problema, do exemplo que você enviou para o SVN para meu código é que ao invés de usar o TBlockSocket eu estava usando o TTCPBlockSocket, no entanto alterei meu código para usar a mesma função do exemplo e obtive o mesmo resultado.

Debugando a função "RecvTerminated" do TBlockSocket quando ele pega a resposta para localizar o limitador, ele pega a string completa com outras informações e acaba vindo junto o limitador duas vezes, ai ele localiza o primeiro e retorna até ele, como mostra a imagem em anexo.

Eu tenho que limpar de alguma forma o comando antes de receber a resposta?

soket.png

Postado

Resolvido!

Meu problema era que eu conectava e enviava o comando no mesmo botão, porém só pegava o retorno depois de enviar o comando, então ele mandava o retorno dos dois comandos na mesma string.

    fsSock.Connect(fsHost, IntToStr(fsPort));

    fsSock.SendString(fsPrefixo + Comando + chrTerminador);

    Resposta := fsSock.RecvTerminated(5000, #3);

Com isso o comando de pegar a resposta encontrava o primeiro limitador e retornava somente a conexão.

Adicionei o comando de pegar resposta logo após a conexão e o retorno veio correto.

      fsSock.Connect(fsHost, IntToStr(fsPort));

      Resposta := fsSock.RecvTerminated(5000, #3);

      fsSock.SendString(fsPrefixo + Comando + chrTerminador);

      Resposta := fsSock.RecvTerminated(5000, #3);

 

Obrigado pelas dicas e pelo exemplo.

  • Curtir 1
  • 8 meses depois ...
  • Este tópico foi criado há 3106 dias atrás.
  • Talvez seja melhor você criar um NOVO TÓPICO do que postar uma resposta aqui.

Crie uma conta ou entre para comentar

Você precisar ser um membro para fazer um comentário

Criar uma conta

Crie uma nova conta em nossa comunidade. É fácil!

Crie uma nova conta

Entrar

Já tem uma conta? Faça o login.

Entrar Agora
×
×
  • Criar Novo...

Informação Importante

Colocamos cookies em seu dispositivo para ajudar a tornar este site melhor. Você pode ajustar suas configurações de cookies, caso contrário, assumiremos que você está bem para continuar.