PDA

Ver la Versión Completa : Atacar ficheros TACOGRAFOS DIGITALES


socger
11-05-2007, 16:07:33
Estoy empeñado en leer / interpretar los datos que devuelven los tacógrafos digitales de los vehículos, su extensión es '.TGD'. Pero no encuentro ninguna documentación del formato de estos ficheros, ni de como atacarlos para conocer su contenido.

Estaría muy agradecido si alguien me pudiera orientar.

Si sirve de algo, estoy interesado en los tacógrafos digitales españoles.

Saludos

Casimiro Notevi
11-05-2007, 16:25:11
Creo que en este documento (http://www.lexureditorial.com/boe/0505/07137.htm) tienes la información que necesitas.
Aunque debes saber que:

La información contenida en los ficheros TGD viene acompañada de una firma electrónica generada por un certificado digital, el cual tiene tres propósitos:


Detectar la alteración del contenido del fichero.
Cifrar parte/toda la información contenida en el fichero.
Verificar la identidad del equipo (tacógrafo o tarjeta) que ha registrado esta información.

Según informan aquí (http://www.tacografo-digital.net/faqs/faqs.aspx#faq0).
Más información aquí (http://www.fomento.es/MFOM/LANG_GL/DIRECCIONES_GENERALES/TRANSPORTE_POR_CARRETERA/IGT/TACDIG/EMPRESA/Empresa+-+Ficheros+de+descarga.htm).
Aquí también (http://www.concretonline.com/jsp/servicios/legislaciontacografo.jsp), muy completo con el formato del fichero t ambién.

Espero que te sirva.

socger
14-05-2007, 11:57:11
Toda esta documentación es amplia pero no clara, todavía estoy perdido.

Soy el típico programador que necesita que alguien le documente mejor los datos como por ejemplo abrir el fichero usa este componente, el registro es el siguiente y se divide de la siguiente manera en los estos campos. En fin este es el problema que tengo.

Gracias de todos modos. Pero necesitaría algo más documentado. Porque todavía estoy pillado

Os agradecería que me condujerais a un sitio o algun compañero que estuviese ya desarrollando algo sobre tacógrafos digitales para ver como nos podemos ayudar.

Agradezco de antemano toda ayuda y me pongo a disposición de quien me necesite para este desarrollo.

De todo lo que vaya encontrando sobre este hilo lo pondré documentado con el transcurso del tiempo aquí y sólo por su puesto si me lo permiten sus moderadores.

Gracias.

Lepe
14-05-2007, 14:33:20
Pa'mí que no has leido el capitulo 2, artículo 24 en adelante del último enlace de casimiro jomio ;)

Saludos

Casimiro Notevi
14-05-2007, 14:54:17
Pa'mí que no has leido el capitulo 2, artículo 24 en adelante del último enlace de casimiro jomio ;)

Saludos

No lo quería decir, pero, sí, tienes razón Lepe, creo que no lo ha leído :)

Lepe
14-05-2007, 18:10:53
... y no le culpo, nada más entrar en una web del estilo BOE, yo al menos, salgo pitando ;).

Hice un Scroll vertical rápido y, por suerte, ví las "tablitas"... me paré un segundo y vi "extensión del archivo: TGD"... ahhh amigo ;)

Saludos

socger
15-05-2007, 10:34:43
Es de agradeceros que me hayais abierto los ojos sobre la información de este BOE.

Aún sigo teniendo dudas sobre como abrir estos ficheros, los voy a abrir como si fueran ficheros de texto, byte a byte, a ver si así y viendo sus datos puedo interpretar esta información.

Igual iré desarrollando el código y lo iré subiendo aquí, para ver si a alguien más le interesa desarrollar algo sobre este tema.

Espero no os importe si os vuelvo a pedir ayuda.

Saludos.-

Casimiro Notevi
15-05-2007, 10:55:01
[..] Espero no os importe si os vuelvo a pedir ayuda. Saludos.-

Por favor, al contrario, estaremos encantados de resolver todas las dudas que tengas, ojalá podamos :)

socger
15-05-2007, 14:13:18
No se en donde fallo, y lo he intentado.

He cogido la estructura del fichero de conductores que me pasastes Casimiro ... esta:

a) Datos de la tarjeta de conductor:
Todos los archivos elementales de la tarjeta que se transfieren en una sesión de descarga deben almacenarse en un único fichero.
Cada fichero contendrá un conjunto de registros lógicos,
que se corresponderán con archivos elementales de la tarjeta y que tendrán la siguiente estructura de campos:
Nombre
Longitud
(bytes)
Significado o valor
FID
Tipo
Longitud
Datos 2
1
2
[Longitud]
Identificador del archivo elemental
‘00’ (archivo elemental)
‘01’ (firma de archivo elemental)
Tamaño del archivo elemental
Contenido del archivo elemental
Los ficheros de datos deberán contener los siguientes archivos elementales:
Archivo
FID
Descripción
ICC
0002

Identificación física de la tarjeta.IC0005
Identificación del chip.Application _identification0500
Versión, tamaño de los registros internos,….Card_CertificateC100
Certificado de la tarjeta.CA_CertificateC108
Certificado de la CIA.Identification0520
Número, CIA, fecha de validez,….Card_Download050E
Fecha y hora de la última transferencia de datos de la tarjeta.Driving_license_info0521
Número, país de expedición, fecha de validez,….Events_data0502
Registro de incidentes.Faults_data0503
Registro de fallos.Driver_Activity_data0504
Actividad del conductor.Vehicles_Used0505
Vehículos utilizados.Places0506
Lugares donde comienza o termina un periodo de trabajo diario.Current_Usage0507
Fecha, hora y vehículo en que se abrió la sesión.Control_Activity_Data0508 Actividades de control sobre la tarjeta.Specific_Conditions0522
Fuera de ámbito, transbordador,….

Y con estos ejemplos que os paso en el fichero 'ficheros tarjeta conductores.zip'

pero no consigo que por ejemplo me diga el número de tarjeta a la que pertenece.

En el ejemplo que os paso para leer estos ficheros, podreis ver que tengo que convertir los bytes que voy recogiendo a HEX pero aun así no veo la manera de seguir. Aparentemente el primer registro que cargo me dice para FID 0002 entre los dos bytes que recupero para tipo cargo 00 para longitud cargo 19, pero después el número de tarjeta no me lo devuelve bien no coincide con el que debería de poner que es el del nombre del fichero.

En fin os envío también el código realizado para su lectura, si me podeis decir en que fallo os lo agradecería pues me estoy dando cabezazos contra algo que no llego a más. Saludos

Lepe
15-05-2007, 14:54:32
¿de donde has sacado ese archivo tgd?

Ese, es un archivo binario (basta abrirlo con el bloc de notas para ver "caracteres extraños").

Siendo binario, no puedes usar TextFile para leerlo, más bien debes usar un file of record.

El problema, es saber el tamaño de las cosas, cuando dice que un campo ocupa 2 bytes... vete a saber si son dos caracteres (letras) o un tipo integer. Para ello tienes que ir al fichero tgd, (abrirlo con el bloc de notas) y más o menos ver que guarda.

Creo que sería así:


type Tconductores = record
Fid : char[2];
Tipo :char;
Longitud: integer; // suele ser lo normal
Datos :integer //
end;

var FConductores : File of TConductores;

mira la ayuda en delphi "File Types" para ver un ejemplo de como leer y escribir en ellos.

Saludos.

