Издательский дом ООО "Гейм Лэнд"ЖУРНАЛ ХАКЕР #110, ФЕВРАЛЬ 2008 г.

Мобильная паскализация

Андрей «LittleBudda» Шкрыль

Хакер, номер #110, стр. 110-108-1

(ShkrylAndrei@rambler.ru)

Кодинг под J2ME-мобилы с помощью родного языка программирования

В наше просвещенное время все кому не лень пишут зловредные программы для смартфонов под Symbian. Плохие программисты настолько сильно осадили производителей смартов, что те вынуждены были подвергнуть их потуги жестокой обструкции в результате чего с запуском нехорошего софта, массово рассылающего sms’ки на платные номера, принадлежащие хакеру, у злодеев возникли определенные проблемы.

Но хакеры, как известно, не сдаются. Они совершили небольшое тактическое отступление для перегруппировки сил, обратив свое пристальное внимание на платформу J2ME. В этой статье мы рассмотрим тему кодинга под мобилы исключительно с ее доброй стороны - поговорим об основах и рассмотрим пару простых примеров: как выводить текст, работать с клавиатурой телефона, использовать мультимедийные файлы, а в заключении напишем полезную утилиту для отправке sms (да, автоматическая отправка sms красивым девушкам – наше любимое дело).

Вступаем в ряды кодеров

Одним из самых популярных средств разработки софта для мобильников является Java (J2ME), а для поклонников Pascal, к которым я себя причисляю, есть отличная альтернатива - это MIDletPascal (www.midletpascal.com). Этот язык создан специально для программирования мобильных приложений, его компилятор транслирует исходник на Паскале в байт-код Java Micro Edition. Как раз то, что нам и надо.

