-[ 0x02 ]--------------------------------------------------------------------
-[ SIM application Toolkit ]-------------------------------------------------
-[ by FCA00000 ]-----------------------------------------------------SET-30--


En un artculo publicado en SET28 cont algunas cosas sobre el acceso a
la tarjeta  SIM de un mvil, 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 mvil, un ordenador, un cable para
conectarlos, un programa de conexin, y la documentacin 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 mvil que pueda acceder al SIM Toolkit. por
ejemplo el Siemens-S45.

Primero, una explicacin breve. Si queris ms detalles solo hay que buscar
en la Internet.
Para la telefona mvil, hay tres elementos fundamentales:
-red
-ME = Mobile Equipment, o sea, el telfono mvil o dispositivo similar
-SIM = Subscriber Identification Module , o sea, la tarjeta SIM

Toda comunicacin desde la red pasa por el mvil, que se encarga de traducir
las seales 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 conversacin.
Esta breve explicacin se puede desglosar en muchas 
etapas pero lo que me interesa aclarar es que el mvil es un
interface, y la red puede comunicar con el SIM pasando a traves del mvil.
Por otro lado, el mvil sirve de GUI para el usuario. Cualquier informacin
que la red quiere enviar al usuario se presenta en la pantalla del telfono, y
viceversa; el usuario puede elegir, por ejemplo, un numero de telfono para
marcar, que va al SIM, quien entonces se lo dice a la parte del mvil que
conecta con la red. Es importante tener clara la distincin entre el GUI del
mvil y la circuiteria de conexin por radio.

Tal como se dice en la documentacin 11.14 , el SIM Application Toolkit (SAT)
es un grupo de rdenes y procedimientos para usar durante la etapa de
operacin 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 prctica todos los SIMs fabricados en los ltimos 6 aos, y todos
los mviles de los ltimos 5 aos permiten SAT.

?Qu cosas se pueden hacer con el SIM?
--------------------------------------
El ejemplo tpico es que el operador de red define un nuevo men en
el mvil, que cuando el usuario lo selecciona, permite buscar
restaurantes en la zona, segn el tipo elegido por el usuario.

La comunicacin entre la red y el SIM se realiza mediante mensajes SMS, as
que no os vayis a pensar que es un servicio gratuito.
A algunos les gusta ver el SAT como un antecesor de WAP, pues permite la
interaccin entre un cliente (el mvil) 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 telefona, y el protocolo no es TCP/IP sino puros SMS.

Pero SAT es mucho ms que eso, ya que no siquiera es necesaria la
conexin a la red para realizar las tareas.
Por ejemplo, se puede hacer un programa para que el usuario
marque solo algunos nmeros, y el SIM rellene los que faltan, en funcin
de la situacin fsica del mvil, la hora del da, o el saldo disponible.
Un tercer uso es el de banca mediante el mvil, pero sinceramente no he visto
ninguna experiencia real: solo modelos piloto.

Por supuesto que es necesario que el SIM contenga una aplicacin con alguna
lgica 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 ms que el programa encapsulado en un SMS y que va directamente al SIM.
Otra opcin es que alguien con un grabador de tarjetas SIM meta el
programa. Esta posibilidad no es tan rara: al fin y al cabo, cualquier mvil
puede escribir en el SIM, suponiendo que se tienen los privilegios y
conocimientos necesarios (que espero aprendis con este artculo :-)
Y la ltima opcin 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
-Interaccin con SIM
-Carga de datos al SIM
-Seleccin 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 'Interaccin con SIM' permite, ente otros, mostrar
un texto en la pantalla del mvil.

Iniciando la marcha
-------------------
Para abrir boca, vamos a ver si el mvil soporta SAT. En el programa
de emulacin 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 mvil responde
^SSTK: 7FFFFFFF7F0300DF5F

Si devuelve ERROR, es porque tu mvil 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 tambin 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, tambin conocida
como 'Siemens service code generator' o 'Developer menu activator'
que permite ver algunos valores internos del telfono. Uno de los
mens se llama 'SAT Commands' y permite ver la lista de los
comandos que le hemos ido mandando, adems 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 mvil.
Este comando es uno de los primeros que el mvil 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 mvil 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 seccin 5.2 del TS 11.14
-todo lo relativo a 'Interaccin con SIM'
-todo lo relativo a 'Informacin de eventos' excepto el estado del lector
-nada de lo relativo a 'Extensiones de informacin de eventos' excepto
  terminacin del navegador, que est habilitado
-nada de clase 'a'
-todo lo relativo a 'Interaccin con SIM' excepto clase 'b'. Mala suerte.
-mas cosas relativas a 'Interaccin con SIM' excepto notificacin de lenguaje.
-nada de clase 'e'
-no hay informacin sobre el tamao de la pantalla

En resumen: permite la mayora de los comandos de interaccin con
el SIM, carga de datos, mens, y eventos. Y claro que no permite
tarjetas mltiples, porque no tengo otro lector de tarjetas extra
en el mvil.