Casimiro Notevi
15-05-2007, 15:17:41
También hay que tener en cuenta que puede que sea texto, pero cifrado, porque:

La información contenida en los ficheros TGD viene acompañada de una firma electrónica generada por un certificado digital, el cual tiene tres propósitos:
Detectar la alteración del contenido del fichero.
Cifrar parte/toda la información contenida en el fichero.
Verificar la identidad del equipo (tacógrafo o tarjeta) que ha registrado esta información.

socger
16-05-2007, 09:23:10
Estuve probando la manera de abrir los ficheros recomendado por nuestro amigo lepe y resulta que seguimos teniendo el mismo problema que con el ejemplo anterior que os pasé.

Creo que Casimiro lleva toda la razón cuando nos dijo que eran ficheros posíblemente cifrados/encriptados con la firma digital.

_______________________________________________________________________

Cita de Casimiro:

También hay que tener en cuenta que puede que sea texto, pero cifrado, porque:


La información contenida en los ficheros TGD viene acompañada de una firma electrónica generada por un certificado digital, el cual tiene tres propósitos:
Detectar la alteración del contenido del fichero.
Cifrar parte/toda la información contenida en el fichero.
Verificar la identidad del equipo (tacógrafo o tarjeta) que ha registrado esta información.
_______________________________________________________________________

Por eso os pediría consejo sobre como poder seguir sobre esa línea, ¿dónde creeis que debería documentarme?, o con quién debería de ponerme en contacto. Es decir, ¿podríais a un ciego guiarle en su andar?, perdón yo soy el ciego.

Saludos y muchas gracias por adelantado.

Casimiro Notevi
16-05-2007, 09:50:13
De todas formas, el ficherito que has puesto de muestra parece que no está cifrado, se puede leer nombres y otros datos, así que en este caso es simplemente un archivo binario con una estructura que hay que conocer.
Bueno, eso es lo que parece.

seoane
16-05-2007, 17:35:05
En un primer análisis, podemos separar el archivo en lo que, según la documentación que enlazo Casimiro, se denominan "Archivos elementales". Estos están formados por una "cabecera" y un bloque de datos.

Algo así (es una aplicación de consola):

program Tacografo;

{$APPTYPE CONSOLE}

uses
Windows, Sysutils, Classes;

type
TCabecera = packed record
FID: Word;
Tipo: Byte;
Longitud: Word;
end;

function FIDToStr(FID: Word): String;
begin
case FID of
$0002: Result:= 'ICC';
$0005: Result:= 'IC';
$0500: Result:= 'Application identification';
$C100: Result:= 'Card certificate';
$C108: Result:= 'CA certificate';
$0520: Result:= 'Identification';
$050E: Result:= 'Card download';
$0521: Result:= 'Driving license info';
$0502: Result:= 'Events data';
$0503: Result:= 'Faults data';
$0504: Result:= 'Driver activity data';
$0505: Result:= 'Vehicles uses';
$0506: Result:= 'Places';
$0507: Result:= 'Currents usage';
$0508: Result:= 'Control activity data';
$0522: Result:= 'Specific conditions';
else
Result:= 'Identificador desconocido';
end;
end;

