none
SAT CF-E Auxilio Criação Aplicativo Comercial RRS feed

  • 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
    quarta-feira, 20 de maio de 2015 14:42

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
    terça-feira, 2 de junho de 2015 18:50

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
    terça-feira, 2 de junho de 2015 18:50
  • 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

    terça-feira, 14 de julho de 2020 19:20