64
1 Государственное образовательное учреждение высшего профессионального образования «Московский государственный технический университет имени Н.Э. Баумана» Калужский филиал Факультет фундаментальных наук Кафедра «Программного Обеспечения ЭВМ, Информационных Технологий и Прикладной Математики» РАСЧЕТНО-ПОЯСНИТЕЛЬНАЯ ЗАПИСКА К КУРСОВОЙ РАБОТЕ ПО КУРСУ «ВЫЧИСЛИТЕЛЬНЫЕ КОМПЛЕКСЫ И СЕТИ» Тема: «Удаленное управление компьютером с использованием мобильного телефона и технологии Bluetooth – клиентская часть на мобильном телефоне» Студент Фам Хонг Куан (___________) Группа ИТД – 81 Преподаватель Вершинин Е. В. (___________) Калуга – 2006

BlueTooth Control

Embed Size (px)

DESCRIPTION

Control the computer using smartphone with technology BlueTooth.

Citation preview

Page 1: BlueTooth Control

1

Государственное образовательное учреждение высшего профессионального образования «Московский государственный технический университет имени

Н.Э. Баумана»

Калужский филиал

Факультет фундаментальных наук Кафедра «Программного Обеспечения ЭВМ, Информационных Технологий и

Прикладной Математики»

РАСЧЕТНО-ПОЯСНИТЕЛЬНАЯ ЗАПИСКА К КУРСОВОЙ РАБОТЕ ПО КУРСУ «ВЫЧИСЛИТЕЛЬНЫЕ КОМПЛЕКСЫ И СЕТИ»

Тема: «Удаленное управление компьютером с использованием мобильного телефона и технологии Bluetooth – клиентская часть на мобильном телефоне»

Студент Фам Хонг Куан (___________) Группа ИТД – 81 Преподаватель Вершинин Е. В. (___________)

Калуга – 2006

Page 2: BlueTooth Control

2

Аннотация

Нашу жизнь сегодня невозможно представить без компьютеров. Они везде:

дома и на работе, в кафе и ресторанах, гостиницах и аэропортах…

А где компьютеры, там и провода. Клавиатуры, мыши, мониторы и вообще

вся периферия подключаются к компьютеру посредством проводов. А где

провода, там и проблемы. Сколько раз, проклиная всё на свете, я распутывал

полтора десятка проводов, соединяющих различную периферию с моим

электронным другом.

Bluetooth дает новые возможности: вы можете обмениваться информацией,

синхронизировать различные устройства, выходить в Интернет,

присоединяться к локальным сетям, управлять бытовой техникой и даже

автомобилем, используя только устройство, оснащённое Bluetooth (например,

мобильный телефон или карманный персональный компьютер) и совершенно

не используя провода.

В этой работе, мы использовали технологию Bluetooth для другой цели –

удаленное управление компьютера с использованием смартфона. И

смартфон, и компьютер должны поддержать Bluetooth.

Page 3: BlueTooth Control

3

Содержание

I. ТЕХНИЧЕСКОЕ ЗАДАНИЕ ........................................................................... 5

1.1 Наименование ............................................................................................ 5

1.2 Основание для разработки........................................................................ 5

1.3 Исполнитель............................................................................................... 5

1.4 Требования к приложению ....................................................................... 5

1.4.1 Требование к устройству ................................................................... 5

1.4.2 Требования к программному обеспечению ..................................... 5

II. ИССЛЕДОВАТЕЛЬСКАЯ ЧАСТЬ ............................................................. 6

2.1. Введение ..................................................................................................... 6

2.2. Технология Bluetooth ................................................................................ 6

2.2.1. Что такое Bluetooth............................................................................. 6

2.2.2. История Bluetooth ............................................................................... 6

2.2.3. Как работает Bluetooth ....................................................................... 7

2.2.4. Стек Bluetooth протоколов ................................................................ 9

2.2.5. Профили............................................................................................. 11

2.2.6. Bluetooth устройства и сети ............................................................. 12

2.3. J2ME и Bluetooth API for Java (JSR 82) ................................................. 13

2.3.1. Что такое J2ME ................................................................................. 13

2.3.2. MIDlet модель Java приложения ..................................................... 14

2.3.2.1. Жизненый цикл MIDlet-а .......................................................... 14

2.3.2.2. Контекст MIDlet-а...................................................................... 16

2.3.3. Java Bluetooth API (JSR 82).............................................................. 18

2.3.3.1. Организация и пакеты ............................................................... 18

2.3.3.2. Анатомия MIDlet-ов, использующих JSR 82.......................... 20

2.3.3.3. Использование Java APIs for Bluetooth.................................... 20

2.4. WidComm драйвер для USB Bluetooth adapter и набор развития BTW

21

2.4.1. WidComm драйвер для USB Bluetooth adapter ............................. 21

Page 4: BlueTooth Control

4

2.4.2. Набор для разработки BTW (Bluetooth for Windows Software

Development Kit) ............................................................................................. 21

III. КОНСТУКТОРСКАЯ ЧАСТЬ ................................................................... 24

3.1 Введение ................................................................................................... 24

3.2 Структура программы ( Клиентская часть ) ......................................... 24

3.2.1 Общая цель ........................................................................................ 24

3.2.2 Классы программы ........................................................................... 24

3.2.2.1 MgtuBtControl (Файл MgtuBtControl.java).................................. 24

3.2.2.2 BtDevices (Файл BtDevices.java) .................................................. 24

3.2.2.3 BtMenu ( Файл BtMenu.java ) ....................................................... 25

3.2.2.4 BtFolder ( Файл BtFolder.java )..................................................... 25

3.2.2.5 BtWinMedia (Файл BtWinMedia.java) ......................................... 25

3.2.2.6 BtWinAMP ( Файл BtWinAMP.java ) .......................................... 25

3.2.2.7 BtPowerPoint ( Файл BtPowerPoint.java ) .................................... 25

3.2.2.8 BtMouse ( Файл BtMouse.java ) .................................................... 25

IV. ТЕХНОЛОГИЧЕСКАЯ ЧАСТЬ ................................................................ 26

4.1. Введение ................................................................................................... 26

4.2. Руководство программиста .................................................................... 26

4.3. Руководство пользователя ...................................................................... 26

V. ЛИТЕРАТУРА ................................................................................................ 38

Page 5: BlueTooth Control

5

I. ТЕХНИЧЕСКОЕ ЗАДАНИЕ

1.1 Наименование

Удаленное управление компьютера с использованием мобильного

телефона через технологию Bluetooth (клиентская часть на мобильном

телефоне).

1.2 Основание для разработки

Выпускная работа бакалавра

1.3 Исполнитель

Студент КФ МГТУ им. Баумана, факультета ФНК, группы ИТД – 81,

Фам Хонг Куан.

1.4 Требования к приложению

1.4.1 Требование к устройству

Мобильный телефон или PDA должен поддерживать J2ME (Java 2 for

micro environment) и JSR 82 (Java Bluetooth APIs) .

1.4.2 Требования к программному обеспечению

• Windows 95/98/2000/XP.

• 128M RAM.

• 612 Мбайт свободного места на жестком диске.

Page 6: BlueTooth Control

6

II. ИССЛЕДОВАТЕЛЬСКАЯ ЧАСТЬ

2.1.

2.2.

Введение

Для того чтобы создать приложение, мы должны разобраться в

следующих концепциях:

• Технология Bluetooth

• J2ME и JSR 82

• WIDCOMM драйвер для USB Bluetooth adapter

Технология Bluetooth

2.2.1. Что такое Bluetooth

Bluetooth - это радиотехнология (радио-интерфейс) малой мощности,

разработанная с целью замены существующих кабельных соединений

персональных офисной и бытовой техники с широким спектром переносных

устройств.

2.2.2. История Bluetooth

В начале 1998 года Ericsson, IBM, Intel, Toshiba и Nokia - крупнейшие

компании компьютерного и телекоммуникационного рынка - объединились

для совместной разработки технологии беспроводного соединения

мобильных устройств. 20 мая 1998 года произошло официальное

представление специальной рабочей группы (SIG - Special Interest Group),

призванной обеспечить беспрепятственное внедрение технологии,

получившей название Bluetooth. Вскоре в группу вошли 3COM/Palm, Axis

Communication, Motorola, Compaq, Dell, Qualcomm, Lucent Technologies, UK

Limited, Xircom. Сейчас группа включает в себя более 1400 компаний,

принимающих участие в работе над бесплатной открытой спецификацией

Bluetooth. Благодаря простоте и изяществу этой технологии, многие