Итак, нам потребуется сам MIDletPascal, эмулятор, в котором мы протестируем наши разработки, ну и, конечно же, официальная документация, которая очень подробно описывает принципы программирования для мобильных устройств (все необходимое можно найти на компакт-диске или скачать с официального сайта). Самым простым эмулятором на сегодняшний день является MidpX (http://kwyshell.myweb.hinet.net/), который к тому же не требует наличия Java SDK для своей работы. Если предложенное решение тебя по какой-то причине не устраивает, можешь скачать альтернативные, например, по следующей ссылке: http://developers.sun.com/mobility/midp/articles/emulators.

Если ты относишь себя к фанатам Basic, тебя определенно заинтересует Mobile Basic (http://mobilebasic.com).

Установка

Инсталляция MIDletPascal на машину - очень простая процедура. Все, что тебе необходимо сделать, – это запустить exe-файл, следовать подсказкам мастера и нажимать кнопку «Далее». Также потребуется установить эмулятор. После этого можно смело запускать среду разработки, в которой необходимо будет выбрать пункт меню File\New project, в результате чего тебе будет предложено создать новый проект.

Введи имя проекта, укажи путь, где он будет храниться, и смело нажимай кнопку ОК. Перед тобой предстанет листинг уже готовой программы Hello world!. Скоро мы напишем почти такую же, но зная, что означает каждая команда.

Сейчас будет нелишним выбрать пункт меню Configure\Program options. Появится окно Program options, где сосредоточены некоторые настройки среды разработки. Например, в разделе Emulator ты можешь отредактировать параметры запуска установленного эмулятора или добавить новый.

Программируем

Переходим к кодингу. Создай новый проект, который выведет на экран текст с использованием команды DrawText, ее описание представлено ниже:

DrawText(Текст, координатаX, координатаY)

Все операции рисования выполняются в памяти, поэтому, чтобы лицезреть результат на экране своего мобильника, необходимо вызывать метод Repaint. Ниже представлен пример классики жанра - программы Hello World!:

Программа Hello World!

program HelloWorld;

begin

DrawText('Привет мир! ', 10, 10);

Repaint;

Delay(5000);

end.

Обрати внимание на команду Delay() - это пауза, необходимая для того, чтобы ты мог увидеть заветную надпись на экране мобильника, в противном случае она пропадет так быстро, что ничего углядеть не удастся. После компиляции программы ты получишь два файла: jar и jad. Самое время запустить их в эмуляторе с помощью волшебной клавиши <F9>.

Чтение с клавиатуры

Для работы с клавиатурой телефона (если ее, конечно, можно так назвать), предназначены две функции: GetKeyPressed() и GetKeyClicked(). Первая возвращает код нажатой клавиши, вторая - код последней нажатой клавиши. Для удобства в MIDletPascal для этих кодов определены константы (последний символ характеризует цифру на клавише).

Сложнее дело обстоит с управляющими клавишами, например со стрелками, поскольку на разных телефонах коды для них запрограммированы разные. Чтобы решить эту проблему, используется специальная функция KeyToAction(), преобразующая числовой код в специальный action-код. В качестве результата возвращается одна из следующих констант: GA_NONE, GA_UP, GA_DOWN, GA_LEFT, GA_RIGHT, GA_FIRE, GA_GAMEA, GA_GAMEB, GA_GAMEC, GA_GAMED.

Для закрепления материала я бы посоветовал написать простую спрайтовую игрушку. В качестве примерчика я написал программу по динамическому управлению буквой «О» на экране, ее листинг ты сможешь найти на диске. Обрати внимание, вся логика заключена в цикле repeat–until. Условием выхода является нажатие на кнопку <0>. После каждой интеграции цикла происходит полная перерисовка экрана. Сначала с помощью команды SetColor() белый цвет устанавливается в качестве текущего, затем вызов FillRect() приводит к отчистке экрана, ну а уже потом осуществляется вывод нужной нам информации в заданных координатах.

Мультимедиа

Мы можем использовать в своей программе картинки формата PNG и звуки в формате MID. Для этого их сначала нужно подгрузить как ресурсы, для чего мы воспользуемся пунктом меню Project\Import resource file. Все подключенные к проекту файлы находятся на закладке Files, расположенной в правой части окна MIDLetPascal.

Работа с картинкой осуществляется следующим образом:

  1. объявляем переменную типа image (например, I:image);
  2. загружаем в нее картинку с помощью имени файла (например, I:=LoadImage('icon.png'));
  3. рисуем картинку в заданных координатах с помощью метода DrawImage() (например, DrawImage(ссылка на картинку, X,Y)).

А работа со звуком происходит так:

  1. вызываем функцию OpenPlayer(имя файла MID, 'audio/midi');
  2. если музыка будет использоваться в качестве фона, то вызываем команду SetPlayerCount(-1), чтобы файл игрался бесконечно;
  3. запускаем проигрывание посредством команды StartPlayer.

Формы

Для того чтобы запросить у пользователя более существенную информацию, нежели нажатие стрелок, существуют формы (практически как в web-сайтах). Поговорим об этом более подробно. Первым делом нужно вызвать команду ShowForm. Далее тебе необходимо добавить элементы, содержащиеся на ней. Это можно сделать с помощью следующих функций:

  • FormAddTextField() - текстовое поле,
  • FormAddImage() – картинка,
  • FormAddGauge() - элемент для отображения прогресса чего-либо,
  • FormAddChoice() – переключатель,
  • AddCommand() – кнопка.

Я специально не стал расписывать подробно входящие параметры вышеперечисленных функций, чтобы у тебя не пропадал стимул заглянуть лишний раз в справочный файл.

Приступим

Теперь у тебя есть вся информация для написания утилиты, которая будет отсылать sms на заранее заданный номер. Обрати свой зоркий взгляд на врезку с заманчивым названием, немного подумай над кодом. Подумал? Нет? Правильно, думать над бездушным кодом смысла нет, лучше подумай над моими нижеследующими словесными излияниями.

Теперь у тебя есть вся информация для написания утилиты, которая будет отсылать sms на заранее заданный номер.

Сначала создается форма, на которой размещены два поля и кнопка ОК. Первое поле предназначено для ввода текста sms, а второе - для номера абонента, которому будет произведена отправка. Функция отправки sms называется smsStartSend(), в качестве первого параметра ей передается номер телефона, в начале которого обязательно ставится префикс «sms://». Вторым параметром идет само сообщение. На форумах я встречал жалобы на то, что русский язык якобы приходит крякозябрами. Однако мной этой проблемы выявлено не было, видимо, затруднения бывают у определенных операторов связи. Следующее действие - обращение к функции SmsIsSending, которая возвращает True, пока идет отправка sms. Именно поэтому в этом месте организуется цикл while. Последнее, что ты должен сделать, - это вызвать функцию SmsWasSuccessfull для проверки факта успешной отправки короткого сообщения.

Стоит отметить одно важное но: эта программа будет работать не на всех мобильниках. Не очень приятно, но факт: я тестировал ее на Nokia 6131 - выполнялась на ура, а вот на Fly SL500m тесты закончились совершенно безрадостно.

Послесловие

Безусловно, MIDLetPascal - удобная штука для написания простейших приложений для мобильных телефонов. Хороша она и для того, чтобы со временем безболезненно перейти на что-то более серьезное, например Java, поскольку рано или поздно ты все равно столкнешься с ограничениями мобильного Паскаля. А они налицо: невозможность сохранять данные, ограниченная работа с файлами, отсутствие способа получения доступа непосредственно к самому телефону. Конечно, можно попытаться выкрутиться, например, я видел программу, которая подключает класс, написанный на Java, и тем самым появляется возможность работать с видеороликами, записанными камерой телефона, но это все равно не решает главное проблемы - жестких рамок самого языка. Надеюсь, что дальнейшее развитие MIDLetPascal откроет перед программистами новые возможности, и я думаю, на это стоит реально рассчитывать, так как рост интереса к этому средству разработки постоянно растет.

program SendSMS;

var

okCommand:command;

TextSMS:integer;

PhoneNumber : integer;

nomer : string;

s : string;

begin

//Создаем кнопку для отправки sms

okCommand := createCommand('OK', CM_OK, 1);

//Объявляем форму

showForm;

//Добавляем на нее кнопку

addCommand(okCommand);

//Поле для ввода текста sms (начинаем вводить с +7)

TextSMS := formAddTextField('Введите текст SMS', '', 100, TF_ANY);

//Поле для ввода номера абонента

PhoneNumber := formAddTextField('Введите номер телефона','',20, TF_PHONENUMBER);

//Пока пользователь не нажал кнопку <ОК>, отображаем ему форму

while (getClickedCommand <> okCommand) do delay(100);

//Если кнопка <ОК> нажата, то

//Получаем текст sms

s := formGetText(TextSMS);

//Получаем номер, на который уйдет sms

nomer := formGetText(PhoneNumber);

//Переключаемся обратно в режим рисования на канве

showCanvas;

setColor(255, 0, 0);

//Стираем все, что было нарисовано ранее

repaint;

//Пытаемся отправить sms

if not smsStartSend('sms://'+nomer, s) then

begin

//Если не получается, выводим сообщение

drawText('Не удается отправить SMS функцией smsStartSend!', 2, 2);

repaint;

delay(2000);

halt;

end;

//Если сообщение уходит, ждем

while smsIsSending do

begin

drawText('Идет отправка SMS...!', 5, 5);

repaint;

delay(500);

end;

//Проверяем, ушло ли sms

if not smsWasSuccessfull then

begin

repaint;

drawText('SMS не было отправлено!', 5, 5);

repaint;

delay(2000);

end;

end.

Полезные ресурсы

CD

На компакт-диске лежат полные исходные коды примеров программ, рассмотренных в статье, а также дистрибутив MIDLetPascal и эмулятора MidpX.

 

 

Содержание