# Tutorial DLLSAT.DLL for Windows

1. Introdução
   - 1.1. Limitações atuais
   - 1.2. Tempos de Respostas
   - 1.3. Codificação do XML e Entrada
   - 1.4. Bibliotecas Adicionais
2. Chamando a DLL
3. Instanciando uma função da DLL
4. Acessando a porta de Comunicação
5. Funções da DLL

# 1. Introdução

Esta DLL implementaas funções de comunicação entre o aplicativo AC e o equipamento SAT através de chamadas de funções de alto nível. A API desta biblioteca, segue as definições da especificação de requisitos do SAT publicado pela SEFAZ-SP. A DLL detecta de forma automática a porta serial em que o SAT etá conectado, entretanto caso se deseje espeficicar a porta, pode-se utilizar a função AbreSerialSAT.

## 1.1. Limitações atuais

Esta DLL foi testada nas seguintes versões de Windows:

- Windows 7 professional
- Windows 8

## 1.2. Tempos de Respostas

Os tempos de respostas da DLL seguem a especificação de requisitos que define o tempo máximo de timeout para cada função da API, portanto, nada precisa ser feito em relação a gerencia de timeout que fica totalmente a cargo da DLL.

## 1.3. Codificação do XML de Entrada

É muito importante atentar para que os xmls de entrada gerados pelo aplicativo de automação (AC) codifiquem os XMLs sempre em UTF-8. Arquivos XMLs coficados em outro formato poderá ser rejeitado pela retaguarda da SEFAZ. A DLL não consiste estes aqruivos de entrada, portanto é de responsabilidade do AC garantir a correta codificação dos mesmos.

## 1.4. Bibliotecas Adicionais

A DLLSAL.DLL necessita da biblioteca zlib.dll que realiza a compressão e descompressão de dados. É essencial a sua instalação para o correto funcionamento da DLL de comunicação, entretanto não há necessidade de nenhuma referencia a zlib.dll pela aplicação, ficando seu uso restrita a DLLSAT.DLL.

# 2. Chamando a DLL

A DLL pode ser chamada em qualquer linguagem de programação através de chamadas especificas para o carregamento da DLL em memória. Abaixo um exemplo de chamada da DLL em C++:

- CBuilder

        int  protosat::LoadDLL (void) {
              int handle;

      		//! Carrega a dll ...
      		handle = LoadLibrary("dllsat.DLL");

      		//! Verifica se a dll foi corretamente carregada..
      		if (handle) {
      		  .
      		  .
      		  .

      		}
              return handle;
        }

# 3. Instanciando uma função da DLL

De forma geral as funções da DLL podem ser facilmente instanciadas em diversas linguagens, abaixo um exemplo de chamada de uma função da DLL em C++:

- CBuilder

        char *  protosat::ConsultarSAT (void) {
              char * resp;

              resp=   (*((char *WINAPI (*) (int sessao)) GetProcAddress (hDll, "ConsultarSAT")))(Sessao);

      		//! retorna a resposta do SAT para a aplicacao
              return resp;
        }

# 4. Acessando a porta de Comunicação

A DLL possui três formas de acesso a porta de comunicação com o SAT:

- Chamando o método AbreSerialSAT

         A porta de comunicação pode ser definida passando no argurmento "commPort" o número da COM desejada, por exemplo, para abrir a porta COM1,
         defina o valor 1 para o argumento "commPort".

         AbreSerialSAT (int commPort, int baud, int nBits, int paridade, int nStops) ;

-     Definindo o arquivo dllsat.cnf
         Este arquivo deve conter apenas uma linha com a indicação da porta onde o SAT está conectado, por exemplo:
         COM1
         OBS: Este arquivo deve estar instalado na mesma pasta da aplicação.

-     Através de auto descoberta
         Caso a aplicação não chame a função "AbreSerialSAT" ou não defina  a porta no arquivo dllsat.cnf, a DLL possui
         mecanismo de descoberta automatica da porta de comunicação onde o SAT está conectado.

É importante deixar claro que apenas um dos métodos acima deve ser utilizado para definir a porta de comunicação com o SAT.

# 5. Funções da DLL

O arquivo de header define os protótipos das funções exportadas pela DLL. Abaixo o corpo do arquivo de definições:

- COMM.h

       enum  codes {
          __NOERROR__  =0,
          __NOCONNECT__=1,
          __READERROR__,
          __CHKERROR__,
          __CMDUNKERROR__,
          __TIMEOUT__  = 0x8000  ,
          __SEMCTS__
      };

      extern  "C"
      	{
      	      /**
      		   * @name Base64ToAscii
      		   * @brief Retorna em formato ASCII o último buffer codificado em base64 pelo SAT.
      		   **/
                __declspec(dllexport) char * __stdcall  Base64ToAscii(void) ;

                /**
                  * @name TrocarCodigoDeAtivacaoSAT
                  * @brief O Aplicativo Comercial ou outro software fornecido pelo Fabricante
                  * @brief poderÃ¡ realizar a troca do cÃ³digo de ativaÃ§Ã£o a qualquer momento
                  * @param numeroSessao
                  * @param CodigoAtivacao
                  * @param opcao
                  * @param novoCodigo
                  * @param confNovoCodigo
                  * @return pointer para area com retorno do comando enviado pelo dispositivo SAT
                  */
             __declspec(dllexport) char * __stdcall  TrocarCodigoDeAtivacao(int nSessao,char *CodigoAtivacao,int opcao, char *novoCodigo, char * confNovoCodigo  ) ;
              /**
               * @name  GeraNumeroessao
               * @brief Gera o numero de sessao para o AC
               *
               */
              __declspec(dllexport) int  __stdcall GeraNumeroSessao (void) ;
              /**
               * @name  CloseSerial
               * @brief Fecha a porta serial
               *
               */
             __declspec(dllexport) void   __stdcall  CloseSerial(void);
               /**
                * @name AtivarSAT
                * @brief Metodo para ativar o uso do SAT
                * @param subComando
                * @param codigoDeAtivacao
                * @param CNPJ
                * @param cUF
                * @return CSR
                */
              __declspec(dllexport) char *  __stdcall AtivarSAT(int nSessao,int subComando, char *codigoDeAtivacao, char *CNPJ, int cUF);
               /**
                * @name  ComunicarCertificadoICPBRASIL
                * @brief Comunica o certificado icp Brasil
                * @param numeroSessao
                * @param codigoDeAtivacao
                * @param Certificado
                * @return pointer para area com retorno do comando enviado pelo dispositivo SAT
                **/
             __declspec(dllexport) char *  __stdcall  ComunicarCertificadoICPBRASIL (int nSessao,char *codigoDeAtivacao, char *Certificado) ;
              /**
                * @name EnviaDadosVenda
                * @brief Responsavel pelo comando de envio de dados de vendas
                * @param codigoDeAtivacao
                * @param numeroSessao
                * @param dadosVenda
                * @return pointer para area com retorno do comando enviado pelo dispositivo SAT
                */
             __declspec(dllexport) char * __stdcall  EnviarDadosVenda(int nSessao,char *codigoDeAtivacao,char *dadosVenda);

                 /**
                  * @name CanclearUltimaVenda
                  * @brief cancela o ultimo cupom fiscal
                  * @param codigoDeAtivacao
                  * @param chave
                  * @param dadosCancelamento
                  * @return pointer para area com retorno do comando enviado pelo dispositivo SAT
                  */
            __declspec(dllexport) char * __stdcall  CancelarUltimaVenda(int nSessao,char *codigoDeAtivacao,  char *chave, char *dadosCancelamento);
             /**
               * @name AbreSerialSAT
               * @brief Configura os parametros de comunicacao da porta serial apontada por commPort
               * @param commPort - Porta Serial 0 COM1 , 1 COM2, ....
               * @param baud : baudrate
               * @param nBits: Numero de stop bits
               * @param paridade: Paridade 0-Sem paridade, 1-Paridade par, 2- Impar
               * @param nStops
               * @return COMM_ERROR
               */
             __declspec(dllexport) int __stdcall AbreSerialSAT (int commPort, int baud, int nBits, int paridade, int nStops) ;
               /**
                 * @name ConsultarSAT
                 * @brief consultar SAT
                 * @param numeroSessao
                 * @return pointer para area com retorno do comando enviado pelo dispositivo SAT
                 */
            __declspec(dllexport)  char * __stdcall ConsultarSAT (int sessao) ;

                /**
                  *  @name TesteFimAFim
                  *  @brief Esta funÃ§Ã£o consiste em um teste de comunicaÃ§Ã£o entre o AC, o Equipamento SAT e a SEFAZ
                  *  @param numeroSessao
                  *  @param codigoAtivacao
                  *  @param dadosVenda
                  *  @return pointer para area com retorno do comando enviado pelo dispositivo SAT
                  */
             __declspec(dllexport) char * __stdcall  TesteFimAFim(int nSessao,char *codigoDeAtivacao, char *dadosVenda) ;

                /**
                  *  @name  ConsultarStatusOperacional
                  *  @brief Essa funÃ§Ã£o Ã© responsÃ¡vel por verificar a situaÃ§Ã£o de funcionamento do Equipamento SAT
                  *  @param numeroSessao
                  *  @param codigoAtivacao
                  *  @return pointer para area com retorno do comando enviado pelo dispositivo SAT
                  *
                  */
             __declspec(dllexport) char *  __stdcall  ConsultarStatusOperacional(int nSessao,char *codigoDeAtivacao) ;
                /**
                  * @name ConsultarNumeroSessao
                  * @brief O AC poderÃ¡ verificar se a Ãºltima sessÃ£o requisitada foi processada em caso de nÃ£o
                  * @brief recebimento do retorno da operaÃ§Ã£o. O equipamento SAT-CF-e retornarÃ¡ exatamente o resultado da
                  * @brief sessÃ£o consultada
                  * @return pointer para area com retorno do comando enviado pelo dispositivo SAT
                  */
             __declspec(dllexport) char *__stdcall  ConsultarNumeroSessao(int nSessao,char *CodAtivacao,int numeroSessao) ;
                /**
                  * @name  ConfigurarInterfaceDeRede
                  * @brief Responsavel pela configuracao da interface de rede do SAT (Ver espec:2.6.10)
                  * @param numeroSessao
                  * @param codigoDeAtivacao
                  * @param dadosVenda
                  * @return pointer para area com retorno do comando enviado pelo dispositivo SAT
                  */
             __declspec(dllexport) char * __stdcall  ConfigurarInterfaceDeRede (int nSessao,char *codigoDeAtivacao, char *DadosConfiguracao) ;
                /**
                  * @name AssociarAssinatura
                  * @brief Responsavel pelo comando de associar o AC ao SAT
                  * @param numeroSessao
                  * @param CodigoAtivacao
                  * @param CNPJ
                  * @param assinaturaCNPJs
                  * @return pointer para area com retorno do comando enviado pelo dispositivo SAT
                  */
             __declspec(dllexport) char *  __stdcall  AssociarAssinatura(int nSessao,char *codativacao,char *CNPJvalue, char *assinaturaCNPJs) ;
                /**
                  * @name AtualizarSoftwateSAT
                  * @brief O Contribuinte utilizarÃ¡ a funÃ§Ã£o AtualizarSoftwareSAT para a atualizaÃ§Ã£o imediata do
                  * @brief software bÃ¡sico do Equipamento SAT
                  * @param numeroSessao
                  * @param codigoAtivacao
                  * @return pointer para area com retorno do comando enviado pelo dispositivo SAT
                  */
             __declspec(dllexport) char * __stdcall AtualizarSoftwareSAT(int nSessao,char *CodigoAtivacao) ;

                /**
                  * @name ExtrairLogs
                  * @brief O Aplicativo Comercial poderÃ¡ extrair os arquivos de registro do
                  * @brief Equipamento SAT por meio da funÃ§Ã£o ExtrairLogs
                  * @param numeroSessao
                  * @param codigoAtivacao
                  * @return  pointer para area com retorno do comando enviado pelo dispositivo SAT
                  */
             __declspec(dllexport) char * __stdcall  ExtrairLogs(int nSessao,char *CodigoAtivacao) ;
                /**
                  * @name BloquearSAT
                  * @brief O Aplicativo Comercial ou outro software fornecido pelo Fabricante poderÃ¡
                  * @brief realizar o bloqueio operacional do Equipamento SAT
                  * @return  pointer para area com retorno do comando enviado pelo dispositivo SAT
                  */
             __declspec(dllexport) char *__stdcall  BloquearSAT(int nSessao,char *CodigoAtivacao);
                /**
                  * @name DesbloquearSAT
                  * @brief O Aplicativo Comercial ou outro software fornecido pelo
                  * @brief Fabricante poderÃ¡ realizar o desbloqueio operacional do Equipamento SAT
                  * @param numeroSessao
                  * @param codigoAtivacao
                  * @return pointer para area com retorno do comando enviado pelo dispositivo SAT
                  */
            __declspec(dllexport)  char *__stdcall DesbloquearSAT(int nSessao,char *CodigoAtivacao) ;

      }

DIMEP Sistemas Ltda. <