El Vienes el forero Pua me pasó un documento bastante interesante sobre envío y recepción de SMS en formato PDU el cual incluye ejemplos. He decidido publicarlo, pues seguro que a más de uno, incluido yo, puede necesitar darle un vistazo en alguna ocasión.

SMS en fprmato PDU

Aquí tenéis el manual:
 
 
SMS EN FORMATO PDU

1. Introducción

Hay 2 formas de tratar los mensajes SMS:
-modo texto
-modo PDU (Protocol Description Unit)

El modo PDU trata el SMS como una cadena de caracteres en octetos hexadecimales o semioctetos decimales, de cuya codificación resulta el SMS en modo texto. La ventaja de modo PDU respecto al modo texto es que en modo texto la aplicación queda limitada a la opción de codificación que se haya preestablecido, en modo PDU se puede implementar cualquier codificación.

La cadena PDU no solo contiene el mensaje, sino que lleva información del centro de servicio SMS (AT+CSCA?), hora de llegada, tipo de mensaje, información sobre el que envía el SMS, vigencia del SMS, nº de caracteres del SMS, tipo de llamada (nacional ó internacional), tipo de alfabeto usado…


2. Estructura de los SMS en formato PDU
 

2.1. SMS Enviados
 

DCS TIPO
PDU
DD PID NR COD PV LD DATOS

DCS: Dirección Centro de Servicio

 
LNº TLL Nº C S

LNº:   longitud nº centro servicio. Nº de octetos (pares de caracteres hexadecimales o decimales) que forman el nº del centro de servicio más 1 octeto que indica tipo de llamada nacional o internacional.
Si en este campo ponemos 00 se toma automáticamente el valor del nº del centro de servicio (dado por at+csca)

TLL: tipo de llamada:
-nacional: 81
-internacional: 91

Nº C S: nº centro de servicio. (se pondrá el número del centro de servicio que utilizamos invirtiendo el orden por pares, por ejemplo: 674562345 se pondría 7654325F4, la F se pone cuando la longitud del número es impar).
Ejemplo:0791437654325F4 (llamada con prefijo internacional al nº +34674562345)

TIPO PDU: Tipo Protocolo de la Unidad de Datos

 
PC CD PRE PV RD TIPO

PC: Path contestación (0 No, 1 Sí)

CD: Cabecera datos (0 Sin, 1 Con)

PRE: Petición reporte de estado (0 No, 1 Sí)

PV: campo Periodo Vigencia presente (0 0 No, 01 Reservado, Sí como entero, Sí como semiocteto)

RD: permite que el centro de SMS acepte un SMS-SUBMIT para un mensaje que todavía está en el centro. (0 Sí, 1 No)

TIPO: 0 1 Mensaje de envío

DD:    Dirección destino.  Se rellenará igual que el campo Dirección centro de servicio, poniendo el nº de teléfono del destinatario del SMS. En el campo longitud nº se contarán por semioctetos sin contar la F en caso de que haya habido que ponerla.
Ejemplo: nº 34676543524(11=0B semioctetos) en el campo DD será 0B914376563425F4)

PID: Protocolo Identificación
Lo pondremos a 00

NR:
Número de referencia

COD: Codificación trama de datos

  Indica el alfabeto con el que se codifica la trama (alfabeto por defecto= codificación a 7 bits o codificación a 8 bits) e indica tipo de SMS.     

0000 0 0 00 Alfabeto a 7 bits
1111 0      
    0   7 bits
    1   8 bits
      00 mensaje clase 0 (se muestra en el display inmediatamente)
      01 mensaje clase 1 ME
      10 mensaje clase 2 SIM
      11 ensaje clase 3 TE


PV:
Periodo de Vigencia del sms

  Valor de PV:
     

0 a 143 (PV+1)*5 minutos
144 a 167 12horas+(PV-143)*30 minutos
168 a 196 (PV-1) *1 día
197 a 255 (PV-192)*1 semana
   
Ejemplo AA: (AA=170-> 170-166=4 * 1 día=4 días )

LD: Longitud de la cadena de datos

  Ejemplo: si el mensaje está formado por la siguiente cadena C8 27 33 08
El campo LD se rellenará con 04 (ya que hay 4 octetos= 2 caracteres hexadecimal)

DATOS:  Para explicar la codificación A 7 BITS usaremos un ejemplo. Codificación de la palabra HOLA:

 
  H O L A
Hex 48 4F 4C 41
Bin 1001000 1001111 1001100 1000001

Para transformarlo a octetos se toma el número de caracteres de la siguiente letra que nos falten para llegar a 8, cuando se hayan tomado caracteres de una letra para la anterior, esta se queda sin esos caracteres y los debe tomar de la siguiente letra