?de donde he sacado esta informacin? 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 mvil ha debido emitir un pitido corto.
y despus responde
^SSTK: 810301200082028281830100

Explicacin: AT^SSTK es el comando para interactuar con el SAT.
El primer parmetro (22) es la longitud de comando. Mi telfono no lo
usa, as que da igual lo que se escriba.
El segundo parmetro (0) es el modo. Puede ser 0=Un nico comando, o 1=varios
comandos juntos.
A continuacin hay que escribir el PDU, o sea, los datos. Luego hay que
finalizarlo con ctrl-z.

Vamos ahora con la explicacin de los datos.

Cada comando para el SIM se compone de una estructura similar a:
Tipo                      Seccion  Obligatoriedad Minimo  Tamao
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 seccin 6.6 de TS-11.14 (el TS-31.111 dice la
misma informacin pero los nmeros de prrafos no coinciden)

Buscando en la seccin 13.2 vemos que el 'Proactive SIM command Tag' es 0xD0

A su vez, el 'Command details' de la seccin 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 seccin 13.3, 'Command details tag' vale 0x01
La longitud es 0x03 porque le siguen 3 bytes
El nmero 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 seccin 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' (mvil)
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 mvil 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 duracin, segn la seccin 12.8
1 Duration tag
2 Length = '02'
3 Time unit
4 Time interval

De acuerdo a la seccin 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 mvil ha hecho lo que ha
querido con el parmetro de duracin del pitido.

Vamos a aadir un texto y un pitido diferente.
Para el texto, vamos a la seccin 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 cdigos
hexadecimales correspondiente a cada letra.
As que todo junto es 05084643413030303030

Para el tono, seccin 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, debera presentar en la pantalla el texto 'FCA00000'
mientras suena el pitido de error de red.


Todos queremos ms
------------------
Vamos con algo diferente. Otro de los comandos es 'SET UP IDLE MODE TEXT'
explicado en la seccin 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 cdigo 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 lnea aparece 'FCA00000'. No s porqu se
llama 'IDLE MODE TEXT' ya que en mi caso aparece siempre, aunque
est usando el telfono. Adems es el mismo sitio donde
aparecen los SMS de clase 0 : aquellos que se presentan
automticamente 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 ms, sabemos por
un artculo mio anteriormente publicado en SET que este
modelo de mvil tiene unas letras que en realidad son dibujos. Por ejemplo
la letra 'E101' es el dibujo de un pequeo 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 estn definidos en EF_IMG. Pero yo no tengo ninguno
cargado, as que nunca muestra ningn icono.

Interactuando
-------------
Cambiando un poco de tema, vamos con otro comando: GET INKEY.
Como su nombre indica, manda un texto a la pantalla del mvil y espera que
se pulse un caracter. Se usa para establecer el dilogo entre el SIM y el
usuario, en particular para elegir una opcin 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 cdigo 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 pulsacin de tecla en el
mvil, seguido del boton "Aceptar" o "OK" o "Cancelar".