var
Cabecera: TCabecera;
Datos: PByte;
begin
if ParamCount > 0 then
try
with TFileStream.Create(ParamStr(1),fmOpenRead or fmShareDenyWrite) do
try
Writeln('Analizando el fichero: ' + ParamStr(1));
GetMem(Datos,$FFFF);
try
while Read(Cabecera,Sizeof(Cabecera)) = Sizeof(Cabecera) do
begin
Cabecera.FID:= Swap(Cabecera.FID);
Cabecera.Longitud:= Swap(Cabecera.Longitud);
Writeln;
Writeln('FID: ' + IntToHex(Cabecera.FID,4));
Writeln('Descripcion: ' + FIDToStr(Cabecera.FID));
Writeln('Longitud: ' + IntToStr(Cabecera.Longitud) + ' Bytes');
FillChar(Datos^,$FFFF,#0);
ReadBuffer(Datos^,Cabecera.Longitud);
end;
finally
FreeMem(Datos);
end;
finally
Free;
end;
except
On E: Exception do
Writeln('Error: ' + E.Message);
end else
Writeln('Uso: ' + ParamStr(0) + ' < archivo >');
end.


El resultado de procesar el archivo de ejemplo:

FID: 0002
Descripcion: ICC
Longitud: 25 Bytes

FID: 0005
Descripcion: IC
Longitud: 8 Bytes

FID: 0501
Descripcion: Identificador desconocido
Longitud: 10 Bytes

FID: 0501
Descripcion: Identificador desconocido
Longitud: 128 Bytes

FID: 0520
Descripcion: Identification
Longitud: 143 Bytes

FID: 0520
Descripcion: Identification
Longitud: 128 Bytes

FID: 0502
Descripcion: Events data
Longitud: 1728 Bytes

FID: 0502
Descripcion: Events data
Longitud: 128 Bytes

FID: 0503
Descripcion: Faults data
Longitud: 1152 Bytes

FID: 0503
Descripcion: Faults data
Longitud: 128 Bytes

FID: 0504
Descripcion: Driver activity data
Longitud: 13780 Bytes

FID: 0504
Descripcion: Driver activity data
Longitud: 128 Bytes

FID: 0505
Descripcion: Vehicles uses
Longitud: 6202 Bytes

FID: 0505
Descripcion: Vehicles uses
Longitud: 128 Bytes

FID: 0506
Descripcion: Places
Longitud: 1121 Bytes

FID: 0506
Descripcion: Places
Longitud: 128 Bytes

FID: 0508
Descripcion: Control activity data
Longitud: 46 Bytes

FID: 0508
Descripcion: Control activity data
Longitud: 128 Bytes

FID: 0522
Descripcion: Specific conditions
Longitud: 280 Bytes

FID: 0522
Descripcion: Specific conditions
Longitud: 128 Bytes

FID: C100
Descripcion: Card certificate
Longitud: 194 Bytes

FID: C108
Descripcion: CA certificate
Longitud: 194 Bytes

Ahora lo que necesitaríamos es saber la estructura de cada uno de esos bloques de datos.

seoane
16-05-2007, 20:37:03
Investigando un poco mas encontré esta pagina donde te puedes descargar un pdf con la estructura de cada uno de esos bloques de los que hablaba.

http://www.boe.es/g/es/bases_datos/doc.php?coleccion=iberlex&id=2002/81422&codmap=

Son mas de 200 paginas, así que me parece que yo lo dejo aquí. :p

socger
18-05-2007, 09:49:52
No he usado nunca este tipo de ficheros, lo cual es un problema para mí. Podrías documentarme ... alguna ayuda o link ... donde pueda ver como se trabajan con los ficheros de este tipo

---
cita tuya:

type
TCabecera = packed record
FID: Word;
Tipo: Byte;
Longitud: Word;
end;

---

Y aún documentándome he visto que estos ficheros elementales que vienen ahora dependen o se crean con la longitud que se consiga en el campo Longitud de tipo Word que creastes, es decir que cambian su longitud debido al campo Longitud.

¿Serías tan amable de por lo menos decirme como crearlo en TCabecera?

No se como ayudarte, en la medida que yo pudiera, pero te garantizo que esta ayuda que me prestas me va a hechar un buen cable. De todos modos me presto para lo que hiciera falta.

Saludos

socger
18-05-2007, 09:54:48
Perdón es un fallo.

Gracias a todos por la ayuda. No se por donde habría tirado sin vuestra ayuda, la de todos.

Ya voy encontrando cielos abiertos gracias a vosotros.

Pero como he comentado en la anterior consulta sigo con problemas. No conozco los ficheros de este tipo. Podríais ver la nota anterior y comentarme que hacer.

Gracias

seoane
18-05-2007, 12:21:50
Pero como he comentado en la anterior consulta sigo con problemas. No conozco los ficheros de este tipo. Podríais ver la nota anterior y comentarme que hacer.

No entiendo tu pregunta. En mi código no utilizo ficheros con tipo, no tendría mucho sentido, ya que los registros tienen un tamaño variable. Lo que si sabemos es que cada "elemento" del fichero tiene el mismo encabezado, y si que tenemos el tamaño de ese encabezado.

Así que lo que hago es leer el encabezado, determinar el tamaño de los datos y leerlos. Si te fijas en la siguiente instrucción:

ReadBuffer(Datos^,Cabecera.Longitud);

Leemos en el buffer "Datos", el contenido de ese bloque. Una vez en memoria, ya veras tu lo que tienes que hacer con el. En el enlace que te di, parece que explican la estructura de cada uno de estos bloques, pero sus mas de 200 paginas me desaniman bastante a leerlo.

Si me permites un consejo, creo que, si no estas familiarizado con el tratamiento de ficheros y el de estructuras en memoria, el proyecto puede que te resulte demasiado complicado. La parte que yo puse es lo mas básico, luego viene interpretar cada bloque, y ya no hablemos de la parte de cifrado ....

socger
18-05-2007, 12:32:09
Sobre tu cita:

--------------------------------------------------------------------
Si me permites un consejo, creo que, si no estas familiarizado con el tratamiento de ficheros y el de estructuras en memoria, el proyecto puede que te resulte demasiado complicado. La parte que yo puse es lo mas básico, luego viene interpretar cada bloque, y ya no hablemos de la parte de cifrado ....
---------------------------------------------------------------------

Si es cierto no estoy familiarizado con esta estructura de ficheros que usas fileStream ni con estructuras en memoria (aunque aprendo rápido), por eso te pedí algun link o documento que me familiarizase sobre esta estructura de datos. Y bueno por eso te seguiría pidiendo que me documentases el paso a seguir para aprender más sobre todo esto.

En cuanto al cifrado de datos este boe que me pasastes, a poco que estoy viendo, es bastante extenso y poco documentativo. Pero espero que superando la primera parte que te comenté antes me pase rápidamente a la siguiente.

Chaval, muchas gracias de todos modos y lo dicho me teneis para lo que os haga falta en este foro. De momento voy a seguir subiendo todo lo que vaya descubriendo sobre este tema.

Saludos, pero antes agradezco toda ayuda suministrada.

seoane
18-05-2007, 13:04:44
Si es cierto no estoy familiarizado con esta estructura de ficheros que usas fileStream

Ahora ya voy entendiendo. Te referías al uso de streams. Los streams se utilizan para escribir y leer datos de forma sencilla. Hay diferentes tipos de stream que permiten leer y escribir en diferentes medios: archivos, memoria, sockets, campos BLOB, etc ... pero todos ellos descienden de la clase TStream y disponen de los métodos Read y Write para leer y escribir.

Yo me he acostumbrado a utilizarlos a la hora de tratar ficheros, son bastante cómodos. Pero hubiera sido lo mismo, si utilizáramos un fichero sin tipo, los de toda la vida, y las funciones Blockread y Blockwrite para leer y escribir. Si quieres saber como funcionan los Stream, revisa la ayuda sobre la clase TFileStream.

Una explicación rápida, para empezar:

// Método Read de la clase TFileStream. Lee en una variable tantos bytes como
// se le indique. En este caso lee en la variable "Cabecera" tantos bytes como
// mide la propia variable. La función devuelve el número de bytes leídos.
Read(Cabecera,Sizeof(Cabecera))



// La función ReadBuffer es similar a Read, solo que si no se consiguen leer
// todos los bytes que se ordenaron, se provoca una excepción.
// En este caso queremos almacenar los datos en la porción de memoria apuntada
// por el puntero "Datos". Por eso utilizamos ^ después del nombre del puntero.
ReadBuffer(Datos^,Cabecera.Longitud);


En cuanto a como analizar las diferentes estructuras, ya depende de como sean. Si tienen un tamaño fijo, a lo mejor podemos utilizar punteros. Si no, deberemos de estudiar en cada caso como hacerlo.

Como ya dije no es nada fácil, pero no quería desanimarte con mi anterior mensaje, aunque leyéndolo ahora veo que me salio un poco pesimista :) . Yo empezaría por familiarizarme con los ficheros (leer, escribir, etc ...) para luego entrar a interpretar los datos. En cualquier caso tienes por delante muchas horas de lectura :)

socger
22-05-2007, 13:01:58
He realizado de momento este código. (lector tacografos.zip)

Os agradecería que le hecharais un vistazo pues tengo dudas. He implementado en el código partes del BOE para aclarar los campos, el BOE es por ejemplo el que se encuentra en uno de los links de seoane

DUDAS:
Por ejemplo, no se que tipo de variables son las que me he topado en el BOE como por ejemplo OCTET STRING, en concreto me he topado con OCTET STRING (SIZE(5)) que lhe usado un ShortString pero no se si está bien (Ver. Card_Approval_Number)

Tampoco se que tipo de variable son IA5String(size(8)) así que también he usado un ShortString, pero creo que también está mal

Otros OCTET STRING como los he asignado a byte y a word dependiendo de que su parte SIZE tuviera 1 o 2. Y he capturado bien los datos. En el ejemplo proyecto podeis verlo con el fichero TGD que pasé en una consulta anterior de este hilo.

Pero en concreto con los campos Card_Approval_Number y Embedder_Ic_Assembler_Id no me displaya bien los datos (en blanco)

Os agradecería que le hecharais un vistazo al código y me pudieseis decir en que fallo y si veis algún fallo en la programación o mejora también os lo agradecería.

Gracias a todos por la ayuda.

PD. En el fichero 'ficheros TGD.zip' os paso más ficheros TGD para que podais hacer pruebas.

seoane
22-05-2007, 14:45:46
Un Octeto no es mas que un Byte o un Char, es decir 8 bits. Son solo maneras diferentes de llamar a lo mismo :)

Prueba usando esto:

Card_Approval_Number: array[1..8] of Char;
Embedder_Ic_Assembler_Id: array[1..5] of Char;


He echo algunas pruebas, y el Embedder_Ic_Assembler_Id ya se muestra bien, en cambio Card_Approval_Number sigue mostrándose en blanco, pero eso es normal porque esta formado por 8 espacios en blanco :) , supongo que en los ficheros que tienes de muestra no se utiliza ese campo.

Casimiro Notevi
22-05-2007, 15:50:59
Yo tampoco recordaba qué era un octeto :confused:, me has refrescado la memoria... es que los años no perdonan :o

:)

socger
23-05-2007, 10:58:09
Gracias por la rápida respuesta de los dos.

Prosigo con el trabajo. Os pasaré el código conforme lo vaya realizando. Espero que os sirva de algo a este foro

Saludos

socger
31-05-2007, 14:05:39
Os paso dos ficheros para probarme este error de interpretación (Lector tacógrafos.rar y Fichero_Tarjeta_Digital_Conductor.rar)

