}
component.setStyle(style);
public Component getListFocusComponent (List list) {
return null;
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();
if (! agent.startInquiry (DiscoveryAgent.GIAC, this)) {
Log.out.println (" DISCOVERING IS NOT STARTED");
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) {
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
case DiscoveryListener.INQUIRY_TERMINATED:
// Inquiry terminated by agent.cancelInquiry()
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);
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().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)
case DiscoveryListener.SERVICE_SEARCH_DEVICE_NOT_REACHABLE:
Log.out.println ("serviceSearchCompleted: SERVICE_SEARCH_DEVICE_NOT_REACHABLE");
case DiscoveryListener.SERVICE_SEARCH_ERROR:
Log.out.println ("serviceSearchCompleted: SERVICE_SEARCH_ERROR");
case DiscoveryListener.SERVICE_SEARCH_NO_RECORDS:
Log.out.println ("serviceSearchCompleted: SERVICE_SEARCH_NO_RECORDS");
case DiscoveryListener.SERVICE_SEARCH_TERMINATED:
Log.out.println ("serviceSearchCompleted: SERVICE_SEARCH_TERMINATED");
Когда среди обнаруженных устройств выбрано одно и выполнен на нем поиск сервисов, то можно осуществить передачу данных по 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 {
Следующий листинг 3.15 содержит код, который выполняет передачу данных. Метод sendImageViaBluetooth получает массив байт, который представляет собой изображение.
Листинг 3.15 - Отправка изображения по Bluetooth
public static void sendImageViaBluetooth (byte[] data) {
OutputStream btOutStr = null;
StreamConnection conn = null;
String connectionURL = Preferences.getInstanse().getBTConnectionURL();
if (connectionURL == "") {
Log.out.println ("connectionURL is empty");
return;
Страницы: 1, 2, 3, 4, 5, 6, 7