SMS binario: envío de contenido enriquecido a dispositivos mediante SMS

Este artículo explicará de un nivel alto a un nivel inferior cómo escribir una aplicación móvil simple habilitada para SMS que le permitirá enviar «mensajes de instalación por aire». Después de leer este artículo, podrá crear un pequeño applet J2ME que teóricamente se enviará a otro teléfono utilizando un mensaje SMS como medio de entrega. De hecho, debido a las limitaciones de la API de mensajería inalámbrica en J2ME (JSR 120/205), el puerto para los mensajes Push WAP está «reservado» por razones de seguridad. La capacidad de enviar contenido a través del canal de SMS ampliamente soportado puede ser muy útil para los proveedores de contenido.

Los mensajes SMS son un pequeño número de bytes empaquetados enviados a través de las redes del operador. Muchos de ustedes ya han experimentado el envío de» mensajes de texto «desde dispositivos y muchos se refieren al envío de mensajes SMS como»mensajes de texto».

Una pequeña introducción técnica a SMS

El alcance de este artículo es ser práctico, por lo que no revisaremos todos los detalles técnicos y aburridos de las redes, pero tres conceptos son bastante importantes para entender sobre sms.

  • SMS utiliza el concepto de «puerto» como lo hacen los sockets de Internet estándar;
  • Los mensajes SMS tienen un límite en el cuerpo de 160 caracteres;
  • El cuerpo no es lo único con lo que puede jugar en un SMS, también está el encabezado de datos del usuario.

Puertos

Cuando pulsa una URL en su navegador, como http://dev.mobi, llama de forma transparente al puerto 80 de un servidor web, por convención. La conexión se inicializará en el puerto 80 y luego se cambiará a un puerto superior para permitir que otros usuarios accedan al mismo puerto del servidor web. El puerto 80, como indica IANA, se refiere al protocolo HTTP, esto significa que un servidor, que es capaz de entender la solicitud de protocolo HTTP, se despertará y estará listo para responder y procesar solicitudes HTTP. Lo mismo sucede con los mensajes SMS. Puede enviar un SMS a un puerto específico de un teléfono y despertará un servicio específico en ese dispositivo. Ahora, al igual que no todos los equipos tienen servicios estándar (como un servidor web), tampoco todos los dispositivos móviles tienen servicios que escuchan puertos. Esta es una cosa muy «relacionada con el fabricante», por lo que deberá verificar en su teléfono lo que está habilitado para aceptar.

Cuerpo y codificación

Este podría ser un tema difícil de tratar, pero solo describiremos información muy básica que puede ser útil. La codificación predeterminada de SMS utiliza 7 bits para manejar un carácter. Esto significa que puede escribir en un SMS solo aquellos caracteres que están presentes en una tabla de caracteres muy básica, sí, esos famosos 127 caracteres. Si quieres hacer cosas más complicadas y enviar personajes más «interesantes», entonces se necesita un grupo de 8 bits y la tabla de caracteres disponibles se hace más grande. El espacio disponible es de 1120 bits por SMS, ni más ni menos. Puede tener 160 caracteres usando 7 bits o 140 caracteres usando 8 bits

Nota: El carácter «É «está incluido en la» tabla básica», mientras que el carácter» È «está en las»tablas más grandes». Si escribe un mensaje con el segundo carácter, tendrá menos espacio disponible en el mensaje. Por lo tanto, preste atención a los caracteres que está utilizando al enviar SMS

Encabezado de datos de usuario

El Encabezado de datos de usuario (también conocido como UDH) es lo que un «desarrollador de alto nivel» puede configurar mientras hace algo más que un simple «mensaje de texto». Un UDH es muy útil porque puede enviar » mensajes de texto invisibles «a una aplicación móvil (donde» aplicaciones móviles » me refiero a las que se ejecutan en dispositivos móviles, por ejemplo) o puede decirle a un dispositivo que el mensaje contendrá información especial. Es muy similar a un archivo XML: tienes que decirle al analizador lo que estás enviando, y el contenido que sigue al prolog que será manejado por el propio analizador.

El UDH se utiliza principalmente para especificar a qué puertos enviará el SMS nuestro cliente (teléfono). Está hecho por un conjunto de números hexadecimales que describen:

<cuánto tiempo tiene el UDH> < el formato utilizado para especificar números de puertos> < la longitud del número de puerto> < número de puerto de destino> < número de puerto de origen>.