Bien me ocurre este problema, existe un tipo de datos según el BOE que conseguí gracias a vosotros que son del tipo time real de hecho esto es lo que dice el BOE:
--------------------------------------------------------------------------------------------------
2.110. TimeReal
Código para un campo combinado de fecha y hora, donde ambos parámetros se expresan como los segundos transcurridos desde las 00h.00m.00s. del 1 de enero de 1970, tiempo medio de Greenwich.

TimeReal{INTEGER:TimeRealRange} ::= INTEGER(0..TimeRealRange)

Asignación de valor . Alineación de octeto: número de segundos transcurridos a partir de la medianoche del día 1 de enero de 1970, tiempo medio de Greenwich.

La fecha/hora máxima posible es en el año 2106.

Definición de valores variables empleados en las definiciones del apartado 2.
TimeRealRange ::= 232-1
--------------------------------------------------------------------------------------------------

Para calcular la fecha que devuelve una variable del tipo he creado primero la clase tTime_Real:
--------------------------------------------------------------------------------------------------
TTime_Real = packed record // 4 byte ver apdo. 2.110. TimeReal
Time_Real: Integer; // [INTEGER:TimeRealRange] ::= INTEGER(0..TimeRealRange) ... TimeRealRange ::= 2^32-1
end;
--------------------------------------------------------------------------------------------------

Y segundo la función Devolver_Fecha:
--------------------------------------------------------------------------------------------------
function TForm1.Devolver_Fecha(Fecha_Integer: Integer): String;
var Cantidad_Dias_Transcurridos: Extended;
Cantidad_Resto_Horas: Extended;
Cantidad_Resto_Minutos: Extended;
Cantidad_Resto_Segundos: Extended;
Resto_Que_Queda_de_Segundos: Extended;
Dia_A_Devolver: tDate;
Mensaje: String;
begin
// Un día = 60 segundos * 60 minutos * 24 horas = 86400 segundos
// Una hora = 60 segundos * 60 minutos = 3600 segundos
// Una minuto = 60 segundos = 60 segundos

Resto_Que_Queda_de_Segundos := Fecha_Integer;
Mensaje := 'Total segundos: ' + FloatToStr(Resto_Que_Queda_de_Segundos) + chr(10) + chr(13);
Mensaje := Trim(Mensaje) + ' ' + chr(10) + chr(13);

Cantidad_Dias_Transcurridos := Abs(Int(Resto_Que_Queda_de_Segundos / 86400));
Resto_Que_Queda_de_Segundos := Resto_Que_Queda_de_Segundos - (Cantidad_Dias_Transcurridos * 86400);
Mensaje := Trim(Mensaje) + 'Total días transcurridos: ' + FloatToStr(Cantidad_Dias_Transcurridos) + chr(10) + chr(13);
Mensaje := Trim(Mensaje) + 'Resto de segundos: ' + FloatToStr(Resto_Que_Queda_de_Segundos) + chr(10) + chr(13);
Mensaje := Trim(Mensaje) + ' ' + chr(10) + chr(13);

Cantidad_Resto_Horas := Abs(Int(Resto_Que_Queda_de_Segundos / 3600));
Resto_Que_Queda_de_Segundos := Resto_Que_Queda_de_Segundos - (Cantidad_Resto_Horas * 3600);
Mensaje := Trim(Mensaje) + 'Resto de horas transcurridas: ' + FloatToStr(Cantidad_Resto_Horas) + chr(10) + chr(13);
Mensaje := Trim(Mensaje) + 'Resto de segundos: ' + FloatToStr(Resto_Que_Queda_de_Segundos) + chr(10) + chr(13);
Mensaje := Trim(Mensaje) + ' ' + chr(10) + chr(13);

Cantidad_Resto_Minutos := Abs(Int(Resto_Que_Queda_de_Segundos / 60));
Resto_Que_Queda_de_Segundos := Resto_Que_Queda_de_Segundos - (Cantidad_Resto_Minutos * 60);
Mensaje := Trim(Mensaje) + 'Resto de minutos transcurridas: ' + FloatToStr(Cantidad_Resto_Minutos) + chr(10) + chr(13);
Mensaje := Trim(Mensaje) + 'Resto de segundos: ' + FloatToStr(Resto_Que_Queda_de_Segundos) + chr(10) + chr(13);
Mensaje := Trim(Mensaje) + ' ' + chr(10) + chr(13);

Cantidad_Resto_Segundos := Resto_Que_Queda_de_Segundos;
Mensaje := Trim(Mensaje) + 'Resto de segundos transcurridas: ' + FloatToStr(Cantidad_Resto_Segundos) + chr(10) + chr(13);
Mensaje := Trim(Mensaje) + 'Resto de segundos: ' + FloatToStr(Resto_Que_Queda_de_Segundos) + chr(10) + chr(13);
Mensaje := Trim(Mensaje) + ' ' + chr(10) + chr(13);

Dia_A_Devolver := StrToDate('01/01/1970') + Cantidad_Dias_Transcurridos;
Mensaje := Trim(Mensaje) + 'Dia a devolver: ' + DateToStr(Dia_A_Devolver) + chr(10) + chr(13);

MessageDlg( Mensaje, mtInformation, [mbOk], 0 );

Result := Trim( DateToStr(Dia_A_Devolver) + ' ' +
Trim(FloatToStr(Cantidad_Resto_Horas)) + ':' +
Trim(FloatToStr(Cantidad_Resto_Minutos)) + ':' +
Trim(FloatToStr(Cantidad_Resto_Segundos)) );
end;
--------------------------------------------------------------------------------------------------

El ejemplo que os paso me debería de haber devuelto sobre el tipo de
FID = 0520 ... EF Identification (CardIdentification + DriverCardHolderIdentification)
En Fecha primer día de validez de la tarjeta: 09-09-2006
y en Fecha en la que termina la validez de la tarjeta: 09-09-2011

Estos datos los cargo en la clase TCard_Identification sobre card_Validity_Begin y card_Expiry_Date respectívamente
--------------------------------------------------------------------------------------------------
TCard_Identification = packed record // 65 byte ... ver apdo. BOE 2.20. CardIdentification
card_Issuing_Member_State: Byte; // NationNumeric, ... 1 byte INTEGER(0..255) por defecto (00) ver apdo 2.72. NationNumeric
card_Number: TCard_Number_Conductor; // CardNumber ... 16 byte por defecto (20..20) ver apdo. 2.21 CardNumber
card_Issuing_Authority_Name: TName; // Name, ... 36 byte por defecto (20..20) ver apdo. 2.70 Name
card_Issue_Date: TTime_Real; // TimeReal ... 4 byte por defecto (00..00) ver apd. 2.110 TimeReal
card_Validity_Begin: TTime_Real; // TimeReal ... 4 byte por defecto (00..00) ver apd. 2.110 TimeReal
card_Expiry_Date: TTime_Real; // TimeReal ... 4 byte por defecto (00..00) ver apd. 2.110 TimeReal
end;
--------------------------------------------------------------------------------------------------

Pero como comprobareis con el ejemplo no me devuelve bien los valores de fecha, creo que puede ser o que no he entendido bien que tipo de datos son los TimeReal o que se me escapa algo en la función.

Por si os hacen falta os envío en el fichero Otros_Ficheros_Conductores.rar más capturas de conductores.

Os agradecería me guiaseis ante esta duda. Como veréis en el código que subo voy bastante avanzado gracias a vuestra ayuda.

De antemano, os doy las gracias por vuestra colaboración.

Lepe
31-05-2007, 15:20:41
Un paréntesis.

El programa ¿es para tí? ¿lo vas a vender? ¿lo haces por curiosidad?