специалисты уверены, что Bluetooth не имеет конкуренции в области

Page 7: BlueTooth Control

7

создания небольших локальных сетей и беспроводного объединения

устройств в пределах дома, офиса или, скажем, машины.

В отличие от технологии инфракрасной связи IrDA (Infrared Direct

Access), работающей по принципу "точка-точка" в зоне прямой видимости,

технология Bluetooth разрабатывалась для работы как по принципу "точка-

точка", так и в качестве многоточечного радиоканала, управляемого

многоуровневым протоколом, похожим на протокол мобильной связи GSM.

Bluetooth стала конкурентом таким технологиям, как IEEE 802.11, HomeRF и

IrDA, хотя последняя и не предназначена для построения локальных сетей,

но является самой распространенной технологией беспроводного соединения

компьютеров и периферийных устройств.

Основной идеей новой технологии было предоставление возможности

легкого и удобного беспроводного соединения различных устройств и

организации беспроводной локальной сети. Технология должна позволить

пользователю организовывать обмен информацией и голосом между

всевозможными устройствами, например настольным компьютером, КПК и

сотовым телефоном. В перспективе, технология позволит объединять любые

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

новой технологии должны были стать низкая стоимость устройства связи - в

пределах 20 долларов, соответственно небольшие размеры (ведь речь идет о

мобильных устройствах) и, что немаловажно, совместимость, простота

встраивания в различные устройства. Собственно ради этого и была

организована группа SIG, которая, помимо всего прочего, позволила

множеству производителей объединиться, а не разрабатывать собственные,

несовместимые друг с другом платформы.

2.2.3. Как работает Bluetooth

Технология использует небольшие приемопередатчики малого радиуса

действия, либо непосредственно встроенные в устройство, либо

подключаемые через свободный порт или PC-карту. Адаптеры работают в

Page 8: BlueTooth Control

8

радиусе 10 метров и, в отличие от IrDA, не обязательно в зоне прямой

видимости, то есть, между соединяемыми устройствами могут быть

различные препятствия, или стены.

Устройства, использующие стандарт Bluetooth, функционируют в

диапазоне 2,45 ГГц ISM (Industrial, Scientific, Medical - промышленный,

научный и медицинский диапазон) и способны передавать данные со

скоростью до 720 кбит/с на расстояние до 10 метров и передачу 3 голосовых

каналов. Такие показатели достигаются при использовании мощности

передачи 1 мВт и задействованном механизме переключения частоты,

предотвращающем интерференцию. Если принимающее устройство

определяет, что расстояние до передающего устройства менее 10 м, оно

автоматически изменяет мощность передачи до уровня, необходимого при

данном расположении устройств. Устройство переключается в режим

экономии энергии в том случае, когда объем передаваемых данных

становится мал или передача прекращается.

Технология использует FHSS - скачкообразную перестройку частоты

(1600 скачков/с) с расширением спектра. При работе передатчик переходит с

одной рабочей частоты на другую по псевдослучайному алгоритму. Для

полнодуплексной передачи используется дуплексный режим с временным

разделением (TDD). Поддерживается изохронная и асинхронная передача

данных и обеспечивается простая интеграция с TCP/IP. Временные

интервалы (Time Slots) развертываются для синхронных пакетов, каждый из

которых передается на своей частоте радиосигнала.

Энергопотребление устройств Bluetooth должно быть в пределах 0.1

Вт. Каждое устройство имеет уникальный 48-битовый сетевой адрес,

совместимый с форматом стандарта локальных сетей IEEE 802.

Диапазон 2.45 ГГц является не лицензируемым и может свободно

использоваться всеми желающими. Управляет им лишь Федеральная

комиссия по коммуникациям (FCC - Federal Communication Commission),

ограничивая часть диапазона, которую может использовать каждое

Page 9: BlueTooth Control

9

устройство. Беда в том, что этих устройств стало очень много - начиная от

беспроводных сетей, поддерживающих стандарты 802.11 и 802.11b и

устройств Bluetooth и вплоть до микроволновых печей! Сейчас комиссия

рассматривает просьбу увеличить используемый диапазон для Home RF

(спецификация, используемая в аудио- и видеотехнике). Это увеличение

может повлиять на другие устройства, работающие в этом диапазоне,

количество которых увеличивается. При этом FCC заявила, что

использование не лицензируемой частоты несет несомненный риск и не

исключена возможность помех и конфликтов между устройствами. Фирмы,

поддерживающие технологи беспроводных сетей, в том числе и Bluetooth,

активно протестуют против увеличения диапазона Home RF.

Устройства стандарта Bluetooth способны соединяться друг с другом,

формируя пикосети, в каждую из которых может входить до 256 устройств.

При этом одно из устройств является ведущим (Master), еще семь - ведомыми

(Slave), остальные находятся в дежурном режиме. Пикосети могут

перекрываться, а к ресурсам ведомых устройств может быть организован

доступ. Перекрывающиеся пикосети могут образовать распределенную сеть,

по которой могут мигрировать данные.

2.2.4. Стек Bluetooth протоколов

Стек Bluetooth протоколов состоит из двух частей: контроллера,

который, как правило, имеет аппаратную реализацию, и on-host стека с

которым, собственно, и взаимодействуют приложения. На рисунке показаны

Bluetooth протоколы.

Page 10: BlueTooth Control

10

Основное внимание в этой статье уделено верхним уровням стека

Программных протоколов. Он состоит из следующих уровней:

• Host Controller Interface (HCI) - Это самый низкий уровень стека

Программных протоколов. Он непосредственно взаимодействует с

Bluetooth контроллером.

• Logical Link Control and Adaptation Layer (L2CAP) - На этом уровне

происходит сегментация и сборка пакетов, мультиплексирование

протокола, обеспечивается качество управляющей информации.

• Service Discovery Protocols (SDP) - этот протокол используется для

поиска доступных Bluetooth устройств.

• RFCOMM - Обеспечивает последовательную передачу данных

через Bluetooth, другими словами, ведет себя аналогично обычному

последовательному порту (COM).

• Object Exchange Protocol - протокол позаимствован у Infrared Data

Association (IrDA). Он позволяет легко обмениваться такими объектами,

как vCard и vCalendar, выполнять синхронизацию данных.

Page 11: BlueTooth Control

11

2.2.5. Профили

Чтобы обеспечить совместимость между устройствами, Bluetooth

профили определяют возможность некого нейтрального устройства. Сам по

себе термин профиль означает набор функций и возможностей, которые

использует Bluetooth в качестве механизма транспортировки. Профили

гарантируют возможность обмена информацией между устройствами разных

производителей. Bluetooth SIG определяет несколько стандартных профилей:

• Generic Access Profile (GAP) - определяет использование стека

протоколов нижнего уровня, включая функции управления устройством.

Все реализации Bluetooth осуществляют GAP.

• Service Discover Application Profile (SDAP) - описывает

специфические приложения и использование SDP, доступность и аспекты

пользовательского интерфейса процесса поиска других устройств,

использование L2CAP и низких слоев для обеспечения режима поиска.

• Serial Port Profile (SPP) - определяет для RFCOMM, L2CAP, SDP, и

других слоев низкого уровня, требования взаимодействия и возможности

для эмуляции последовательного кабеля.

• Dial-up Networking Profile (DUNP) - определяет требования

обеспечения взаимодействия для GAP и SPP, а также для телефонных

звонков, контролирует возможность устройства работать в режиме

телефона.

• Generic Object Exchange Profile (GOEP) - определяет для OBEX,

SPP и GAP требования к взаимодействию и способности OBEX для

передачи файлов, размещения объектов и синхронизации.

• Object Push Profile (OPP) - определяет требования к

пользовательскому интерфейсу, использование OBEX, SDP и способности

размещать объекты для контента в форматах vCard, vCalendar, vNote и

vMessage.

Page 12: BlueTooth Control

12

• File Transfer Profile (FTP) - определяет требования к

пользовательскому интерфейсу, а также взаимодействие и использование

GOEP, OBEX и SDP.

• Synchronization Profile (SP) - определяет требования к

пользовательскому интерфейсу, а также взаимодействие и использование

GOEP, OBEX и SDP в режиме, аналогичном IrMC синхронизации.

Sony Ericsson P900 поддерживает следующие Bluetooth профили:

• Generic Access Profil

• Serial Port Profile

• Dialup Networking Pr

• Generic Object Excha

• Object Push Profile

• Headset Profile

• File Transfer Profile

2.2.6. Bluetooth устройства и сети

