Раздел 1. Введение
Wireless Toolkit (WTK) - это интегрированная среда разработки Java 2 Micro Edition (J2ME) приложений (более известных как мидлеты).
Этот документ содержит подробное пошаговое описание загрузки, инсталляции и настройки toolkit-а. Ниже достаточно подробно описаны процессы компиляции, предварительной проверки и создания MIDlet пакетов. Кроме этого будет показано, как реализовать загрузку мидлета с удаленного сервера, и как осуществить его проверку. Достаточно подробно будут рассмотрены возможности toolkit-а по обеспечению безопасности. В частности мы познакомимся с подписыванием мидлетов, созданием сертификатов и установкой разрешений. Наконец мы затронем некоторые другие возможности и особенности WTK, включая средства отладки.
Вам потребуются следующие компоненты:
В состав JDK входят Java компилятор и утилиты для создания Java архивов: JAR файлов. Работа со второй версией WTK требует установки JDK не младше 1.4. Скачать JDK можно здесь:
http://java.sun.com/products/jdk/1.4.1
В состав WTK входят IDE и библиотеки, необходимые для создания мидлетов. Вы можете совершенно бесплатно скачать и использовать WTK:http://java.sun.com/products/j2mewtoolkit
Примечание. В настоящее время доступна версия WTK для платформы Windows. В дальнейшем компания Sun обещает выпустить версии для Linux и Solaris.
При установке Java Development Kit (JDK) просто следуйте подсказкам инсталлятора и отвечайте на его вопросы. Вы можете выбрать каталог, куда следует установить JDK. Запомните путь к каталогу, он нам еще понадобится. При установке WTK инсталлятор попытается установить местоположение Виртуальной Машины Java (JVM); в случае неудачи, вам придется вручную указать каталог, куда вы установили JDK.
Инсталляция WTK не вызывает трудностей. Просто запустите самораскрывающийся архив и выберите папку для установки. Внимание! путь к этой папке не должен содержать пробелов.
Перейдите в папку WTK и запустите KToolbar. Вы должны увидеть такое окно:
Давай создадим новый проект. Щелкните по иконке New Project. Введите название проекта и имя класса мидлета, затем щелкните Create Project
Следующим шагом является настройка атрибутов нашего мидлета. Все атрибуты разделены на шесть групп. Давайте обсудим каждую из них.
Required attributes. Эти семь атрибутов необходимо задать перед созданием мидлета. Они будут в дальнейшем разделены между файлом манифеста JAR архива и дескриптором мидлета (текстовый файл с расширением JAD). Для нас разбор всех этих атрибутов не так уж важен. Прелесть интегральных сред состоит как раз в том, что мы можем не обращать внимание на мелочи. WTK самостоятельно заполнит эти атрибуты. В большинстве случаев вполне допустимо использовать значения по-умолчанию.
Optional attributes. Эти атрибуты задавать не обязательно. Они содержат дополнительную информацию о вашем мидлете.
User-defined attributes. Как разработчику, вам могут понадобиться какие-нибудь уникальные атрибуты. Например, если Вы работаете над бурно развивающимся проектом, вам наверняка потребуется хранить его версию. Пример того, как это можно сделать, показан на следующем рисунке.
MIDlet attributes. Здесь можно задать атрибуты нашего мидлета. По умолчанию WTK заполняет поле для MIDlet-1 на основании введенной нами при создании проекта информации. Именно здесь хранится название проекта, его иконка и название класса мидлета. Иконку приложения следует поместить в папку images.
Push registry attributes. Вторая версия профиля MIDP 2.0 позволяет нашему мидлету соединяться с удаленными ресурсами. Здесь вы можете задать список удаленных адресов с которыми разрешено соединение. Более детально на этом вопросе мы остановимся позже.
Permission attributes. Согласно MIDP 1.0 спецификации мидлет должен использовать только библиотеки (API), которые были добавлены в мидлет пакет: такая модель получила название песочница (sandbox model). Согласно этой модели, мидлет не может использовать дополнительные функции (API), предоставляемые устройством. В MIDP 2.0 вводится концепция доверенных приложений (trusted applications), которая позволяет получить доступ к объектам вне песочницы. В этой секции вы можете определить, какие API будут доступны. Атрибуты, указанные в MIDlet-Permissions необходимы для запуска мидлета. А указанные в MIDlet-Permissions-opt - являются дополнительными.
Приведенный ниже листинг иллюстрирует использование компонентов List и Ticker.
Внимательно прочитайте код и постарайтесь его понять. Мы должны откомпилировать этот код, а затем выполнить его предварительную проверку. Откройте какой-нибудь текстовый редактор и воспроизведите в нем приведенный ниже листинг. О том, куда нужно сохранить полученный таким образом файл я расскажу позже.
/*-------------------------------------------------- * TickerDemo.java *-------------------------------------------------*/ import javax.microedition.midlet.*; import javax.microedition.lcdui.*; publicclass TickerDemoextends MIDlet implements CommandListener { private Display display;// Reference to Display object privateList lsProducts;// Main productlist private Ticker tkSale;// Ticker of what's on sale private Command cmExit;// Command to exit the MIDlet public TickerDemo() { display= Display.getDisplay(this); cmExit=new Command("Exit", Command.SCREEN,1); tkSale=new Ticker("Current Sale: Torchiere Lamp only$29.00"); lsProducts=newList("Products", Choice.IMPLICIT); lsProducts.append("Floor Lamp",null); lsProducts.append("Chandelier",null); lsProducts.addCommand(cmExit); lsProducts.setCommandListener(this); lsProducts.setTicker(tkSale); } public void startApp() { display.setCurrent(lsProducts); } public void pauseApp() { } public void destroyApp(boolean unconditional) { } public void commandAction(Command c, Displayable s) { if(c== cmExit) { destroyApp(true); notifyDestroyed(); } } }
Сохраните исходный код файл TickerDemo.java в папку С:\WTK20\apps\TickerDemo\src\. Конечно вместо C:\WTK20 необходимо использовать папку, куда вы установили WTK. Как вы уже, наверное, догадались, подкаталог src служит для хранения исходников проекта.
После того, как файл сохранен, щелкните кнопку Build на панели инструментов KToolbar-а. В результате будет вызван Java компилятор и осуществлена предварительная проверка проекта. Если не возникло никаких ошибок, Вы можете запустить проект, нажав кнопку Run.
Если Вы предварительно установили на своем компьютере какой-либо MIDP софт (отличный от WTK), то вероятно вы увидите в окне KToolbar-а сообщения об ошибках (см. рисунок ниже). Чтобы устранить эти ошибки, Вы должны удалить переменную окружения MIDP-HOME и перезапустить WTK.
Как только Вы запустите мидлет, откроется менеджер приложений. В его окне Вы найдете название своего проекта с соответствующей иконкой.
Выберите свое приложение и нажмите Select. Мидлет запустится. Вы увидите бегущую строку вверху экрана (Tricker) и список (List) из двух позиций.
WTK 2.0 имеет очень полезную особенность: моделирует Over-the-air (OTA) provisioning. Это позволяет демонстрировать работу OTA функций: поиск и закачку мидлета с удаленного сервера.
В этом разделе мы рассмотрим все необходимые шаги для создания пакета мидлета, его поиска, загрузки и установки мидлета с удаленного ресурса. Выделим несколько последовательных этапов, которые нам предстоит преодолеть:
С помощью WTK создание JAR и JAD файлов не представляет трудности. Однако прежде чем сделать это, нам необходимо внести небольшие изменения в один из установленных нами атрибутов. Если Вы помните, мы присвоили атрибуту MIDlet-Jar-URL на вкладке Required свойств проекта значение TickerDemo.jar. В случае если мы хотим запустить наш мидлет с сервера, нужно изменить его на URL адрес нашего мидлета. У меня на машине установлен локальный сервер Tomcat, и адрес мидлета на этом сервере имеет вид:
http://localhost:8080/examples/midp20/TickerDemo.jar
Замечание. Я рекомендую вам установить либо Apache либо Tomcat. Оба эти локальных сервера абсолютно бесплатны и хорошо документированы.
Итак, мы исправили все необходимые атрибуты и можем приступать к созданию пакета. Это очень просто. Вам надо кликнуть на меню Project, выбрать строку Select Package и щелкнуть по Create Package. Все. Упаковка займет несколько секунд.
Чтобы указать менеджеру приложений, какие файлы можно загрузить с сервера, мы должны создать простой HTML файл:
<html>
<head>
<title>TickerDemo</title>
</head>
<body>
<a href="/http://localhost:8080/examples/midp20/TickerDemo.jad">TickerDemo</a>
</body>
</html>
Загоните этот текст в редактор и сохраните его в файл с именем TickerDemo.html. Осталось загрузить файлы на сервер.
В подкаталоге bin каталога нашего проекта вы найдете файлы, которые создал для нас WTK. Загрузим файлы TrickerDemo.jar, TrickerDemo.jad и TrickerDemo.html на наш сервер. Как Вы помните, атрибут MIDlet-Jar-URL имеет значениеhttp://localhost:8080/examples/midp20/TickerDemo.jar. Это означает, что нам нужно скопировать файлы в папку examples\midp20 нашего сервера. Как только файлы окажутся на месте, мы сможем загружать мидлет с нашего сервера.
Итак, давайте еще раз вспомним, что мы сделали.
Теперь настало время запустить эмулятор и найти, загрузить, установить и выполнить наш мидлет.
Для начала откройте меню и щелкните по Run via OTA. В результате запустится эмулятор, в окне которого Вы должны увидеть следующее изображение:
Чтобы запустить менеджер приложений, выберите Apps. В открывшимся окне менеджера Вы найдете лишь одну строку: Install Application. Запустите программу, нажав на кнопку Menu в правом нижнем углу экрана. Когда меню высветится, выберите Launch.
Настало время ввести адрес страницы на нашем Web сервере. Введитеhttp://localhost:8080/examples/midp20/TickerDemo.html, затем нажмите menu и выберите пункт Go. Устройство установит соединение с сервером и загрузит HTML файл. Вы увидите следующее сообщение:
Как только загрузка будет окончена, менеджер приложений выведет список мидлетов, доступных для скачивания. В нашем случае будет присутствовать только TickerDemo.jad. Выберите его и нажмите кнопку Install в правом нижнем углу экрана. Обратите внимание на то, что сначала должен быть загружен именно JAD файл. Подробнее об этом читайте ниже.
После загрузки JAD файла менеджер проектов покажет версию и размер JAR архива мидлета, а также некоторую другую полезную информацию. Теперь вам понятно почему менеджер проектов не загрузил JAR файл сразу? Он мог оказаться слишком большим или у вас могла быть установлена более новая версия этого мидлета. Менеджер спросит, надо ли продолжать установку.
Нажмите кнопку Install в нижнем правом углу экрана, чтобы загрузить JAR файл.
Как только загрузка завершится, менеджер проверит содержание загруженного пакета, и если все правильно, то позволит запустить мидлет.
Теперь в окне менеджера проектов появилась еще одна строка: TickerDemo. Нажмите кнопку Menu и выберите пункт Launch, чтобы запустить мидлет. Как видите все прошло успешно.
Как упоминалось ранее, все мидлеты по спецификации MIDP 1.0 работали, используя модель безопасности под названием "песочница" (sandbox). То есть, мидлеты могли получить доступ к API, являющимся частью MIDP спецификации (например, компоненты пользовательского интерфейса) или библиотек, включенных в мидлет. Таким образом, не было возможности получить доступ к специфическим функциям устройства.
MIDP 2.0 построена на концепции недоверенных и доверенных приложений. Недоверенные приложение полностью соответствуют модели MIDP 1.0 со всеми ее ограничениями. Доверенные мидлеты могут получить доступ к внешним функциям. Например, телефон может предоставлять функции для работы с адресной книгой.
Далее речь пойдет о том, как можно с помощью WTK получить доступ к этим специфическим функциям.
Система безопасности мидлета работает подобно ореховой скорлупе. Область защиты (protection domain) определяет что может использовать мидлет (в рамках данной области). Владелец области решает кто может получить доступ к защищенным функциям. Он также определяет что считать доверенным мидлетом. Идентификация доверенного мидлета осуществляется согласно X.509 Public Key Infrastructure (PKI) сертификату.
Таким образом, мидлет должен уметь генерировать PKI сертификат. Этот процесс получил название подпись (signing). Как только мидлет окажется подписанным, устройство сможет проверить подпись и предоставить доступ к защищенным функциям.
Очевидно, вопрос безопасности не относится к разряду простых. Цель данной статьи научить Вас использовать WTK, а не воспитать эксперта по безопасности. Мы затронем лишь те вопросы и приемы, которые могут пригодиться на практике.
В установках продукта сертификат должен генерироваться специально уполномоченным центром. В нашем случае, можно генерировать сертификат для эмуляции создания подписанного мидлета.
Шаг 1. Мы будем использовать созданный нами ранее проект TickerDemo. Упакуйте мидлет, создав JAR и JAD файлы. Для этого откройте проект, выберите пункт Project в меню KToolbar-а и нажмите на Create Package.
Шаг 2. Выберите пункт меню File. Щелкните по Utilities. В открывшемся диалоге выберите Sign MIDlet. Обратите внимание на диапазон дат, когда сертификат считается действительным.
Valid from Sun Jan 05 04:26:34 CST 2003 to Tue Oct 11 05:26:34 CDT 2005
Мы вернемся к этому опросу позже, когда будем проверять сертификат на устройстве.
Шаг 3. Нажмите кнопку Sign MIDlet Suite на верхней панели.
Скопируйте новые JAD и JAR файлы на наш Web сервер. Выберите в меню KToolbar-а пункт Project, а затем Run via OTA. В появившемся окне введите URL нашего мидлета (точно так же как мы это делали в предыдущем разделе).
http://localhost:8080/examples/midp20/TickerDemo.html
Установите и выполните мидлет.
Итак, чем же отличается этот процесс от проделанного ранее, когда мидлет не был подписан? Все выглядит так, будто подписание мидлета это просто упражнение. Пока менеджер приложений проверяет мидлет, Вы видите незамысловатое сообщение на экране телефона: Verifying the application ... Оно создает впечатление, что проверка действительно происходит. Давайте выясним так ли это.
Если вы помните, то при подписи мидлета мы использовали строку:
Valid from Sun Jan 05 04:26:34 CST 2003 to Tue Oct 11 05:26:34 CDT 2005
Если мы установим на компьютере дату, выходящую за пределы этого промежутка, то при загрузке мидлета (опять через OTA) мы должны получить сообщение о том, что срок действия сертификата иссек. Давайте проверим так ли это:
Все будет идти прекрасно до момента проверки сертификата. На этом шаге Вы получите сообщение, что его срок действия иссек:
Как видите, WTK действительно проверяет сертификаты, а не просто выводит красивую картинку.
Вы можете задаться вопросом: А что же WTK делал, когда мы тестировали неподписанную версию мидлета, и почему не появилось сообщение об ошибке? Даже если мидлет не подписан, он должен проверяться. В этом случае просто проверяется, соответствует ли размер JAR архива указанному в JAD файлы и синхронизирован ли JAD с манифестом.
Стоит упомянуть еще один важный пункт. Предыдущий пример просто демонстрировал средства конфигурирования настроек безопасности. До сих пор мы не пытались воспользоваться защищенными функциями. На практике при конфигурировании требуется проделать дополнительный шаг: обозначить используемые нами защищенные ресурсы.
Перед тем как приступить к настройке нашей системы, давайте рассмотрим два варианта задания разрешений: вручную и с помощью WTK.
Wireless Toolkit предоставляет набор утилит для настройки разрешений.
Все введенные здесь разрешения будут добавлены в JAD файл. Вы могли сделать это и вручную в любом текстовом редакторе.
В этом разделе мы только коснулись возможностей WTK по настройке безопасности. Если Вы собираетесь распространять свои приложения, вам стоит более близко познакомиться с этой темой. Незаменимым подспорьем здесь будет документация, поставляемая вместе с WTK.
MIDP 2.0 включает поддержку уведомления о входящем соединении. Основная идея заключается в том, что при попытке входящего соединения установить связь с мидлетом, он может быть оповещен менеджером проектов. Если мидлет уже запущен, то соединение будет установлено. Если мидлет не активен, менеджер приложений запустит его, с помощью метода startApp().
Для того чтобы мидлет обрабатывал входящее соединение, он должен зарегистрировать список действительных связей. Это можно сделать, добавляя соответствующие строки в JAD файл, или запустив мидлет и вызвав метод registerConnection().
При добавлении новой записи в список соединений через JAD файл, Вы должны использовать следующий формат:
MIDlet-Push-<n>: <ConnectionURL>, <MIDletClassName>, <AllowedSender>
где:
Чтобы не быть голословным, рассмотрим несколько примеров:
MIDlet-Push-1: socket://:88, Chatterbox, *
MIDlet-Push-2: datagram://:50000, Chatterbox, *
Эти строки говорят, что мидлет Chatterbox будет обрабатывать соединения через socket и datagram через указанные порты от всех отправителей.
Чтобы настроить список разрешенных внешних соединений с помощью WTK надо:
Этот краткий обзор лишь затронул работу с входящими соединениями. Согласно политике безопасности, менеджер приложений обеспечивает полную проверку мидлета, в том числе на способность быть запущенным в ответ на входящие соединение. Сама по себе эта возможность очень привлекательна и интересна.
Спецификация MIDP 2.0 не поддерживает радио сообщения (такие как SMS). Однако, поскольку API радио сообщений (Wireless Message API - WMA) является дополнительным пакетом для J2ME, WTK позволяет разрабатывать мидлеты использующие WMA.
Вы можете настроить WMA следующим образом:
Для того чтобы включить поддержку Wireless Messaging API, поставьте на соответствующем поле галочку.
При разработке мидлета, использующего радио сообщения, доступны несколько опций, которые могут помочь провести его тестирование.
Хотя мы и не имеем возможность привести в этом документе полноценный пример, следующий диалог показывает возможный вариант настройки эмулятора для отправки и получения сообщений между устройствами (фактически сообщения передаются между несколькими открытыми эмуляторами). Эта возможность незаменима при разработке приложений, поддерживающих соединение между устройствами.
Mobile Media API (MMA) поддерживается J2ME устройствами с расширенными возможностями по воспроизводству звука. Для устройств с ограниченными звуковыми возможностями, MIDP включает поднабор MMA.
WTK позволяет разрабатывать приложения как с использованием полной версии MMA, так и с урезанным API, входящим в состав MIDP 2.0 спецификации. Выбрать один из этих вариантов можно в Preferences меню.
Здесь Вы можете указать, стоит ли использовать MMA или достаточно возможностей MIDP 2.0 API.
Вы также можете выбрать поддерживаемые форматы звука и дополнительные аудио функции. Для этого перейдите на вкладку MMedia. Названия говорят сами за себя.
В силу того, что мощность телефонных процессоров оставляет желать лучшего, графические возможности в MIDP 1.0 были существенно ограничены. Это привело к тому, что разработчики игр вынуждены были изобретать велосипед. В MIDP 2.0 это упущение было устранено. В состав MIDP 2.0 был добавлен игровой API, который предоставлял более широкие графические возможности и состоял из следующих классов:
В дополнение к игровым расширениям, MIDP 2.0 поддерживает представление рисунков в виде массива целых чисел. Это позволяет получить прямой доступ к изображению и редактировать его в памяти телефона.
С помощью WTK вы можете следить за ходом выполнения вашего приложения: просматривать используемую память, сетевой трафик и время выполнения методов. Для реализации этих возможностей необходимо проделать следующие шаги:
Когда вы запустите мидлет, вместе с эмуляторам будут открыты дополнительные окна (по одному на каждый помеченный вами тип мониторинга).
С помощью этого монитора, вы можете просматривать сетевой трафик между вашим мидлетом и удаленным ресурсом. Просмотр возможен для протоколов HTTP, HTTPS,
datagrams, sockets, SSL, comm, SMS, и CBS. Монитор отображает как входящие, так и исходящие сообщения. Вы также можете использовать различные фильтры, чтобы ограничить поток выводимой информации.
С помощью этого монитора Вы можете узнать сколько памяти использует ваше приложение. Возможно представление информации в виде графика или в виде таблицы, где показано распределение памяти по объектам.
С помощью этого монитора можно узнать сколько времени занимает выполнение того или иного метода. Этот монитор незаменим при оптимизации программы. Он позволяет быстро находить слабые места приложения.
Как Вы могли убедиться, WTK поддерживает все функциональные возможности спецификации MIDP 2.0. Ниже приведен список не упомянутых нами возможностей:
Wireless Toolkit прекрасно подходит на роль отправного пункта для J2ME разработчика. В этом документе было показано как списать и установить Wireless Toolkit, как с его помощью создать простейший мидлет. Большая часть была отведена под over-the-air (OTA) provisioning, позволяющий эмулировать процессы загрузки и установки мидлета с удаленного web сервера на устройство.
В Wireless Toolkit 2.0 были существенно расширены возможности по настройке параметров безопасности проекта. В рамках данного документа мы создали подписанный мидлет и проверили подлинность подписи через OTA provisioning. Мы также затронули вопрос настройки WTK для работы с защищенным API.
В WTK 2.0 была добавлена поддержка регистрации, радио сообщений, аудио и игрового API. Мы коротко рассмотрели их основные возможности.
В рамках документа был затронут вопрос осуществления мониторинга за ходом выполнения приложения.
Вы познакомились с основными возможностями среды WTK, теперь вы можете сосредоточить свои усилия на изучении MIDP API и написании кода. Удачи в этом нелегком, но интересном деле!