на тему рефераты Информационно-образоательный портал
Рефераты, курсовые, дипломы, научные работы,
на тему рефераты
на тему рефераты
МЕНЮ|
на тему рефераты
поиск
Использование платформы j2me для мобильных телефонов при организации видеонаблюдений
p align="left">}

3.3 Передача данных по Bluetooth

API для работы с Bluetooth содержится в пакете JSR-82 [9]. Эта библиотека состоит из двух пакетов: базовое Bluetooth API и OBEX.

Для работы с Bluetooth у телефона должны быть минимум 512 килобайт памяти, а также поддерживаться CLDC.

Чтобы приложение могло использовать возможности Bluetooth, необходимо реализовать интерфейс DiscoveryListener и его методы deviceDiscovered(), inquiryCompleted(), servicesDiscovered(), serviceSearchCompleted(), используемые для обнаружения рядом находящихся Bluetooth-устройств.

Далее приводится программный код (листинг 3.9), который инициирует поиск. Вначале инициализируется переменная LocalDevice local, которая представляет собой данный телефон; потом инициализируется переменная DiscoveryAgent agent. Именно этот объект запускает поиск методом startInquiry() с параметрами DiscoveryAgent.GIAC и ссылкой на объект, который реализовал интерфейс DiscoveryListener и будет обрабатывать все события, связанные с обнаружением устройств и их сервисов. Этот метод возвращает true, если поиск устройств был успешно начат, или false в противном случае.

Переменная Vector devicesFound используется для сохранения всех обнаруженных устройств.

Листинг 3.9 - Начало поиска устройств

* This method starts device discovering

*/

public void doDeviceDiscovery() {

try {

local = LocalDevice.getLocalDevice();

} catch (BluetoothStateException bse) {

Log.out.println ("EXCEPTION!" + bse.toString());

}

agent = local.getDiscoveryAgent();

devicesFound = new Vector();

try {

if (! agent.startInquiry (DiscoveryAgent.GIAC, this)) {

Log.out.println (" DISCOVERING IS NOT STARTED");

}

} catch (BluetoothStateException bse) {

Log.out.println (" BluetoothStateException "+ bse.toString());

}

}

При обнаружении Bluetooth-устройства вызывается метод deviceDiscovered(), который получает в качестве параметров найденное устройство remoteDevice и его тип deviceClass.

Далее приводится программный код (листинг 3.10) этого метода. В методе выполняется добавление в список, отображаемый на экране, доступных рядом находящихся Bluetooth-устройств. Найденное устройство также добавляется в массив devicesFound.

Листинг 3.10 - Обработка события, связанного с обнаружением нового устройства