Bluetooth устройства используют уникальные IEEE 802 48-bit адреса.

Когда два или более Bluetooth устройства соединяются, они образуют

структуру, известную под названием Piconet. Это динамическая сеть, в

которой одно из устройств выступает в роли мастера (Master), а все другие

(до семи устройств) в роли клиентов (Slave). Клиенты могут участвовать в

различных Piconet сетях. Если два мастера соединяются, они образуют

перекрывающийся Piconet, известный как Scatternet. На представленном

рисунке Piconet мастер одной сети подключился к клиенту другой Piconet

сети.

Page 13: BlueTooth Control

13

Bluetooth поддерживает один канал данных и три (максимум)

голосовых канала. Максимальная скорость передачи данных составляет 720

килобит в секунду. Теоретически, радиус действия Bluetooth устройств

составляет около 100 метров. Радиус Sony Ericsson P900/P908 - примерно 10

метров.

2.3. J2ME и Bluetooth API for Java (JSR 82)

2.3.1. Что такое J2ME

В 1999 году Sun Microsystems представила всему миру новую

программную технологию, предназначенную для создания приложений,

работающих на мобильных устройствах — сотовых телефонах, КПК и др.

J2ME (Java 2 Micro Edition) - это не отдельная спецификация конкретного

программного обеспечения. Это набор технологий и спецификаций,

предназначенных для различных частей рынка небольших пользовательских

электронных устройств. Основная часть платформы J2ME состоит из двух

конфигураций: Connected Device Configuration (CDC) и Connected Limited

Device Configuration (CLDC). Конфигурация определяет центральные

библиотеки технологии Java и возможности Java Virtual Machine.

Конфигурация CDC предназначена для портативных устройств типа high-end,

например, коммуникаторов. Конфигурация CLDC создана для недорогих

Page 14: BlueTooth Control

14

портативных устройств, таких как популярные модели мобильных

телефонов. Специальные режимы позволяют определять функциональность

конфигураций для различных типов устройств. Режим Mobile Information

Device Profile (MIDP) предназначен для основанных на CLDC портативных

устройств с возможностью коммуницировать - к таким устройствам

относятся мобильные телефоны. Режим MIDP определяет функциональность

- работу пользовательского интерфейса, сохранение настроек, работу в сети и

модель приложения. CLDC и MIDP закладывают основу реализации J2ME.

2.3.2. MIDlet модель Java приложения

MIDlet – это разновидность MIDP (Mobile Information Device Profile)

Java приложения, предназначенное для работы на различных мобильных

устройствах.

Особенностью программной модели MIDlet-а является возможность

вмешательства операционной системы в ход выполнения программы. То есть

работа вашего приложения может быть прервана в любой момент каким-

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

обстоятельство требует постоянного контроля системы над ходом

выполнения программы. Реализуется этот контроль с помощью

специального, встроенного в телефон управляющего софта, называемого

AMS (Application-Management Software) - программа управления

приложениями. Вообще, AMS контролирует весь жизненный цикл

приложения: от установки и обновления до удаления программного

обеспечения.

2.3.2.1. Жизненый цикл MIDlet-а

Если вы уже программировали на Java, то знаете, что в каждой

программе должен присутствовать метод main(), с запуска которого и

начинается ее работа. Однако, поскольку MIDlet это не простое Java

приложение, Вам не придется писать этот метод. Он уже реализован и входит

в пакет javax.microedition.midlet.MIDlet. Вместо него предлагается

Page 15: BlueTooth Control

15

использовать три других, необходимых для работы MIDlet приложения,

метода: startApp(), pauseApp() и destroyApp().

Запущенное MIDlet приложение может находиться в трех возможных

состояниях:

• paused: MIDlet запущен, но не активен.

• active: MIDlet активен.

• destroyed: MIDlet был остановлен, и он готов к запуску

уборщика мусора.

Рассмотрим жизненный цикл MIDlet-а. AMS запускает его в ответ на

команду пользователя. На практике это обычно выглядит как выбор

пользователем одного из установленных на телефоне приложений.

Первоначально, MIDlet находится в соостоянии paused. Прежде чем

перейти в активный режим, он должен выполнить инициализацию. MIDlet не

имеет специального инициализационного метода, поэтому все необходимые

для нее действия выполняются внутри startApp(). Таким образом, через

некоторое время после создания, AMS активизирует MIDlet и вызывает

метод startApp(), который создает и выводит на экран

пользовательский интерфейс приложения. MIDlet переходит из состояния

paused в active. При запуске возникли какие-нибудь ошибки, управление

передается методу javax.microedition.midlet.MIDletStateChangeException,

который непосредственно переключает MIDlet в состояние destroyed.

Если произошла деактивация и переход в состояние paused, MIDlet не

уничтожается, однако он должен освободить как можно больше системных

ресурсов. Если деактивация явилась результатом работы AMS, вызывается

метод pauseApp(). Если MIDlet деактивирует сам себя, то есть пользователь

завершает работу приложения, то pauseApp() не вызывается.

Уничтожение происходит когда MIDlet переходит в состояние

destroyed. Если причиной послужила работа AMS, то вызывается метод

destroyApp(). Метод имеет необязательный параметр типа boolean, который

Page 16: BlueTooth Control

16

определяет является ли уничтожение безусловным или необязательным. Если

MIDlet уничтожает сам себя, destroyApp() не вызывается.

Ниже приведен код каркаса MIDlet-a.

import javax.microedition.midlet.*;