Lo digo porque leer los archivos (que es lo que haces ahora) es lo de menos, después tienes que:
- organizar los datos (de cada conductor en una carpeta separada).
- interpretar los datos cuando es tarjeta de Empresa.
- Sacar las estadísticas, que es en realidad lo interesante del tema (saber cuando un conductor se pasó del límite de velocidad o bien cuando sobrepasó el límite de tiempo al volante), el día, la hora, el periodo de incidencia, etc.
-Cruzar los datos de la tarjeta empresa con los datos de conductores, esto si puede ser más que tedioso y propenso a errores.
- Revisar todas las modificaciones del BOE al efecto, para actualizar tu programa y que cumpla las nuevas reformas.
- Revisar todos los nuevos fabricantes de VU que vayan saliendo, (para que tu programa lo reconozca). Yo no he encontrado una lista de fabricantes por ningún sitio.
- Sobre todo, realizar gráficas de líneas basadas en todos los datos anteriores, porque realmente es lo que va a mirar el empresario. De nada me sirve ver un grid con los datos de 3 meses anteriores, de nueve camiones y 12 conductores y aparte los datos de Empresa.

Es muy típico que un conductor introduzca la tarjeta en el coche por la mañana y la saque por la noche, sin establecer los modos de pausa, aparcamiento, conducción al entrar en barcos, etc. Todos esos trucos debes conocerlos y actuar como diga la ley, por ejemplo, alertar cuando el tiempo de conducción no supere los 2 minutos... (caso típico de mover el camión en el lugar de carga) para que el empresario tome cuenta y le eche la bulla al conductor.

Lo que digo, es que por 1.000 € tienes el DATACOGRAF Professional que realiza todo el trabajo. Dudo que una persona sola, pueda realizar el mismo software por el mismo coste.

Existen programas más baratos, pero, por ejemplo, no cruzan los datos de Empresa - conductores.

No quiero desalentarte, solo quiero que veas donde te metes y valores otras opciones ;) antes de continuar.

Saludos.

socger
31-05-2007, 16:04:15
Pertenezco a una empresa que se dedica al servicio de viajes discrecionales (viajes por bus).

Estoy desarrollando esta aplicación para integrarla en nuestro ERP, no con vistas a su comercialización posterior.

La mayoría del software que hay en EL MERCADO no da integración de sus datos con un ERP ajeno a no ser por importación/exportación de datos por lo que no es trasparente para el usuario de la empresa para la que trabajo.

Por eso en este hilo comenté de ir subiendo el código progresívamente para que otros pudieran aprovecharse de él.

De momento me he topado con este último problema (2 comentarios anteriores), por eso pido ayuda. Héchale un vistazo por favor y a ver que me puedes decir.

Gracias, de antemano.

Lepe
31-05-2007, 17:04:29
Se lo he echado, pero no me queda nada claro, por eso no comento nada desde hace mucho :D.

Dice que TimeReal va de cero a 2^32-1 ... vale, eso cabe en un tipo de datos Integer.

Después Fecha_integer da resultados negativos ¿no quedamos en que era un valor positivo? .... ¿está en complemento a 2 ese número? ¿no está leyendo bien los datos? :confused:

Saludos

socger
05-06-2007, 12:38:20
En cuanto a tu cita:
----
Después Fecha_integer da resultados negativos ¿no quedamos en que era un valor positivo? .... ¿está en complemento a 2 ese número? ¿no está leyendo bien los datos? :confused:
---

Si está recogiendo bien los datos pero no se a que te refieres (¿está en complemento a 2 ese número?)

Gracias, por vuestra ayuda. Pero sigo pillado en este asunto antes puesto.

sitrico
06-06-2007, 18:22:14
Me voy a meter a consciencia de que no tengo ni idea de esto :confused:

Pero...

Time_Real: Integer; // [INTEGER:TimeRealRange] ::= INTEGER(0..TimeRealRange) ... TimeRealRange ::= 2^32-1
end;


dice que el INTEGER va de 0..2^32-1

Me pasó algo parecido en otro caso y la solucion tenía que ver con:

Generic integer types for 32-bit implementations of Delphi
Type Range Format
Integer -2147483648..2147483647 signed 32-bit
Cardinal 0..4294967295 unsigned 32-bit
Fundamental integer types include Shortint, Smallint, Longint, Int64, Byte, Word, and Longword.

Fundamental integer types
Type Range Format
Shortint -128..127 signed 8-bit
Smallint -32768..32767 signed 16-bit
Longint -2147483648..2147483647 signed 32-bit
Int64 -2^63..2^63-1 signed 64-bit
Byte 0..255 unsigned 8-bit
Word 0..65535 unsigned 16-bit
Longword 0..4294967295 unsigned 32-bit


El tipo integer va de -2147483648..2147483647 mientras que el Cardinal 0..4294967295 (sin signo) por lo que creo que debes definir tu variable como cardinal (ó longword) en lugar de integer.

Espero te sirva.

socger
07-06-2007, 11:26:24
Gracias, pero cambiando en el programa el tipo de variable a cardinal o longword me sigue ocurriendo lo mismo

Saludos

socger
11-06-2007, 18:28:01
Sigo teniendo el mismo problema. Ya casi me siento inutil, pues aunque he controlado todo lo que me habeis dicho que estudiase. Me he topado con este ultimo problema y sigo sin resolverlo. Por lo que se deduce que si no pillo un golpe de ayuda voy a tener que abandonar este proyecto..

Saludos de todos modos

Casimiro Notevi
11-06-2007, 22:49:33
socger, pero exactamente ¿qué valores existen en esa posición en el fichero a leer, qué resultado deberías obtener y qué resultado obtienes?


p.d.: no te rindas, muchas veces es mejor apartarse un rato del problema, dedicarse a descansar o algún hobby y luego volver con más energías para enfrentarse al problema.

Lepe
12-06-2007, 10:19:54
Encontrarse en esta situación es muy típico de nosotros (los programadores) socger. El consejo de Casimiro es muy bueno.