Como ejemplo práctico, digamos que quiero crear un UDH para enviar un Push WAP, donde el puerto de destino estándar para los push WAP es 2948, el UDH será:

1
06 05 04 0B 84 23 F0

donde:

  • 06 significa «oye, lee los siguientes 6 bytes»
  • 05 es el formato para los números, en este caso los números hexadecimales
  • 04 le dirán al UDH que cada puerto está representado usando 4 caracteres
  • 0B84 es el puerto de destino, 2948 (representación decimal) o 0B84 (representación hexadecimal)
  • 23F0 es el puerto de origen, 9200 (representación decimal) o 23F0 (representación hexadecimal).

Nota: Use una calculadora simple para convertir números decimales a hexadecimales; seleccione «Dec», coloque 2948 en la calculadora, luego presione el botón»Hexadecimal». Cualquier calculadora científica puede hacer esto y muchos sistemas operativos tienen una pequeña aplicación «calc» en algún lugar que puede hacer esto.

SMS binario

Un «SMS binario» es un SMS textual con formato XML que se ha transformado con WBXML. WBXML es un «transformador de etiquetas», esto significa que para cada etiqueta XML se asocia un byte binario. Por ejemplo, la etiqueta < SI> se convierte como el carácter binario & #x0005;

¿Por qué WBXML?

Respuesta fácil: el resultado de una transformación WBXML es menor en el número de bytes generados que el propio archivo XML textual detallado.

Nota: muchas etiquetas se convierten en bytes, pero a veces también el contenido (como direcciones URL), por ejemplo, la URL http://www.dev.mobi se puede escribir en WBXML como 0Ddev.mobi , donde » 0D » significa http://www.

«0C» es más genérico, y se destaca por http:// así que usted puede escribir la dirección URL en dos formas:

1
<span>0Ddev.mobi </span>

o

1
<span>0Cwww.dev.mobi< / span>

El primero utiliza 9 caracteres (0D es un byte), el segundo 13 caracteres! Me encanta WBXML 🙂

Términos

Para ser claros, por «WAP push» no nos referimos a una forma de enviar SMS usando WAP. Lo que queremos decir es lo que técnicamente se conoce como SI (Indicación de servicio). Una Indicación de servicio es un SMS binario enviado a un puerto dedicado en un dispositivo que informa al dispositivo de que hay una URL a la espera de ser visitada. La URL puede ser la dirección de un tono de llamada en un servidor web, la dirección de un archivo JAD para instalar una aplicación J2ME o un JPG o simplemente una página WAP; depende del «webmaster» del servidor web colocar el contenido en el sitio web, y depende del dispositivo entender cómo manejar el contenido. Para obtener más información sobre este aspecto del rompecabezas, consulte nuestra serie de artículos de Adaptación de contenido.

Nota: Cuando digo «servidor web» me refiero a servidor web y WAP, ya que la mayoría de los servidores web se pueden configurar para entregar contenido WAP. Por» SMS de configuración de OTA «me refiero a un SMS binario que contiene detalles de APN (pero puede contener más) también conocido como»Configuración de acceso a Internet».

Nota: Hay mensajes especiales de «Indicación de servicio» que normalmente se llaman SL (Carga de servicio) y que son similares a «SI». Un SI pide permiso al usuario antes de buscar el contenido a través de la conexión de red, SL descarga el contenido automáticamente sin pedir permiso al usuario. Los » SL » son muy similares a los mensajes MMS: el contenido está en un servidor web y el SMS le dice al teléfono que descargue el mensaje.

Así que comencemos

En primer lugar, necesitamos leer algunos documentos (por desgracia) para leer algunas especificaciones sobre cómo escribir contenido XML para enviarlo por SMS. Un buen punto de partida podría ser la «Especificación de mensajería inteligente 3.0.0» de Nokia, que se puede descargar desde www.forum.nokia.com y también más documentos técnicos de Open Mobile Alliance (OMA) de www.openmobilealliance.org/tech/affiliates/wap/wapindex.html

Así que nuestros pasos serán:

  • Decida qué queremos enviar
  • Encuentre los documentos sobre ese tema
  • Encuentre la estructura XML del mensaje que se va a enviar
  • Personalice el XML
  • Convierta el XML a WBXML
  • Prepare el UDH
  • Enviar el UDH y el CUERPO

Como queremos enviar una aplicación J2ME a un nuevo teléfono, necesitamos enviar un mensaje de «Indicación de servicio», también conocido como «Empuje de WAP». Este » SI » se puede usar para enviar un SMS que se leerá como un enlace para descargar algo. Cualquier tipo de contenido (imagen/jpeg, aplicación/archivo java, archive) es válido si el teléfono puede abrirlo.

