Jump to content
edith

Como ler os dados do CC (cartão do Cidadão) através da API fornecida?

Recommended Posts

edith

Bem, por + voltas que dê não encontro solução para ler os dados do CC, nome, foto, etc.

Através do manual para programadores fornecido no site do CC, não consigo lá ir. As funções da API mensionadas lá, não as consigo encontrar em nenhuma DLL fornecida.

Alguém me pode ajudar com um exemplo em VB de como aceder ao Cartão do Cidadão.

Desde já o meu muito obrigado

Share this post


Link to post
Share on other sites
Warrior

Já existiu uma discussão sobre isso, julgo que a podes encontrar usando o Search do forum.

Share this post


Link to post
Share on other sites
djthyrax

Nunca programei em VB, mas quando tentei usar o dll através do Python tive problemas por causa das estruturas definidas no pteidlib.h e não conseguia fazer nada de jeito em Python. Em VB não sei se será esse também o teu problema, tens que ver.

Já agora, depois de instalada a aplicação disponível no site, podes encontrar o pteidlib.dll no C:\Windows\system32, tal como todas as outras pteid*.dll.

PS: Há um DLL para .NET, vê se te ajuda. Encontra-se no mesmo sítio que os outros, e chama-se pteidlib_dotnet.dll, salvo erro.


Não peças ajuda por PM! A tua dúvida vai ter menos atenção do que se for postada na secção correcta do fórum!

Share this post


Link to post
Share on other sites
FernandoNunes

Caros,

O que existe em termos de APIs/SDKs do cartão de cidadão é um pouco confuso. Para qualquer operação é necessário a instalação do Middleware do Cartão de Cidadão disponível em: http://www.cartaodecidadao.pt/index.php?option=com_content&task=view&id=102&Itemid=44〈=pt

Fica disponível na pasta do SDK (%Program Files%\Cartão de Cidadão\sdk) uma Static Library (.lib) e exemplos em Java.

Ficam também disponíveis em C:\Windows\System32 várias bibliotecas pteid*.dll que podem ser usadas, inclusive a de .NET tal como referido pelo djthyrax.

Foi disponibilizado sob LGPL em http://cartaodecidadao.codeplex.com/ a mesma funcionalidade existente na biblioteca pteidlib_dotnet.dll, com código fonte ou binário.

Devido a alguma procura foi também disponibilizado um wrapper e programa de exemplo para VB6.

Cumprimentos,

Fernando Nunes

Share this post


Link to post
Share on other sites
pedro.godinho

Fernando,

    Tenho uma dúvida em relação à eidpt.dll,  é o seguinte, o meu objectivo é detectar a entrada do cartão do cidadão no smart card reader e depois ler os certificados, para isso recorri à classe SCWatcher que funciona bem detectando a  entrada do cartão, o problema é a seguinte, que na função chamada pelo Handler, ele não  consegue correr a função do EIDPT_Init() e diz SC_ERROR_OBJECT_NOT_FOUND, o que  devo  fazer?