Casimiro, el valor que se obtiene en algunos casos era negativo, y en otros, se obtiene una fecha muy cerca de 1900. Con el comentario de sítrico, todo queda mucho más claro: el integer llega hasta un valor de 0..2^16-1 cuando encuentra un valor más grande en el archivo, el tipo integer devuelve un número negativo (interpretando erróneamente el valor guardado. Por ello debe usarse el LongWord.

Por otra parte, creo haber leído en el pdf, que la fecha en la que se basa es 1970, es decir, ese número guardado, son los días transcurridos desde 1/01/1970 (lo digo de memoria, favor de mirar el pdf para comprobarlo) y como sabemos, el calendario del ordenador se basa en 1900, por tanto, a ese número obtenido habría que sumarle 70 años para obtener el valor correcto. Yo, aunque lo intenté, tampoco obtuve los resultados esperados, muy probablemente porque usaba un Integer en lugar del LongWord o Cardinal.

Son muchos detalles los que hay que tener en cuenta :(

Saludos

Lepe
12-06-2007, 12:01:07
Pues con esas modificaciones tampoco va :D


En Fecha primer día de validez de la tarjeta: 09-09-2006
y en Fecha en la que termina la validez de la tarjeta: 09-09-2011

Pues no da, jejeje, me da fechas entorno al 1970 y el año 2038 :D
Incluso miré sin sumar el 1970 ... a ver si daba fechas mejores... pero nop

(Veasé la rutina devolver_fecha)

He añadido un par de lineas de debug:
"Fecha sumando 1970" y "Fecha partiendo de 1900". Lo hice porque ya dudaba que la fecha base de un TTime_Real fuese el 01/01/1970

Estos son los datos que obtengo para el conductor diego Antonio:

Segundos leidos de archivo 2150951235
Valor en dias obtenido: 24.895,27 (unos 68 años más o menos)
Fecha sumando el 1970: 28/02/2038 06:27:15
Fecha partiendo de 1900: 27/02/1968 06:27:15
*** Fecha en que se expidió la tarjeta: 28/02/2038 06:27:15


Segundos leidos de archivo 14935875
Valor en dias obtenido: 172,87
Fecha sumando el 1970: 22/06/1970 20:51:15
Fecha partiendo de 1900: 20/06/1900 20:51:15
*** Fecha primer día de validez de la tarjeta: 22/06/1970 20:51:15


Segundos leidos de archivo 3559245
Valor en dias obtenido: 41,19
Fecha sumando el 1970: 11/02/1970 04:40:45
Fecha partiendo de 1900: 09/02/1900 04:40:45
*** Fecha en la que termina la validez de la tarjeta: 11/02/1970 04:40:45
*** Apellidos/nombre titular de la tarjeta: MIÑANO MORENO, DIEGO ANTONIO

O sea:
- La tarjeta se expidió hace 68 años más o menos desde la fecha base :eek:
- Fecha primer día de validez: 172 días más o menos desde la fecha base :eek:
- Fecha termina la validez: 41 dias desde la fecha base :eek:

Causas de que eso no vaya bien:
- Estamos olvidando un detalle del famoso pdf
- No está leyendo bien del archivo (aunque no da errores de lectura, puede que esté interpretando datos que no deberían leerse así).
- Las fechas no parten desde el 1970, sino de otra fecha. (esto es improbable, ya que lo dice expresamente el pdf, salvo error tipográfico :D).

- He modificado las líneas ReadBuffer, ya que ponías a mano el número de bytes a leer, yo he puesto sizeof(Tipo_de_registro).
- También he modificado la rutina devolver_fechas.

... pero seguimos igual que antes :(.

Saludos

Casimiro Notevi
13-06-2007, 00:45:59
Basándome en el programita de Lepe, he hecho algunas pruebas y desde luego que si es desde 1970, no cuadran las fechas.
¿Puede ser que no se estén leyendo los datos correctos?, casi seguro que es eso.

No he revisado la parte que lee el fichero, he supuesto que está leyendo los bytes correctos.

Lepe
13-06-2007, 18:11:19
Yo si hice 1 sola traza de la rutina de lectura; lo hace bien.

Lo que fastidia bastante, es que el resto de datos de ese registro TCard_Identification lo devuelve correctamtente.

card_Issuing_Member_State: Byte; // NationNumeric, ... 1 byte INTEGER(0..255) por defecto (00) ver apdo 2.72. NationNumeric
card_Number: TCard_Number_Conductor; // CardNumber ... 16 byte por defecto (20..20) ver apdo. 2.21 CardNumber
card_Issuing_Authority_Name: TName; // Name, ... 36 byte por defecto (20..20) ver apdo. 2.70 Name
card_Issue_Date: TTime_Real; // TimeReal ... 4 byte por defecto (00..00) ver apd. 2.110 TimeReal
card_Validity_Begin: TTime_Real; // TimeReal ... 4 byte por defecto (00..00) ver apd. 2.110 TimeReal
card_Expiry_Date: TTime_Real;

Si el Card_Number es el correcto (porque no hay duda, se ve en el Memo1 y también en el GroupBox.Caption), entonces el resto de datos deben ser correctos.

Si hubiese un byte de desplazamiento erróneo (porque estuviese leyendo mal del archivo), ese fallo se propagaría, y faltaría o sobraría una letra a ese Card_Number, y lo mismo con el card_Issuing_Authority_Name.

Pero no, los datos son correctos, aparece la "DGT DE MURCIA" y el nombre y apellidos del conductor perfectamente, sin falta ni sobra de letras.

Llegados a este punto, diría que falla la función Devolver_Fecha, es decir, la traducción que hace de ese número no es la correcta.

Lo más fácil es decir que el pdf tiene un error, o que incluso se ha modificado posteriormente las normas, y que ese pdf no lo contempla.

Yo aconsejo dejar eso de lado y tirar hacia delante, posiblemente al final se encuentre como resolver el inconveniente. Socger, ¡¡ ánimo !!

Por curiosidad, conté los días entre 01/01/1970 y la fecha de hoy, me daba 13.677,72. La primera fecha da sobre unos

- La tarjeta se expidió hace 24.895,27 días (esto daba el año 2038)
- Fecha primer día de validez: 172 días
- Fecha termina la validez: 41 dias


Queda claro que la primera fecha no es desde 1970, tampoco desde 1900.
Queda claro que la segunda y tercera fecha, está en base a esa fecha que desconocemos.

Saludos

Casimiro Notevi
13-06-2007, 19:38:19
Sí, puede ser que la documentación tenga una errata en la fecha o que la hayan cambiado.
Sería conveniente localizar el organismo encargado de emitir esas normas y conseguir la última que tengan actualizada.

Casimiro Notevi
14-06-2007, 09:00:40
Por lo visto el dato está bien, he encontrado información en sitios oficiales y parece correcto.
Entonces, me pregunto, ¿puede ser que lo que esté mal sea el fichero que se está importando?, ¿de dónde han salido esos ficheritos de pruebas?

socger
15-06-2007, 08:57:15
Estos ficheros están recogidos de las tarjetas de algunos de los conductores de la empresa de transportes para la que trabajo.

Puedo subir más para que los probeis. Y de momento con todos los que he probado me ha ocurrido lo mismo.

Gracias de todos modos. Seguiré haciendo pruebas, pero os agradecería que me pudieseis hechar un cable. Cualquier idea por la que pueda caminar me podría solucionar este problema.

Saludos.

Lepe
15-06-2007, 11:09:26
los conductores que tenemos son:
- diego antonio
- juan jose
- manuel riquelme.

Sería bueno saber de antemano la fecha de expedición de su tarjeta, primer dia de validez y fecha en la que termina la validez (Al menos algunas de ellas) a ver si calculando los segundos de esas fechas, se puede obtener el número que viene en el fichero).

Este fin de semana salgo de viaje, así que no podré echarle un vistazo.

Saludos

Casimiro Notevi
15-06-2007, 11:22:46
También sería útil ver los resultados de esos ficheros con algún otro programa que los lea, a ver qué datos saca.

SpyNett
21-06-2007, 23:23:00
Socger,
Te puedo comentar que leer correctamente los ficheros no es en absoluto trivial. La estructura de los ficheros sigue un método de almacenamiento bastante arcaico y propenso a errores. Toda la información se graba en binario y debes convertirla a carácter y después verificar que lees correctamente mediante la firma digital. En realidad la información no va encriptada (aunque podría estarlo). Cada segmento sólo va acompañado de un hash hecho sobre estos datos en base a la parte privada del certificado del dispositivo (tarjeta de conductor en tu caso).
Como ha comentado ya alguien en el foro, leer el fichero solo es un paso, luego debes darle coherencia a la información leída y es entonces :eek: cuando empiezan los problemas: Un fichero de conductor se divide en varios segmentos (por ejemplo: tarjetas introducidas, lugares visitados, vehículos utilizados, actividades) los cuales no siempre cuadran entre si. :eek: !!

Después tienes errores del tipo en que un mismo día y hora aparece que el conductor ha llevado dos vehículos :eek: (porque uno de los relojes de los tacógrafos no está bien calibrado por ejemplo), después tienes discrepancias respecto a cuánto tiempo ha estado la tarjeta insertada en el tacógrafo (que puede variar según donde lo mires) u otros problemas como que el tacógrafo no registre con cuantos kilómetros has finalizado un día de conducción, entonces no puedes calcular correctamente la distancia recorrida en ese dia.
No es por desanimarte pero te espera bastante curro. Donde yo trabajo hemos tenido que lidiar con estos y 'algunos' problemas más ya que hemos desarrollado un software de lectura y análisis de tacógrafos. Se llama Datacograf y creo (humildemente) que es el software más detallado en cuanto a análisis. (no porque seamos más listos que nadie, sino porque lo hemos desarrollado partiendo de lo que creemos que no hacen bien los otros programas y porque está desarrollado sobre .NET 2.0+Visual Studio 2005).

En cuanto al acceso a los datos: puedes acceder a la información por dos vías: con este programa tienes acceso libre a la base de datos (el programa trabaja en MS Access, SQL Server 2000, SQL Server 2005 o MySQL 5.0 ). Si el primer método no te sirve puedo comentarte que actualmente yo estoy desarrollando una DLL que ataca a los datos integrados en el programa, de manera que puedas llamar a esta DLL y pedirle por ejemplo los totales de conducción y descanso del conductor X entre el dia xxx y el xxx.

Yo he analizado los ficheros TGD que has colgado y si a alguien les interesa os los puedo mandar por email (no los puedo colgar aquí porque su tamaño está entre 400Kb (informe de contenido puro del fichero) y 4000Kb (informe detallado)).
Si quereis probar vosotros mismo el análisis de ficheros de conductor lo podeis hacer en un servicio (actualmente gratuïto) que colgamos hace más o menos un mes en http://www.tacografo-digital.net/FileAnalyzer/formAnalyzerLogin.aspx
Introducid el usuario 'datacograf' y el password 'invitado'.

Si deseas más información puedes escribir a eutisoftware@eutisoftware.com o llamar al 972 207 208 y preguntar por Pedro.
Espero haber ayudado en algo y disculpad por la longitud de este mensaje.

Cordialmente,
Miquel Fornas
miquel.fornas@eutisoftware.com

Lepe
22-06-2007, 00:50:47
Que el nombre de "Datacograf Profesional" aparezca en este hilo no es mera casualidad, de hecho, es el software que recomendé a uno de mis Clientes de mi ciudad (Lepe) hace cosa de un mes.

Miguel, aprovecho la ocasión para agradecer que te hayas registrado en el foro y responder este hilo.

Saludos

xino83
01-08-2007, 13:06:35
Hola a todos,
Soy novato en este tema de tacógrafos digitales. Trabajo en una empresa donde la flota de vehículos está bastante descentralizada y mi intención es poder descargar las tarjetas de cada conductor en la sede en la que esté trabajando y enviarlas a la sede central donde se integrarán en el programa que gestione estos ficheros. Mi duda es cómo descargar estas tarjetas, se que necesito un lector de tarjetas. Lo que no se es cómo descargarla y si al descargarla obtengo directamente el fichero TGD o necesita hacer alguna transformación. Como dije anteriormente mi intención no es editar los datos del fichero ni la tarjeta, sino exportalos para posteriormente ser integrados.

Saludos y gracias de antemano

SpyNett
01-08-2007, 18:09:24
Hola xino83,

Tienes varias alternativas:

1- Usar el dispositivo DownloadKey de Siemens. Deberás ir al vehículo e insertar la tarjeta de empresa así como la tarjeta del conductor. El downloadkey generará un fichero TGD que quedará almacenado en su memoria y que después podrás enviar via email a la central.

2- Usar el dispositivo de Optac o de Actia. Con estos dispositivos no necesitas ir al vehículo ya que tiene una ranura para poder insertar la tarjeta de conductor, también generarán un fichero TGD que quedará almacenado en su memoria y que después podrás enviar via email a la central.

3- Usar un lector genérico de smartcards conectado a un PC y un software que genere el fichero. Productos como Datacograf, Strada o TachoMaster ofrecen este servicio.

Si ya dispones del hardware para descargar y no necesitas acceder ni consultar los datos leídos en las delegaciones, lo más sencillo es usar la opción 1 o 2.


Cordialmente,

Miquel Fornas
miquel.fornas@eutisoftware.com
www.tacografo-digital.net

jojobkx_1
02-09-2007, 09:07:37
con los problemas de fechas yo de duzco que:
tienes posibilidad de ver las tarjetas fisicamente No?
pues puedes saber la fecha de validez.
si no esta impreso en la tarjeta, puedes saber el plazo sabiendo cuando
se izo la tarjeta. No?
apartir de ahi teniendo lo que obtienes en el fichero tgd se podria saber
desde cuando se empieza.(pero provando varias tarjetas).

No se si te servira o sera una tonteria.
sobre los ficheros tgd es muy interesante(quien no tiene un amigo camionero y que quiera ver el fichero. ya que es suyo!sin pagar una pasta)
si puedo le echare un ojo al codigo tuyo.
saludos.

javigh
08-10-2007, 13:28:41
Hola. Yo también estoy intentando descrifrar este tipo de archivos. El problema con el que me encuentro es que el único documento que he encontrado explica la estructura de datos de la "tarjeta de conductor" es el pdf ese del BOE. En la página 119 es donde se encuentra dicha estructura, pero no tiene "nada" que ver con la estructura del fichero TGD que tengo y los que he bajado de este post. Yo he podido leer el "EF Identification" (titular de la tarjeta, todo tipo de fechas, etc), pero por ingeniería inversa y no leyendo el documento. Según el PDF el "cardIssuingMemberState" debería estar en la posición 0x01B0, pero tanto en los archivo que tengo como en los que se han publicado en este post, esa información está en el 0x00C4. ¿Qué ha pasado con los certificados que deberían estar antes?.

Si se empieza desde el principio, el embedderIcAssemblerId debería estar en la posición 0x0012, pero anda sobre la posición 0x0017 (que es donde pone EFNMT, que deduzco que será la fábrica nacional de moneda y timbre).

¿Alguien sabe por qué no coincide la posición indicada en el documento con la que viene en el archivo?. Yo he pensado que quizás la información del PDF es la información almacenada en la tarjeta, y parte de esa información se pierde al pasarlo a un archivo, como por ejemplo los certificados digitales.

Muchas gracias de antemano!

Un Saludo.

PE: Bueno, he "descubierto" que los diferentes campos pueden estar desordenados y sólo es cosa de mirar el FID, jeje... Las prisas!

javigh
08-10-2007, 14:36:15
Sobre el tema de la fecha... supongo que ya hace tiempo que estará arreglado, pero por si acaso. Lo que a mi me ha funcionado es coger el hexadecimal, por ejemplo 4F 38 52 80, se pasa a decimal que sería 1329091200, y esos son los segundos a partir del 1/1/1970. Y ya "sólo" hay que haer las cuentas pertinentes.

Un Saludo.

javigh
17-10-2007, 11:09:57
Hola a todos de nuevo. Ya he conseguido extraer toda la información de la tarjeta del conductor y del archivo del tacógrafo. Ahora estoy intentando verificar las firmas de las diferentes zonas de datos.

¿Sabéis si existen librerías para Delphi que utilicen certificados RSA para encriptar/desencriptar datos?. La verdad es que he estado buscando y no he encontrado ninguna gratuita.

A falta de esto, me valdría con alguna función que pueda elevar un número impresionantemente grande (del tamaño de los datos), a otro número de 1024 bits y hacerle un módulo de 1024 bits. No sé tampoco si esto existe o me lo tendré que implementar yo todo.

Un Saludo.

Casimiro Notevi
17-10-2007, 12:27:49
Creo que es una buena pregunta para seoane, que, por cierto, hace unos días que no se le ve por aquí :confused:

socger
17-10-2007, 12:34:22
No se exáctamente que es lo que necesitas.
Pero no me importaría poderte hechar un cable con lo que he ido avanzando.

Si quieres contactar diréctamente conmigo mi cuenta de correo es socger@hotmail.com

Saludos

javigh
17-10-2007, 13:06:10
No se exáctamente que es lo que necesitas.
Pero no me importaría poderte hechar un cable con lo que he ido avanzando.

Si quieres contactar diréctamente conmigo mi cuenta de correo es socger@hotmail.com

Saludos

Bueno, lo que necesito es verificar que los datos son correctos y no han sido modificados. En el caso de la tarjeta del conductor la firma de una zona concreta de datos empieza con la cabecera con Tipo = 0x01. Pero para verificar esa firma primero hace falta saber la clave pública del aparato que ha firmado los datos (en este caso, de la tarjeta), y para saber eso hace falta saber la clave pública de la CA y para saber eso se necesita la clave pública EUR.PK. Con la clave EUR.PK se verifica el certificado MemberStateCertificate y se saca ES.PK en nuestro caso. Y con la ES.PK se saca la clave pública de la tarjeta a partir del CardCertificate. Una vez que se tiene la clave pública de la tarjeta, se hace el Hash de los datos, se desencripta la firma (dándonos el hash calculado en la creación) y ambos hash deberían coincidir.

Con los datos del tacógrafo es básicamente lo mismo, aunque el archivo no tiene el mismo formato que el archivo de la tarjeta del conductor, pero también tiene los dos certificados (MemberStateCertificate y VUCertificate) y una firma cada segmento de datos.

El proceso que hay que hacer sé cual es, pero no sé cómo conseguir la EUR.PK, ni si existe alguna librería en delphi que devuelva la clave pública de un certificado y que compruebe una firma ni nada...

Gracias por la ayuda!

Un Saludo.

jojobkx_1
03-12-2007, 09:44:05
he visto algo +- sobre lo que buscas de las claves.
prueba en:

http://es.wikipedia.org/wiki/RSA#Generaci.C3.B3n_de_claves

si que hay librerias (para linux) no he encontrado nada para delphi.

javigh
03-12-2007, 18:35:44
he visto algo +- sobre lo que buscas de las claves.
prueba en:

http://es.wikipedia.org/wiki/RSA#Generaci.C3.B3n_de_claves

si que hay librerias (para linux) no he encontrado nada para delphi.

Muchas gracias!. Pero la teoría ya la sé, jeje ;). El problema es encontrar alguna librería gratuita que sea medianamente rápida para delphi.

Un Saludo.

pauvalencia
21-01-2008, 10:10:52
Muchas gracias!. Pero la teoría ya la sé, jeje ;). El problema es encontrar alguna librería gratuita que sea medianamente rápida para delphi.