Entonces, ¿quién puede saber qué tipos de contenido puede abrir un dispositivo ? DeviceAtlas puede ayudarnos aquí! (ver Referencias)

Encuentre los documentos sobre ese tema

Ok, abramos el enlace de OMA y vayamos al » Área funcional «denotado»push». Vamos a obtener la «Especificación de Indicación de Servicio WAP». Para entender cómo funciona WBXML, sugiero leer el párrafo 8.3.2 «Tokens de inicio de atributos».

Encuentre la estructura XML del mensaje

Para aquellos de ustedes que les gustan más los DTDs, consulte la sección 7.2. Todos los demás pueden omitir todo el documento e ir al ejemplo de lectura en la sección 9. El XML es bastante autoexplicativo, así que haré algo de personalización directamente.

1
2
3
4
5
6
7

<?xml version= «1.0»?>
<!DOCTYPE si PUBLIC «- / / WAPFORUM / / DTD SI 1.0 / / ES «» http://www.wapforum.org/DTD/si.dtd»>
<si>
<indication href=http://www.dev.mobi/is_fun.html si-id=»6532″>
DevDotMobi is Fun !
</indication>
</si>

Convert to WBXML

Hex code Meaning
02 WBXML Version 1.2
05 SI 1.0 Public Identifier
6A Charset UTF-8
00 String table length = 0
45 <SI>
C6 <indication>
0C href=»http://
03 String starts
* 7777772E6465762E6D6F62692F69735F66756E2E68746D6C www.dev.mobi/is_fun.html
00 los extremos de una Cuerda
11 si-atributo id
03 Cadena comienza
** 36353332 6532
00 los extremos de una Cuerda
07 el atributo de Acción (señal – medio)
01 los Extremos de los atributos, ahora el contenido
03 Cadena comienza
* 446576446F744D6F62692069732046756E2021 DevDotMobi es Divertido !
00 Extremos de cuerda
01 </indicación>
01 </SI>

* Se trata de cadenas utilizadas para pasar contenido al SI, cada carácter de la cadena se convierte en su representación hexadecimal.
* * «6532» debe considerarse una cadena de caracteres y no un número, así que no use la calculadora para convertir este número

Nuestro cuerpo es, juntando todos los números:

1
02056A0045C60C037777772E6465762E6D6F62692F69735F66756E2E68746D6C0<br />011033635333200070103446576446F744D6F62692069732046756E2021000101

(que es de 130 caracteres)

Preparar la UDH

Preparación de la UDH es bastante fácil. Simplemente comience con «06 05 04» y luego agregue los números de puerto. Los mensajes Push WAP utilizan el «puerto de destino» 2948, mientras que el puerto de origen es 9200. Convierta números de puerto decimales a formatos hexadecimales, de modo que 2948 se convierta en 0B84 y 9200 en 23F0. Mágicamente, el UDH es: 06 05 04 0B 84 23 F0

Envíe el SMS y el UDH

Ahora, ¿qué necesita hacer con esto? Bastante simple, simplemente junte todo y el SMS estará listo para ser enviado.

<UDH> + <CUERPO>

1
UDH: 06 05 04 0 MM 84 23 F0<br />CUERPO: 02056A0045C60C037777772E6465762E6D6F62692F69735F66756E2E68746D6C0<br /> 011033635333200070103446576446F744D6F62692069732046756E2021000101

The complete message is then:

1
<span><strong>0605040B8423F0</strong><br /> 02056A0045C60C037777772E6465762E6D6F62692F69735F66756E2E68746D6C0<br /> 011033635333200070103446576446F744D6F62692069732046756E2021000101</span>

Que tiene 137 caracteres (oye, es un SMS binario, Java usa codificación UTF-8 para mensajes binarios, por lo que el límite para 1 SMS es de 140 caracteres, ¿no es genial ?)

La aplicación J2ME

Para ser lo más práctico posible, necesitaremos un entorno para enviar mensajes SMS y describir el mundo real, pero como no todo el mundo tiene acceso a una puerta de enlace SMS con UDHs y una interfaz donde ingresar código binario, describiremos cómo hacer lo mismo con una aplicación J2ME.

Descargo de responsabilidad: En cuanto a las especificaciones WMA, las aplicaciones J2ME no pueden acceder a puertos reservados especiales para enviar SMS binarios, por lo que la aplicación J2ME en el teléfono recibirá una excepción de seguridad y el mensaje no se entregará.