1 1001000 00 100111 1 001 10011 00 1000 001
C8 27 33 08



 
>> Ejemplo Envío SMS en formato PDU

Envío de un SMS con la palabra ALARMA

  A L A R M A
Hex 41 4C 41 52 4D 41
Bin 1000001 100110 0 10000 01 1010 010 100 1101 10 00001
  0 1000001 01 100110 0 010 10000 01 1101 1010 010 00001 100 1101  10
00001
  41 66 50 DA 0C 02

Enviamos los comandos AT …

AT+CPIN=nºpin
AT+CMGF=0 //modo PDU
AT+CMGS=19 //nº octetos que forman el SMS sin contar el campo dirección centro servicio. ( en el ejemplo cuenta hasta el 11 azul )
> 07914356060013F11100098126064321F50000A706416650DA0C02   CTRL+Z

donde …

  07 = nº octetos que forman el campo dirección centro servicio
91 = nº con prefijo internacional
4356060013F1 = nº centro servicio 34656000131
11 = tipo PDU (SMS para enviar. Formato Periodo Vigencia Relativo(1 octeto))
00 = número de referencia
09 = número de semioctetos (caracteres) del teléfono de envío
81 = nº sin prefijo internacional
26064321F5 = nº teléfono de envío 62064321F5
00 = protocolo identificación
00 = codificación trama de datos a 7 bits. Alfabeto por defecto
A7 = periodo de vigencia del SMS
06 = nº de octetos que forman los datos del mensaje
416650DA0C02 = datos “ALARMA” codificado a 7 bits


 
2.2 SMS Recibidos

DCS TIPO
PDU
DO PID NR COD TR LD DATOS


DCS
: Dirección Centro de Servicio. Será el nº centro de servicio de envio al que pertenezca el teléfono

TIPO PDU:
Tipo Protocolo de la Unidad de Datos

 
PC CD RE sin uso RD TIPO

PC: Path contestación (0 No, 1 Sí)

CD: Cabecera datos (0 Sin, 1 Con)

RE: Petición reporte de estado (0 No, 1 Sí). Este campo lo rellena el centro de servicio.

RD: permite que el centro de SMS acepte un SMS-SUBMIT para un mensaje que todavía está en el centro. (0 Sí, 1 No)

TIPO: 0 0 Tipo SMS recibido

DO: Dirección Origen.  Este campo contiene el nº del que envía el SMS

PID:
Protocolo Identificación

COD: Codificación trama de datos. Indica qué tipo de codificación tienen los datos

TR: Tiempo Recepción.  Indica cuando se ha recibido el SMS. Invierte el orden por pares de caracteres.

 
Año Mes Día Hora Minutos Segundos Zona Horaria

Ejemplo.  Supongamos la fecha/hora:    14/03/02 a las 20:17:52
La codificación sería 20 30 41 02 71 25 00

LD: Longitud Datos

DATOS: Datos codificados (con el alfabeto indicado en el campo codificación de datos)
 
 

>> Ejemplo recepción de SMS

Recibimos el SMS con el texto “ALARMA” el: 28/05/02 a las 15:24:59 zona 00
+CMGL: 12,1,,25
07914356060018F2040B914356554985F200002050825142950006416650DA0C02

donde …

  07 = nº octetos que forman el campo dirección centro servicio
91 = nº con prefijo internacional
4356060018F2 = nº centro servicio 34656000812
04 = tipo PDU (SMS recibido)
0B = número de semioctetos (caracteres) del teléfono de envío
91 = nº sin prefijo internacional
4356554985F2 = nº teléfono de envío +34655594582
00 = protocolo identificación
00 = codificación trama de datos a 7 bits. Alfabeto por defecto
20508251429500 Cuando llegó el SMS: 28/05/02, 15:24:59+00
06 = nº de octetos que forman los datos del mensaje
416650DA0C02 = datos “ALARMA” codificado a 7 bits

El manual disponía de algunos ejemplos más, que incluyo en este enlace para quien los necesite.
 
 

Bueno, otro día más. Ahora me voy un rato a hacer de mecánico. Ayer Sábado mi hijo cumplió 3 añitos y como es fan (apasionado) de Rayo MCQueen (de la película Cars) le regalé uno eléctrico que compré por Internet. El problema es que quiere “que corra como los del Youtube“, como dice él, por lo que me toca “trastear” un poquito con el coche ;)


Post relacionados:

  1. Las comunicaciones GPRS La tecnología GPRS (General Packet Radio Service) es diferente de...








