Главная » Разработка для Android » Выбор удаленных Bluetooth-устройств для подключения

0

Класс BluetoothSocket используется клиентским устройством  для соз- дания канала связи между вашим приложением и ожидающим  серверным сокетом.

Создание  клиентского сокета происходит  с помощью вызова метода createRfcommSocketToServiceRecord из объекта  BluetoothDevice. Этот объект представляет собой удаленное устройство,  с которым необходи- мо связаться.  На самом удаленном устройстве должен находиться объект BluetoothServerSocket, ожидающий  запросов  на подключение  (описано в предыдущем разделе).

Есть несколько способов получить ссылку на удаленное устройство. Существуют  также некоторые  ограничения в отношении  устройств,  с ко- торыми вы можете устанавливать связь.

Условия для установления соединения  через Bluetooth. Чтобы  объ- ект BluetoothSocket мог установить  соединение  с удаленным  Bluetooth- устройством,  должны выполняться следующие условия:

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

удаленное  устройство  должно  принимать подключения с помощью объекта BluetoothServerSocket;

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

Поиск Bluetooth-устройства для установления связи. Каждый экзем- пляр  класса  BluetoothDevice — удаленное  устройство.  Эти объекты  ис- пользуются  для получения свойств удаленного адаптера и для соединения через BluetoothSocket. Существует  несколько  способов получить  объект BluetoothDevice внутри своей программы.

В любом случае необходимо убедиться в том, что устройство, к которому вы хотите подключиться, доступно  для обнаружения, и (при  необходи- мости)  узнать, привязано ли оно к вашему адаптеру. Если вы не можете обнаружить удаленное  устройство,  то предложите пользователю сделать его доступным для сканирования.

Ранее в этом разделе вы уже познакомились с одним способом обнару- жения Bluetooth-устройств, который заключался в использовании метода startDiscovery и в отслеживании срабатывания действия ACTION_FOUND. Вы знаете, что каждое полученное  Намерение содержит  дополнительный параметр BluetoothDevice.EXTRA_DEVICE, в котором находится  объект BluetoothDevice, представляющий обнаруженное устройство.

Можно использовать и метод getRemoteDevice из объекта BluetoothAdapter, указывая аппаратный адрес удаленного  адаптера, к которому  нужно под- ключиться.

BluetoothDevice device = bluetooth.getRemoteDevice("01:23:77:35:2F:AA");

Чтобы получить набор связанных на данный момент устройств, вызо- вите метод getBondedDevices из объекта BluetoothAdapter. Можно посылать запросы внутри возвращенного набора, чтобы проверить, связано ли целевое устройство с локальным адаптером.

Set<BluetoothDevice> bondedDevices = bluetooth.getBondedDevices();

if (bondedDevices.contains(remoteDevice))

// TODO Целевое устройство связано с локальным адаптером.

В листинге 13.9 представлен пример того, как можно проверить доступ- ность целевого устройства  для обнаружения и связанности.

Листинг 13.9. Проверка  удаленного устройства  на возможность обнаружения и связанность

final BluetoothDevice device =

bluetooth.getRemoteDevice("01:23:77:35:2F:AA");

final Set<BluetoothDevice> bondedDevices = bluetooth.getBondedDevices();

BroadcastReceiver discoveryResult = new BroadcastReceiver() {

@Override

public void onReceive(Context context, Intent intent) { BluetoothDevice remoteDevice = intent.getParcelableExtra(BluetoothDevice.EXTRA_DEVICE);

if ((remoteDevice.equals(device) && (bondedDevices.contains(remoteDevice)) {

// TODO Целевое устройство связано с локальным адаптером

// и доступно для обнаружения

}

};

registerReceiver(discoveryResult,

new IntentFilter(BluetoothDevice.ACTION_FOUND));

if (!bluetooth.isDiscovering())

bluetooth.startDiscovery();

Создание соединения с помощью клиентского сокета

BluetoothSocket

Чтобы наладить канал связи с удаленным  устройством,  создайте сокет BluetoothSocket с помощью объекта BluetoothDevice, который это устрой- ство представляет.

Для соединения  вызовите  метод createRfcommSocketToServiceRecord в контексте Bluetooth-устройства, к которому хотите подключиться, пере- дав идентификатор UUID серверного  сокета, ожидающего запрос на под- ключение.

Если вы попытаетесь подключиться к устройству, которое еще не было связано  с вашим локальным адаптером,  пользователю будет предложено осуществить  связывание, прежде чем завершится вызов  метода connect. Этот процесс показан на рис. 13.4.

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

Объект  BluetoothSocket, который  при этом возвращается, может ис- пользоваться для подключения с помощью метода connect,  как показано в листинге 13.10.

ВНИМАНИЕ

Метод connect блокирует работу приложения, поэтому запросы на подключение рекомендуется делать в фоновом режиме, вместо того чтобы «замораживать» пользовательский интерфейс, пока соединение не установлено.

Листинг 13.10. Соединение с удаленным  серверным Bluetooth-устройством

try{

BluetoothDevice device = bluetooth.getRemoteDevice("00:23:76:35:2F:AA"); BluetoothSocket clientSocket =

device.createRfcommSocketToServiceRecord(uuid);

clientSocket.connect();

// TODO Передача данных с помощью BluetoothSocket

} catch (IOException e) { Log.d("BLUETOOTH", e.getMessage());

}

Источник: Майер P. Android 2 : программирование приложений для планшетных компьютеров и смартфонов : [пер. с англ. ] / Рето Майер. — М. : Эксмо, 2011. — 672 с. — (Мировой компьютерный бестселлер).

По теме:

  • Комментарии