MIDP2. 0 tiene dos métodos que permiten enviar mensajes: uno requiere una cadena, otro requiere una matriz de bytes. Sí, el primero se usa para establecer el contenido de texto, el segundo para establecer el contenido binario.

Método de texto: setPayloadText(String textualSMS);
Método binario: setPayloadData(binarySMS de bytes);

Para poder instalar la aplicación J2ME «Por aire», compílela con su entorno J2ME favorito (Me gustan los NetBeans con el Paquete de movilidad), copie el .JAD y .Archivos JAR a su servidor web y personalice la URL en el mensaje Push Wap.

Ahora escribamos una clase J2ME simple que envíe el mensaje:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69

import javax.microedition.midlet.*;
import javax.microedition.lcdui.*;
import javax.wireless.messaging.*;
import java.io.*;
import javax.microedition.io.*;
public class WapPush extends MIDlet {
// Conexión para enviar un mensaje
privado MessageConnection conn;
public void startApp() {
// Pon aquí tu número de móvil
String myMobileNumber=»+39335…»;
try {
// Crear un mensaje binario
// puerto de Destino se expresa utilizando la notación decimal
este.conector conn=(Conexión de mensaje).open(«sms://»+myMobileNumber+»:2948″);
// Especificar que vamos a enviar un mensaje binario
BinaryMessage bm=(BinaryMessage)conn.newMessage(MessageConnection.BINARY_MESSAGE);
String ourContent=»0605040B8423F0″ +
«02056A0045C60C037777772E6465762E6D6F62692F69735F66756E2E68746D6C0» +
«011033635333200070103446576446F744D6F62692069732046756E2021000101»;
bm.setPayloadData(convertHexToBinary(ourContent));
this.conn.send(bm);
}
// Let’s throw exceptions
catch (IOException ex) {
ex.printStackTrace();
}
catch (Exception ex) {
ex.printStackTrace();
}
/** Este método proviene de affinitystudios
* leer en http://discussion.forum.nokia.com/forum/member.php?u=56142
* convierte las Cadenas de datos array de caracteres
*/
private static byte convertHexToBinary(Cadena hexData) throws Exception {
Sistema.fuera.println («Longitud:» +(hexData.longitud()/2));
if (hexData.length() % 2 != 0 ) {
throw new Exception(«Debe ser un número par de dígitos hexadecimales» );
}
byte binaryData = new byte;
for (int i = 0; i < binaryData.length; ++i) {
String byteStr = hexData.substring(i*2, i*2+2);
int value;
try {
value = Integer.parseInt(byteStr,16);
}
catch (NumberFormatException e) {
e.printStackTrace();
throw new Exception(«»);
}
binaryData = (byte)value;
}
return binaryData;
}
pausa de vacío público() {}
destructor del vacío público (booleano incondicional) {}
}

Usando una puerta de enlace SMS en línea

Como J2ME bloquea muchos mensajes binarios, puede probar una puerta de enlace en línea para enviar sus mensajes binarios. Muchas compañías proporcionan servicios de puerta de enlace de SMS, y la mayoría de ellas tienen una interfaz para enviar mensajes SMS binarios sin procesar (estos son un «plus» para mí), mientras que otras compañías solo le brindan una interfaz para configurar los campos personalizados y hacer las cosas binarias para usted.

Si desea utilizar una pasarela de SMS en línea, recuerde leer sus especificaciones técnicas. Si quieres instalarte una pasarela de SMS que se conecte a servicios externos (operadores/operadores), te sugiero Kannel, que es un software de pasarela de SMS gratuito y está extendido por todo el mundo; a Kannel le gusta tener el UDH y el cuerpo a separar.

  1. Puertos reservados y más: Especificaciones de la «API de mensajería inalámbrica» de J2ME
    http://java.sun.com/products/wma/index.jsp
  2. formato estándar para contenidos de OTA: Open Mobile Alliance
    http://www.openmobilealliance.org/tech/affiliates/wap/wapindex.html
  3. Cómo enviar configuraciones de OTA, tonos de llamada y logotipos de operador: NOKIA
    http://www.forum.nokia.com (consulte la «Especificación de mensajería inteligente»)
  4. Cómo detectar un teléfono móvil: WURFL
    http://deviceatlas.com
  5. Software de puerta de enlace Sms: Kannel
    www.kannel.org

Deja una respuesta

Tu dirección de correo electrónico no será publicada.