Un Saludo.

Hola!!!,

Yo estoy con el mismo tema, tengo la aplicación del tacógrafo hecha, simplmente me queda poder analizar el tema de las firmas digitales. Si tienes un rato ponte en contacto conmigo, bueno, tú o cualquiera que se haya pegado con este tema de las firmas digitales de ficheros TGD y lo comentamos, gracias!

Saludos cordiales.

sunday5_5
28-02-2008, 12:53:04
soy un usuario sin m uchos nconocimientoa de programacion y querria saber si alguien me puede pasar un link o algun programa gratuito respondan a mi correo sunday5_5@hotmail.com

josejm
25-03-2008, 00:57:46
Estoy alucinando, cada dia mas con www.clubdelphi.com (http://www.clubdelphi.com), aqui he resuleto el 80% de mis dudas en casi todos los temas. Estoy desarrollando en delphi desde hace ya 6 años y es alucinante, como crecemos entre todos.

ral
10-11-2009, 12:07:53
Buenas a todos,

Realmente no se si debería abrir un post nuevo para esto, pero he pensado que quizas estaría bien la continuación de la lectura de los ficheros TGD.

Como todos vosotros, he tenido que realizar la lectura de los ficheros TGD de conductores para mi empresa, pero parece que eso no es suficiente y ahora necesitan tambien la lectura de los ficheros de datos de la Unidad Intravehicular.

Mirando la documentación, no logro encontrar donde está la estructura de datos para estos ficheros que comienza con V_*.TGD
Según el B.O.E. la estructura de campos es:

Nombre Longitud Significado
SID 1 Identificador de servicio (fijo '76')
TREP 1 '01' Resumen, '02' Actividades, '03' Incidente......
Datos [variable] Contenido del archivo elemental

Pero esto es lo máximo que he encontrado. No cuantos bytes debo leer para el contenido de datos, y voy muy perdido...

¿Alguien podría echarme una mano (al cuello :P) e iluminarme para seguir el camino?

Muchas Gracias por todo de antemano!!!

Manolin
26-11-2009, 20:23:37
Un saludo a todos!!

Me esta sirviendo de mucho toda la informacion que poneis aqui en el foro, estoy mui agradecido.. No obstante haber si tambien me podeis ayudar en esto.

Yo descargo los datos del tacografo de mis vehiculos y guardo los discos de los analogicos, pero esto no me dice nada, me gustaria que me aconsejarais sobre algun programa informatico que me diera informacion sobre estos datos, porque con el simple hecho de guardar los datos no me vale, me gustaria tener mas informacion! muchas gracias de antemano

isaacRHR
31-01-2010, 22:04:59
Hola a todos.

Mi problema no es la interpretación de los ficheros, por lo menos aún no.
Estoy realizando un programa que se conecta a nuestro sistema y simplemente lo que necesito es descargar los ficheros.

Es decir el programa que estoy realizando debe ser capaz de sacar los ficheros de la tarjeta y colocarlos en un directorio. La verdad es que estoy muy perdido.

Muchas gracias

carlangasmanero
13-02-2011, 10:38:09
entonces, la herramienta online que sale en la web del ministerio para que sirve?
Gracias de antemano.
Estoy intentando ponerme al dia haber si con lo poco que se de programacion puedo ayudaros algo.
No pongo la url como enlace porque no me deja.
Un saludo.

SAMGCT
25-03-2011, 12:48:44
Existe algún programa de descarga y analisis para android, sería muy interesante....
Sobre todo ahora que están proliferando los dispositivos con este sistema operativo.

Manolin
15-07-2011, 12:22:13
Hola de nuevo!!!

He leido mucho sobre el tema tratado aqui y me han comentado el uso de Tachospeed, para la lectura de tacografos tanto analogicos como digitales. No se si alguien lo conoce o lo ha utilizado y podria, aconsejarme.

Un saludo

SAMGCT
10-11-2011, 23:15:44
Hola yo he probado tachospeed y no me ha gustado, al final, despues de probar el stradacard, lector, tachospeed, globofleet y datacograf, me he comprado datacograf y sin duda el mas claro y hace unos informes fenomenales, lo recom
iendo.