Rastreamento ONIXSAT

Projeto [x]Harbour - Compilador de código aberto compatível com o Clipper.

Moderador: Moderadores

Avatar do usuário
FFreire
Usuário Nível 3
Usuário Nível 3
Mensagens: 113
Registrado em: 19 Mai 2013 16:16
Localização: Andirá-PR / Itaporanga-SP

Rastreamento ONIXSAT

Mensagem por FFreire »

Olá...
Estou precisando receber o retorno de um rastreamento de veículos...dai usei o código abaixo!

Código: Selecionar todos

#include "hbcompat.ch"
#include "hbxml.ch"
#include "hbmxml.ch"
//-----------------
FUNCTION Rastreador
//-----------------
   
LOCAL cWebService := 'http://webservice.onixsat.com.br'
LOCAL cXml, oXml

cXml := '<RequestMensagemCB>'+hb_eol()
cXml += '   <login>xxx</login>'+hb_eol()
cXml += '   <senha>123456</senha>'+hb_eol()
cXml += '   <mId>1</mId>'+hb_eol()
cXml += '</RequestMensagemCB>'

HB_MemoWrit('enviado.xml',cXml)
   
oXml := TXMLDocument():New( cXml, HBXML_STYLE_NOESCAPE )
IF oXml:nError != HBXML_ERROR_NONE
   TONE( 321, 2 )
   MSGBOX1( {'Erro na criação do XML !!!',oXML:nError}, 'Erro...',,'&OK', ArqAdm[cALERT_TIT], ArqAdm[cALERT_BORD], ArqAdm[cALERT_IN] )
   xret := .F.
ELSE
   xretorno := MicrosoftXmlRequest( cXml, cWebservice )
   IF xretorno == NIL
      xret := .F.
   ELSE
// Criar o arquivo zip e descompactar


      HB_MemoWrit('retorno.xml',xretorno)
      HB_UnZipFile('retorno.xml')
      xret := .T.
   END
END
   
RETURN(xret)
   
//------------------------------------------------------
FUNCTION MicrosoftXmlRequest( cXmlRequest, cWebService )
//------------------------------------------------------
   
LOCAL oServer, oDOMDoc, cRetorno, cXmlRetorno, nCont
   
oServer := WIN_OLECREATEOBJECT( "MSXML2.ServerXMLHTTP")
oServer:Open( "POST", cWebService, .F. )
   
oDOMDoc := Win_oleCREATEOBJECT("MSXML2.DOMDocument")
oDOMDoc:async = .F.
oDOMDoc:validateOnParse  = .T.
oDOMDoc:resolveExternals := .F.
oDOMDoc:preserveWhiteSpace = .T.
   
oDOMDoc:LoadXML(cXmlRequest)
IF oDOMDoc:parseError:errorCode <> 0
   TONE( 321, 2 )
   MSGBOX1( {'Erro no carregamento do XML !!!',oDOMDoc:parseError:errorCode}, 'Erro...',,'&OK', ArqAdm[cALERT_TIT], ArqAdm[cALERT_BORD], ArqAdm[cALERT_IN] )
ELSE     
   TRY
      oServer:Send(oDOMDoc:xml)
      WHILE oServer:readyState <> 4
         HB_milliseconds(500)
      END
      cRetorno := oServer:responseText
   CATCH oError
      TONE( 321, 2 )
      MSGBOX1( 'Falha no envio do XML !!!', 'Erro...',,'&OK', ArqAdm[cALERT_TIT], ArqAdm[cALERT_BORD], ArqAdm[cALERT_IN] )
   END
END
      
IF VALTYPE( cRetorno ) == "C"
   cXmlRetorno := cRetorno
ELSE
   IF VALTYPE( cRetorno ) == "A"
      cXmlRetorno := ""
      FOR nCont = 1 TO LEN( cRetorno )
         cXmlRetorno += CHR( cRetorno[ nCont ] )
      NEXT
   ELSE
      cXmlRetorno := ""
   END
END
   
RETURN(cXmlRetorno)
Esta retornando ok... mas o retorno segundo o fabricante, tem que ser descompactado...
As palavras dele: "voce precisa capturar os bytes, montar o arquivo zip e descompactar." e "ele esta com aqueles caracteres pois voce nao montou o arquivo zip, que vai conter um xml la dentro."

Alguém ja passou por isso. Qual seria a saída ??

Em anexo o arquivo retorno.xml, que não é um XML, pois segundo o fabricante, tenho que descompactar!

