limpieza
This commit is contained in:
-195
@@ -1,195 +0,0 @@
|
|||||||
# Changelog - iTartanas
|
|
||||||
|
|
||||||
## Versión 1.0 - Implementación Completa
|
|
||||||
|
|
||||||
### 🎉 Funcionalidades Implementadas
|
|
||||||
|
|
||||||
#### ✅ Lectura NFC de Tarjeta Millennium
|
|
||||||
- **Comunicación ISO-DEP**: Implementado el protocolo completo de comunicación con tarjetas Calypso
|
|
||||||
- **Selección de red de transporte**: Comando APDU para inicializar la comunicación
|
|
||||||
- **Lectura de entorno y contrato**: Extracción de datos básicos de la tarjeta
|
|
||||||
- **Lectura de registros de eventos**: Obtención de los últimos 3 movimientos
|
|
||||||
|
|
||||||
#### 💳 Procesamiento de Datos de Tarjeta
|
|
||||||
|
|
||||||
##### Número de Tarjeta
|
|
||||||
- Decodificación BCD (Binary Coded Decimal) a decimal
|
|
||||||
- Conversión de PAN (Primary Account Number) a IEP según aplicación
|
|
||||||
- Cálculo y validación de dígito de verificación Luhn
|
|
||||||
- Enmascaramiento de primeros 8 dígitos por seguridad
|
|
||||||
- Formato visual en grupos de 4 dígitos
|
|
||||||
|
|
||||||
##### Saldo
|
|
||||||
- Lectura desde bytes 29-31 del contrato (3 bytes big-endian)
|
|
||||||
- Conversión de céntimos a euros
|
|
||||||
- Formato con 2 decimales
|
|
||||||
|
|
||||||
##### Últimos Movimientos (NUEVO)
|
|
||||||
- Lectura de registros de eventos (comando READ RECORD)
|
|
||||||
- Parseo de hasta 3 movimientos más recientes
|
|
||||||
- Extracción de información:
|
|
||||||
- **Fecha**: Días desde 01/01/1997 (formato Calypso)
|
|
||||||
- **Hora**: Minutos desde medianoche (convertido a HH:MM)
|
|
||||||
- **Tipo de evento**: Carga, Validación, Operación
|
|
||||||
- **Importe**: En euros (si aplica)
|
|
||||||
- **Ubicación**: Línea o parada (si está disponible)
|
|
||||||
|
|
||||||
#### 🎨 Interfaz de Usuario
|
|
||||||
|
|
||||||
##### Pantalla Principal
|
|
||||||
- Diseño Material 3 con Jetpack Compose
|
|
||||||
- Tema moderno y responsivo
|
|
||||||
- Edge-to-edge UI
|
|
||||||
|
|
||||||
##### Estados de la Aplicación
|
|
||||||
1. **Estado Inicial**: Instrucciones y icono NFC
|
|
||||||
2. **Leyendo**: Indicador de progreso circular
|
|
||||||
3. **Datos Leídos**: Card con toda la información
|
|
||||||
4. **Error**: Card roja con mensaje descriptivo
|
|
||||||
|
|
||||||
##### Visualización de Datos
|
|
||||||
- **Número de tarjeta**: Tipografía destacada, parcialmente enmascarado
|
|
||||||
- **Saldo**: Display prominente en color primario, tamaño grande
|
|
||||||
- **Movimientos**: Lista compacta con diseño tipo timeline
|
|
||||||
- Fecha y hora
|
|
||||||
- Tipo de operación con estilo diferenciado
|
|
||||||
- Importe con código de color (Cargas en azul, Validaciones en gris)
|
|
||||||
- Ubicación/línea cuando está disponible
|
|
||||||
|
|
||||||
#### 🔧 Características Técnicas
|
|
||||||
|
|
||||||
##### Arquitectura
|
|
||||||
- **Patrón Repository**: Separación de lógica de negocio
|
|
||||||
- **Coroutines**: Operaciones asíncronas sin bloqueo
|
|
||||||
- **Compose State Management**: Estado reactivo de UI
|
|
||||||
- **Manejo de errores robusto**: Try-catch en múltiples niveles
|
|
||||||
|
|
||||||
##### Comandos APDU Implementados
|
|
||||||
```
|
|
||||||
SELECT Transport Network: 0x80 0x26 0x4F 0x11 0x0A
|
|
||||||
READ Environment: 0x80 0x32 0x00 0x00 0x18
|
|
||||||
READ Contract: 0x80 0x2E 0x01 0x00 0x20
|
|
||||||
READ Event Log (1-3): 0x80 0x2B 0x0N 0x05 0x1D
|
|
||||||
```
|
|
||||||
|
|
||||||
##### Seguridad y Privacidad
|
|
||||||
- ✅ Sin conexión a Internet
|
|
||||||
- ✅ Sin almacenamiento persistente
|
|
||||||
- ✅ Solo lectura (no puede modificar datos)
|
|
||||||
- ✅ Enmascaramiento de información sensible
|
|
||||||
- ✅ Validación de datos antes de mostrar
|
|
||||||
|
|
||||||
### 📋 Archivos Creados/Modificados
|
|
||||||
|
|
||||||
#### Nuevos Archivos
|
|
||||||
```
|
|
||||||
app/src/main/java/com/pjpmosteiro/itartanas/nfc/
|
|
||||||
└── CardRepositoryImpl.kt (270 líneas)
|
|
||||||
|
|
||||||
app/src/main/res/xml/
|
|
||||||
└── nfc_tech_filter.xml
|
|
||||||
|
|
||||||
docs/
|
|
||||||
├── README.md
|
|
||||||
├── INSTALLATION_GUIDE.md
|
|
||||||
└── CHANGELOG.md (este archivo)
|
|
||||||
```
|
|
||||||
|
|
||||||
#### Archivos Modificados
|
|
||||||
```
|
|
||||||
app/src/main/AndroidManifest.xml
|
|
||||||
- Añadidos permisos NFC
|
|
||||||
- Configurado intent-filter para NFC
|
|
||||||
- Añadido launchMode="singleTop"
|
|
||||||
|
|
||||||
app/src/main/java/com/pjpmosteiro/itartanas/MainActivity.kt
|
|
||||||
- Implementada gestión completa de NFC
|
|
||||||
- Añadida UI de lectura de tarjeta
|
|
||||||
- Implementado componente MovementItem
|
|
||||||
- Gestión de estados (leyendo, éxito, error)
|
|
||||||
```
|
|
||||||
|
|
||||||
### 🛠️ Dependencias
|
|
||||||
|
|
||||||
Todas las dependencias ya estaban presentes:
|
|
||||||
- Kotlin 2.1.0
|
|
||||||
- Jetpack Compose BOM
|
|
||||||
- Material 3
|
|
||||||
- Lifecycle Runtime KTX
|
|
||||||
- Android NFC API (incluida en SDK)
|
|
||||||
|
|
||||||
### ✅ Testing y Calidad
|
|
||||||
|
|
||||||
- ✅ Build exitoso sin errores
|
|
||||||
- ✅ Código sin warnings críticos
|
|
||||||
- ✅ Uso correcto de Locale para formateo
|
|
||||||
- ✅ Manejo apropiado de excepciones
|
|
||||||
- ✅ Compatibilidad con Android 7.0+ (API 24)
|
|
||||||
- ✅ Soporte para Android 13+ (API 33) con APIs actualizadas
|
|
||||||
|
|
||||||
### 📱 Cómo Probar
|
|
||||||
|
|
||||||
1. Compilar e instalar:
|
|
||||||
```bash
|
|
||||||
.\gradlew installDebug
|
|
||||||
```
|
|
||||||
|
|
||||||
2. Abrir la aplicación en un dispositivo con NFC
|
|
||||||
|
|
||||||
3. Acercar una Tarjeta Millennium al lector NFC
|
|
||||||
|
|
||||||
4. Verificar que se muestran:
|
|
||||||
- Número de tarjeta enmascarado
|
|
||||||
- Saldo actual
|
|
||||||
- Últimos 3 movimientos con detalles
|
|
||||||
|
|
||||||
### 🎯 Objetivos Cumplidos
|
|
||||||
|
|
||||||
- ✅ Lectura de número de tarjeta
|
|
||||||
- ✅ Consulta de saldo
|
|
||||||
- ✅ Visualización de últimos movimientos (NUEVO)
|
|
||||||
- ✅ Interfaz moderna y usable
|
|
||||||
- ✅ Detección automática NFC
|
|
||||||
- ✅ Manejo robusto de errores
|
|
||||||
- ✅ Documentación completa
|
|
||||||
|
|
||||||
### 🔮 Posibles Mejoras Futuras
|
|
||||||
|
|
||||||
- Guardar historial de lecturas en base de datos local
|
|
||||||
- Gráficos de evolución de saldo
|
|
||||||
- Notificaciones de saldo bajo
|
|
||||||
- Múltiples tarjetas en una cuenta
|
|
||||||
- Exportar historial a PDF
|
|
||||||
- Widget de pantalla de inicio
|
|
||||||
- Modo oscuro/claro manual
|
|
||||||
- Soporte para otros sistemas de transporte
|
|
||||||
|
|
||||||
### 📝 Notas Técnicas
|
|
||||||
|
|
||||||
#### Formato de Fechas Calypso
|
|
||||||
Las fechas se almacenan como días transcurridos desde el 01/01/1997 (epoch Calypso).
|
|
||||||
|
|
||||||
#### Formato de Hora
|
|
||||||
Las horas se almacenan como minutos desde medianoche (0-1439).
|
|
||||||
|
|
||||||
#### Tipos de Evento
|
|
||||||
- `1`: Carga de saldo
|
|
||||||
- `2, 3`: Validación en transporte
|
|
||||||
- Otros: Operaciones diversas
|
|
||||||
|
|
||||||
#### Estructura de Registros
|
|
||||||
Cada registro de evento tiene 29 bytes útiles con la siguiente estructura aproximada:
|
|
||||||
- Bytes 0-1: Fecha (días desde epoch)
|
|
||||||
- Bytes 2-3: Hora (minutos desde medianoche)
|
|
||||||
- Byte 4: Tipo de evento
|
|
||||||
- Bytes 5-7: Importe (céntimos, big-endian)
|
|
||||||
- Bytes 8-11: Información adicional
|
|
||||||
- Bytes 10-11: Código de ubicación/línea
|
|
||||||
|
|
||||||
---
|
|
||||||
|
|
||||||
**Desarrollado por**: Pablo Mosteiro
|
|
||||||
**Basado en**: Análisis de código decompilado de iTranvias
|
|
||||||
**Fecha**: Marzo 2026
|
|
||||||
**Versión**: 1.0
|
|
||||||
|
|
||||||
@@ -1,175 +0,0 @@
|
|||||||
# 🔧 Actualización - Debug de Movimientos
|
|
||||||
|
|
||||||
## Problema Reportado
|
|
||||||
Los movimientos no se estaban mostrando en la aplicación, solo el número de tarjeta y el saldo.
|
|
||||||
|
|
||||||
## ✅ Cambios Implementados
|
|
||||||
|
|
||||||
### 1. Mejorado el Manejo de Errores
|
|
||||||
- **Antes**: Los errores al leer movimientos se "tragaban" silenciosamente
|
|
||||||
- **Ahora**: Se capturan y muestran en la UI para debugging
|
|
||||||
|
|
||||||
### 2. Comandos APDU Múltiples
|
|
||||||
He implementado 3 intentos diferentes para leer los registros de eventos:
|
|
||||||
|
|
||||||
```kotlin
|
|
||||||
// Intento 1: SFI 0x08 (file 8)
|
|
||||||
0x80 0x2B [record] 0x45 0x1D
|
|
||||||
|
|
||||||
// Intento 2: SFI 0x07
|
|
||||||
0x80 0x2B [record] 0x3D 0x1D
|
|
||||||
|
|
||||||
// Intento 3: Comando simplificado
|
|
||||||
0x80 0x2B [record] 0x05 0x1D
|
|
||||||
```
|
|
||||||
|
|
||||||
Esto aumenta las posibilidades de éxito con diferentes implementaciones de tarjetas Calypso.
|
|
||||||
|
|
||||||
### 3. Status Words Flexibles
|
|
||||||
Ahora la app reconoce:
|
|
||||||
- `9000` - Éxito
|
|
||||||
- `6A83` - Registro no encontrado (normal si no hay movimientos)
|
|
||||||
- `6A82` - Archivo no encontrado (tarjeta sin historial)
|
|
||||||
|
|
||||||
### 4. UI con Información de Debug
|
|
||||||
|
|
||||||
Ahora verás uno de estos escenarios:
|
|
||||||
|
|
||||||
#### Caso A: Movimientos Encontrados ✅
|
|
||||||
```
|
|
||||||
┌─────────────────────────────┐
|
|
||||||
│ Últimos Movimientos │
|
|
||||||
│ │
|
|
||||||
│ Carga +10.00 € │
|
|
||||||
│ 15/03/2026 14:30 │
|
|
||||||
│ Línea 12 │
|
|
||||||
│ ... │
|
|
||||||
└─────────────────────────────┘
|
|
||||||
```
|
|
||||||
|
|
||||||
#### Caso B: Sin Movimientos (con debug) 🔍
|
|
||||||
```
|
|
||||||
┌─────────────────────────────┐
|
|
||||||
│ Últimos Movimientos │
|
|
||||||
│ │
|
|
||||||
│ No se pudieron leer los │
|
|
||||||
│ movimientos │
|
|
||||||
│ │
|
|
||||||
│ Debug: Registro no │
|
|
||||||
│ encontrado │
|
|
||||||
└─────────────────────────────┘
|
|
||||||
```
|
|
||||||
|
|
||||||
## 🧪 Qué Probar Ahora
|
|
||||||
|
|
||||||
1. **Reinstala la app** con el nuevo APK:
|
|
||||||
```
|
|
||||||
app\build\outputs\apk\debug\app-debug.apk
|
|
||||||
```
|
|
||||||
|
|
||||||
2. **Lee tu tarjeta nuevamente**
|
|
||||||
|
|
||||||
3. **Observa la sección "Últimos Movimientos"**:
|
|
||||||
- Si ves movimientos: ¡Perfecto! ✅
|
|
||||||
- Si ves "No se pudieron leer...": Lee el mensaje de debug
|
|
||||||
|
|
||||||
## 📊 Posibles Resultados
|
|
||||||
|
|
||||||
### Resultado 1: Funciona Ahora ✅
|
|
||||||
Si los movimientos aparecen, significa que uno de los nuevos comandos funcionó.
|
|
||||||
|
|
||||||
### Resultado 2: "Debug: Registro no encontrado" ⚠️
|
|
||||||
**Significado**: La tarjeta no tiene registros de eventos disponibles para leer.
|
|
||||||
|
|
||||||
**Posibles causas**:
|
|
||||||
- La tarjeta es nueva y no tiene movimientos todavía
|
|
||||||
- Los registros de eventos están en un archivo diferente
|
|
||||||
- La tarjeta Millennium usa un formato propietario diferente
|
|
||||||
|
|
||||||
**Solución**: Es normal. Algunas tarjetas no almacenan historial localmente.
|
|
||||||
|
|
||||||
### Resultado 3: Otro mensaje de error 🔍
|
|
||||||
Si ves otro error, por favor compártelo conmigo para investigar más.
|
|
||||||
|
|
||||||
## 🔬 Próximos Pasos según el Resultado
|
|
||||||
|
|
||||||
### Si Funciona:
|
|
||||||
- ✅ Ya está todo listo
|
|
||||||
- Puedes usar la app normalmente
|
|
||||||
- Los movimientos se mostrarán cuando estén disponibles
|
|
||||||
|
|
||||||
### Si No Funciona:
|
|
||||||
Necesitaré más información:
|
|
||||||
|
|
||||||
1. **¿Qué dice el mensaje de debug?**
|
|
||||||
- El texto exacto que aparece en rojo
|
|
||||||
|
|
||||||
2. **¿Es una tarjeta usada o nueva?**
|
|
||||||
- Si es nueva, puede no tener historial
|
|
||||||
|
|
||||||
3. **¿Puedes leer movimientos en la app oficial de iTranvias?**
|
|
||||||
- Esto confirmaría que los datos existen
|
|
||||||
|
|
||||||
## 💡 Información Técnica
|
|
||||||
|
|
||||||
### Por qué pueden faltar los movimientos:
|
|
||||||
|
|
||||||
1. **Formato Propietario**: Algunas ciudades usan extensiones propietarias del formato Calypso
|
|
||||||
|
|
||||||
2. **Archivo Diferente**: Los eventos pueden estar en un SFI (Short File Identifier) diferente
|
|
||||||
|
|
||||||
3. **Sin Historial Local**: Algunas tarjetas no almacenan historial en el chip, solo en servidores
|
|
||||||
|
|
||||||
4. **Encriptación**: Algunos campos pueden estar encriptados y requerir claves específicas
|
|
||||||
|
|
||||||
### Comandos que estamos probando:
|
|
||||||
|
|
||||||
Las tarjetas Calypso usan el comando READ RECORD (`0x2B`) con diferentes parámetros:
|
|
||||||
|
|
||||||
- **P1**: Número de registro (1, 2, 3)
|
|
||||||
- **P2**: SFI × 8 + modo (ej: `0x45` = SFI 8, modo 5)
|
|
||||||
- **Le**: Longitud esperada (`0x1D` = 29 bytes)
|
|
||||||
|
|
||||||
Estamos probando los SFI más comunes:
|
|
||||||
- SFI 7 (típico para eventos de validación)
|
|
||||||
- SFI 8 (típico para log de transacciones)
|
|
||||||
- Modo directo sin SFI
|
|
||||||
|
|
||||||
## 📱 Instalación del APK Actualizado
|
|
||||||
|
|
||||||
El nuevo APK está en:
|
|
||||||
```
|
|
||||||
app\build\outputs\apk\debug\app-debug.apk
|
|
||||||
```
|
|
||||||
|
|
||||||
Para instalar:
|
|
||||||
1. Transfiere el APK a tu teléfono
|
|
||||||
2. Abre el APK y permite la instalación
|
|
||||||
3. Si ya tenías la app instalada, se actualizará automáticamente
|
|
||||||
|
|
||||||
## ✅ Build Exitoso
|
|
||||||
|
|
||||||
```
|
|
||||||
BUILD SUCCESSFUL ✅
|
|
||||||
35 tareas ejecutadas
|
|
||||||
7 cambios aplicados
|
|
||||||
```
|
|
||||||
|
|
||||||
---
|
|
||||||
|
|
||||||
## 🎯 Resumen
|
|
||||||
|
|
||||||
He mejorado significativamente la lectura de movimientos:
|
|
||||||
- ✅ Múltiples comandos APDU (3 intentos)
|
|
||||||
- ✅ Mejor manejo de errores
|
|
||||||
- ✅ Información de debug visible
|
|
||||||
- ✅ Status words más flexibles
|
|
||||||
|
|
||||||
**Próximo paso**: Prueba la app actualizada y cuéntame qué mensaje ves en la sección de movimientos.
|
|
||||||
|
|
||||||
---
|
|
||||||
|
|
||||||
**Actualización**: 9 de Marzo, 2026
|
|
||||||
**Versión**: 1.1 (Debug Build)
|
|
||||||
**Estado**: Listo para probar
|
|
||||||
|
|
||||||
Reference in New Issue
Block a user