public class BasicMIDlet extends MIDlet { public BasicMIDlet(){ // Конструктор }

protected void destroyApp( boolean unconditional ) throws MIDletStateChangeException { // Вызывается когда система уничтожает MIDlet }

protected void pauseApp(){ // Вызывается при переводе приложения в режим паузы. }

protected void startApp() throws MIDletStateChangeException { // Вызывается, когда приложение переводится в активный режим. } }

2.3.2.2. Контекст MIDlet-а

Класс java.microedition.midlet.MIDlet определяет методы, которые

позволяют MIDlet-у взаимодействовать с операциональным контекстом:

getAppProperty() возвращает значения инициализационных свойств;

resumeRequest() просит AMS реактивировать MIDlet; notifyPaused()

переводит MIDlet в состояние paused; notifyDestroyed() переводит MIDlet в

состояние destroyed.

Для правильного управления ресурсами, телефону необходима

некоторая инициализационная информация о приложении. Она должна

быть представлена в дескрипторе приложения (application descriptor

текстовый файл с расширением jad) или его манифесте (файл Manifest.MF).

Метод getAppProperty(), позволяет получить доступ к этой информации,

Page 17: BlueTooth Control

17

причем сначала опрашивается дескриптор, и если информация не найдена,

просматривается манифест. (MIDP 2.0 использует концепцию доверенных

(trusted) приложений, согласно которой метод getAppProparty() ищет

только манифест).

Остальные методы прямо затрагивают жизненный цикл MIDlet-а.

Переведенный в режим паузы MIDlet вызывает метод resumeRequest() для

реактивации. Активный MIDlet вызывает notifyPaused(), чтобы

деактивироваться. Активный или находящийся в состоянии паузы

MIDlet вызывает метод notifyDestroyed() для самоуничтожения. Помните, что

resumeRequest() просто просит AMS реактивировать MIDlet; ASM решает

надо ли это делать и если надо, то когда. Реактивация вызывает метод

startApp(). Матоды notifyPaused() и notifyDestroyed()

непосредственно осуществляют перевод MIDlet-а в новое состояние; как

следствие ни pauseApp() ни destroyApp не вызываются.

Ниже приведен более полный код каркаса MIDlet-а.

import javax.microedition.lcdui.*; import javax.microedition.midlet.*;

public class BetterMIDlet extends MIDlet {

private Display display;

public BetterMIDlet(){ }

protected void destroyApp( boolean unconditional ) throws MIDletStateChangeException { exitApp(); // вызывает уборщик мусора }

protected void pauseApp(){ // Сюда следует добавить код, который надо выполнять непосредственно // перед переводом приложения в режим паузы. }

protected void startApp() throws MIDletStateChangeException {

Page 18: BlueTooth Control

18

if( display == null ){ initApp(); // Определяет первоначальную инициализацию } // Сюда следует добавить код, который надо выполнять непосредственно // перед переводом приложения в активный режим. }

private void initApp(){ display = Display.getDisplay( this ); // Сюда добавляется код инициализации приложения }

public void exitApp(){ // добавит код "уборки мусора" notifyDestroyed(); // уничтожение MIDlet-а } }

terMidlet определяет initApp() - метод для первой инициализации и

exitApp() - метод для централизованного освобождения ресурсов.

удобства восприяния, все методы объединены в таблицу:

Методы, которые вызываются при изменении состояния MIDlet-а startApp() Переводит приложение в активное состояние. pauseApp() Переводит приложение в состояние паузы. destroyApp() Завершает работу приложения.

Методы управления состоянием MIDlet-а. notifyDestroyed() Запрос на завершение работы. notifyPaused() Запрос на дезактивацию и переход в состояние паузы. resumeRequest() Запрос на реактивацию и переход в активное состояние.

2.3.3. Java Bluetooth API (JSR 82)

2.3.3.1. Организация и пакеты

Java API for Bluetooth представляет собой дополнительный пакет для

Java Community Process (JSR-82). Этот дополнительный пакет предоставляет

Page 19: BlueTooth Control

19

разработчику общий API для работы с Bluetooth. На следующем рисунке

показано отношение между Java API for Bluetooth и платформой J2ME,

использующей Mobile Information Device Profile (MIDP) и Connected Limited

Device Configuration (CLDC).

Из рисунка видно, что внизу расположены hardware, operating system и

Bluetooth stack; выше находятся конфигурация (в нашем случае это CLDC) и

профиль (MIDP), а также дополнительные пакеты. В самом верху

располагается собственно MIDP приложение (MIDlet).

Java APIs for Bluetooth

Пакет Описание

javax.microedition.io Ядро CLDC Generic Connection

Framework.

javax.Bluetooth

Ядро Bluetooth API, включающее в себя

Discovery, L2CAP, а также интерфейсы и

классы устройства и данных.

javax.obex

Ядро Object Exchange (OBEX) API. Этот

пакет является дополнительным и

поддерживается не всеми устройствами.

В рамках Java APIs for Bluetooth определяется новый протокол соединения

для GCF и Object Exchange (OBEX) API на основе спецификации IrDA Data

Association.

Page 20: BlueTooth Control

20

2.3.3.2. Анатомия MIDlet-ов, использующих JSR 82

На следующем рисунке показаны все интерфейсы и классы, которые

можно использовать в JSR-82 MIDlet-те.

2.3.3.3. Использование Java APIs for Bluetooth

Использование Java APIs for Bluetooth состоит из нескольких

отдельных этапов:

• Инициализация Bluetooth стека.

• Поиск устройств.

• Поиск сервисов.

• Открытие соединения.

• Закрытие соединения.

• Ожидание соединения.

• Инициализация соединения.

• Выполнение операций ввода-вывода.

На приведенном ниже рисунке схематично показано приложение,

использующее Bluetooth.

Page 21: BlueTooth Control

21

2.4. WidComm драйвер для USB Bluetooth adapter и набор развития BTW

2.4.1. WidComm драйвер для USB Bluetooth adapter

Сейчас на рынке существуют два основных драйвера для USB

Bluetooth адаптера:

• Драйвер компания Microsoft, который включается в семействе

Windows 2000/XP. Этот драйвер поддерживает мало

возможностей, не гибкий и не лёгко программировать.

• Драйвер компания WIDCOMM, который обеспечивает большой

возможности, легко программировать. Дополнительную

информацию можно найти на сайте http://www.widcomm.com .

2.4.2. Набор для разработки BTW (Bluetooth for Windows Software

Development Kit)

Набор для разработки BTW состоит из:

• Одной динамической библиотеки (WidCommSDK.dll)

• Одной статическаой библиотеки (WidCommSDK.lib)

• Заголовочных файлов C++: BtIfClasses.h , BtIfDefinitions.h

Этот DK обеспечивает разработку Bluetooth приложений с

возможностю доступа к уровням:

• L2CAP

• RFCOMM

• OPP

Page 22: BlueTooth Control

22

• FTP

• SDP

• SPP

• LAP

• OBEX

Block diagram/overview of the Bluetooth

Чтобы использовать WIDCOMM Bluetooth API, вы должны иметь

следующие аппаратные и программные средства:

• Windows 98 SE / Me / 2000 и выше

• The evaluation or retail version of the BTW software from

WIDCOMM,

• Microsoft Visual C++ 6.0

• 64 MB активной памяти

Page 23: BlueTooth Control

23

• 50 MB свободного места на жестком диске (после того как

загрузился VC++)

• Один USB порт

• Один USB Bluetooth dongle

• WidComm драйвер CD диска

Page 24: BlueTooth Control

24

III. КОНСТУКТОРСКАЯ ЧАСТЬ

3.1 Введение

Приложение написано на языке Java, который поддерживает

концепцию объектно-ориентированного программирования (ООП). ООП

дает возможность разделить приложение на отдельные части (классы),

каждая из которых выполняет отдельное задание.

3.2 Структура программы ( Клиентская часть )

3.2.1 Общая цель

Клиент работает на мобильном телефоне. Он выполняет поиск

поддерживающих Bluetooth устройств, посылает запросы на соединение с

сервером, предоставляет пользователю графический интерфейс для работы с

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

которых выполняет определенные задачи. Каждый модуль является

отдельным классом, размещенным в одноименном файле с расширением

.java .

3.2.2 Классы программы

3.2.2.1 MgtuBtControl (Файл MgtuBtControl.java)

Этот класс наследуется из класса MIDlet, который является главным

классом любой программы, написанной на J2ME для мобильных

телефонов. Этот класс первым получает управление при запуске

программы. В теле этого класса мы получаем очень важный элемент –

элемент управления экрана мобильного телефона.

public Display ds ;

ds=Display.getDisplay(this) ;

С помощью этого элемента, мы можем создать формы, кнопки,

отображать текст и др. на экране телефона.

3.2.2.2 BtDevices (Файл BtDevices.java)

Этот класс отвечает за поиск окружающих Bluetooth устройств. Он

показывает список имен всех Bluetooth устройств на экране и позволяет

пользователю выбрать устройство, с которым он хочет работать.

Page 25: BlueTooth Control

25

3.2.2.3 BtMenu ( Файл BtMenu.java )

После того как класс BtDevice нашел поддерживающие Bluetooth

устройства, и пользователь выбрал одно из них для работы, класс BtMenu

попытается создать соединение мобильного телефона с Bluetooth

устройством. Если процесс создания соединения закончится успешно, то

на экране появится меню, если нет, то на экране телефона выведется

сообщение об ошибке.

3.2.2.4 BtFolder ( Файл BtFolder.java )

Этот класс позволяет пользователю просмотреть файловую систему

компьютера, используя мобильный телефон. С помощью этого класса,

пользователь может открыть любой файл, послать SMS сообщение,

которое сохранено в текстовом файле компьютера.

3.2.2.5 BtWinMedia (Файл BtWinMedia.java)

Этот класс используется для управления программой Windows Media

Player компьютера. Как клиент он просто создает удобный интерфейс для

пользователя и посылает соответствующие сигналы компьютеру, когда

пользователь нажимает кнопки мобильного телефона.

3.2.2.6 BtWinAMP ( Файл BtWinAMP.java )

Этот класс используется для управления программой Winamp Player

компьютера. Как клиент, он просто создает удобный интерфейс для

пользователя и посылает соответствующие сигналы компьютеру, когда

пользователь нажимает кнопки мобильного телефона.

3.2.2.7 BtPowerPoint ( Файл BtPowerPoint.java )

Этот класс используется для управления программой PowerPoint

компьютера.

3.2.2.8 BtMouse ( Файл BtMouse.java )

Этот класс используется для управления мышью компьютера.

Пользователь может двигать мышь влево, вправо, вверх, или вниз,

нажимать на кнопки, а также изменять скорость движения мыши.

Page 26: BlueTooth Control

26

IV. ТЕХНОЛОГИЧЕСКАЯ ЧАСТЬ

4.1. Введение

В этой части говорится о том, как работать с приложением.

4.2. Руководство программиста

Для создания программы, требуются следующие инструменты:

• J2ME Wireless ToolKit (использовалась версия 2.2)

• J2SDK (использовалась версия 1.4.2-09)

• J2RE (использовалась версия 1.4.2.10 windows i586)

• IntelliJ IDEA 5.0

Порядок установления инструментов – J2SDK, J2RE и J2ME Wireless

ToolKit .

IntelliJ IDEA устанавливается последним. После этого следует

переконфигурировать его, чтобы он мог работать с библиотекой J2ME.

Дополнительную информацию об этой конфигурации можно получить на

сайте king-tommy.de.

4.3. Руководство пользователя

После запуска программы пользователь увидит на экране следующее

окно:

Page 27: BlueTooth Control

27

Figure 1 : окно начала работы

После того как пользователь выберет команду Launch , программа начинает

поиск поддерживающих Bluetooth устройств. Экран в это время будет

выглядеть следующим образом:

Page 28: BlueTooth Control

28

Figure 2: окно поиска поддерживающих Bluetooth устройств

В процессе поиска поддерживающих Bluetooth устройств, сообщение

“Finding device” двигает слева на право в пределах окна программы до тех

пор, пока процесс поиска поддерживающих Bluetooth устройств не

завершается. По окончании поиска на экран будет выведен конечный список

найденных Bluetooth устройств:

Page 29: BlueTooth Control

29

Figure 3: список найденных Bluetooth устройств

После этого пользователь может выбрать устройство, к которому он хочет

подключать. В меню программы пользователь может выбрать одну из двух

команд: команду Refresh, выполняющую повторный поиск поддерживающих

Bluetooth устройств, или команду Connect, выполняющую подключение к

устройству. При этом на экране появится сообщение о подтверждении

подключения к серверу:

Page 30: BlueTooth Control

30

Figure 4: Сообщение о подтверждении подключения к серверу

Пользователь должен выбрать Yes, чтобы подключать к серверу. После этого на экране появится один из следующих сообщений:

1. Если подключение к серверу не состоялось:

Page 31: BlueTooth Control

31

Figure 5: Сообщение об ошибке соединения

2. Если подключение к серверу прошло успешно, то на экране появится

меню управления:

Page 32: BlueTooth Control

32

Figure 6: Меню программ управления

После установки соединения пользователь может выбрать одну из

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

Page 33: BlueTooth Control

33

Figure 7: окно управления мышью.

Page 34: BlueTooth Control

34

Figure 8: окно управления программой PowerPoint

Page 35: BlueTooth Control

35

Figure 9: окно управления системой

Page 36: BlueTooth Control

36

Figure 10: окно управления программой WinAMP

Page 37: BlueTooth Control

37

Figure 11: окно управления программой Media player

Page 38: BlueTooth Control

38

V. ЛИТЕРАТУРА

1. Bluetooth for Java by Bruce Hopkins and Ranjith Antony, Apress - 2003

2. Java APIs for BluetoothTM Wireless Technology (JSR 82)

3. J2ME in a Nutshell by Kim Topley, O'Reilly 2002

4. Справочная служба http://www.bluejack.ru

5. Справочная служба http://www.j2medev.com

6. Справочная служба http://www.mobilab.ru

Page 39: BlueTooth Control

39////////////////////////////////////////////////////////////////////////////////////

BtApplication.java import javax.bluetooth.*;

import javax.microedition.lcdui.*;

import javax.microedition.io.Connector;

import java.io.*;

public class BtApplication implements Runnable,CommandListener{

public BtApplication(BtMenu bm){

}

public void commandAction(Command c, Displayable d){

}

public void run(){

}

}

////////////////////////////////////////////////////////////////////////////////////

BtDevices.java import javax.bluetooth.*;

import javax.microedition.lcdui.*;

import javax.microedition.io.Connector;

import java.io.*;

public class BtDevices implements CommandListener , DiscoveryListener{

public List li;

public MgtuBtControl mtc;

private LocalDevice ld;

private DiscoveryAgent da;

private BtMenu btm;

private Ticker tk=new Ticker("Finding devices");

private Command m_Refresh=new Command("Refresh",Command.SCREEN,1) ;

private Command m_Exit=new Command("Exit",Command.EXIT, 0);

private Command m_Connect=new Command("Connect",Command.SCREEN, 1);

public BtDevices(MgtuBtControl mgt){

mtc=mgt;

li=new List("Devices",List.IMPLICIT);

li.setTicker(tk);

li.addCommand(m_Exit);

li.setCommandListener(this);

try{

ld=LocalDevice.getLocalDevice();

Page 40: BlueTooth Control

40 da=ld.getDiscoveryAgent();

da.startInquiry(DiscoveryAgent.GIAC, this);

}catch(BluetoothStateException e){

}

mtc.ds.setCurrent(li);

}

public void deviceDiscovered(RemoteDevice btDevice,DeviceClass cod){

li.append(btDevice.getBluetoothAddress(),null);

li.removeCommand(m_Connect);

li.addCommand(m_Connect);

}

public void inquiryCompleted(int discType){

li.setTicker(null);

int num=li.size();

li.setTitle(num+" device(s) found");

li.addCommand(m_Refresh);

li.removeCommand(m_Connect);

if(li.size()>0) li.addCommand(m_Connect);

}

public void servicesDiscovered(int transID,ServiceRecord[] servRecord){

}

public void serviceSearchCompleted(int transID,int responseCode){

}

public void commandAction(Command c,Displayable d){

if(c==m_Exit){

mtc.destroyApp(true);

mtc.notifyDestroyed();

}else if(c==m_Refresh){

li.deleteAll();

li.setTicker(tk);

li.setTitle("Devices");

try{

da.cancelInquiry(this);

da.startInquiry(DiscoveryAgent.GIAC, this);

}catch(BluetoothStateException e){

}

}else //if(c==m_Connect)

Page 41: BlueTooth Control

41 {

int index=li.getSelectedIndex();

btm=new BtMenu(this, li.getString(index));

}

}

}

BtFolder.java import javax.bluetooth.*;

import javax.microedition.lcdui.*;

import java.io.*;

public class BtFolder implements Runnable,CommandListener{

private BtMenu btm;

public Display ds;

private L2CAPConnection conn;

public List lif=new List("Folder Browser",List.IMPLICIT);

private Command m_Back=new Command("Back",Command.BACK, 0);

private Command m_Open=new Command("Open",Command.OK, 0);

private Command m_SMS=new Command("See and Send Message",Command.OK, 0);

private Command m_Powerpoint=new Command("Open with PowerPoint",Command.OK, 0);

private Image folder=null;

private Ticker tk=new Ticker("");

private String path;

public BtFolder(BtMenu bm){

btm=bm;

this.ds = btm.bd.mtc.ds;

conn=btm.l2capConn;

lif.addCommand(m_Back);

lif.addCommand(m_Open);

lif.addCommand(m_SMS);

lif.addCommand(m_Powerpoint);

lif.setSelectCommand(m_Open);

path="";

lif.setCommandListener(this);

lif.setTicker(tk);

Thread thread=new Thread(this);

thread.start();

}

public void send(byte[] buff){

try{

Page 42: BlueTooth Control

42 conn.send(buff);

}catch(IOException e){

}

}

public int receive(byte[] buff)

{

int i=0;

try{

i= conn.receive(buff) ;

}catch(IOException e){

Alert al=new Alert("Connect fault");

ds.setCurrent(al);

return 0;

}

return(i);

}

public void sendCommand(byte command,String fname){

byte[] buff=new byte[fname.length()+2];

buff[0]=1;buff[1]=command;

for(int i=0;i<fname.length();i++){

buff[i+2]=(byte)fname.toCharArray()[i];

}

send(buff);

}

public String small(String path){

int i=path.indexOf("\\..");

if(i>=0){

int j=path.lastIndexOf('\\',i-1);

return path.substring(0,j)+path.substring(i+3,path.length());

}else return path;

}

public void commandAction(Command c, Displayable d){

if(c==m_Back){

ds.setCurrent(btm.li);

path="";

}else if(c==m_Open){

int i=lif.getSelectedIndex();

String fname=lif.getString(i);

if(lif.getImage(i)!=null){

if(path=="") {

path=fname.substring(0,2);

Page 43: BlueTooth Control

43 sendCommand((byte)1,fname);

}

else{

path=path + "\\" + fname;

sendCommand((byte)1,path);

}

listReceive();

}else{

sendCommand((byte)2,path+"\\"+fname);

}

path=small(path);

if(path.indexOf("\\")<0) path=path+"\\";

tk.setString(path);

}else if(c==m_SMS){

int i=lif.getSelectedIndex();

if(lif.getImage(i)==null){

String fname= path+"\\"+lif.getString(i);

sendCommand((byte)3,fname);

String str;

str=receiveFile();

SMSSend sms=new SMSSend(this,str);

}

}else if(c==m_Powerpoint) {

int i=lif.getSelectedIndex();

if(lif.getImage(i)==null){

String fname= path+"\\"+lif.getString(i);

sendCommand((byte)4,fname);

BtPowerPoint btpp=new BtPowerPoint(btm);

}

}

}

public String receiveFile(){

String data="";

for(;;){

byte[] recei=new byte[100];

int len=receive(recei);

if(len==0) break;

if(recei[0]==0) break;

for(int i=1;i<len;i++) data=data+(char)recei[i];

}

Page 44: BlueTooth Control

44 return data;

}

public void listReceive(){

lif.deleteAll();

int pos=0;

for(;;){

byte[] recei=new byte[100];

int len=receive(recei);

if(len==0) break;

String str="";

for(int i=1;i<len;i++) str=str+(char)recei[i];

if(recei[0]==1) {

try{

folder=Image.createImage("/folder.png");

}catch(IOException e){

}

lif.insert(pos,str,folder);

pos=pos+1;

//lif.set(0,str,folder);

}

else if(recei[0]==2) lif.append(str,null);

else if(recei[0]==127) {

lif.setSelectedIndex(0,true);

break;

}

}

}

public void run() {

ds.setCurrent(lif);

byte[] buff=new byte[2];

buff[0]=1;

buff[1]=127;

send(buff);

listReceive();

}

}

BtMenu.java import javax.bluetooth.*;

import javax.microedition.lcdui.*;

Page 45: BlueTooth Control

45import javax.microedition.io.Connector;

import java.io.*;

public class BtMenu implements Runnable,CommandListener{

public BtDevices bd;

private String url;

public List li;

private Command m_OK=new Command("OK",Command.OK, 0);

private Command m_Back=new Command("Back",Command.BACK, 1);

public L2CAPConnection l2capConn;

private int firstBtFolder=0;

private BtFolder btf;

public BtMenu(BtDevices bd,String serverAdd){

this.bd = bd;

url="btl2cap://"+serverAdd+":1001;ReceiveMTU=512;TransmitMTU=512";

Thread thread=new Thread(this);

thread.start();

}

public void run(){

try{

l2capConn=(L2CAPConnection)Connector.open(url);

ShowCommands();

}catch(IOException e){

Alert al=new Alert("Connect fault");

bd.mtc.ds.setCurrent(al);

//ShowCommands();

}

}

public void ShowCommands(){

li=new List("Choice one, pleeease !!!",List.IMPLICIT );

li.append("Folder Browser",null); //0

li.append("Media player",null); //1

li.append("WinAMP",null); //2

li.append("PowerPoint",null); //3

li.append("Process",null); //4

li.append("Application",null); //5

li.append("System",null); //6

li.append("Mouse",null); //7

li.addCommand(m_OK);

li.addCommand(m_Back);

li.setCommandListener(this);

bd.mtc.ds.setCurrent(li);

}

Page 46: BlueTooth Control

46 public void commandAction(Command c,Displayable d){

if(c==m_Back){

try{

l2capConn.close();

}catch(IOException e){

}

bd.mtc.ds.setCurrent(bd.li);

}else // if(c==m_OK)

{

switch(li.getSelectedIndex())

{

case 0:

if(firstBtFolder==0) {

btf=new BtFolder(this);

firstBtFolder=1;

}else btf.run();

break;

case 1:

BtWinMedia btwm=new BtWinMedia(this);

break;

case 2:

BtWinAMP btwa=new BtWinAMP(this);

break;

case 3:

BtPowerPoint btpp=new BtPowerPoint(this);

break;

case 4:

BtProcess btp=new BtProcess(this);

break;

case 5:

BtApplication bta=new BtApplication(this);

break;

case 6:

BtSystem bts=new BtSystem(this);

break;

case 7:

BtMouse btm=new BtMouse(this);

break;

}

}

}

Page 47: BlueTooth Control

47}

BtMouse.java import javax.bluetooth.*;

import javax.microedition.lcdui.*;

import javax.microedition.io.Connector;

import java.io.*;

public class BtMouse implements Runnable,CommandListener{

private BtMenu btm;

private Display ds;

private L2CAPConnection conn;

private MyCanvas mcv=new MyCanvas(this);

private Command m_Back=new Command("Back",Command.BACK, 0);

public BtMouse(BtMenu bm){

btm=bm;

this.ds = btm.bd.mtc.ds;

conn=btm.l2capConn;

Thread thread=new Thread(this);

thread.start();

}

public void commandAction(Command c, Displayable d){

if(c==m_Back){

ds.setCurrent(btm.li);

}

}

public void send(byte[] buff){

try{

conn.send(buff);

}catch(IOException e){

}

}

public void run(){

mcv.addCommand(m_Back);

mcv.setTitle("Mouse control");

ds.setCurrent(mcv);

mcv.setCommandListener(this);

byte[] buff=new byte[2];

buff[0]=8;buff[1]=127; //Start the Media Player service in server

send(buff);

Page 48: BlueTooth Control

48 }

static class MyCanvas extends Canvas{

int height=getHeight();

int width=getWidth();

BtMouse btwm;

public MyCanvas(BtMouse btw){

btwm=btw;

}

public void sendKey(int keyCode){

byte[] buff=new byte[2];

buff[0]=8;

buff[1]=-100;

switch(keyCode)

{

case Canvas.KEY_NUM0:

buff[1]=0;

break;

case Canvas.KEY_NUM1:

buff[1]=1;

break;

case Canvas.KEY_NUM2:

buff[1]=2;

break;

case Canvas.KEY_NUM3:

buff[1]=3;

break;

case Canvas.KEY_NUM4:

buff[1]=4;

break;

case Canvas.KEY_NUM5:

buff[1]=5;

break;

case Canvas.KEY_NUM6:

buff[1]=6;

break;

case Canvas.KEY_NUM7:

buff[1]=7;

break;

case Canvas.KEY_NUM8:

buff[1]=8;

break;

case Canvas.KEY_NUM9:

Page 49: BlueTooth Control

49 buff[1]=9;

break;

}

if(keyCode ==getKeyCode(Canvas.UP)){

buff[1]=10;

}else if(keyCode ==getKeyCode(Canvas.DOWN)){

buff[1]=11;

}else if(keyCode==getKeyCode(Canvas.LEFT)){

buff[1]=12;

}else if(keyCode ==getKeyCode(Canvas.RIGHT)){

buff[1]=13;

}else if(keyCode==-5){

buff[1]=14;

}else if(keyCode=='*'){

buff[1]=15;

}else if(keyCode=='#'){

buff[1]=16;

}

if (buff[1]!=-100) btwm.send(buff);

}

public void keyReleased(int keyCode)

{

sendKey(keyCode);

}

public void keyRepeated(int keyCode){

sendKey(keyCode);

}

public void paint(Graphics g){

g.setColor(0);

g.fillRect(0,0,width,height);

int h=g.getFont().getHeight();

g.setColor(0xffffff);

g.drawString("Up : Move mouse up",0,0,Graphics.TOP | Graphics.LEFT);

g.drawString("Down : Move mouse down",0,h,Graphics.TOP | Graphics.LEFT);

g.drawString("-> : Move mouse right",0,2*h,Graphics.TOP | Graphics.LEFT);

g.drawString("<- : Move mouse left",0,3*h,Graphics.TOP | Graphics.LEFT);

g.drawString("Fire : Click left",0,4*h,Graphics.TOP | Graphics.LEFT);

g.drawString("3 : Click right",0,5*h,Graphics.TOP | Graphics.LEFT);

g.drawString("0,1,2,4,5,6,7,8,9 : Mouse speed",0,6*h,Graphics.TOP | Graphics.LEFT);

}

}

Page 50: BlueTooth Control

50}

BtPowerPoint.java import javax.bluetooth.*;

import javax.microedition.lcdui.*;

import javax.microedition.io.Connector;

import java.io.*;

public class BtPowerPoint implements Runnable,CommandListener{

private BtMenu btm;

private Display ds;

private L2CAPConnection conn;

private MyCanvas mcv=new MyCanvas(this);

private Command m_Back=new Command("Back",Command.BACK, 0);

public BtPowerPoint(BtMenu bm){

btm=bm;

this.ds = btm.bd.mtc.ds;

conn=btm.l2capConn;

Thread thread=new Thread(this);

thread.start();

}

public void commandAction(Command c, Displayable d){

if(c==m_Back){

ds.setCurrent(btm.li);

}

}

public void send(byte[] buff){

try{

conn.send(buff);

}catch(IOException e){

}

}

public void run(){

mcv.addCommand(m_Back);

mcv.setTitle("PowerPoint control");

ds.setCurrent(mcv);

mcv.setCommandListener(this);

byte[] buff=new byte[2];

buff[0]=4;buff[1]=127; //Start the Media Player service in server

send(buff);

Page 51: BlueTooth Control

51 }

static class MyCanvas extends Canvas{

int height=getHeight();

int width=getWidth();

BtPowerPoint btwm;

public MyCanvas(BtPowerPoint btw){

btwm=btw;

}

public void sendKey(int keyCode){

byte[] buff=new byte[2];

buff[0]=4;

buff[1]=-100;

switch(keyCode)

{

case Canvas.KEY_NUM0:

buff[1]=0;

break;

case Canvas.KEY_NUM1:

buff[1]=1;

break;

case Canvas.KEY_NUM2:

buff[1]=2;

break;

case Canvas.KEY_NUM3:

buff[1]=3;

break;

case Canvas.KEY_NUM4:

buff[1]=4;

break;

case Canvas.KEY_NUM5:

buff[1]=5;

break;

case Canvas.KEY_NUM6:

buff[1]=6;

break;

case Canvas.KEY_NUM7:

buff[1]=7;

break;

case Canvas.KEY_NUM8:

buff[1]=8;

break;

case Canvas.KEY_NUM9:

Page 52: BlueTooth Control

52 buff[1]=9;

break;

}

if(keyCode ==getKeyCode(Canvas.UP)){

buff[1]=10;

}else if(keyCode ==getKeyCode(Canvas.DOWN)){

buff[1]=11;

}else if(keyCode==getKeyCode(Canvas.LEFT)){

buff[1]=12;

}else if(keyCode ==getKeyCode(Canvas.RIGHT)){

buff[1]=13;

}else if(keyCode==-5){

buff[1]=14;

}else if(keyCode=='*'){

buff[1]=15;

}else if(keyCode=='#'){

buff[1]=16;

}

if (buff[1]!=-100) btwm.send(buff);

}

public void keyReleased(int keyCode)

{

sendKey(keyCode);

}

public void keyRepeated(int keyCode){

sendKey(keyCode);

}

public void paint(Graphics g){

g.setColor(0);

g.fillRect(0,0,width,height);

int h=g.getFont().getHeight();

g.setColor(0xffffff);

g.drawString("Up : Previous",0,0,Graphics.TOP | Graphics.LEFT);

g.drawString("Down : Next",0,h,Graphics.TOP | Graphics.LEFT);

g.drawString("# : Exit",0,2*h,Graphics.TOP | Graphics.LEFT);

g.drawString("Fire : Slide show",0,3*h,Graphics.TOP | Graphics.LEFT);

}

}

}

BtProcess.java

Page 53: BlueTooth Control

53import javax.bluetooth.*;

import javax.microedition.lcdui.*;

import javax.microedition.io.Connector;

import java.io.*;

public class BtProcess implements Runnable,CommandListener{

private Display ds;

private BtMenu btm;

private L2CAPConnection conn;

private List lip=new List("List of processes",List.IMPLICIT );

private Command m_Back=new Command("Back",Command.BACK, 0);

public BtProcess(BtMenu bm){

btm=bm;

this.ds=btm.bd.mtc.ds;

conn=btm.l2capConn;

Thread thread=new Thread(this);

thread.start();

}

public void send(byte[] buff){

try{

conn.send(buff);

}catch(IOException e){

}

}

public int receive(byte[] buff)

{ int i=0;

try{

i= conn.receive(buff) ;

}catch(IOException e){

}

return(i);

}

public void run(){

ds.setCurrent(lip);

byte[] buff=new byte[2];

buff[0]=5;

buff[1]=127;

send(buff);

for(;;){

byte[] recei=new byte[100];

Page 54: BlueTooth Control

54 int len=receive(recei);

String str="";

for(int i=0;i<len;i++) str=str+(char)recei[i];

lip.append(str,null);

}

}

public void commandAction(Command c,Displayable d){

if(c==m_Back){

ds.setCurrent(btm.li);

}

}

}

BtSystem.java import javax.bluetooth.*;

import javax.microedition.lcdui.*;

import javax.microedition.io.Connector;

import java.io.*;

public class BtSystem implements Runnable,CommandListener{

private BtMenu btm;

private Display ds;

private L2CAPConnection conn;

private MyCanvas mcv=new MyCanvas(this);

private Command m_Back=new Command("Back",Command.BACK, 0);

public BtSystem(BtMenu bm){

btm=bm;

this.ds = btm.bd.mtc.ds;

conn=btm.l2capConn;

Thread thread=new Thread(this);

thread.start();

}

public void commandAction(Command c, Displayable d){

if(c==m_Back){

ds.setCurrent(btm.li);

}

}

public void send(byte[] buff){

try{

conn.send(buff);

Page 55: BlueTooth Control

55 }catch(IOException e){

}

}

public void run(){

mcv.addCommand(m_Back);

mcv.setTitle("System control");

ds.setCurrent(mcv);

mcv.setCommandListener(this);

byte[] buff=new byte[2];

buff[0]=7;buff[1]=127; //Start the Media Player service in server

send(buff);

}

static class MyCanvas extends Canvas{

int height=getHeight();

int width=getWidth();

BtSystem btwm;

public MyCanvas(BtSystem btw){

btwm=btw;

}

public void sendKey(int keyCode){

byte[] buff=new byte[2];

buff[0]=7;

buff[1]=-100;

switch(keyCode)

{

case Canvas.KEY_NUM0:

buff[1]=0;

break;

case Canvas.KEY_NUM1:

buff[1]=1;

break;

case Canvas.KEY_NUM2:

buff[1]=2;

break;

case Canvas.KEY_NUM3:

buff[1]=3;

break;

case Canvas.KEY_NUM4:

buff[1]=4;

break;

case Canvas.KEY_NUM5:

Page 56: BlueTooth Control

56 buff[1]=5;

break;

case Canvas.KEY_NUM6:

buff[1]=6;

break;

case Canvas.KEY_NUM7:

buff[1]=7;

break;

case Canvas.KEY_NUM8:

buff[1]=8;

break;

case Canvas.KEY_NUM9:

buff[1]=9;

break;

}

if(keyCode ==getKeyCode(Canvas.UP)){

buff[1]=10;

}else if(keyCode ==getKeyCode(Canvas.DOWN)){

buff[1]=11;

}else if(keyCode==getKeyCode(Canvas.LEFT)){

buff[1]=12;

}else if(keyCode ==getKeyCode(Canvas.RIGHT)){

buff[1]=13;

}else if(keyCode==-5){

buff[1]=14;

}else if(keyCode=='*'){

buff[1]=15;

}else if(keyCode=='#'){

buff[1]=16;

}

if (buff[1]!=-100) btwm.send(buff);

}

public void keyReleased(int keyCode)

{

sendKey(keyCode);

}

public void paint(Graphics g){

g.setColor(0);

g.fillRect(0,0,width,height);

int h=g.getFont().getHeight();

g.setColor(0xffffff);

Page 57: BlueTooth Control

57 g.drawString("1 : Restart",0,0,Graphics.TOP | Graphics.LEFT);

g.drawString("2 : Shutdown",0,h,Graphics.TOP | Graphics.LEFT);

g.drawString("3 : Screen save",0,2*h,Graphics.TOP | Graphics.LEFT);

g.drawString("4 : Log off",0,3*h,Graphics.TOP | Graphics.LEFT);

g.drawString("5 : Increase volume",0,4*h,Graphics.TOP | Graphics.LEFT);

}

}

}

BtWinAMP.java import javax.bluetooth.*;

import javax.microedition.lcdui.*;

import javax.microedition.io.Connector;

import java.io.*;

public class BtWinAMP implements Runnable,CommandListener{

private BtMenu btm;

private Display ds;

private L2CAPConnection conn;

private MyCanvas mcv=new MyCanvas(this);

private Command m_Back=new Command("Back",Command.BACK, 0);

public BtWinAMP(BtMenu bm){

btm=bm;

this.ds = btm.bd.mtc.ds;

conn=btm.l2capConn;

Thread thread=new Thread(this);

thread.start();

}

public void commandAction(Command c, Displayable d){

if(c==m_Back){

ds.setCurrent(btm.li);

}

}

public void send(byte[] buff){

try{

conn.send(buff);

}catch(IOException e){

}

}

Page 58: BlueTooth Control

58 public void run(){

mcv.addCommand(m_Back);

mcv.setTitle("WinAMP control");

ds.setCurrent(mcv);

mcv.setCommandListener(this);

byte[] buff=new byte[2];

buff[0]=3;buff[1]=127; //Start the Media Player service in server

send(buff);

}

static class MyCanvas extends Canvas{

int height=getHeight();

int width=getWidth();

BtWinAMP btwm;

public MyCanvas(BtWinAMP btw){

btwm=btw;

}

public void sendKey(int keyCode){

byte[] buff=new byte[2];

buff[0]=3;

buff[1]=-100;

switch(keyCode)

{

case Canvas.KEY_NUM0:

buff[1]=0;

break;

case Canvas.KEY_NUM1:

buff[1]=1;

break;

case Canvas.KEY_NUM2:

buff[1]=2;

break;

case Canvas.KEY_NUM3:

buff[1]=3;

break;

case Canvas.KEY_NUM4:

buff[1]=4;

break;

case Canvas.KEY_NUM5:

buff[1]=5;

break;

case Canvas.KEY_NUM6:

buff[1]=6;

Page 59: BlueTooth Control

59 break;

case Canvas.KEY_NUM7:

buff[1]=7;

break;

case Canvas.KEY_NUM8:

buff[1]=8;

break;

case Canvas.KEY_NUM9:

buff[1]=9;

break;

}

if(keyCode ==getKeyCode(Canvas.UP)){

buff[1]=10;

}else if(keyCode ==getKeyCode(Canvas.DOWN)){

buff[1]=11;

}else if(keyCode==getKeyCode(Canvas.LEFT)){

buff[1]=12;

}else if(keyCode ==getKeyCode(Canvas.RIGHT)){

buff[1]=13;

}else if(keyCode==-5){

buff[1]=14;

}else if(keyCode=='*'){

buff[1]=15;

}else if(keyCode=='#'){

buff[1]=16;

}

if (buff[1]!=-100) btwm.send(buff);

}

public void keyReleased(int keyCode)

{

sendKey(keyCode);

}

public void paint(Graphics g){

g.setColor(0);

g.fillRect(0,0,width,height);

int h=g.getFont().getHeight();

g.setColor(0xffffff);

g.drawString("Up : Previous song",0,0,Graphics.TOP | Graphics.LEFT);

g.drawString("Down : Next song",0,h,Graphics.TOP | Graphics.LEFT);

g.drawString("-> : Increase volume",0,2*h,Graphics.TOP | Graphics.LEFT);

g.drawString("<- : Decrease volume",0,3*h,Graphics.TOP | Graphics.LEFT);

Page 60: BlueTooth Control

60 g.drawString("5 : All Screen",0,4*h,Graphics.TOP | Graphics.LEFT);

g.drawString("1 : Mute",0,5*h,Graphics.TOP | Graphics.LEFT);

g.drawString("# : Exit",0,6*h,Graphics.TOP | Graphics.LEFT);

g.drawString("Fire : Start/Stop",0,7*h,Graphics.TOP | Graphics.LEFT);

}

}

}

BtWinMedia.java import javax.bluetooth.*;

import javax.microedition.lcdui.*;

import javax.microedition.io.Connector;

import java.io.*;

public class BtWinMedia implements Runnable,CommandListener{

private BtMenu btm;

private Display ds;

private L2CAPConnection conn;

private MyCanvas mcv=new MyCanvas(this);

private Command m_Back=new Command("Back",Command.BACK, 0);

public BtWinMedia(BtMenu bm){

btm=bm;

this.ds = btm.bd.mtc.ds;

conn=btm.l2capConn;

Thread thread=new Thread(this);

thread.start();

}

public void commandAction(Command c, Displayable d){

if(c==m_Back){

ds.setCurrent(btm.li);

}

}

public void send(byte[] buff){

try{

conn.send(buff);

}catch(IOException e){

}

}

public void run(){

Page 61: BlueTooth Control

61 mcv.addCommand(m_Back);

mcv.setTitle("Media player control ");

ds.setCurrent(mcv);

mcv.setCommandListener(this);

byte[] buff=new byte[2];

buff[0]=2;buff[1]=127; //Start the Media Player service in server

send(buff);

}

static class MyCanvas extends Canvas{

int height=getHeight();

int width=getWidth();

BtWinMedia btwm;

public MyCanvas(BtWinMedia btw){

btwm=btw;

}

public void sendKey(int keyCode){

byte[] buff=new byte[2];

buff[0]=2;

buff[1]=-100;

switch(keyCode)

{

case Canvas.KEY_NUM0:

buff[1]=0;

break;

case Canvas.KEY_NUM1:

buff[1]=1;

break;

case Canvas.KEY_NUM2:

buff[1]=2;

break;

case Canvas.KEY_NUM3:

buff[1]=3;

break;

case Canvas.KEY_NUM4:

buff[1]=4;

break;

case Canvas.KEY_NUM5:

buff[1]=5;

break;

case Canvas.KEY_NUM6:

buff[1]=6;

break;

Page 62: BlueTooth Control

62 case Canvas.KEY_NUM7:

buff[1]=7;

break;

case Canvas.KEY_NUM8:

buff[1]=8;

break;

case Canvas.KEY_NUM9:

buff[1]=9;

break;

}

if(keyCode ==getKeyCode(Canvas.UP)){

buff[1]=10;

}else if(keyCode ==getKeyCode(Canvas.DOWN)){

buff[1]=11;

}else if(keyCode==getKeyCode(Canvas.LEFT)){

buff[1]=12;

}else if(keyCode ==getKeyCode(Canvas.RIGHT)){

buff[1]=13;

}else if(keyCode==-5){

buff[1]=14;

}else if(keyCode=='*'){

buff[1]=15;

}else if(keyCode=='#'){

buff[1]=16;

}

if (buff[1]!=-100) btwm.send(buff);

}

public void keyReleased(int keyCode)

{

sendKey(keyCode);

}

public void paint(Graphics g){

g.setColor(0);

g.fillRect(0,0,width,height);

int h=g.getFont().getHeight();

g.setColor(0xffffff);

g.drawString("Up : Previous song",0,0,Graphics.TOP | Graphics.LEFT);

g.drawString("Down : Next song",0,h,Graphics.TOP | Graphics.LEFT);

g.drawString("-> : Increase volume",0,2*h,Graphics.TOP | Graphics.LEFT);

g.drawString("<- : Decrease volume",0,3*h,Graphics.TOP | Graphics.LEFT);

g.drawString("5 : All Screen",0,4*h,Graphics.TOP | Graphics.LEFT);

Page 63: BlueTooth Control

63 g.drawString("1 : Mute",0,5*h,Graphics.TOP | Graphics.LEFT);

g.drawString("# : Exit",0,6*h,Graphics.TOP | Graphics.LEFT);

g.drawString("Fire : Start/Stop",0,7*h,Graphics.TOP | Graphics.LEFT);

}

}

}

MgtuBtControl.java import javax.microedition.midlet.*;

import javax.microedition.lcdui.*;

public class MgtuBtControl extends MIDlet {

public Display ds;

private BtDevices btd;

public void startApp(){

ds=Display.getDisplay(this);

btd=new BtDevices(this);

}

public void pauseApp(){

}

public void destroyApp(boolean reason){

}

}

SMSSend.java import javax.bluetooth.*;

import javax.microedition.lcdui.*;

import javax.microedition.io.*;

import java.io.*;

import javax.wireless.messaging.*;

public class SMSSend implements Runnable,CommandListener{

private Display ds;

private Command m_Send=new Command("Send",Command.OK, 0);

private Command m_Back=new Command("Back",Command.BACK, 0);

private TextBox tb=new TextBox("Address + Message", null, 65535, TextField.ANY);

private BtFolder btf;

private String data;

private String strConn;

public SMSSend(BtFolder btf,String str){

this.btf = btf;

Page 64: BlueTooth Control

64 this.ds=btf.ds;

tb.addCommand(m_Send);

tb.addCommand(m_Back);

data=str;

tb.setString(data);

tb.setCommandListener(this);

//tb.setTitle("Title");

ds.setCurrent(tb);

}

public void run(){

MessageConnection smsconn = null;

try{

int i=data.indexOf("\n");

strConn="sms://"+data.substring(0,i-1);

data=data.substring(i+1);

smsconn=(MessageConnection)Connector.open(strConn);

TextMessage txtmessage = (TextMessage)smsconn.newMessage(

MessageConnection.TEXT_MESSAGE);

txtmessage.setAddress(strConn);

txtmessage.setPayloadText(data);

smsconn.send(txtmessage);

}catch (IOException e){

Alert al=new Alert("Can't send message");

ds.setCurrent(al);

}

}

public void commandAction(Command c,Displayable d){

if(c==m_Send){

Thread thread=new Thread(this);

thread.start();

}else if(c==m_Back){

ds.setCurrent(btf.lif);

}

}

}