/**

* Called when a device is discovered during device discovery

* @param remoteDevice founded device

* @param deviceClass

public void deviceDiscovered (RemoteDevice remoteDevice,

DeviceClass deviceClass) {

try {

midlet.getSelectDeviceDisplay().getDevicesList().addItem (

remoteDevice.getFriendlyName(false));

devicesFound.addElement(remoteDevice);

} catch (IOException ex) {

Log.out.println ("ex when device has been discovered "+ex.toString());

}

}

После окончания поиска всех устройств вызывается метод inquiryCompleted(), в параметре которого содержится код результата поиска. Далее приводится этот метод (листинг 3.11).

Листинг 3.11 - Завершение поиска устройств

/**

* Called when device discovering is complete

* @param - param discovering status

public void inquiryCompleted (int param) {

midlet.getSelectDeviceDisplay().removeCommand (midlet.getSelectDeviceDisplay().

getStopSearchDevices());

midlet.getSelectDeviceDisplay().addCommand (midlet.getSelectDeviceDisplay().

getBackSelectDevice());

switch (param) {

case DiscoveryListener.INQUIRY_COMPLETED:

if (devicesFound.size() > 0) {

midlet.getSelectDeviceDisplay().removeCommand (

midlet.getSelectDeviceDisplay().getStopSearchDevices());

midlet.getSelectDeviceDisplay().addCommand (

midlet.getSelectDeviceDisplay().getBackSelectDevice());

doServiceSearch((RemoteDevice) devicesFound.elementAt(0));

} else

break;

case DiscoveryListener.INQUIRY_ERROR:

 //Error during inquiry

break;

case DiscoveryListener.INQUIRY_TERMINATED:

 // Inquiry terminated by agent.cancelInquiry()

break;

}

}

62

Рисунок 3.5 - Список найденных устройств

После поиска устройств (на рисунке 3.5 показан список обнаруженных устройств) начинается поиск сервисов на одном из них. Найденные сервисы запоминаются в массиве ServiceRecord[] servicesFound. В следующем листинге 3.12 приводится метод, который начинает поиск сервисов. Для начала поиска вызывается метод searchServices() ранее созданного объекта DiscoveryAgent agent, которому передаются следующие параметры: атрибуты искомого сервиса или его UUID, удаленное устройство, на котором производить поиск, а также ссылка на объект, который будет обрабатывать все события, связанные с обнаружением сервисов.

Листинг 3.12 - Инициация поиска сервисов

/**

* This method starts service search on the divice

* @param device to be scanned for services

public void doServiceSearch (RemoteDevice device) {

* Service search will always give the default attributes:

* ServiceRecordHandle (0x0000), ServiceClassIDList (0x0001),

* ServiceRecordState (0x0002), ServiceID (0x0003) and

* ProtocolDescriptorList (0x004).

* These hex-values must be supplied through an int array

*/

int[] attributes = null; // {0x100};

/*

* Supplying UUIDs in an UUID array enables searching for

* specific services.

UUID[] uuids = new UUID[1];

uuids[0] = new UUID(0x0003);

try {

agent.searchServices (attributes, uuids, device, this);

} catch (BluetoothStateException e) {

Log.out.println ("BluetoothStateException error" + e.getMessage());

}

}

Когда поиск сервисов завершен, вызывается метод serviceSearchCompleted(), код которого приведен ниже (листинг 3.13). В параметре данного метода содержится код результата поиска сервисов.

Листинг 3.13 - Завершение поиска сервисов

/**

* Called when service search completes

* @param transID identifies a particular service search

* @param respCode indicates why the service search is ended

*/

public void serviceSearchCompleted (int transID, int respCode) {

switch (respCode) {

case DiscoveryListener.SERVICE_SEARCH_COMPLETED:

Log.out.println ("serviceSearchCompleted: SERVICE_SEARCH_COMPLETED");

if (servicesFound.length > 0) {

midlet.getSelectDeviceDisplay().addCommand (

midlet.getSelectDeviceDisplay().getSelectDeviceCommand());

}

/*

* The service to connect to has been found earlier

* (by service discovery) and the service record is

* referencedthrough the object named: service (of type

* ServiceRecord)

*/

break;

case DiscoveryListener.SERVICE_SEARCH_DEVICE_NOT_REACHABLE:

Log.out.println ("serviceSearchCompleted: SERVICE_SEARCH_DEVICE_NOT_REACHABLE");

break;

case DiscoveryListener.SERVICE_SEARCH_ERROR:

Log.out.println ("serviceSearchCompleted: SERVICE_SEARCH_ERROR");

break;

case DiscoveryListener.SERVICE_SEARCH_NO_RECORDS:

Log.out.println ("serviceSearchCompleted: SERVICE_SEARCH_NO_RECORDS");

break;

case DiscoveryListener.SERVICE_SEARCH_TERMINATED:

Log.out.println ("serviceSearchCompleted: SERVICE_SEARCH_TERMINATED");

break;

}

}

Когда среди обнаруженных устройств выбрано одно и выполнен на нем поиск сервисов, то можно осуществить передачу данных по Bluetooth. Передача осуществляется через StreamConnection, URL которого получается с помощью следующего метода (листинг 3.14).

Листинг 3.14 - Получение URL для доступа к сервису

