Интерфейс Wireless Messaging API (WMA), также известный как JSR 120, позволяет разработчикам приложений (мидлетов) Java ME использовать службу коротких сообщений (SMS).
На сегодняшний день JSR 120 поддерживается большинством Java-машин мобильных устройств, построенных на стеке CLDC/MIDP. Но JSR 120 может также поддерживаться и Java-машинами с CDC-стеком. Кроме того, он включен в спецификацию MSA, которая со временем станет обязательным набором JSR'ов для мобильных устройств. Помимо сетей GSM, JSR 120 предусматривает работу в сетях CDMA. Поэтому распространение JSR 120 очень широко, и на него можно смело опираться в разработке приложений для мобильных устройств.
Рассмотрим среду NetBeans, как простейший путь создания первого JavaME-приложения и дальнейшей разработки сложных проектов. Среда NetBeans поддерживается компанией Sun Microsystems и доступна для бесплатной загрузки на сайте www.netbeans.org. На момент написания статьи доступна версия NetBeans IDE 6.1. Для разработки JavaME-приложений нужна версия с пакетом Mobility.
Устанавливаем и запускаем NetBeans, выбираем [File -> NewProject], тип проекта [Mobility, MIDP Application]. Компилируем, запускаем эмулятор, убеждаемся, что мидлет HelloWorld работает. Теперь добавим SMS-функциональность. Не перегружая читателя логикой приложения, просто приведём простейший пример кода, который посылает сам себе SMS сообщение. Для этого открывается виртуальное серверное SMS-соединение на порту 1234, затем создаётся такое же удалённое соединение, используя мобильный номер телефона адресата, создаётся и посылается текстовое сообщение, и, наконец, сообщение принимается через серверное соединение:
import javax.wireless.messaging.*;
import javax.microedition.io.*;
MessageConnection serverConnection = (MessageConnection)Connector.open("sms://:1234");
MessageConnection remoteConnection = (MessageConnection)Connector.open("sms://+987654321:1234");
TextMessage message1 = (TextMessage)remoteConnection.newMessage(MessageConnection.TEXT_MESSAGE);
message1.setPayloadText("hello");
remoteConnection.send(message1);
Message message2 = serverConnection.receive();
Как видно, интерфейс несложный. SMS-соединение (Connection) – это реализация обобщенного соединения CLDC, оно инстанциируется через обобщенный класс Connector. Если Java-машина, установленная на устройстве, не поддерживает JSR120, то вызов метода open бросит исключение типа ConnectionNotFoundException.
Спецификация JSR 120 предусматривает SMS-порты. У обычных пользовательских SMS никаких портов нет. Но в программной реализации JSR120 разные приложения могут слушать разные порты – в точности как это сделано, например, в протоколе TCP. Это позволяет мобильному устройству и подсистеме Java найти точного адресата. Если SMS должен получить сам пользователь, а не приложение на пользовательском телефоне, то для этого предусмотрен порт с номером ноль. Но обратный фокус невозможен: java MIDlet не может зарегистрироваться на нулевом порту и отбирать у пользователя его SMS сообщения.
Конечно, кроме текстовых можно посылать и бинарные сообщения (BINARY_MESSAGE). Нужно помнить, что метод receive синхронный, поэтому, чтобы не блокировать поток выполнения, предусмотрены слушатели (MessageListener), которые будут вызваны по приходу SMS сообщения.
Важной функциональностью JSR120 является поддержка технологии Push. Эта технология описана в спецификации MIDP (JSR 118). В случае JSR120 её суть состоит в том, что для получения SMS мидлет не обязательно должен быть всё время запущен. Мидлету достаточно зарегистрироваться в подсистеме Push – и, по приходу SMS сообщения, он будет запущен автоматически. Спецификация требует, чтобы после запуска мидлет обязательно забрал своё сообщение.
Мидлет может быть зарегистрирован статически и динамически. Для статической регистрации инcтрукции Push должны быть прописаны в jad-файле:
MIDlet-Push-1: sms://:1234, MyMidlet, *
MIDlet-Permissions: javax.microedition.io.PushRegistry
a динамическая регистрация предусматривает использование программного интерфейса:
import javax.microedition.io.*;
PushRegistry.registerConnection(“sms://:1234”, “MyMidlet”, “*”);
Последний параметр (“*”) - это так называемый фильтр. С его помощью может быть задан предполагаемый адрес (телефон) отправителя сообщения – тогда мидлет будет запущен только в случае, если телефон отправителя совпадает с маской, заданной фильтром.
Кроме коротких сообщений SMS с помощью JSR 120 можно принимать CBS-сообщения. Если SMS на слуху у всех пользователей мобильной связи, то про CBS стоит пояснить, что CBS расшифровывается как Cell Broadcast Service. С помощью службы CBS сотовый оператор может рассылать массовые сообщения на все мобильные станции в заданном регионе. Это может быть информация о погоде, спортивные новости или сообщения о бедствии. Не все операторы поддерживают CBS, но в некоторых случаях использование этой технологии может быть очень полезно. С точки зрения программиста Java ME CBS выглядят в точности как SMS, кроме того, что их можно только принимать, а послать нельзя. Точно так же открывается соединение на определенном порту, точно так же принимаются и обрабатываются текстовые сообщения.
К сожалению, существенным ограничением службы SMS-сообщений является максимальная длина сообщения, которая составляет всего 140 байт полезной нагрузки. В случае большого количества информации JSR 120 предусматривает разбиение SMS-сообщения на составляющие части. При этом адресат получит не кусочки, а уже собранное сообщение. Количество таких частей можно узнать с помощью метода MessageConnection.numberOfSegments(Message). Спецификация устанавливает, что любая реализация JSR 120 должна поддерживать разбиение сообщения, как минимум, на три части. Каждая конкретная реализация может поддерживать и больше, но не стоит на это полагаться. Кроме того, нужно учитывать, что каждое сообщение может стоить денег пользователю, и перед посылкой сообщения Java ME уведомит пользователя о том, что собирается послать сообщение, и из какого количества частей оно состоит, а пользователь может отказаться от посылки, в результате чего сообщение не будет послано, и приложение получит ошибку.
В заключение разговора про JSR 120 следует сказать про его логическое продолжение, JSR 205 (Wireless Messaging API 2.0), который позволяет работать с MMS-сообщениями (Multimedia Messaging Service). За небольшими исключениями (например, текстовый порт вместо цифрового) программный интерфейс JSR 205 выглядит точно так же, как интерфейс JSR 120. Технология MMS более продвинутая, она позволяет передавать намного большие объемы информации. Но в этом и её слабость, т.к. до сих пор часть мобильных телефонов не поддерживают MMS и, соответственно, программа, опирающаяся на JSR 205, на этих телефонах работать не будет. При этом всё же можно ожидать, что доля рынка телефонов с поддержкой MMS будет неуклонно расти, и когда-нибудь JSR 205 по распространению догонит JSR 120. |