Основной вопрос:
Если я открываю несколько соединений Bluetooth в Android 2.2+, имеет ли значение UUID для обеспечения уникальности используемого канала RFCOMM?
Справочная информация:
Я хочу создать приложение для Android, которое будет находиться на нескольких (3+) разных телефонах Android (минимальная версия Android 2.2). Каждый экземпляр приложения будет общаться друг с другом через Bluetooth. Поэтому в каждом приложении одновременно будет открыто несколько соединений Bluetooth для общения со всеми участвующими приложениями.
Я знаю, что это (по крайней мере) возможно, потому что я расширил пример приложения BluetoothChat для поддержки N клиентов, которые все общаются в чате в стиле чата. Таким образом, у меня есть возможность держать открытыми несколько подключений Bluetooth одновременно.
Меня беспокоит следующее утверждение в документации Android:
«В отличие от TCP / IP, RFCOMM допускает только один подключенный клиент на канал за раз, поэтому в большинстве случаев имеет смысл вызывать close () на BluetoothServerSocket сразу после принятия подключенного сокета».
(http://developer.android.com/guide/topics/wireless/bluetooth.html)
Теперь тот факт, что моя реализация приложения BluetoothChat в стиле чата говорит мне, что мой подход к открытию одновременных соединений приводит к соединениям на разных каналах RFCOMM (в противном случае я получаю сбои соединения или перекрестные помехи). Однако я не уверен, что ЧАСТЬ моего подхода приводит к различным каналам RFCOMM, и это то, о чем этот вопрос.
Мой подход к открытию нескольких соединений Bluetooth состоит из двух частей:
1. Вместо того, чтобы использовать один и тот же объект BluetoothServerSocket для принятия нескольких соединений с помощью многократного вызова accept (), я создаю поток, который вызывает listenUsingRfcommWithServiceRecord (String, UUID) для каждого соединения, которое я хочу принять.
2. Вместо того, чтобы использовать один и тот же UUID для каждого соединения, у меня есть набор из 7 UUID, которыми я управляю вручную, так что каждый accept () находится на BluetoothServerSocket, созданном с другим UUID.
Теперь, насколько я понимаю из документации, listenUsingRfcommWithServiceRecord (String, UUID) добавляет запись в базу данных SDP для прослушивания. Ясно, что тот факт, что я создаю отдельную запись базы данных SDP для каждого принятого соединения, является, по крайней мере, частью причины, по которой разные соединения RFCOMM используются для каждого соединения. Но влияет ли UUID здесь? Если бы мне пришлось вызывать метод 7 раз в 7 разных потоках, использующих один и тот же UUID, он все равно работал бы? Или разные UUID вызывают использование разных каналов RFCOMM?
Проблема здесь, очевидно, заключается в том, что мне приходится управлять 7 различными UUIDS для моего приложения, обеспечивая надлежащую синхронизацию доступных UUIDS соединений, когда соединения открываются и закрываются, может быть огромной проблемой. Если кто-либо может подтвердить или опровергнуть, что идентификаторы UUID влияют на выбор канала RFCOMM при вызове listenUsingRfcommWithServiceRecord (String, UUID), это будет чрезвычайно полезно.
(Не обсуждалось - влияние UUID на стороне соединения, createRfcommSocketToServiceRecord (UUID); я предполагаю, что, если оно сохраняется для входящих, оно, вероятно, сохраняется для исходящих.)
Спасибо всем, кто может помочь.