Qual seria a função para montar esse tal ZIP e depois descompactar para gerar o XML que irá conter as informações do rastreamento ???
Anexos
retorno.xml
(148.1 KiB) Baixado 84 vezes
Harbour 3.2.0+MiniGui Extended 16.02+BCC5 / HWGdebug / SIXCDX / PostgreSQL 9.5 / LetoDB 2.15 / Java8
fabiano@ffsoft.com.br
Avatar do usuário
sygecom
Administrador
Administrador
Mensagens: 7131
Registrado em: 21 Jul 2006 10:12
Localização: Alvorada-RS
Contato:

Rastreamento ONIXSAT

Mensagem por sygecom »

Já tentou

Código: Selecionar todos

cResult:=HB_ZUNCOMPRESS( HB_BASE64DECODE( ),,@nResult )
      IF nResult<>0
         SHOWMSG('Não foi possível descompactar o retorno do SEFAZ.')
         return(.f.)
      ENDIF
MEMOWRIT("relatorio.xml",cResult,.F.)
Leonardo Machado
xHarbour.org + Hwgui + PostgreSql
Avatar do usuário
FFreire
Usuário Nível 3
Usuário Nível 3
Mensagens: 113
Registrado em: 19 Mai 2013 16:16
Localização: Andirá-PR / Itaporanga-SP

Rastreamento ONIXSAT

Mensagem por FFreire »

Não funcionou...
Harbour 3.2.0+MiniGui Extended 16.02+BCC5 / HWGdebug / SIXCDX / PostgreSQL 9.5 / LetoDB 2.15 / Java8
fabiano@ffsoft.com.br
Avatar do usuário
sygecom
Administrador
Administrador
Mensagens: 7131
Registrado em: 21 Jul 2006 10:12
Localização: Alvorada-RS
Contato:

Rastreamento ONIXSAT

Mensagem por sygecom »

Na documentação deles não diz nada, tem exemplo em outra linguagem( php e etc ) ?
Leonardo Machado
xHarbour.org + Hwgui + PostgreSql
Avatar do usuário
FFreire
Usuário Nível 3
Usuário Nível 3
Mensagens: 113
Registrado em: 19 Mai 2013 16:16
Localização: Andirá-PR / Itaporanga-SP

Rastreamento ONIXSAT

Mensagem por FFreire »

Tenho esses exemplos...

em C# (Requisição)

Código: Selecionar todos

private static HttpWebRequest CreateRequest()
{
HttpWebRequest request = (HttpWebRequest)WebRequest.Create("http://webservice.onixsat.com.br");
      request.Method = "POST";
      request.ContentType = "text/xml";
      return request;
}

public static string RequestXml(string strRequest)
{
          string result = string.Empty;
          try
          {
              // requisição xml em bytes
              byte[] sendData = UTF8Encoding.UTF8.GetBytes(strRequest);

              // cria requisicao
              HttpWebRequest request = CreateRequest();
              Stream requestStream = request.GetRequestStream();

              // envia requisição
              requestStream.Write(sendData, 0, sendData.Length);
              requestStream.Flush();
              requestStream.Dispose();

              // captura resposta
              HttpWebResponse response = (HttpWebResponse)request.GetResponse();
              Stream responseStream = response.GetResponseStream();

              MemoryStream output = new MemoryStream();

              byte[] buffer = new byte[256];

              int byteReceived = -1;            

              do
              {
                  byteReceived = responseStream.Read(buffer, 0, buffer.Length);
                  output.Write(buffer, 0, byteReceived);
              } while (byteReceived > 0);

              responseStream.Dispose();
              response.Close();

              buffer = output.ToArray();

              output.Dispose();

              // transforma resposta em string para leitura xml
              result = UTF8Encoding.UTF8.GetString(buffer);
          }
          catch (Exception ex)
          {
              // tratar exceção            
          }        
          return result;
}
Em C# (Descompactação)

Código: Selecionar todos

public override byte[] Decompress(byte[] data)
      {
          if (IsValidDecompress(data))
          {
              try
              {
                  // nome arquivo
                  string nameDirectory = Guid.NewGuid().ToString();

                  // cria diretorio na pasta temp
                  DirectoryInfo dInfo = Directory.CreateDirectory(Path.GetTempPath() + nameDirectory);

                  // path arquivo zip
                  string pathFileZip = dInfo.FullName + Path.DirectorySeparatorChar + nameDirectory + ".zip";

                  // CREATE FILE ZIP
                  File.WriteAllBytes(pathFileZip, data);

                  // DECOMPRESS
                  FastZip fastZip = new FastZip();
                  fastZip.ExtractZip(pathFileZip, dInfo.FullName, "");

                  // nome do arquivo txt salvo
                  string nameFileTxt = Directory.GetFiles(dInfo.FullName, "*.txt")[0];

                  // arquivo descompactado em bytes
                  byte[] buffer = File.ReadAllBytes(nameFileTxt);

                  // exclui diretorio e arquivos da pasta temp
                  if (Directory.Exists(dInfo.FullName))
                      Directory.Delete(dInfo.FullName, true);
                  return buffer;
              }
              catch (Exception ex)
              {
                  throw new ZipLibraryException("Falha ao descompactar arquivo no formato .zip", ex);
              }
          }
          return null;
      }
