Usuário com melhor resposta
SAT CF-E Auxilio Criação Aplicativo Comercial

Pergunta
-
Boa tarde.
Preciso de uma ajuda para desenvolvimento de AC (aplicativo comercial) para comunicação com S@AT São Paulo.
O que preciso saber é como utilizar o emulador com os dados do nosso aplicativo comercial. o que ocorre:
1 - Executei o passo a passo para instalação e uso do emulador.
2 - executei os três programas, fiz a ativação do SAT, com cnpj 11.111.111/1111-11.
3 - Configurei o AC que acompanha o emulador para o fabricante software 12.345.678/9091-23 e contribuinte 11.111.111/1111-11.
4 - Fiz a configuração de um produto Colocando EAN e NCM validos.
e Consegui realizar uma venda
obs: Eu não tenho o aparelho SAT real (SOMENTE o emulador).
O que preciso:
Na empresa onde trabalho utilizamos linguagens .NET.
Eu preciso entender este projeto, mas realmente não consegui, apesar de ler documentação para caramba.
dúvidas:
1 - Posso usar o emulador para testes do aplicativo comercial que estou criando?
como fazer isso?
tenho de usar a dll? qual?
se sim, a dll deve disponibilizar métodos e suas respectivas assinaturas. como utiliza-la.
2 - Pela documentação do SAT, cada fabricante terá um driver. e o nome da dll não é padronizado.
eu tenho de entrar em contato com cada fabricante e obter a dll (driver)?
obrigado a todos que puderem ajudar.
- Editado Jose Geraldo quarta-feira, 20 de maio de 2015 14:43
Respostas
-
Pessoal, boa tarde.
Para auxiliar aos escovadores de bits, segue abaixo minhas experiências, de repente quem sabe não auxilio alguém:
1 - A empresa onde trabalho adquiriu o SAT Tanca - SDK-1000 - Desenvolvimento.
2 - Instalar o driver do produto. Atenção: O driver deve ser instalado corretamente, a porta COMXX deve ser assumida automaticamente. exemplo: COM3.
Se for windows 8, precisa de procedimentos adicionais para instalar os drivers. (tem documento no site da tanca)
Atenção: Eu precisei colocar a SAT.DLL e TANCA_SAT.INF nas pastas windows\system32 e windows\sysWOW64.
abaixo está a classe declarações, somente para exemplificar meu teste, em uma das funções;
using System;
using System.Collections.Generic;
using System.Text;
using System.Runtime.InteropServices;
namespace WindowsFormsApplication1
{
public class Declaracoes
{
public static int iRetorno;
//Métodos de consulta Status operacional
[DllImport("SAT.dll")]
public static extern string ConsultarStatusOperacional(int numeroSessao, string codigoDeAtivacao);
[DllImport("SAT.dll")]
public static extern string EnviarDadosVenda(...);}
}Abaixo codigo fonte para consumir a função Declaracoes.ConsultarSatatusOperacional:
private void btnConsultaStatus_Click(object sender, EventArgs e)
{
int sessao = GerarCodigoNumerico(int.Parse(DateTime.Now.ToString("HHmmss"))); // NUMERO DA SESSAO
string retorno = Declaracoes.ConsultarStatusOperacional(sessao, txtCodigoAtivacao.Text.Trim());
}
public Int32 GerarCodigoNumerico(Int32 numeroNF)
{
string s;
Int32 i, j, k;
// Essa função gera um código numerico atravéz de calculos realizados sobre o parametro numero
s = numeroNF.ToString("000000");
for (i = 0; i < 6; ++i)
{
k = 0;
for (j = 0; j < 6; ++j)
k += Convert.ToInt32(s[j]) * (j + 1);
s = (k % 11).ToString().Trim() + s;
}
return Convert.ToInt32(s.Substring(0, 6));
}
abaixo segue um print do resultado da função.
- Marcado como Resposta Jose Geraldo terça-feira, 2 de junho de 2015 18:51
- Editado Jose Geraldo terça-feira, 2 de junho de 2015 19:04 acertos
Todas as Respostas
-
Pessoal, boa tarde.
Para auxiliar aos escovadores de bits, segue abaixo minhas experiências, de repente quem sabe não auxilio alguém:
1 - A empresa onde trabalho adquiriu o SAT Tanca - SDK-1000 - Desenvolvimento.
2 - Instalar o driver do produto. Atenção: O driver deve ser instalado corretamente, a porta COMXX deve ser assumida automaticamente. exemplo: COM3.
Se for windows 8, precisa de procedimentos adicionais para instalar os drivers. (tem documento no site da tanca)
Atenção: Eu precisei colocar a SAT.DLL e TANCA_SAT.INF nas pastas windows\system32 e windows\sysWOW64.
abaixo está a classe declarações, somente para exemplificar meu teste, em uma das funções;
using System;
using System.Collections.Generic;
using System.Text;
using System.Runtime.InteropServices;
namespace WindowsFormsApplication1
{
public class Declaracoes
{
public static int iRetorno;
//Métodos de consulta Status operacional
[DllImport("SAT.dll")]
public static extern string ConsultarStatusOperacional(int numeroSessao, string codigoDeAtivacao);
[DllImport("SAT.dll")]
public static extern string EnviarDadosVenda(...);}
}Abaixo codigo fonte para consumir a função Declaracoes.ConsultarSatatusOperacional:
private void btnConsultaStatus_Click(object sender, EventArgs e)
{
int sessao = GerarCodigoNumerico(int.Parse(DateTime.Now.ToString("HHmmss"))); // NUMERO DA SESSAO
string retorno = Declaracoes.ConsultarStatusOperacional(sessao, txtCodigoAtivacao.Text.Trim());
}
public Int32 GerarCodigoNumerico(Int32 numeroNF)
{
string s;
Int32 i, j, k;
// Essa função gera um código numerico atravéz de calculos realizados sobre o parametro numero
s = numeroNF.ToString("000000");
for (i = 0; i < 6; ++i)
{
k = 0;
for (j = 0; j < 6; ++j)
k += Convert.ToInt32(s[j]) * (j + 1);
s = (k % 11).ToString().Trim() + s;
}
return Convert.ToInt32(s.Substring(0, 6));
}
abaixo segue um print do resultado da função.
- Marcado como Resposta Jose Geraldo terça-feira, 2 de junho de 2015 18:51
- Editado Jose Geraldo terça-feira, 2 de junho de 2015 19:04 acertos
-
Boa tarde, faz um tempo, mas caso queria deixar o nome da dll dinâmica basta fazer o seguinte:
///Capturar o caminho da dll
public static string GetDLL()
{
string dllStr = String.Empty;
switch (Uteis.variaveis.Instance.Param.SATMod)
{
case Uteis.Tipos.SATFab.BEMATECH:
dllStr = "BemaSAT.dll";
break;
case Uteis.Tipos.SATFab.ControlID:
case Uteis.Tipos.SATFab.KRYPTUS:
case Uteis.Tipos.SATFab.TANCA:
dllStr = "SAT.dll";
break;
case Uteis.Tipos.SATFab.GERTEC:
case Uteis.Tipos.SATFab.EPSON:
dllStr = "GERSAT.dll";
break;
default:
dllStr = "dllsat.dll";
break;
}
return Path.Combine(Sat.Uteis.variaveis.Instance.PathStartup, dllStr);
}-----------------------------------------------------------------
///Carregar a DLL
public void LoadDLL()
{
dllName = GetDLL();
dll = Uteis.Win32Native.LoadLibrary(dllName);
if (dll == IntPtr.Zero)
{
var lasterror = Marshal.GetLastWin32Error();
var innerEx = new Win32Exception(lasterror);
innerEx.Data.Add("LastWin32Error", lasterror);
System.Text.StringBuilder sb = new System.Text.StringBuilder();
sb.AppendFormat("Erro ao ler DLL em \"{0}\"", Path.Combine(Uteis.variaveis.Instance.PathStartup, dllName));
if (innerEx != null)
sb.AppendFormat("\n > Mensagem original: {0} - {1}", lasterror, innerEx.Message);
throw new Exception(sb.ToString());///, innerEx);
//throw new Exception(string.Format("Erro ao ler DLL em \"{0}\"\n\n > {1}", Path.Combine(Uteis.variaveis.Instance.PathStartup, dllName), Marshal.GetLastWin32Error().ToString()));
}
//else
// return dllHandle.ToString(); // Loading done !
}
-----------------------------------------------------------------
///Executar um metodo
public string mTesteFimAFim(string nSessao, string cAtivacao, string pDadosVenda)
{
try
{
// IntPtr ptr = TesteFimAFim(int.Parse(nSessao), cAtivacao, pDadosVenda);
// return Marshal.PtrToStringAnsi(ptr);
LoadDLL();
IntPtr pAddressOfFunctionToCall = Uteis.Win32Native.GetProcAddress(dll, "TesteFimAFim");
if (pAddressOfFunctionToCall == IntPtr.Zero)
throw new Exception(string.Format("Método \"{0}\" não encontrado na dll \"{1}\"", "TesteFimAFim", Environment.CurrentDirectory + dllName));
TesteFimAFim testFimAFim = (TesteFimAFim)Marshal.GetDelegateForFunctionPointer(
pAddressOfFunctionToCall,
typeof(TesteFimAFim));
return Marshal.PtrToStringAnsi(testFimAFim(int.Parse(nSessao), cAtivacao, pDadosVenda));
}
catch (Exception ex)
{
throw (ex);
}
finally
{
//if (dll != IntPtr.Zero)
// FreeLibrary(dll);
}//-----------------------------------------------------------------
[UnmanagedFunctionPointer(CallingConvention.StdCall)]
private delegate IntPtr TesteFimAFim(int numeroSessao, [MarshalAs(UnmanagedType.LPStr)] string codigoDeAtivacao,
[MarshalAs(UnmanagedType.LPStr)] string dadosVenda);
//----------------------------------------------------------------
public static class Win32Native
{
[DllImport("kernel32.dll", CharSet = CharSet.Ansi)]
public static extern IntPtr GetProcAddress(IntPtr hModule, string lpProcName);
[DllImport("kernel32.dll")]
public static extern bool FreeLibrary(IntPtr hModule);
//[DllImport("kernel32.dll")]
//public static extern IntPtr LoadLibrary(string lpFileName);
[DllImport("kernel32", SetLastError = true, CharSet = CharSet.Ansi)]
public static extern IntPtr LoadLibrary([MarshalAs(UnmanagedType.LPStr)]string lpFileName);
}//----------------------------------------------------------------
Aprendendo C#, SQL Server