SMS en formato PDU
Escrito por blogElectronica en 1.TECNOLOGÍAS (teórico), Comunic. GSM/GPRS, Comunicaciones UMTSEl 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.
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º: 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. TLL: tipo de llamada: 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). |
TIPO PDU: Tipo Protocolo de la Unidad de Datos
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.
|
PV: Periodo de Vigencia del sms
Valor de PV:
|
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:
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
|
>> 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: 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.
Ejemplo. Supongamos la fecha/hora: 14/03/02 a las 20:17:52 |
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:
- Las comunicaciones GPRS La tecnología GPRS (General Packet Radio Service) es diferente de...
Etiquetas: gsm, modem
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.
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.
Como sabemos que hemos recibido un mensaje? Que parametros hemos de entrar en PDU mode para saberlo. Y los acuses de recibo?
Saludos.
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
Vale, he mirado los ejemplos y ya funciona. Si es que siempre pregunto antes de leer…
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…..
Hola, y cómo se le hace para enviar a varios teléfonos el mismo mensaje con una sola trama?
Hola Karla,
no se puede. Que tu teléfono lo haga no quiere decir que se haga en una línea. Tu teléfono internamente los envía uno a uno. No es posible enviar con un único comando AT un SMS a varios teléfonos.
Salu2.
Como le hago para enviar el ctrl+z, que caracter es, o simplemente lo escribo
Hola Alejandro,
creo (te lo digo de memoria) que es el carácter ASCII 26.
Salu2.
“416650DA0C02 = datos “ALARMA” codificado a 7 bits”
No veo de que forma 416650DA0C02 representa ALARMA
Alguien puede ayudarme?
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
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
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.
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
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…
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.
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.
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
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.
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
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 C CD PRE PV RD TIPO
me lo podrias explicar mas claro??. gracias amigo
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
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!