public String getServiceConnectionURL (int nom) {

if (nom < servicesFound.length) {

return servicesFound[nom].getConnectionURL (

ServiceRecord.NOAUTHENTICATE_NOENCRYPT,

false);

} else {

return null;

}

}

Следующий листинг 3.15 содержит код, который выполняет передачу данных. Метод sendImageViaBluetooth получает массив байт, который представляет собой изображение.

Листинг 3.15 - Отправка изображения по Bluetooth

public static void sendImageViaBluetooth (byte[] data) {

OutputStream btOutStr = null;

try {

StreamConnection conn = null;

String connectionURL = Preferences.getInstanse().getBTConnectionURL();

if (connectionURL == "") {

Log.out.println ("connectionURL is empty");

return;

}

try {

conn = (StreamConnection) Connector.open(connectionURL);

} catch (IOException e) {

Log.out.println (" sendImageViaBluetooth" + e.toString());

}

btOutStr = conn.openOutputStream();

btOutStr.write(data);

btOutStr.close();

} catch (IOException ex) {

Log.out.println ("sending image via BT failed (IOException)" + ex.toString());

} catch (Throwable th) {

Log.out.println ("sending image via BT failed" + th.toString());

} finally {

try {

btOutStr.close();

} catch (IOException ex) {

Log.out.println ("IOException while closing stream" + ex.toString());

}

}

}

Прием и отображение полученного кадра выполняется аналогичным способом на другом телефоне. Соответствующий код представлен в приложении А.

На следующем рисунке 3.6 приведен пример получения клиентом изображения по Bluetooth и отображения его на форме.

62

Рисунок 3.6 - Передача данных по Bluetooth

3.4 Работа с файловой системой телефона

В конфигурации CLDC отсутствует API для работы с файловой системой и внешними картами памяти телефона, т. к. не у каждого устройства с профилем MIDP есть файловая система.

Платформа J2SE включает в себя java.io. File и сопутствующие классы, но эти пакеты слишком тяжеловесны для мобильных устройств. Для работы с файлами в мобильных устройствах разработан пакет JSR-75 [10], который предоставляет простой и легковесный FileConnection API для работы с файловой системой. FileConnection API позволяет приложениям создавать, выполнять чтение и запись в файлы и директории, размещенные на телефоне или карте памяти. Основные классы и интерфейсы пакета JSR-75 следующие:

- интерфейс FileConnection - для доступа к файлам и директориям;

- интерфейс FileSystemListener - для прослушивания извещения о добавлении или удалении корневых директорий;

- класс FileSystemRegistry - центральный реестр для слушателей о добавлении или удалении корневых файловых систем;

- класс ConnectionClosedException - исключение, которое выбрасывается в случае невозможности выполнения методов FileConnection по причине закрытия соединения;

- класс IllegalModeException - исключение, которое выбрасывается в случае выполнения методов, требующих особых режимов безопасности, таких как READ или WRITE, но FileConnection открыт в другом режиме.

Приложение может открыть соединение, используя метод Connector.open(). Его единственный параметр - URL, содержащий полный путь к файлу специального формата: file:// <host>/<root>/<directory>/<directory>/…/<fileName>. Элемент host может быть пустым.

Список доступных корневых директорий устройства можно получить с помощью вызова метода FileSystemRegistry.listRoots().

Установив соединение FileConnection с файлом или каталогом, можно выполнять следующие действия:

Страницы: 1, 2, 3, 4, 5, 6



© 2003-2013
Рефераты бесплатно, курсовые, рефераты биология, большая бибилиотека рефератов, дипломы, научные работы, рефераты право, рефераты, рефераты скачать, рефераты литература, курсовые работы, реферат, доклады, рефераты медицина, рефераты на тему, сочинения, реферат бесплатно, рефераты авиация, рефераты психология, рефераты математика, рефераты кулинария, рефераты логистика, рефераты анатомия, рефераты маркетинг, рефераты релиния, рефераты социология, рефераты менеджемент.