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
|