Etiquetas: ,
24 Respuestas a “SMS en formato PDU”
  1. Gabriel dice:

    Hola master, te sacaste un 10, muy bien explicado el manual y facil de entender. Hace mucho que buscaba algo sencillo.

    Tengo problemas con mi V3, no cierra cuando lo mando el CTRL+Z ni el ESC. No se si sepas de eso, si encuentras un manual, lo publicas.

    Gracias.

  2. David Moreno dice:

    exelente explicacion, comentarte que me ayudo tu pagina referente a un proyecto con GPS enviando SMS del posicionamiento por el formato PDU, que de hecho me funciona bien. gracias.

  3. Josep dice:

    Como sabemos que hemos recibido un mensaje? Que parametros hemos de entrar en PDU mode para saberlo. Y los acuses de recibo?

    Saludos.

  4. Pablo dice:

    Como dice Josep, qué parámetros deben marcar para recibir un aviso de su correcto envío y recepción.
    ¿PC: Path contestación (0 No, 1 Sí) o PRE: Petición reporte de estado (0 No, 1 Sí)?
    Puedes especificar? Gracias

  5. Pablo dice:

    Vale, he mirado los ejemplos y ya funciona. Si es que siempre pregunto antes de leer…

  6. Israel dice:

    Como quedo el auto de tu ninño??? Espero que como los del youtube….

    Ahh y por cierto muy buena explicacion de los sms en pdu…..

  7. Karla dice:

    Hola, y cómo se le hace para enviar a varios teléfonos el mismo mensaje con una sola trama?

  8. Alejandro dice:

    Como le hago para enviar el ctrl+z, que caracter es, o simplemente lo escribo

  9. Leandro dice:

    “416650DA0C02 = datos “ALARMA” codificado a 7 bits”

    No veo de que forma 416650DA0C02 representa ALARMA

    Alguien puede ayudarme?

  10. don gato dice:

    Estaba viendo tus comentario
    son muy buenos tengo estos datos pero no me concuerdad creo que estan en hexadecimal pero me faltan datos voy a seguir intentando pero si me ayudas te lo agradecere mira este es el mensaje con la fecha y hora

    Fecha: 26/11/2009 12:49
    1003160CAC99B988B1834301A8C0C0DA1C
    Espero si me puedes ayudar y buena explicacion

  11. Sergio dice:

    Buenas tardes,

    Tengo un problema que no me surge siempre, despues de buscar un poco en la web no he llegado a ninguna conclusion. Resulta que tengo una aplicacion corriendo en un TC65, e internamente cuando le hago un OTAP, para confirmar que se ha actualizado le digo que me envie un sms a un movil en concreto. Entonces aqui viene el problema, que hay veces que me lo manda y otras no…, para averiguar el error le puse un AT+CMEE=1 y consegui saber el error (que repito no me ocurre siempre),y el error que capture es el siguiente.

    CMS ERROR: 535 (Protocol stack busy)

    No le veo solucion y la verdad es que sin que me garantice este mensaje desde el TC65, mi aplicacion no tiene sentido despues de todo el trabajo.

    Cualquier ayuda sera de agrado.

    Un saludo
    Sergio

    • blogElectronica dice:

      Hola Sergio,

      ¿qué versión tienes de TC65? ¿cuando envías el SMS ya estás registrado en la red GSM? ¿Lo has comprobado con “AT+CREG?” ? ¿En el caso de obtener el error en el envío de SMS, lo estás reintentando continuamente sin dejar pausa? ¿Sabes que cuando haces un OTAP hay un parámetro llamado notifyURL para cargar una página web, que además puede tener parámetros así saber que un determinado móvil ha finalizado el OTAP?

      Salu2.

      • Sergio dice:

        Hola,

        Siento no dirijirme por tu nombre, pero lo desconozo. Te comento, la aplicacion cuando arranca se registra en la la red y todo…entonces hay veces que me envia el sms y otras veces me da el error que comente antes. El caso es que no puede fallar, tiene que enviar el sms, o….. tendre que ver eso del NotifyURL. Que lo he leido pero no lo he entendido.

        Segun como lo tengo ahora en el parametro notifyURL, tengo una url de un txt, pero nunca me llega a escribir nada en ese txt. siempre que termina de ejecutarse el OTAP, ese archivo se genera en esa URL, pero tiene 0 KB. Entonces estoy bastante perdido. Por cierto utilizo el programa OTAP v1.1, puesto que el modem TC65 o MTX-65 estan fuera de mi ciudad.

        No se si me explicado o me he liado mas…

        Saludos y muchas gracias

  12. Sergio dice:

    Don Gato, te falta el caracter “Control Z”, que en hexadeximal es 1A..debes ponerlo al final, sino de dara error. Utiliza el AT+CMEE=1 antes de cualquier comando, para averiguar el error siempre…

    Espero no llegar tarde…

    • blogElectronica dice:

      Hola Sergio,

      No se si estarás haciendo otras operaciones mientras intentas enviar el SMS. Si estás realizando otras acciones con un hilo en paralelo quizás estés teniendo algún problema con eso. Si tan importante es ese SMS, quizás debería ser lo primero y único que debe hacer la aplicación en ese instante. Asegúrate de ello y no tendrás ningún problema. Estoy harto de enviar SMSs desde TC65 y nunca me ha dado un error de ese tipo. Quizás lo estés enviando en el preciso instante que estás iniciando una sesión GPRS y pueda venir de ahí.

      Lo del notifyURL obviamente no te va a escribir ningún txt en un servidor remoto. Si llamas a una URL tipo:

      midominio.com/actualizacion.asp?IMEI=1234123412342

      después en el servidor, en la página actualizacion.asp puedes tener algo como:

      < %
      variable=Request.QueryString("IMEI")
      %>

      y en variable tendrás el IMEI y luego puedes hacer lo que quieras, guardarlo en una BBDD o lo que sea.

      Salu2.

      • Sergio dice:

        Buenos días,

        Las operaciones que realizo son una a una, de eso ya me preocupe, no para no saturar con comandos at. Ademas, realizo el envio de sms, antes de iniciar cualquier operacion, tipo registros, gprs…

        En cuanto a lo del notifyURL, creo que me parece la opcion mas segura, pero…en el mundo de diseño web me pierdo, lo unico que te puedo decir es que tengo un servidor apache corriendo y las asp van sobre IIS. Aun asi, se podria poner una url en el notifyURL en html? tipo:

        midominio.com/actualizacion.html?IMEI=1234123412342

        Y como deberia ser esa pagina html…

        Aun asi el envio de los sms, los realizo por OTAP v1.1 y pense que podria saber el resultado de la actualizacion median “Comprobacion OTAP”, pero siempre me devuelve que no se ha podido comprobar, aunque el OTAP se haya ejecutado.

        Como ves en ese mundo estoy perdido, toda la ayuda que me ofrezcas sera bien recibida.

        Saludos y gracias.

  13. Luis dice:

    La explicación es muy buena… hasta un punto y ese punto es cuando se intenta enviar un mensaje con acentos o con una letra Ñ, ¿Por qué? muy simple, en todas las letras del ejemplo aparecen letras cuyo primer bit es 0 y en la codificación se elimina ese cero, dejándolo en septetos y rellenándolos con datos del octeto anterior. la Ñ o cualquier carácter ascii “no inglés” tienen como primer bit un 1, con lo cual no se puede aplicar el algoritmo que se indica aquí de forma directa.

    Estoy buscando la forma de “españolizar” ese algoritmo, pero de momento es un fracaso total.

    Luis

  14. viczea2002 dice:

    Estimados amigos: necesito ayuda, pues acabo de comprar un GPS103 y me dice q el formato de SMS debe estar en texto porque en formato PDU no lo reconoce, y tengo problemas, mi pregunat es como verificar que si el formato de SMS esta en texto o e PDU?
    Gracias.

    • blogElectronica dice:

      Hola Viczea2002,

      no conozco el GPS103 pero si el módem desde el que estás enviando el SMS lo tienes configurado con AT+CMGF=1 estarás enviando el SMS en modo texto. Si lo haces con AT+CMGF=0 lo hará en PDU. Si lo estás enviando con un teléfono móvil creo recordar que si envías un SMS sin caracteres especiales (acentos, eñes, …) el mensaje será enviado en modo texto.

      Salu2

  15. velazquez dice:

    hola que tal. te quiero felicitar por el aporte grandioso que hiciste explicando lo de formato pdu. mi duda es sobre la parte donde explicas :P C CD PRE PV RD TIPO
    me lo podrias explicar mas claro??. gracias amigo

  16. cal dice:

    muy bien te felicito yo tambien lo hice pero con el SE k300i el cual no manda formato texto eso creo por que me sale despues de escribir AT+cpmgf=1 por respuesta +cpmgf error 302 y al escribir AT+cpmgf=? me sale +cpmgf(0)
    y por ello creo que solo controla pdu
    me pueden decir que modem trabajan con formato texto?
    por fa

  17. Carlos Dk dice:

    Buenas, ¿hay alguna manera de modificar el remitente? Me gustaría que apareciera un texto en vez de mi número de teléfono. Algunas empresas lo hacen así.

    Estoy utilizando un modem GSM, un huawei k3765 y he conseguido enviar un sms desde mi pc, pero me gustaría poder modificar el emisor. Sino se pudiera usando este modem, no tendría problema en buscar otro que deje.

    Gracias!

  18.  
Deja una Respuesta

Puedes publicar un comentario aquí si quieres, pero te recomiendo que uses el nuevo foroElectronica.com para introducir comentarios. Te contestaré más rápido. Recuerda que debes registrarte si no lo estás para publicar un comentario.