Ir para conteúdo
  • Cadastre-se

dev botao

ACBrMTer - Erro enviando comando customizado


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

Recommended Posts

Ola a todos,

Quero receber o nome de identificação que foi configurado em cada terminal, como o componente ACBrMTer não tem uma método para isso tentei usar os métodos EnviarComando/LeResposa para solicitar essa informação de acordo com as instruções do manual do protocolo. Fiz duas tentativas diferentes, em ambas tive problemas, abaixo estão o código fonte e os problemas que encontrei:

 

Equipamento: Gertec Microterminal MT-720

Protocolo: PMTG

Teste feio com 2 micro terminais conectados a rede.

 

Em ambas tentativas, tentei enviar o comando 83 (53h) para o terminal e ler a resposta esperada.

 

Tentativa 1:

Quote

  Log('Inicio');
  nomeTerminal := '';
  for i:=0 to ACBrMTer1.Conexoes.Count - 1 do
  begin
    ip := ACBrMTer1.Conexoes.IP;
    ACBrMTer1.EnviarComando(ip, IntToLEStr(83) + IntToLEStr(0));
    rawData := ACBrMTer1.LerResposta(ip, 5000, 28);
    if (Length(rawData) <> 28) or (Ord(rawData[1]) <> $54) then
      Log('Resposta errada')
    else begin
      for k:=13 to Length(rawData) do
      begin
        if Ord(rawData[k]) = 0 then
          break;
        nomeTerminal := nomeTerminal + string(rawData[k]);
      end;
      nomeTerminal := nomeTerminal + ', ';
    end;
  end;
  Log(nomeTerminal);
  Log('Fim');

Log:

Quote

 

  --------------------------------------------------------------------------------
  ATIVAR - 14/11/18 16:16:57:618 - Modelo:  - Porta: 6550 - Terminador:  - Timeout: 5000
  --------------------------------------------------------------------------------

   -- 14/11 16:16:59:072 -- Terminal: 192.168.0.115 Conectou
   -- 14/11 16:17:00:059 -- Terminal: 192.168.0.117 Conectou
   -- 14/11 16:17:08:707 -- Terminal: 192.168.0.115 - Comando enviado: S

 

Resultado:

Não funciona. O programa trava na linha rawData := ACBrMTer1.LerResposta(ip, 5000, 28);. Pelo que entendi do código fonte, o próprio ACBrMTer intercepta a resposta e por isso minha rotina não recebe nada.

 

Tentativa 2: Fiz o código abaixo me baseando no fonte do método TACBrMTer.Online, para tentar ler a resposta do terminal.

Quote

 

  Log('Inicio');
  nomeTerminal := '';
  threadList := ACBrMTer1.TCPServer.ThreadList.LockList;
  try
    for i:=0 to threadList.Count - 1 do
    begin
      if TACBrTCPServerThread(threadList.Items).Active then
      begin
        TACBrTCPServerThread(threadList.Items).Enabled := false;
        try
          ip := AnsiString(TACBrTCPServerThread(threadList.Items).TCPBlockSocket.GetRemoteSinIP);
          ACBrMTer1.EnviarComando(ip, IntToLEStr(83) + IntToLEStr(0));
          rawData := ACBrMTer1.LerResposta(ip, 5000, 28);
          if (Length(rawData) <> 28) or (Ord(rawData[1]) <> $54) then
            Log('Resposta errada')
          else begin
            for k:=13 to Length(rawData) do
            begin
              if Ord(rawData[k]) = 0 then
                break;
              nomeTerminal := nomeTerminal + string(rawData[k]);
            end;
            nomeTerminal := nomeTerminal + ', ';
          end;
        finally
          TACBrTCPServerThread(threadList.Items).Enabled := true;
        end;
      end;
    end;
  finally
    ACBrMTer1.TCPServer.ThreadList.UnlockList;
  end;
  Log(nomeTerminal);
  Log('Fim');

 

Log:

Quote

 

  --------------------------------------------------------------------------------
  ATIVAR - 14/11/18 16:09:56:096 - Modelo:  - Porta: 6550 - Terminador:  - Timeout: 5000
  --------------------------------------------------------------------------------

   -- 14/11 16:09:57:296 -- Terminal: 192.168.0.115 Conectou
   -- 14/11 16:10:00:813 -- Terminal: 192.168.0.117 Conectou
   -- 14/11 16:10:03:921 -- Terminal: 192.168.0.115 - Comando enviado: S
   -- 14/11 16:10:03:936 -- Terminal: 192.168.0.117 - Comando enviado: S
   -- 14/11 16:10:07:711 -- Terminal: 192.168.0.115 - Comando enviado: S
   -- 14/11 16:10:07:720 -- Terminal: 192.168.0.117 - Comando enviado: S
   -- 14/11 16:10:07:733 -- Terminal: 192.168.0.117 Desconectou - 10054-Connection reset by peer
   -- 14/11 16:10:10:485 -- Terminal: 192.168.0.117 Conectou
   -- 14/11 16:10:12:720 -- Terminal: 192.168.0.115 Desconectou - 10060-Connection timed out
   -- 14/11 16:10:14:959 -- Terminal: 192.168.0.115 Conectou
   -- 14/11 16:10:40:254 -- Terminal: 192.168.0.115 Desconectou - -5-TACBrTCPServer.Desativar
   -- 14/11 16:10:40:287 -- Terminal: 192.168.0.117 Desconectou - -5-TACBrTCPServer.Desativar
   -- 14/11 16:10:40:303 -- -6-TACBrTCPServer.Desativar

 

Resultado:

Funciona de forma inconstante. As vezes dá certo, como mostra o log acima, nas duas primeiras linhas "Comando enviado: S", os meus dois terminais responderam como deveriam. Porém quanto executei a rotina novamente, os terminais foram desconectados. Em outros testes que fiz, algumas vezes o programa simplesmente trava e segundo o debugger do Delphi o código fica num loop dentro de "ntdll.RltUserThreadStart", em outras vezes recebo uma Access Violation no arquivo ACBrSocket, linha 522: "fsSock.CloseSocket", em outras vezes recebo a resposta correta do terminal, mas logo em seguida os terminais são desconectados.

 

Como deve ser o procedimento correto para enviar comandos específicos ao terminal e ler a resposta?

 

Obrigado,

Marcelo

 

Link para o comentário
Compartilhar em outros sites

  • Este tópico foi criado há 1989 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.

The popup will be closed in 10 segundos...