Copy Link
Add to Bookmark
Report
SET 030 0x02
-[ 0x02 ]--------------------------------------------------------------------
-[ SIM application Toolkit ]-------------------------------------------------
-[ by FCA00000 ]-----------------------------------------------------SET-30--
En un artículo publicado en SET28 conté algunas cosas sobre el acceso a
la tarjeta SIM de un móvil, con hincapié en el sistema de ficheros.
Allí hice una vaga referencia al uso del SIM Toolkit pero no profundicé
en el tema. Bueno, ese momento ha llegado ahora.
Las herramientas son: una tarjeta SIM, un móvil, un ordenador, un cable para
conectarlos, un programa de conexión, y la documentación de
la ETSI y 3GPP, en especial
TS 11.14 , TS 31.111, TS 02.17 , TS 23.040 y TS 27.007
Por supuesto, se necesita un móvil que pueda acceder al SIM Toolkit. por
ejemplo el Siemens-S45.
Primero, una explicación breve. Si queréis más detalles solo hay que buscar
en la Internet.
Para la telefonía móvil, hay tres elementos fundamentales:
-red
-ME = Mobile Equipment, o sea, el teléfono móvil o dispositivo similar
-SIM = Subscriber Identification Module , o sea, la tarjeta SIM
Toda comunicación desde la red pasa por el móvil, que se encarga de traducir
las señales de radio en paquetes , y los manda al SIM si son de puros
datos, el cual los decodifica y los manda al auricular si son conversación.
Esta breve explicación se puede desglosar en muchas
etapas pero lo que me interesa aclarar es que el móvil es un
interface, y la red puede comunicar con el SIM pasando a traves del móvil.
Por otro lado, el móvil sirve de GUI para el usuario. Cualquier información
que la red quiere enviar al usuario se presenta en la pantalla del teléfono, y
viceversa; el usuario puede elegir, por ejemplo, un numero de teléfono para
marcar, que va al SIM, quien entonces se lo dice a la parte del móvil que
conecta con la red. Es importante tener clara la distinción entre el GUI del
móvil y la circuiteria de conexión por radio.
Tal como se dice en la documentación 11.14 , el SIM Application Toolkit (SAT)
es un grupo de órdenes y procedimientos para usar durante la etapa de
operación GSM con la red. Las aplicaciones residentes en el SIM pueden
así operar en el ME.
Aunque estas especificaciones solo se aplican a algunos SIMs de fase 2+, en
la práctica todos los SIMs fabricados en los últimos 6 años, y todos
los móviles de los últimos 5 años permiten SAT.
?Qué cosas se pueden hacer con el SIM?
--------------------------------------
El ejemplo típico es que el operador de red define un nuevo menú en
el móvil, que cuando el usuario lo selecciona, permite buscar
restaurantes en la zona, según el tipo elegido por el usuario.
La comunicación entre la red y el SIM se realiza mediante mensajes SMS, así
que no os vayáis a pensar que es un servicio gratuito.
A algunos les gusta ver el SAT como un antecesor de WAP, pues permite la
interacción entre un cliente (el móvil) y el servidor, alojado en el
operador de red. Esto no es del todo correcto, ya que para SAT no es
necesario ninguno de los elemento de Internet. La red que provee los
datos es la de telefonía, y el protocolo no es TCP/IP sino puros SMS.
Pero SAT es mucho más que eso, ya que no siquiera es necesaria la
conexión a la red para realizar las tareas.
Por ejemplo, se puede hacer un programa para que el usuario
marque solo algunos números, y el SIM rellene los que faltan, en función
de la situación física del móvil, la hora del día, o el saldo disponible.
Un tercer uso es el de banca mediante el móvil, pero sinceramente no he visto
ninguna experiencia real: solo modelos piloto.
Por supuesto que es necesario que el SIM contenga una aplicación con alguna
lógica para manejar los datos. Estos programas se pueden cargar en el SIM
cuando se fabrica, o se pueden meter en un punto de venta, o el proveedor
de red puede meterlos mas tarde mediante OTAP-Over the Air Provisioning, que
no es más que el programa encapsulado en un SMS y que va directamente al SIM.
Otra opción es que alguien con un grabador de tarjetas SIM meta el
programa. Esta posibilidad no es tan rara: al fin y al cabo, cualquier móvil
puede escribir en el SIM, suponiendo que se tienen los privilegios y
conocimientos necesarios (que espero aprendáis con este artículo :-)
Y la última opción es que un usuario cargue el programa mandando un SMS
adecuado. Pero esto es adelantar acontecimientos.
Esta es la lista de mecanismos definidos:
-Carga de perfil
-Interacción con SIM
-Carga de datos al SIM
-Selección de menú
-Control de llamadas mediante SIM
-Mensajes cortos mediante SIM
-Carga de eventos
-Seguridad
-Tarjetas multiples
-Alarmas
-Protocolo independiente del transporte
Por ejemplo, el mecanismo 'Interacción con SIM' permite, ente otros, mostrar
un texto en la pantalla del móvil.
Iniciando la marcha
-------------------
Para abrir boca, vamos a ver si el móvil soporta SAT. En el programa
de emulación de terminal (minicom en Linux, Hyperterminal en Windows)
escribimos:
AT
y debe responder
OK
Bueno, por lo menos está correctamente conectado.
Entonces escribimos:
AT^SSTK=?
a lo que el móvil responde
^SSTK: 7FFFFFFF7F0300DF5F
Si devuelve ERROR, es porque tu móvil no usa ese comando para acceder
al SAT. Algunos dispositivos pueden usar AT^SSTA o AT^SSTR o AT^SSTN.
No sé el comando para los Nokia, pero sé que también son capaces
de operar con el SAT si los conectas con el cable o mediante OBEX.
El programa IrCOMM te puede servir si tienes puerto de infrarrojos.
En los Siemens, hay una utilidad llamada sscgw, también conocida
como 'Siemens service code generator' o 'Developer menu activator'
que permite ver algunos valores internos del teléfono. Uno de los
menús se llama 'SAT Commands' y permite ver la lista de los
comandos que le hemos ido mandando, además del resultado.
Como iba diciendo, tras el comando SSTK da la
respuesta 7FFFFFFF7F0300DF5F que es el equivalente al TERMINAL PROFILE y
nos dice las caracteristicas de las que es capaz el móvil.
Este comando es uno de los primeros que el móvil le manda al SIM, para que
el SIM sepa qué cosas puede pedirle y cuales no.
En nuestro caso esta respuesta quiere decir que el móvil es capaz de
muchas cosas:
-todo lo relativo a 'Carga de perfil', excepto el envoltorio que se manda
al SIM cuando se hace una re-llamada
-todo lo relativo a 'Otro' en la sección 5.2 del TS 11.14
-todo lo relativo a 'Interacción con SIM'
-todo lo relativo a 'Información de eventos' excepto el estado del lector
-nada de lo relativo a 'Extensiones de información de eventos' excepto
terminación del navegador, que está habilitado
-nada de clase 'a'
-todo lo relativo a 'Interacción con SIM' excepto clase 'b'. Mala suerte.
-mas cosas relativas a 'Interacción con SIM' excepto notificación de lenguaje.
-nada de clase 'e'
-no hay información sobre el tamaño de la pantalla
En resumen: permite la mayoría de los comandos de interacción con
el SIM, carga de datos, menús, y eventos. Y claro que no permite
tarjetas múltiples, porque no tengo otro lector de tarjetas extra
en el móvil.
?de donde he sacado esta información? Pues de la lista 5.2 del
documento TS-11.14.
Por ahora, vamos muy bien.
Tomando velocidad
------------------
Así que intentamos un comando simple:
at^sstk=22,0
y cuando aparece
>
escribimos
D009010301200002028182
y, sin pulsar ENTER, pulsamos CONTROL-z
Si todo ha ido bien, el móvil ha debido emitir un pitido corto.
y después responde
^SSTK: 810301200082028281830100
Explicación: AT^SSTK es el comando para interactuar con el SAT.
El primer parámetro (22) es la longitud de comando. Mi teléfono no lo
usa, así que da igual lo que se escriba.
El segundo parámetro (0) es el modo. Puede ser 0=Un único comando, o 1=varios
comandos juntos.
A continuación hay que escribir el PDU, o sea, los datos. Luego hay que
finalizarlo con ctrl-z.
Vamos ahora con la explicación de los datos.
Cada comando para el SIM se compone de una estructura similar a:
Tipo Seccion Obligatoriedad Minimo Tamaño
Proactive SIM command Tag 13.2 M Y 1
Length (A+B+C+D+E+F) - M Y 1 or 2
Command details 12.6 M Y A
Device identities 12.7 M Y B
Alpha identifier 12.2 O N C
Tone 12.16 O N D
Duration 12.8 O N E
Icon identifier 12.31 O N F
Tal como se explica en la sección 6.6 de TS-11.14 (el TS-31.111 dice la
misma información pero los números de párrafos no coinciden)
Buscando en la sección 13.2 vemos que el 'Proactive SIM command Tag' es 0xD0
A su vez, el 'Command details' de la sección 12.6 nos dice que es otra
estructura de 5 bytes:
1 Command details tag
2 Length = '03'
3 Command number
4 Type of command
5 Command Qualifier
Segun la sección 13.3, 'Command details tag' vale 0x01
La longitud es 0x03 porque le siguen 3 bytes
El número de comandos es 0x01 porque es solo un comando, no varios
El tipo de comando es 0x20, que significa 'PLAY TONE'
El calificador de comando es 0x00 porque no se usa
Todo junto: 0103012000
A su vez, el 'Device identities' de la seccion 12.7 nos dice que es otra
estructura de 4 bytes:
1 Device identities tag
2 Length = '02'
3 Source device identity
4 Destination device identity
Segun la sección 13.3, 'Device identities tag' vale 0x02
La longitud es 0x02 porque le siguen 2 bytes
La identidad del dispositivo origen es 0x81, que significa 'SIM'
La identidad del dispositivo destino es 0x82, que significa 'ME' (móvil)
Todo junto: 02028182
La parte 'Alpha identifier' no es mandatoria (M) sino opcional (O) así
que no la incluimos. Lo mismo se aplica a 'Tone', 'Duration' y 'Icon id'
(A partir de ahora, usaré los caracteres '{' y '}' para agrupar
los elementos, pero el comando que hay que mandar al móvil no
permite esos caracteres, y hay que borrarlos)
Por tanto, el comando es
D0xx{0103{012000}}{0202{8182}}
Donde xx es el numero de bytes que le siguen, es decir, 5+4=0x09
Los 'tag' pueden tener el bit 7 activado o no, dependiendo de si
es el primero o el ultimo de la serie, y de quien es el emisor del comando.
Eso hace que algunos 'tags' puedan valer tanto 01 como 81, por ejemplo.
El hecho de que haya funcionado no quiere decir que todos los sub-comandos
hayan funcionado. Por ejemplo, a partir del mensaje anterior vamos a
hacer otro, incluyendo la duración, según la sección 12.8
1 Duration tag
2 Length = '02'
3 Time unit
4 Time interval
De acuerdo a la sección 13.3, 'Duration tag' vale 0x04
La longitud es 0x02 porque le siguen 2 bytes
La unidad de tiempo es 0x01, que significa segundos
El intervalo de tiempo es 08
Todo junto: 04020108
Ahora la longitud es 5+4+4=0x0D
Así que el comando es
D00D{0103{012000}}{0202{8182}}{0402{0108}}
Que no dura 8 segundos. En este caso el móvil ha hecho lo que ha
querido con el parámetro de duración del pitido.
Vamos a añadir un texto y un pitido diferente.
Para el texto, vamos a la sección 12.2 del 'Alpha identifier':
Alpha identifier tag (0x05)
Length (0x8, en mi caso)
Alpha identifier. Quiero mostrar el texto FCA00000 , que se
codifica 46 43 41 30 30 30 30 30 , simplemente usando los códigos
hexadecimales correspondiente a cada letra.
Así que todo junto es 05084643413030303030
Para el tono, sección 12.16
Tone tag (0x0E)
Length = '01'
Tone (0x06=Tono de error)
Así que todo junto es 0E0106
En total:
D01A{0103{012000}}{0202{8182}}{0508{4643413030303030}}{0E01{06}}{0402{0108}}
o sea:
D01A010301200002028182050846434130303030300E010604020108
Si todo ha ido bien, debería presentar en la pantalla el texto 'FCA00000'
mientras suena el pitido de error de red.
Todos queremos más
------------------
Vamos con algo diferente. Otro de los comandos es 'SET UP IDLE MODE TEXT'
explicado en la sección 6.4.22
Su estructura es
Proactive SIM command Tag 13.2 M Y 1
Length (A+B+C+D) - M Y 1 or 2
Command details 12.6 M Y A
Device identities 12.7 M Y B
Text string 12.15 M Y C
Icon identifier 12.31 O N D
El código de 'SET UP IDLE MODE TEXT' es 0x28
El único elemento nuevo es 'Text string' que consiste en:
Text string tag (0x8D)
Length (0x01 + 0x08 en mi caso)
Data coding scheme (segun TS 23.038 . 0x04 en mi caso: 8 bit)
Text string (FCA00000)
O sea: 0D09044643413030303030
Todo junto:
D014{0103{012800}}{0202{8182}}{8D09{044643413030303030}}
o sea:
D0140103012800020281828D09044643413030303030
Así que en la quinta línea aparece 'FCA00000'. No sé porqué se
llama 'IDLE MODE TEXT' ya que en mi caso aparece siempre, aunque
esté usando el teléfono. Además es el mismo sitio donde
aparecen los SMS de clase 0 : aquellos que se presentan
automáticamente en la pantalla.
Para el 'Data coding scheme' hemos usado 0x04 que significa un alfabeto
de 8 bits. Pero tambien podemos usar 16 bits. Es más, sabemos por
un artículo mio anteriormente publicado en SET que este
modelo de móvil tiene unas letras que en realidad son dibujos. Por ejemplo
la letra 'E101' es el dibujo de un pequeño telefono sonando.
Así que el mensaje
D00E{0103{012800}}{0202{8182}}{8D03{08E101}}
muestra ese dibujo.
He probado a usar el elemento 'Icon identifier', que parece que tiene que
ser uno de los que están definidos en EF_IMG. Pero yo no tengo ninguno
cargado, así que nunca muestra ningún icono.
Interactuando
-------------
Cambiando un poco de tema, vamos con otro comando: GET INKEY.
Como su nombre indica, manda un texto a la pantalla del móvil y espera que
se pulse un caracter. Se usa para establecer el diálogo entre el SIM y el
usuario, en particular para elegir una opción del menú.
Su estructura es
Proactive SIM command Tag 13.2 M Y 1
Length (A+B+C+D) - M Y 1 or 2
Command details 12.6 M Y A
Device identities 12.7 M Y B
Text string 12.15 M Y C
Icon identifier 12.31 O N D
El código de 'GET INKEY' es 0x22 y el resto
de los elementos ya los hemos visto. Simplemente nombrar que vamos
a mostrar el texto 'SI?' y esperamos una pulsación de tecla en el
móvil, seguido del boton "Aceptar" o "OK" o "Cancelar".
La codificación de 'SI?' es 0453493F así que el comando queda:
D00F{0103{012200}}{0202{8102}}{8D04{0453493F}}
o sea: D00F0103012200020281028D040453493F
La respuesta tiene formato:
^SSTK: 8103012200820282818301008D02043y
donde 'y' es la tecla pulsada.
Partiéndolo en trozos:
{8103{012200}}{8202{8281}}{8301{00}}{8D02{043y}}
Los datos son:
81 Significa que es una respuesta. La pregunta era {0103{012200}}...
asi que la respuesta pone el bit 7, resultando {0803{012200}}
El segundo comando también tiene respuesta satisfactoria. El elemento
era {0202{8102}} así que la respuesta es {8202{8281}} . Como es
comprensible, el dispositivo origen es el móvil (82) y el destino
es el SIM (81), justo lo contrario que en la pregunta.
El trozo {8301{00}} tiene el tag 83, es decir, 'Result tag' tal como
está definido en la seccion 12.12 . La longitud es 0x01 y el resultado
es 0x00, o sea, 'Comando ejecutado satisfactoriamente'.
Hay otras muchas respuestas. Por ejemplo, si hubiéramos pulsado
el boton de 'Cancelar' la respuesta sería
^SSTK: 810301220082028281830111
{8103{012200}}{8202{8281}}{8301{11}}
indicando su parte final que el resultado es 0x11, es decir: 'El usuario
ha pulsado la tecla de cancelar el proceso'
Para finalizar de analizar la respuesta, el último trozo {8D02{043y}}
tiene el tag de 'Text string tag' que ya hemos visto
antes: el 'Data coding scheme' es 0x04 (alfabeto de 8-bit) y el dato
es '3y', o sea, '0x31' para la tecla '1', y así sucesivamente.
Para los que todavía no estan cansados, vamos a ver otro comando: GET INPUT
que tiene identificador 0x23
D013{8103{012300}}{8202{8102}}{8D04{0453493F}}{1102{0506}}
D0138103012300820281028D040453493F11020506
Creo que es fácil de entender. Lo único nuevo es que necesitamos
un nuevo parámetro 'Response length' con tag=0x11. Asi especificamos
que la longitud mínima son 5 caracteres y la máxima 6.
La respuesta es del tipo
^SSTK: 8103012300820282818301008D0704303030303030
es decir: .....{8D07{04303030303030}}
porque mi respuesta ha sido '000000' , o sea: 0x30 0x30 0x30 0x30 0x30 0x30.
Debido a la limitacion de 140 caracteres por PDU, los textos más largos
que no quepan (incluyendo cabeceras) apareceran cortados. De todos modos
no creo que nade vaya a escribir 'El Quijote' en el móvil.
Vamos con algo mas emocionante: SET UP MENU en la sección 6.6.7
La estructura es:
Proactive SIM command Tag 13.2 M Y 1
Length (A+B+C+D1+...) - M Y 1 or 2
Command details 12.6 M Y A
Device identities 12.7 M Y B
Alpha identifier 12.2 M Y C
Item data object for item 1 12.9 M Y D1
Item data object for item 2 12.9 O N D2
...... 12.9 O N Dx
Item for last item in list 12.9 O N Dn
Items Next Action Indicator 12.24 O N E
Icon identifier 12.31 O N F
Item Icon identifier list 12.32 O N G
D030{0103{012500}}{0202{8182}}{0508{4643413030303030}}...
.{0F03{915349}}{0F03{924E4F}}{0F05{935155495A}}{0F06{944E4F205345}}{0F02{952E}}
Lo explico:
{0103{012500}} son los detalles del comando SET UP MENU.
{0202{8182}} es 'Device identities'
{0508{4643413030303030}} es 'Alpha identifier', que es el nombre del
menú tal como aparece en la pantalla del móvil. En este caso: 'FCA00000'
{0F03{915349}} es el primer sub-menú. Devuelve 91 y tiene el texto 'SI'
{0F03{924E4F}} es el segundo sub-menú. Devuelve 92 y tiene el texto 'NO'
{0F05{935155495A}} es el tercer sub-menú. Devuelve 93 y tiene el texto 'QUIZ'
{0F06{944E4F205345}} es el cuarto sub-menú. Devuelve 94 y tiene texto 'NO_SE'
{0F02{952E}} es el último sub-menú. Devuelve 95 y tiene texto '.'
O, lo que es lo mismo:
D03001030125000202818205084643413030303030...
....0F039153490F03924E4F0F05935155495A0F06944E4F2053450F02952E
Cuando se selecciona alguno de estos menús, el SIM recibe el comando
^SSTK: D30702020181900194
es decir: D307{0202{0181}}{9001{94}}
cuyo último elemento significa 'Item identifier tag' con
valor 95, o sea, que se ha seleccionado el sub-menú 'NO_SE'.
Con los comandos 'GET INKEY' y 'GET INPUT' el SIM se queda esperando
la respuesta que el usuario introduce en el móvil, por lo que son
comandos síncronos.
Por el contrario, la selección de un menú es asíncrono. Es el móvil
quien manda la respuesta al SIM aunque no haya pregunta. Esto convierte el
móvil en un control remoto.
Por ejemplo, puedo poner un ordenador con puerto de infrarrojos en la
entrada de mi garaje. Gracias a que el móvil tiene también un puerto
de infrarrojos, hago un programa que constantemente escucha el puerto serie
asociado al canal de infrarrojos (el programa IrCOMM2k y Linux-IrDA me
facilitan esta tarea). Cuando quiero entrar en casa, saco el
móvil, selecciono el submenú de abrir-garaje, apunto al dispositivo
de infrarrojos, y el programa detecta
^SSTK: D30702020181900194
Simplemente tengo que hacer que identifique {9001{94}} y active el relé de
abrir la puerta.
Seguro que hay maneras mas fáciles de hacerlo, pero ésta me da seguridad
y además yo siempre llevo el móvil en el bolsillo.
También se podría unir con los módulos de autentificación PAM para acceso
al ordenador. ?Qué te parecería hacer un login desde el móvil?
Acceso remoto
-------------
Un paso más allá es lo que hacen los operadores de red para modificar
la información en el SIM. Hay algunos datos que se pueden parametrizar
remotamente. Por ejemplo:
-telefonos denegados. El operador puede hacer que un SIM no sea capaz
de llamar a ciertos números de teléfono. Pero quiero hacer notar que
no es decisión unilateral del operador: el usuario puede pedirle al operador
que deshabilite algunos números, por ejemplo las llamadas internacionales,
o los 906xxxxxx, o los de otra red.
-los servidores asociados a una conexión GPRS
-Modificar el listín telefónico en el SIM
-cambiar el MSISDN, por ejemplo cuando el usuario quiere cambiar de número
de teléfono pero mantener el SIM. Esto ya lo comenté en SET-28.
Para que esto sea posible, el operador manda un mensaje SMS al móvil con
unos parámetros especiales, que hacen que se pase limpiamente al SIM, quien
lo procesará adecuadamente. Esto está explicado en la seccion 7: 'Data
download to SIM'.
Básicamente hay 2 métodos: SMS-PP o Cell Broadcast. En el primero, la red
manda el comando a un móvil específico. En el segundo, se manda la
información a todos los móviles que se encuentran en una celda particular.
Esto podría servir para mandar un mensaje a todos los espectadores
de un partido de fútbol, o a todos los que se encuentren en un aeropuerto.
Pero yo jamás he sabido de ningún operador de red que haya hecho esto.
El primer método SMS-PointToPoint Download consiste en un
mensaje que tiene identificador de protocolo='SIM data download' y
el 'Data Coding scheme' es clase-2.
La estructura es:
SMS-PP download tag 13.1 M Y 1
Length (A+B+C) - M Y 1 or 2
Device identities 12.7 M Y A
Address 12.1 O N B
SMS TPDU (SMS-DELIVER) 12.13 M Y C
Segun la sección 13.1 , 'SMS-PP download tag' vale 0xD1
El 'Device identities' ya lo conocemos. Pero en este caso el origen
debe ser la red (0x83), y el destino el SIM (0x81). Lo cual no quiere
decir necesariamente que venga desde la red :-)
El campo 'Address' no es necesario, aunque mi pruebas indican que
debe ser el centro SMSC del proveedor, tal como se define en TS 24.011 y
que se almacena en el archivo EF_SMSP, posición 6F42.
Para ver la codificación del TPDU, leer SET-28.
Vamos con otro comando: intentar saber el nivel de la batería.
Para ello contamos con el comando
AT+CBC
Así que hay que mandar el comando 'RUN AT COMMAND' con código 0x34
que necesita el elemento 'AT command' de tag 0xA8.
D011{0103{013400}}{0202{8182}}{A806{41542B434243}}
D011010301340002028182A80641542B434243
Pero la respuesta es
^SSTK: 810301340082028281830131
{8103{013400}}{8202{8281}}{8301{31}}
El dato final con el 'result tag'=0x83 dice que
el resultado es 0x31 , lo cual , segun la sección 6.11 significa
que el tipo de comando no es entendido por el ME. En otras palabras, que
el móvil no puede ejecutar ese comando.
Esto no debería soprendernos, pues ya sabíamos desde el principio
que la clase 'b' no está soportada en este móvil, y precisamente el
comando 'RUN AT COMMAND' es de clase 'b'.
Así que vamos a tener que buscar otro método para saber la carga
de batería. Por supuesto que el dato no se encuentra en el SIM, y si
el telefono no tiene un comando para obtener el nivel de carga, no
hay nada que hacer.
Llegados a este punto tengo que decir que este comando no lo tengo yo
muy claro. En teoría debería devolver 0x30 , que significa 'Comando más
allá de las capacidades del móvil, así que es posible que no esté
escribiendo correctamente el comando y por eso se queja.
A lo mejor necesito empaquetarlo como 7-bits, o no usar la parte 'AT+' .
Lo que tengo seguro es que el perfil del móvil dice que no soporta
este comando, por lo que no voy a gastar más tiempo.
Eventos
-------
Gracias al comando 'TIMER MANAGEMENT' se puede hacer que
periódicamente el SIM sea llamado por el móvil cada cierto tiempo.
La estructura es:
Proactive SIM command Tag 13.2 M Y 1
Length (A+B+C+D) - M Y 1 or 2
Command details 12.6 M Y A
Device Identities 12.7 M Y B
Timer Identifier 12.37 M Y C
Timer value 12.38 M/O N D
'Timer Expiration tag' vale 0x27
El calificador es 0x00 para establecerlo, 0x01 para desactivarlo,
0x02 para saber el estado, y el resto están reservados para uso futuro.
'Timer identifier' contiene los datos:
Timer identifier tag (0x24)
Length='01'
Timer identifier (0x01)
'Timer value' contiene los datos:
Timer value tag (0x25)
Length='03'
Timer value (3 bytes) : hora, minuto, segundo : 0x005000. Tener
en cuenta que hay que cambiar los bytes de 2 en 2. Por
ejemplo, 0x50 significa 5 minutos, no 80 minutos (0x50=80)
D011{0103{012700}}{0202{8182}}{2401{01}}{2503{005000}}
es decir, D0110103012700020281822401012503005000
Esto hace que cada 5 minutos, el SIM es llamado por el ME.
Para saber cuanto falta para que se active el timer 1, solo hay que hacer
D00C{0103{012702}}{0202{8182}}{2401{01}}
D00C010301270202028182240101
Y la respuesta es:
^SSTK: 810301270282028281830100A40101A503000021
{8103{012702}}{8202{8281}}{8301{00}}{A401{01}}{A503{000021}}
Lo cual quiere decir (0xA5) que el timer se activará
en 0 horas, 0 minutos, y 0x12 segundos.
Cuando el timer llega a 0, el SIM recibe un comando de expiración de timer.
Entonces podemos usar el comando
PROVIDE LOCAL INFORMATION y buscar el dato 'current time' para saber
la hora del teléfono. Esta no es la hora de la red. De hecho, he estado
buscando algún método para sincronizar el teléfono con la hora real de
la red, pero lo más aproximado ha sido mandarme un SMS, porque el
servidor de SMS marca también su propia hora, y confío en que sea correcta.
No solo es necesario establecer el timer; también debemos
subscribirnos al evento con SET UP EVENT LIST.
Entonces recibiremos un EVENT DOWNLOAD (0x05) , uno de cuyos elementos
es 'Event list':
Event list tag 0x19
Length (X) of bytes following Y
Event list X
y la lista de eventos es:
'00' = Llamada MT
'01' = Llamada activa
'02' = Llamada desconectada
'03' = Información de localización
'04' = Acción del usuario
'05' = Salvapantallas activado
'06' = Información del lector de tarjetas (clase "a")
'07' = Selección de lenguaje
'08' = Finalización del navegador (clase "c")
'09' = Datos disponibles (clase "e")
'0A' = Información del canal (clase "e")
El dibujo completo
------------------
Cual es el uso básico de un teléfono? Hablar.
Una de las funcionalidades es que el SIM puede pedir al teléfono que inicie
una llamada, bien de datos, bien de voz. Para ello se usa el
comando SET UP CALL, que tiene código 10. El elemento principal
es 'Address' y contiene el número de teléfono al que queremos llamar, en
formato como EF_ADN, es decir, que los dígitos van cambiados
de dos en dos y un '0' si son impares.
Por ejemplo, para llamar al +34 901 23 45 67 el comando es
D013{0103{011000}}{0202{8182}}{8608{00430921436507}}
El único inconveniente es que el teléfono me pide confirmación para
establecer la llamada. Esto es una buena medida de seguridad contra
applets de procedencia dudosa, pero en mi caso he sido yo mismo
quien lo he programado, así que me gustaría que no me
preguntara cada vez. Para colmo, no me dice
el número de teléfono al que va a llamar. Simplemente pregunta
'Execute?'
lo cual no es muy informativo.
A cambio, tiene una cosa buena, y es que cuando la llamada acaba
o no se puede establecer, tenemos el resultado.
Programando
-----------
Como ejemplo práctico (real: yo lo uso) , si hago una llamada y el otro
teléfono está ocupado, da la señal de 'comunicando' así que mi SIM me
pregunta si quiero intentarlo 5 minutos mas tarde. Pongo un timer, y
cuando expira, mi móvil pita (PLAY TONE) e intenta la llamada de nuevo.
Pero no solo eso: también se puede interceptar una llamada entrante
con el comando SET UP EVENT LIST y el mensaje CONNECT .
Si me llaman cuando estoy durmiendo, el SIM mira si la persona que me
llama está en mi listín (archivos EF_ADN y EF_FDN) y si no está, la
lamada ni siquiera suena en mi teléfono y no me molestan.
Otra aplicación que he desarrollado es que cuando intento hacer una
llamada, mira la hora que es y la red del destinatario. Si está en
una tarifa que no es barata, me lo advierte en la pantalla.
Dado que tengo una tarjeta de pre-pago, me interesa saber el saldo
actualizado. Para ello solo hay que mandar un SMS gratuito a mi
operador. Después el SIM intercepta e interpreta el mensaje recibido y
almacena el saldo en un fichero del SIM. Así siempre lo tengo disponible.
Tras finalizar una llamada, o al final del día, envía el SMS. Si el
saldo es alarmantemente bajo, mi móvil me informa.
Todo esto se puede hacer porque es posible programar el SIM para
que haga lo que nosotros queremos.
El SIM tiene un microprocesador que es diferente para cada tipo
de tarjeta, por lo que es necesario conocer el lenguaje ensamblador
particular.
Sin embargo, en un intento por unificar criterios, ha surgido la iniciativa
de adoptar Java como el lenguaje universal. Para ello es necesario una
tarjeta que incluya una (version limitada de) máquina virtual Java. El código
se compila, y se mete en la tarjeta, por ejemplo remotamente con un SMS-PP.
Estas funciones de alto nivel solo estan disponibles en las
tarjetas denominadas JavaCard.
Cada programa extiende la clase javacard.framework.Applet y debe importar
las librerías sim.toolkit.*
Todo esto está documentado en TS-43.019 y en TS 11.13 se describen todas
las funciones del API que estan disponibles.
Además hay bastantes ejemplos en la red.
Basicamente, si queremos que el usuario sea capaz de iniciar el programa,
definimos un menú con ToolkitRegistry.getEntry().initMenuEntry()
Si queremos procesar una respuesta de la red, hay que subscribirse con
ToolkitRegistry.getEntry().setEvent(EVENT_UNFORMATTED_SMS_PP_ENV);
A partir de entonces, cualquier comando llama a
public void process(APDU apdu)
del cual obtenemos información con apdu.getBuffer()
Cuando el menú se selecciona, se llama a la función pública processToolkit
con el parámetro EVENT_MENU_SELECTION, y sabemos cual sub-menú se ha
pulsado con ProactiveResponseHandler.getTheHandler().getItemIdentifier
Si lo que sucede es un mensaje de la red, el
parametro es EVENT_UNFORMATTED_SMS_PP_ENV, y la información la obtenemos de
EnvelopeHandler.getTheHandler().getTPUDLOffset()
A partir de entonces podemos hacer cualquier cosa:
-Actualizar un fichero con
SIMSystem.getTheSIMView().select y SIMSystem.getTheSIMView().updateBinary
-Mostrar información en el móvil con
ProactiveHandler.getTheHandler().initDisplayText
o con
ProactiveHandler.getTheHandler() , comando PRO_CMD_DISPLAY_TEXT
y luego appendTLV y send
-Solicitar datos al usuario con
ProactiveHandler.getTheHandler().initGetInput
-Enviar nuevos SMS a la red, o a un servidor web con
ProactiveHandler , comando PRO_CMD_SEND_SHORT_MESSAGE
-Leer un SMSrecibido con
EnvelopeHandler.getTheHandler().getValueByte
-Ver las características del teléfono con
MEProfile.check
-y en general, todos los comandos que hemos ido viendo anteriormente
Lo que es más complicado es meter el applet en el SIM. Primero hay que
compilar el programa Java, luego empaquetarlo en CAP, firmarlo
segun TA-03.48, encapsularlo con los certificados
en un SMS para enviarlo por el aire (OTAP) o en un dispositivo capaz
de escribir SIM, y finalmente instalarlo y activarlo.
Todos estos y más, son temas para tu propia investigación o un
futuro artículo.
Fin de fiesta
-------------
Otros temas en los que me gustaría profundizar son el comando LAUNCH BROWSER
y OPEN CHANNEL, pero estos son comandos de clase 'e' y mi teléfono
no los admite. El SIM puede interactuar con páginas web mediante
mensajes SMS pero sería mejor poder usar el GPRS que sale mucho mas barato.
Si has aguantado leer hasta aquí, habrás entendido que es posible
interactuar remotamente con la tarjeta a traves de SMS. Y la tarjeta
tiene control casi total con el teléfono. Se pueden definir nuevos servicios,
extender funcionalidad, y sobrepasar los puntos débiles. Todo esto en tu
propio beneficio.
*EOF*