Главная » Разработка для Android » Установка сокета BluetoothServerSocket в режим ожидания

0

BluetoothServerSocket используется для ожидания запроса на подключе- ние от объекта BluetoothSocket, расположенного на удаленном устройстве. Чтобы установить связь между двумя адаптерами, один из них должен вести себя, как сервер (ожидая и принимая запросы на подключение), а другой — как клиент (инициируя запрос на подключение  к серверу).

При подключении управление  связью на обоих концах ведется с помо- щью объектов BluetoothSocket.

Чтобы начать процесс ожидания входящего соединения, вызовите метод listenUsingRfcommWithServiceRecord из объекта BluetoothAdapter, пере- давая ему в качестве параметров строку name (для идентификации вашего сервера) и универсальный уникальный идентификатор устройства  UUID. В результате этих действий вы получите объект BluetoothServerSocket. Обратите  внимание,  что клиентский сокет, который  будет подключаться к данному адаптеру, должен знать его UUID.

Начать  отслеживание входящих  подключений поможет  метод accept, вызванный из серверного сокета (при необходимости можно также указать длительность этого процесса).  Теперь BluetoothServerSocket будет забло- кирован, пока к нему не попытается  подключиться удаленное устройство, передающее соответствующий UUID. Если подключение  инициировано

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

ВНИМАНИЕ

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

Важно отметить, что для установления связи ваш адаптер должен быть до- ступным для обнаружения удаленными Bluetooth-устройствами. В листин- ге 13.8 показан каркас, в котором ACTION_REQUEST_DISCOVERABLE

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

Листинг 13.8. Ожидание запросов на подключение  от BluetoothSocket

startActivityForResult(new

Intent(BluetoothAdapter.ACTION_REQUEST_DISCOVERABLE), DISCOVERY_REQUEST);

@Override

protected void onActivityResult(int requestCode, int resultCode, Intent data) {

if (requestCode == DISCOVERY_REQUEST) { boolean isDiscoverable = resultCode > 0; int discoverableDuration = resultCode;

if (isDiscoverable) {

UUID uuid = UUID.fromString("a60f35f0-b93a-11de-8a39-

08002009c666");

String name = "bluetoothserver";

final BluetoothServerSocket btserver =

bluetooth.listenUsingRfcommWithServiceRecord(name, uuid);

Thread acceptThread = new Thread(new Runnable() {

public void run() {

try {

// Блокируется, пока соединение не будет установлено.

BluetoothSocket serverSocket = btserver.accept();

// TODO Передать данные с помощью серверного сокета

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

}

}

});

acceptThread.start();

}

}

}

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

По теме:

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