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.
Esta DLL foi testada nas seguintes versões de Windows:
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.
É 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.
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.
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++:
int protosat::LoadDLL (void) { int handle; //! Carrega a dll ... handle = LoadLibrary("dllsat.DLL"); //! Verifica se a dll foi corretamente carregada.. if (handle) { . . . } return handle; }
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++:
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; }
A DLL possui três formas de acesso a porta de comunicação com o SAT:
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.
O arquivo de header
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. <