Em Delphi

Código: Selecionar todos

function TfrmJaburSat.EnviaCMDXML(pstrXML, pHost: String; intTipo : integer; var Resposta:String): boolean;
var
   ResponseCont,
   Response : TStringStream;
   HTTP : TIdHTTP;
   ms: TMemoryStream;
   archiver : TZipForge;
   AbUnZipper: TAbUnZipper;
   ToStream : TMemoryStream;
begin
   Result := false;
   Resposta := '';
   try
      //Log('Envio - '+pstrXML);
      HTTP          := TIdHTTP.Create(Application);
      ResponseCont  := TStringStream.Create('');
      Response      := TStringStream.Create('');
      ms            := TMemoryStream.Create;
      archiver      := TZipForge.Create(Application);
      AbUnZipper    := TAbUnZipper.Create(Application);

      HTTP.Disconnect;
      HTTP.Request.Accept := 'application/zip,text/html';
      try
         HTTP.ConnectTimeout := 10000; // 10 Segundos
         HTTP.ReadTimeout    := 10000; // 10 Segundos
         HTTP.Post(pHost,TStringStream.Create((pstrXML+Char(10)+Char(13))), Response);
         HTTP.Disconnect;
         HTTP.DisconnectSocket;
         if (intTipo = intEnvio) then
         begin
           //Processa Retorno do Comando
           Resposta := Response.DataString;
           //Log(Resposta);
           if Resposta <> ''
           then Result := true;
         end
         else
         begin
           try
             Response.Position := 0;
             ms.LoadFromStream(Response);
             // Salva arquivo .zip em Disco
             ms.SaveToFile(strCaminhoZip);
             archiver.FileName := strCaminhoZip;
             archiver.OpenArchive(fmOpenRead);
             
             if vboolLogReceb then
             begin
               archiver.BaseDir := strCaminhoTxt;
               // Salva arquivo descompactado .txt em Disco.
               archiver.ExtractFiles('*.*');
             end;

             // Salva arquivo descompactado .txt em memória.
             archiver.ExtractToStream('*.*',ResponseCont);
             Resposta := ResponseCont.DataString;
             if Resposta <> ''
             then Result := true;
             archiver.CloseArchive();
           except
              on E : Exception do
              begin
                  Log('Erro - Requisição(Salvando/Descompactando): '+E.Message);
              end;
           end;
         end;
      except
          on E : Exception do
          begin
              Log('Erro - Requisição: '+E.Message);
              AnalisaTrocaEndereco(E.Message);
          end;
      end;
   finally
     Response.Free;
     ResponseCont.Free;     
     HTTP.Free;
     FreeAndNil(ms);
     archiver.Free;
   end;
end;
O exemplo em PHP esta em anexo!

Segue também o manual, apesar de não acrescentar muita coisa...

Esses são exemplos que o pessoal passou !
Anexos
HelpIntegracao5.3.pdf
(3.01 MiB) Baixado 86 vezes
funcoes_php-3.txt
(1.71 KiB) Baixado 78 vezes
Harbour 3.2.0+MiniGui Extended 16.02+BCC5 / HWGdebug / SIXCDX / PostgreSQL 9.5 / LetoDB 2.15 / Java8
fabiano@ffsoft.com.br
Avatar do usuário
sygecom
Administrador
Administrador
Mensagens: 7131
Registrado em: 21 Jul 2006 10:12
Localização: Alvorada-RS
Contato:

Rastreamento ONIXSAT

Mensagem por sygecom »

Acredito que está faltando você colocar o HEAder correto

oXml:setRequestHeader('Content-Type',' text/xml;charset=UTF-8')
Leonardo Machado
xHarbour.org + Hwgui + PostgreSql
Avatar do usuário
FFreire
Usuário Nível 3
Usuário Nível 3
Mensagens: 113
Registrado em: 19 Mai 2013 16:16
Localização: Andirá-PR / Itaporanga-SP

Rastreamento ONIXSAT

Mensagem por FFreire »

Tinha notado isso e inseri... mas sem progresso também...

veja o código dai como ficou...

Código: Selecionar todos

//------------------------------------------------------
FUNCTION MicrosoftXmlRequest( cXmlRequest, cWebService )
//------------------------------------------------------
   
LOCAL oServer, oDOMDoc, cRetorno, cXmlRetorno, nCont
   