static class Program
    {
        static Form1 frm;
        static DevScope.CartaoDeCidadao.SCWatcher scw;

        static void cardInsertedMethod(string readerName,string cardName)
        {
            frm.outputTextBox("readerName:" + readerName + " cardName:" + cardName);

            DevScope.CartaoDeCidadao.EIDPT.Init(null); //"O2Micro CCID SC Reader 0"
            DevScope.CartaoDeCidadao.Certificate[] certs = DevScope.CartaoDeCidadao.EIDPT.GetCertificates();

            foreach (DevScope.CartaoDeCidadao.Certificate cert in certs)
            {
                frm.outputTextBox("cert.Name:" + cert.Name);
            }

        }

        [sTAThread]
        static void Main()
        {
            Application.EnableVisualStyles();
            Application.SetCompatibleTextRenderingDefault(false);
            Control.CheckForIllegalCrossThreadCalls = false;

            frm = new Form1();
            //Instantiates and starts the SCWatcher 
            scw = DevScope.CartaoDeCidadao.SCWatcher.GetInstance();            

            //register listener para o evento de CardInserted
            scw.CardInserted += new DevScope.CartaoDeCidadao.SCWatcher.CardInsertedHandler(cardInsertedMethod);

            Application.Run(frm);
            
        }

Share this post


Link to post
Share on other sites
rafael_276

Boas, Quando tento importar da API do CC ele confunde os digitos com acentos..

Codigo:

   Public Function fGetMorada() As clMorada
        Try

            Dim address As eidpt.PteidAddr = eId.GetAddr()
            Dim cl As New clMorada
            With cl
                .tipoRua = StrConv(address.streettype, VbStrConv.ProperCase)
                .rua = StrConv(address.street, VbStrConv.ProperCase)
                .morada = StrConv(address.streettype & " " & address.street, VbStrConv.ProperCase)
                .porta = StrConv(address.door, VbStrConv.ProperCase)
                .andar = StrConv(address.floor, VbStrConv.ProperCase)
                .lado = StrConv(address.side, VbStrConv.ProperCase)
                .edificio = StrConv(address.building, VbStrConv.ProperCase)
                .edificioAbr = StrConv(address.buildingAbbr, VbStrConv.ProperCase)

                .codigoPostal = StrConv(address.cp4 & "-" & address.cp3, VbStrConv.ProperCase)
                .codigoPostal1 = StrConv(address.cp4, VbStrConv.ProperCase)
                .codigoPostal2 = StrConv(address.cp3, VbStrConv.ProperCase)

                .localidade = StrConv(address.locality, VbStrConv.ProperCase)
                .tipoRuaAbr = StrConv(address.streettypeAbbr, VbStrConv.ProperCase)
                .freguesia = StrConv(address.freguesiaDesc, VbStrConv.ProperCase)
                .concelho = StrConv(address.municipalityDesc, VbStrConv.ProperCase)
                .districto = StrConv(address.districtDesc, VbStrConv.ProperCase)
                .pais = StrConv(address.countryDescF, VbStrConv.ProperCase)
            End With
            Return cl
        Catch
            Return Nothing
        End Try
    End Function

O que deveria devolver era "Rua António Abreu Freire" mas devolve "Rua Doutor Antã“Nio Abreu Freire".

Alguem me pode ajudar?

Abraços


Exitem apenas 10 Tipos de pessoas no mundo: Aqueles que percebem binario e aqueles que não percebem.

akaru.pT

Share this post


Link to post
Share on other sites
paulo_dias78

Bom dia,

Alguém tem um exemplo em VB.NET que funcione?

Inicialização - Leitura dos dados - (etc)

Obrigado.

Share this post


Link to post
Share on other sites
RSFalcon7

rafael_276: não percebo nada de VB, mas este erro parece-me do tamanho do encode, tenta usar uma funcao de leitura mais abrangente, em C julgo que a getchar faz isso, pois na verdade ela devolve um int (4 vezes mais capacidade de armazenamento que o char)

Share this post


Link to post
Share on other sites
rafael_276

se eu fizer um brakePoint em address.street o atributo street da API já me devolve com o erro..


Exitem apenas 10 Tipos de pessoas no mundo: Aqueles que percebem binario e aqueles que não percebem.

akaru.pT

Share this post


Link to post
Share on other sites
rafael_276

Bom dia,

Alguém tem um exemplo em VB.NET que funcione?

Inicialização - Leitura dos dados - (etc)

Obrigado.

Public Class clCartaoCidadao
    'Dim proxyInfo As ProxyInfo
    'Dim scWatch As SCWatcher
    'Dim ccCurrentReader As String = "RICOH Company, Ltd. RICOH SmartCard Reader 0"
    Private knownCards As New ArrayList(New String() {"3B 7D 95 00 00 80 31 80 65 B0 83 11 C0 A9 83 00 90 00", "3B 95 95 40 FF D0 00 54 01 31", "3B 95 95 40 FF D0 00 54 01 32"})
    Dim isCardPresent As Boolean = False
    Dim eId As eidpt.Pteid

    Dim _leitorSmartReader As String = ""

    Public Property leitor As String
        Get
            Return _leitorSmartReader
        End Get
        Set(ByVal value As String)
            _leitorSmartReader = value
            If Not sCCInit() Then
                Throw New Exception("Erro a Iniciar Cartão")
            End If
        End Set
    End Property

    Public Function sCCInit() As Boolean
        Try
            eId.Init(_leitorSmartReader)
            eId.SetSODChecking(False)
            Return True
        Catch ex As Exception
            eId.Exit(0)
            Return False
        End Try
    End Function

    Public Sub sClose()
        eId.Exit(0)
    End Sub

    Function fGetString(ByVal str As String, ByVal conv As VbStrConv) As String
        Dim byInput() As Byte = System.Text.Encoding.Default.GetBytes(str)
        Return StrConv(System.Text.Encoding.UTF8.GetString(byInput), conv)
    End Function

    Public Class clMorada
        Public tipoRua As String
        Public tipoRuaAbr As String
        Public rua As String
        Public morada As String
        Public porta As String
        Public andar As String
        Public lado As String
        Public edificio As String
        Public edificioAbr As String


        Public codigoPostal As String
        Public codigoPostal1 As String
        Public codigoPostal2 As String

        Public localidade As String

        Public freguesia As String
        Public concelho As String
        Public districto As String
        Public pais As String
    End Class

    Public Function fGetMorada() As clMorada
        Try

            Dim address As eidpt.PteidAddr = eId.GetAddr()
            Dim cl As New clMorada
            With cl
                .tipoRua = fGetString(address.streettype, VbStrConv.ProperCase)
                .rua = fGetString(address.street, VbStrConv.ProperCase)
                .morada = fGetString(address.streettype & " " & address.street, VbStrConv.ProperCase)
                .porta = fGetString(address.door, VbStrConv.ProperCase)
                .andar = fGetString(address.floor, VbStrConv.ProperCase)
                .lado = fGetString(address.side, VbStrConv.ProperCase)
                .edificio = fGetString(address.building, VbStrConv.ProperCase)
                .edificioAbr = fGetString(address.buildingAbbr, VbStrConv.ProperCase)

                .codigoPostal = fGetString(address.cp4 & "-" & address.cp3, VbStrConv.ProperCase)
                .codigoPostal1 = fGetString(address.cp4, VbStrConv.ProperCase)
                .codigoPostal2 = fGetString(address.cp3, VbStrConv.ProperCase)

                .localidade = fGetString(address.locality, VbStrConv.ProperCase)
                .tipoRuaAbr = fGetString(address.streettypeAbbr, VbStrConv.ProperCase)
                .freguesia = fGetString(address.freguesiaDesc, VbStrConv.ProperCase)
                .concelho = fGetString(address.municipalityDesc, VbStrConv.ProperCase)
                .districto = fGetString(address.districtDesc, VbStrConv.ProperCase)
                .pais = fGetString(address.countryDescF, VbStrConv.ProperCase)
            End With
            Return cl
        Catch
            Return Nothing
        End Try
    End Function

    Public Class clGeral

        Public altura As String
        Public sexoMasc As Boolean
        Public sexoFem As Boolean

        Public dataNascimento As String

        Public nrCartao As String
        Public nrCartaoPAN As String

        Public pais As String

        Public dataValidade As String
        Public dataEmissao As String
        Public arquivo As String

        Public localidade As String
        Public nacionalidade As String

        Public primeiroNome As String
        Public primeiroNomePai As String
        Public primeiroNomeMae As String

        Public apelido As String
        Public apelidoPai As String
        Public apelidoMae As String

        Public nome As String
        Public nomePai As String
        Public nomeMae As String

        Public notas As String

        Public nrBI As String
        Public nrNIF As String
        Public nrSNS As String
        Public nrSS As String


    End Class

    Public Function fGetGeral() As clGeral
        Try
            Dim ID As eidpt.PteidId = eId.GetID()
            Dim cl As New clGeral
            With cl
                .altura = uCDec(ID.height)
                .sexoMasc = IIf(ID.sex = "M", True, False)
                .sexoFem = Not .sexoMasc

                .primeiroNome = fGetString(ID.firstname, VbStrConv.ProperCase)
                .primeiroNomeMae = fGetString(ID.firstnameMother, VbStrConv.ProperCase)
                .primeiroNomePai = fGetString(ID.firstnameFather, VbStrConv.ProperCase)

                .apelido = fGetString(ID.name, VbStrConv.ProperCase)
                .apelidoMae = fGetString(ID.nameMother, VbStrConv.ProperCase)
                .apelidoPai = fGetString(ID.nameFather, VbStrConv.ProperCase)

                .nome = fGetString(ID.firstname & " " & ID.name, VbStrConv.ProperCase)
                .nomeMae = fGetString(ID.firstnameMother & " " & ID.nameMother, VbStrConv.ProperCase)
                .nomePai = fGetString(ID.firstnameFather & " " & ID.nameFather, VbStrConv.ProperCase)

                .arquivo = fGetString(ID.deliveryEntity, VbStrConv.ProperCase)
                .dataEmissao = fGetString(ID.deliveryDate, VbStrConv.ProperCase)
                .dataNascimento = fGetString(ID.birthDate, VbStrConv.ProperCase)
                .dataValidade = fGetString(ID.validityDate, VbStrConv.ProperCase)
                .localidade = fGetString(ID.locale, VbStrConv.ProperCase)
                .nacionalidade = fGetString(ID.nationality, VbStrConv.ProperCase)
                .notas = fGetString(ID.notes, VbStrConv.ProperCase)
                .nrBI = fGetString(ID.numBI, VbStrConv.ProperCase)
                .nrCartao = fGetString(ID.cardNumber, VbStrConv.ProperCase)
                .nrCartaoPAN = fGetString(ID.cardNumberPAN, VbStrConv.ProperCase)
                .nrNIF = fGetString(ID.numNIF, VbStrConv.ProperCase)
                .nrSNS = fGetString(ID.numSNS, VbStrConv.ProperCase)
                .nrSS = fGetString(ID.numSS, VbStrConv.ProperCase)
            End With
            Return cl
        Catch
            Return Nothing
        End Try
    End Function

    Public Function fGetFoto(Optional ByVal altura As Integer = 0, Optional ByVal largura As Integer = 0) As Bitmap
        Try
            Dim pic As eidpt.PteidPic = eId.GetPic()
            Dim bmp As New Bitmap(CSJ2K.J2kImage.FromStream(New System.IO.MemoryStream(pic.picture, 0, pic.piclength, False)))
            If altura = 0 AndAlso largura = 0 Then
                Return bmp
            ElseIf altura > 0 AndAlso largura = 0 Then
                Return New Bitmap(bmp, (altura * bmp.Width) / bmp.Height, altura)
            ElseIf altura = 0 AndAlso largura > 0 Then
                Return New Bitmap(bmp, largura, (largura * bmp.Height) / bmp.Width)
            Else
                Return New Bitmap(bmp, largura, altura)
            End If
        Catch
            Return Nothing
        End Try
    End Function

    Sub sCartaoCCInserido(ByVal readerName As String, ByVal cardName As String)
        MsgBox("Cartão inserido")

        If (readerName <> _leitorSmartReader Or isCardPresent Or Not knownCards.Contains(cardName)) Then Exit Sub

        MsgBox("Um Cartão de Cidadão foi detectado.")

        'configs.leitorSmartReader = readerName
        isCardPresent = True
    End Sub

    Sub sCartaoCCRemovido(ByVal readerName As String)
        isCardPresent = False
    End Sub

    Public Sub sLoadCC()
        'scWatch = SCWatcher.GetInstance() ' Daemon starts when instantiated
        'ccCurrentReader = ""

        'If (scWatch.ListReaders.Length > 0) Then
        'ccCurrentReader = scWatch.ListReaders(0)
        'End If

        'AddHandler scWatch.CardInserted, AddressOf sCartaoCCInserido
        ' AddHandler scWatch.CardRemoved, AddressOf sCartaoCCRemovido
        ' scWatcher.ReaderInserted += new SCWatcher.ReaderInsertedHandler(scWatcher_ReaderInserted);
        ' scWatcher.ReaderRemoved += new SCWatcher.ReaderRemovedHandler(scWatcher_ReaderRemoved);
        ' scWatcher.OnError += new SCWatcher.ErrorHandler(scWatcher_OnError);
        ' TODO: Test and validate the use of delegate as function pointer
        'eId.ChangeAddressHandler += new EIDPT.ChangeAddressCallback(ChangeAddressHandler);
        'eId.ChangePinHandler += new EIDPT.CapPinChangeCallback(ChangePinHandler);
    End Sub

End Class


Exitem apenas 10 Tipos de pessoas no mundo: Aqueles que percebem binario e aqueles que não percebem.

akaru.pT

Share this post


Link to post
Share on other sites
rafael_276

Boas, Quando tento importar da API do CC ele confunde os digitos com acentos..

Codigo:

   Public Function fGetMorada() As clMorada
        Try

            Dim address As eidpt.PteidAddr = eId.GetAddr()
            Dim cl As New clMorada
            With cl
                .tipoRua = StrConv(address.streettype, VbStrConv.ProperCase)
                .rua = StrConv(address.street, VbStrConv.ProperCase)
                .morada = StrConv(address.streettype & " " & address.street, VbStrConv.ProperCase)
                .porta = StrConv(address.door, VbStrConv.ProperCase)
                .andar = StrConv(address.floor, VbStrConv.ProperCase)
                .lado = StrConv(address.side, VbStrConv.ProperCase)
                .edificio = StrConv(address.building, VbStrConv.ProperCase)
                .edificioAbr = StrConv(address.buildingAbbr, VbStrConv.ProperCase)

                .codigoPostal = StrConv(address.cp4 & "-" & address.cp3, VbStrConv.ProperCase)
                .codigoPostal1 = StrConv(address.cp4, VbStrConv.ProperCase)
                .codigoPostal2 = StrConv(address.cp3, VbStrConv.ProperCase)

                .localidade = StrConv(address.locality, VbStrConv.ProperCase)
                .tipoRuaAbr = StrConv(address.streettypeAbbr, VbStrConv.ProperCase)
                .freguesia = StrConv(address.freguesiaDesc, VbStrConv.ProperCase)
                .concelho = StrConv(address.municipalityDesc, VbStrConv.ProperCase)
                .districto = StrConv(address.districtDesc, VbStrConv.ProperCase)
                .pais = StrConv(address.countryDescF, VbStrConv.ProperCase)
            End With
            Return cl
        Catch
            Return Nothing
        End Try
    End Function

O que deveria devolver era "Rua António Abreu Freire" mas devolve "Rua Doutor Antã“Nio Abreu Freire".

Alguem me pode ajudar?

Abraços

A solução para o problema:

Function fGetString(ByVal str As String, ByVal conv As VbStrConv) As String
        Dim byInput() As Byte = System.Text.Encoding.Default.GetBytes(str)
        Return StrConv(System.Text.Encoding.UTF8.GetString(byInput), conv)
    End Function


Exitem apenas 10 Tipos de pessoas no mundo: Aqueles que percebem binario e aqueles que não percebem.

akaru.pT

Share this post


Link to post
Share on other sites
fonsecas72

Olá

Não consigo colocar o código fonte aqui disponibilizado a funcionar no meu vb 2010.

Alguém me pode explicar os passos?

Preciso muito da vossa ajuda

Muito Obrigado Amigos

Share this post


Link to post
Share on other sites
watt

boa noite!

Já alguem ao tentar programar para o cartão do cidadão teve este erro:

Could not load file or assembly 'eidpt.dll' or one of its dependencies. Não foi possível iniciar a aplicação porque a configuração lado-a-lado está incorrecta. Consulte o registo de eventos da aplicação ou utilize a ferramenta de linha de comandos sxstrace.exe para obter mais detalhes. (Exception from HRESULT: 0x800736B1)

??? será que me podem ajudar sff

Share this post


Link to post
Share on other sites
ricardoguerreiro

Eu tentei procurar uma outra thread, mas parece que aqui no P-a-P apenas existe esta thread para o CC (procurei CC e cidadão ;)).