La codificacin 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.
Partindolo 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 tambin tiene respuesta satisfactoria. El elemento
era {0202{8102}} as que la respuesta es {8202{8281}} . Como es
comprensible, el dispositivo origen es el mvil (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 hubiramos pulsado
el boton de 'Cancelar' la respuesta sera 
^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 todava 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 fcil de entender. Lo nico nuevo es que necesitamos
un nuevo parmetro 'Response length' con tag=0x11. Asi especificamos
que la longitud mnima son 5 caracteres y la mxima 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 ms largos
que no quepan (incluyendo cabeceras) apareceran cortados. De todos modos
no creo que nade vaya a escribir 'El Quijote' en el mvil.


Vamos con algo mas emocionante: SET UP MENU en la seccin 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 mvil. 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 mens, 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 mvil, por lo que son
comandos sncronos.
Por el contrario, la seleccin de un men es asncrono. Es el mvil
quien manda la respuesta al SIM aunque no haya pregunta. Esto convierte el
mvil en un control remoto.
Por ejemplo, puedo poner un ordenador con puerto de infrarrojos en la
entrada de mi garaje. Gracias a que el mvil tiene tambin 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
mvil, 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 fciles de hacerlo, pero sta me da seguridad
y adems yo siempre llevo el mvil en el bolsillo.

Tambin se podra unir con los mdulos de autentificacin PAM para acceso
al ordenador. ?Qu te parecera hacer un login desde el mvil?

Acceso remoto
-------------
Un paso ms all es lo que hacen los operadores de red para modificar
la informacin 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 nmeros de telfono. Pero quiero hacer notar que
 no es decisin unilateral del operador: el usuario puede pedirle al operador
 que deshabilite algunos nmeros, por ejemplo las llamadas internacionales,
 o los 906xxxxxx, o los de otra red.
-los servidores asociados a una conexin GPRS
-Modificar el listn telefnico en el SIM
-cambiar el MSISDN, por ejemplo cuando el usuario quiere cambiar de nmero
 de telfono pero mantener el SIM. Esto ya lo coment en SET-28.

Para que esto sea posible, el operador manda un mensaje SMS al mvil con
unos parmetros especiales, que hacen que se pase limpiamente al SIM, quien
lo procesar adecuadamente. Esto est explicado en la seccion 7: 'Data
download to SIM'.
Bsicamente hay 2 mtodos: SMS-PP o Cell Broadcast. En el primero, la red
manda el comando a un mvil especfico. En el segundo, se manda la
informacin a todos los mviles que se encuentran en una celda particular.
Esto podra servir para mandar un mensaje a todos los espectadores
de un partido de ftbol, o a todos los que se encuentren en un aeropuerto.
Pero yo jams he sabido de ningn operador de red que haya hecho esto.

El primer mtodo 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 seccin 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, posicin 6F42.

Para ver la codificacin del TPDU, leer SET-28.


Vamos con otro comando: intentar saber el nivel de la batera.
Para ello contamos con el comando
AT+CBC
As que hay que mandar el comando 'RUN AT COMMAND' con cdigo 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 seccin 6.11 significa
que el tipo de comando no es entendido por el ME. En otras palabras, que
el mvil no puede ejecutar ese comando.
Esto no debera soprendernos, pues ya sabamos desde el principio
que la  clase 'b' no est soportada en este mvil, y precisamente el
comando 'RUN AT COMMAND' es de clase 'b'.
As que vamos a tener que buscar otro mtodo para saber la carga
de batera. 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 teora debera devolver 0x30 , que significa 'Comando ms
all de las capacidades del mvil, 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 mvil dice que no soporta
este comando, por lo que no voy a gastar ms tiempo.


Eventos
-------
Gracias al comando 'TIMER MANAGEMENT' se puede hacer que
peridicamente el SIM sea llamado por el mvil 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 estn 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 expiracin de timer.
Entonces podemos usar el comando
PROVIDE LOCAL INFORMATION y buscar el dato 'current time' para saber
la hora del telfono. Esta no es la hora de la red. De hecho, he estado
buscando algn mtodo para sincronizar el telfono con la hora real de
la red, pero lo ms aproximado ha sido mandarme un SMS, porque el
servidor de SMS marca tambin su propia hora, y confo en que sea correcta.


No solo es necesario establecer el timer; tambin 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' = Informacin de localizacin
'04' = Accin del usuario
'05' = Salvapantallas activado
'06' = Informacin del lector de tarjetas (clase "a")
'07' = Seleccin de lenguaje
'08' = Finalizacin del navegador (clase "c")
'09' = Datos disponibles (clase "e")
'0A' = Informacin del canal (clase "e")


El dibujo completo
------------------
Cual es el uso bsico de un telfono? Hablar.
Una de las funcionalidades es que el SIM puede pedir al telfono que inicie
una llamada, bien de datos, bien de voz. Para ello se usa el
comando SET UP CALL, que tiene cdigo 10. El elemento principal
es 'Address' y contiene el nmero de telfono al que queremos llamar, en
formato como EF_ADN, es decir, que los dgitos 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 telfono me pide confirmacin 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 gustara que no me
preguntara cada vez. Para colmo, no me dice
el nmero de telfono 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 prctico (real: yo lo uso) , si hago una llamada y el otro
telfono est ocupado, da la seal de 'comunicando' as que mi SIM me
pregunta si quiero intentarlo 5 minutos mas tarde. Pongo un timer, y
cuando expira, mi mvil pita (PLAY TONE) e intenta la llamada de nuevo.
Pero no solo eso: tambin 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 listn (archivos EF_ADN y EF_FDN) y si no est, la
lamada ni siquiera suena en mi telfono y no me molestan.
Otra aplicacin 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. Despus 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 da, enva el SMS. Si el
saldo es alarmantemente bajo, mi mvil 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) mquina virtual Java. El cdigo
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 libreras 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.
Adems 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 informacin con  apdu.getBuffer()

Cuando el men se selecciona, se llama a la funcin pblica processToolkit
con el parmetro 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 informacin 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 informacin en el mvil 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 caractersticas del telfono con
   MEProfile.check
-y en general, todos los comandos que hemos ido viendo anteriormente


Lo que es ms 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 ms, son temas para tu propia investigacin o un
futuro artculo.


Fin de fiesta
-------------
Otros temas en los que me gustara profundizar son el comando LAUNCH BROWSER
y OPEN CHANNEL, pero estos son comandos de clase 'e' y mi telfono
no los admite. El SIM puede interactuar con pginas web mediante
mensajes SMS pero sera mejor poder usar el GPRS que sale mucho mas barato.

Si has aguantado leer hasta aqu, habrs entendido que es posible
interactuar remotamente con la tarjeta a traves de SMS. Y la tarjeta
tiene control casi total con el telfono. Se pueden definir nuevos servicios,
extender funcionalidad, y sobrepasar los puntos dbiles. Todo esto en tu
propio beneficio.


*EOF*