oServer := WIN_OLECREATEOBJECT( "MSXML2.ServerXMLHTTP")
oServer:Open( "POST", cWebService, .F. )
//oServer:SetRequestHeader("Content-Type","application/zip;charset=UTF-8")
oServer:SetRequestHeader("Content-Type","text/xml;charset=UTF-8")

oDOMDoc := WIN_OLECREATEOBJECT("MSXML2.DOMDocument")
oDOMDoc:async = .F.
oDOMDoc:validateOnParse  = .T.
oDOMDoc:resolveExternals := .F.
oDOMDoc:preserveWhiteSpace = .T.
   
oDOMDoc:LoadXML(cXmlRequest)
IF oDOMDoc:parseError:errorCode <> 0
   TONE( 321, 2 )
   MSGBOX1( {'Erro no carregamento do XML !!!',oDOMDoc:parseError:errorCode}, 'Erro...',,'&OK', ArqAdm[cALERT_TIT], ArqAdm[cALERT_BORD], ArqAdm[cALERT_IN] )
ELSE     
   TRY
      oServer:Send(oDOMDoc:xml)
      WHILE oServer:readyState <> 4
         HB_milliseconds(500)
      END
      cRetorno := oServer:responseText
   CATCH oError
      TONE( 321, 2 )
      MSGBOX1( 'Falha no envio do XML !!!', 'Erro...',,'&OK', ArqAdm[cALERT_TIT], ArqAdm[cALERT_BORD], ArqAdm[cALERT_IN] )
   END
END
      
IF VALTYPE( cRetorno ) == "C"
   cXmlRetorno := cRetorno
ELSE
   IF VALTYPE( cRetorno ) == "A"
      cXmlRetorno := ""
      FOR nCont = 1 TO LEN( cRetorno )
         cXmlRetorno += CHR( cRetorno[ nCont ] )
      NEXT
   ELSE
      cXmlRetorno := ""
   END
END
   
RETURN(cXmlRetorno)
O que aparentemente falta é realmente a descompactação... que não achei nada semelhante no Harbour para fazer...

:%
Harbour 3.2.0+MiniGui Extended 16.02+BCC5 / HWGdebug / SIXCDX / PostgreSQL 9.5 / LetoDB 2.15 / Java8
fabiano@ffsoft.com.br
Avatar do usuário
rochinha
Administrador
Administrador
Mensagens: 4664
Registrado em: 18 Ago 2003 20:43
Localização: São Paulo - Brasil
Contato:

Rastreamento ONIXSAT

Mensagem por rochinha »

Amiguinhos,

FFreire bastaria renomear o arquivo .xml para .zip

ren retorno.xml retorno.zip

Pois este não é um arquivo .xml legitimo. Trata-se de um arquivo .zip renomeado para .xml ou .txt.

Se você abrir pelo notepad verá a string PK mas o problema é que o arquivo está corrompido por falta de algum trecho.
OPS! LINK QUEBRADO? Veja ESTE TOPICO antes e caso não encontre ENVIE seu email com link do tópico para [url=mailto://fivolution@hotmail.com]fivolution@hotmail.com[/url]. Agradecido.

@braços : ? )

A justiça divina tarda mas não falha, enquanto que a justiça dos homens falha porque tarda.
Avatar do usuário
FFreire
Usuário Nível 3
Usuário Nível 3
Mensagens: 113
Registrado em: 19 Mai 2013 16:16
Localização: Andirá-PR / Itaporanga-SP

Rastreamento ONIXSAT

Mensagem por FFreire »

Vejam...

Não é simplesmente "renomear" o arquivo, o que ocorre é que, o que esta gravado no arquivo vem em um formato que não permite ser descompactado, o arquivo não esta faltando nada e nem esta corrompido, só não foi montado da maneira correta!

Ja consegui a solução, mas em JAVA, irei postar a solução aqui! Mas gostaria de resolver em HARBOUR!

Após recebido o arquivo "download.xml" do WS executo o JAVA e monto o arquivo, mas no JAVA, segue trecho da solução:

Código: Selecionar todos

//Pega a resposta
                    InputStream in = connection.getInputStream();
                    try (FileOutputStream out = new FileOutputStream("download.xml")) {
                        byte[] buf = new byte[1024];
                        int n = in.read(buf);
                        while (n >= 0) {
                            out.write(buf, 0, n);
                            n = in.read(buf);
                        }
                        out.flush();
                    }
Harbour 3.2.0+MiniGui Extended 16.02+BCC5 / HWGdebug / SIXCDX / PostgreSQL 9.5 / LetoDB 2.15 / Java8
fabiano@ffsoft.com.br
Responder