Вы находитесь на странице: 1из 64

1

Государственное образовательное учреждение высшего профессионального


образования «Московский государственный технический университет имени
Н.Э. Баумана»

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

Факультет фундаментальных наук


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

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


КУРСУ «ВЫЧИСЛИТЕЛЬНЫЕ КОМПЛЕКСЫ И СЕТИ»

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


телефона и технологии Bluetooth – клиентская часть на мобильном телефоне»

Студент Фам Хонг Куан (___________)


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

Калуга – 2006
2
Аннотация
Нашу жизнь сегодня невозможно представить без компьютеров. Они везде:
дома и на работе, в кафе и ресторанах, гостиницах и аэропортах…
А где компьютеры, там и провода. Клавиатуры, мыши, мониторы и вообще
вся периферия подключаются к компьютеру посредством проводов. А где
провода, там и проблемы. Сколько раз, проклиная всё на свете, я распутывал
полтора десятка проводов, соединяющих различную периферию с моим
электронным другом.
Bluetooth дает новые возможности: вы можете обмениваться информацией,
синхронизировать различные устройства, выходить в Интернет,
присоединяться к локальным сетям, управлять бытовой техникой и даже
автомобилем, используя только устройство, оснащённое Bluetooth (например,
мобильный телефон или карманный персональный компьютер) и совершенно
не используя провода.
В этой работе, мы использовали технологию Bluetooth для другой цели –
удаленное управление компьютера с использованием смартфона. И
смартфон, и компьютер должны поддержать Bluetooth.
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
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
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 Мбайт свободного места на жестком диске.
6

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

2.1. Введение
Для того чтобы создать приложение, мы должны разобраться в
следующих концепциях:
• Технология Bluetooth
• J2ME и JSR 82
• WIDCOMM драйвер для USB Bluetooth adapter

2.2. Технология 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 не имеет конкуренции в области
7
создания небольших локальных сетей и беспроводного объединения
устройств в пределах дома, офиса или, скажем, машины.
В отличие от технологии инфракрасной связи IrDA (Infrared Direct
Access), работающей по принципу "точка-точка" в зоне прямой видимости,
технология Bluetooth разрабатывалась для работы как по принципу "точка-
точка", так и в качестве многоточечного радиоканала, управляемого
многоуровневым протоколом, похожим на протокол мобильной связи GSM.
Bluetooth стала конкурентом таким технологиям, как IEEE 802.11, HomeRF и
IrDA, хотя последняя и не предназначена для построения локальных сетей,
но является самой распространенной технологией беспроводного соединения
компьютеров и периферийных устройств.
Основной идеей новой технологии было предоставление возможности
легкого и удобного беспроводного соединения различных устройств и
организации беспроводной локальной сети. Технология должна позволить
пользователю организовывать обмен информацией и голосом между
всевозможными устройствами, например настольным компьютером, КПК и
сотовым телефоном. В перспективе, технология позволит объединять любые
электронные устройства. При этом, одними из немаловажных параметров
новой технологии должны были стать низкая стоимость устройства связи - в
пределах 20 долларов, соответственно небольшие размеры (ведь речь идет о
мобильных устройствах) и, что немаловажно, совместимость, простота
встраивания в различные устройства. Собственно ради этого и была
организована группа SIG, которая, помимо всего прочего, позволила
множеству производителей объединиться, а не разрабатывать собственные,
несовместимые друг с другом платформы.

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


Технология использует небольшие приемопередатчики малого радиуса
действия, либо непосредственно встроенные в устройство, либо
подключаемые через свободный порт или PC-карту. Адаптеры работают в
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),
ограничивая часть диапазона, которую может использовать каждое
9
устройство. Беда в том, что этих устройств стало очень много - начиная от
беспроводных сетей, поддерживающих стандарты 802.11 и 802.11b и
устройств Bluetooth и вплоть до микроволновых печей! Сейчас комиссия
рассматривает просьбу увеличить используемый диапазон для Home RF
(спецификация, используемая в аудио- и видеотехнике). Это увеличение
может повлиять на другие устройства, работающие в этом диапазоне,
количество которых увеличивается. При этом FCC заявила, что
использование не лицензируемой частоты несет несомненный риск и не
исключена возможность помех и конфликтов между устройствами. Фирмы,
поддерживающие технологи беспроводных сетей, в том числе и Bluetooth,
активно протестуют против увеличения диапазона Home RF.
Устройства стандарта Bluetooth способны соединяться друг с другом,
формируя пикосети, в каждую из которых может входить до 256 устройств.
При этом одно из устройств является ведущим (Master), еще семь - ведомыми
(Slave), остальные находятся в дежурном режиме. Пикосети могут
перекрываться, а к ресурсам ведомых устройств может быть организован
доступ. Перекрывающиеся пикосети могут образовать распределенную сеть,
по которой могут мигрировать данные.

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


Стек Bluetooth протоколов состоит из двух частей: контроллера,
который, как правило, имеет аппаратную реализацию, и on-host стека с
которым, собственно, и взаимодействуют приложения. На рисунке показаны
Bluetooth протоколы.
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, выполнять синхронизацию данных.
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.
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
сети.
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 создана для недорогих
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. Вместо него предлагается
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, который
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(), позволяет получить доступ к этой информации,
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 {
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). Этот дополнительный пакет предоставляет
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
Пакет Описание

Ядро CLDC Generic Connection


javax.microedition.io
Framework.

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


javax.Bluetooth Discovery, L2CAP, а также интерфейсы и
классы устройства и данных.

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


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

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


для GCF и Object Exchange (OBEX) API на основе спецификации IrDA Data
Association.
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.
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
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 активной памяти
23

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


загрузился VC++)
• Один USB порт
• Один USB Bluetooth dongle
• WidComm драйвер CD диска
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 устройств на экране и позволяет
пользователю выбрать устройство, с которым он хочет работать.
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 )
Этот класс используется для управления мышью компьютера.
Пользователь может двигать мышь влево, вправо, вверх, или вниз,
нажимать на кнопки, а также изменять скорость движения мыши.
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. Руководство пользователя


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

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

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


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

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

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


“Finding device” двигает слева на право в пределах окна программы до тех
пор, пока процесс поиска поддерживающих Bluetooth устройств не
завершается. По окончании поиска на экран будет выведен конечный список
найденных Bluetooth устройств:
29

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

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


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

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


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

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

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


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

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

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


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

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


34

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


35

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


36

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


37

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


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
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();
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)
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{
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);
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];

}
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.*;
45
import 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);
}
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;
}
}
}
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);
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:
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);
}
}
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);
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:
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
53
import 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];
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);
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:
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);
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){

}
}
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;
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);
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(){
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;
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);
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;
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);
}
}
}