Издательский дом ООО "Гейм Лэнд"ЖУРНАЛ ХАКЕР #75, МАРТ 2005 г.

Мобильная архивация

Филипп Коряка

Хакер, номер #075, стр. 075-114-4


Message - основной интерфейс для представления сообщений, из которого наследуются два следующих класса.

TextMessage - класс текстового сообщения.

BinaryMessage - класс бинарного сообщения.

Следующий код осуществляет отправку SMS-сообщения c помощью этого API:

try{

String addr = "sms://+1234567890";

MessageConnection conn = (MessageConnection) Connector.open (addr);

TextMessage msg = (TextMessage)conn.newMessage (MessageConnection.TEXT_MESSAGE);

msg.setPayloadText ("Hello World!");

conn.send (msg);

}

catch (Exception e) {}

Как видишь, здесь все очень просто:

1. создаем соединение

2. создаем сообщение

3. отправляем сообщение

4. закрываем соединение

В случае с отправкой кодированных по нашему методу сообщений, следует использовать класс BinaryMessage. Соответственно код преобразуется следующим образом:

byte[] bin_msg;

try{

String addr = "sms://+1234567890:5151";

MessageConnection conn = (MessageConnection) Connector.open (addr);

BinaryMessage msg = (BinaryMessage)conn.newMessage (MessageConnection.BINARY_MESSAGE);

msg.setPayloadData (bin_msg);

conn.send (msg);

}

catch (Exception e) {}

Обрати внимание на то, что в строке адреса появилось дополнение в виде ":5151". Это номер порта, на который следует отправлять СМСку. Дело в том, что существует два вида SMS-сообщений, в которых присутствует номер порта, и в которых его в помине нет. Сообщения первого типа принимаются стандартным ПО телефона. Сообщения второго типа, в свою очередь, должны обрабатываться соответствующими мидлетами настроенными на получение сообщений из данного порта. Если в момент поступления сообщения такой мидлет не запущен, то сообщение передается стандартному ПО мобилы.

К примеру, получать все сообщения пришедшие на 5151 порт можно с помощью следующего простого кода:

try{

String addr = "sms://:5151";

MessageConnection conn = (MessageConnection) Connector.open (addr);

Message msg = null;

while (!ex){

msg = conn.receive();

if (msg instanceof TextMessage){

TextMessage txt_msg = (TextMessage)msg;

String text = txt_msg.getPayloadText();

txt_msg.setPayloadText ("Received: " + text);

conn.send(txt_msg);

}

}

}

catch (Exception e) {}

Тут ты можешь столкнуться с небольшой проблемой. Мидлет предназначенный для получения СМСок с определенного порта будет получать их только в то время когда он запущен. В случае если СМСка придет, когда мидлет не запущен, она перенаправится стандартному ПО телефона. Решением данной проблемы является использование технологии Push Registry, которая позволяет установить соответствие между мидлетом и некоторым портом. При поступлении информации в зарегистрированной специальным способом порт твой мидлет автоматически загрузится.

Таким образом, получается некоторое подобие сервера. Для того, что бы связать определенный порт с мидлетом, следует добавить в jad-файл строчку вроде этой:

MIDlet-Push-1: sms://:5151, sms_test, *

Грубо говоря, в этой строке оговорено, что при поступлении сообщений типа sms на 5151 порт, необходимо активизировать мидлет sms_test и передать ему эти данные. Далее мидлет должен проводить декодирование и отображать сообщение в читабельном виде (с этой, достаточно сложной, но очень интересной проблемой предстоит разобраться тебе самому). Посмотреть на уже реализованное приложение, которое принимает, получает, кодирует и декодирует сообщения по описанному выше принципу можно на диске.

Назад на стр. 075-114-3  Содержание  Вперед на стр. 075-114-5