Quantos aos exemplos de VB, se forem à página do projecto no codeplex http://cartaodecidadao.codeplex.com/SourceControl/changeset/view/37556#404081 encontram lá um exemplo da biblioteca eidpt em VB (espero que vos ajude).

Para o C# alguém me pode dar uma ajuda com a seguinte questão:

namespace ConsoleUI
{
  class Program
  {
    static void Main(string[] args)
    {
        SCWatcher scw = SCWatcher.GetInstance();
        scw.Start();
        string[] readers = scw.ListReaders();
        EIDPT.Init(readers[0]);// We pass blank or a specific card reader name, ex: "Gemplus USB Smart Card Reader 0"
        EIDPT.SetSODChecking(false);
        Id userInfo = EIDPT.GetID();      
        Address add = EIDPT.GetAddress();
       [....]

Se ler alguma coisa do userInfo consigo sem problemas. Ao fazer a linha do GetAddress() e após me dar o pop-up e inserir correctamente o pin de morada dá-me SC_ERROR_SECURITY_STATUS_NOT_SATISFIED.

O mais estranho é que este código parece-me funcionar perfeitamente se meter forms ao barulho :wallbash:

Alguém sabe o que tou a fazer de mal?


Ricardo Guerreiro

Linked-In: http://pt.linkedin.com/in/ricardoguerreiro

Share this post


Link to post
Share on other sites
nett_fan

ola Ricardo, vejo que estas a desenvolver em c# a aplicacao para leitura do cartao do cidadao. como fazes isso? existe alguma dll, a famosa EIDPT em c#? senao como fazes a integracao?

sei que esta thread é antiga, mas se poderes ajudar agradecia.

Share this post


Link to post
Share on other sites
thoga31

Duvido que o Ricardo responda tão depressa. A última actividade dele remonta a 16 de Maio de 2012, e esse foi o seu único post a 15 de Novembro de 2011, data do seu registo.


Knowledge is free!

Share this post


Link to post
Share on other sites
thoga31

Já abriste um outro tópico sobre o assunto, pelo que deverás esperar por resposta nesse tópico. Não deves dispersar a tua questão por vários sítios.

Assim que alguém com os conhecimentos necessários ver a tua ajuda, então terás resposta. Nem todos têm conhecimentos para o que precisas, e nem todos os que têm conhecimentos vêm cá todos os dias. ;)

(Tópico trancado)


Knowledge is free!

Share this post


Link to post
Share on other sites
Guest
This topic is now closed to further replies.

×
×
  • Create New...

Important Information

By using this site you accept our Terms of Use and Privacy Policy. We have placed cookies on your device to help make this website better. You can adjust your cookie settings, otherwise we'll assume you're okay to continue.