Установка Bluetooth Piconet в Android - PullRequest
4 голосов
/ 15 февраля 2011

Я работаю над созданием Bluetooth Piconet среди нескольких устройств на испытательном стенде. Топология этой сети известна всем устройствам.

Устройства в тестовом стенде - настольные ПК Ubuntu и устройства Android (Eclair). Теперь я смотрю на способ установления отношений между подчиненным и ведущим между этими устройствами детерминистическим способом. В частности, я ищу способ установить устройство Android в качестве главного и открыть несколько соединений с 7 другими устройствами.

Я смотрел на собственные реализации, использующие стек bluez и NDK, но реализация стека bluez на моем устройстве (Samsung GT 15503) не соответствует стандартам, я думаю, и даже обычные приложения, такие как hcitool, hciconfig не работают .

Поэтому я попытался использовать официальный SDK и даже преуспел в установке гнезда RFCOMM на своем ноутбуке (используя пример приложения для чата bluetooth в качестве примера). Но я застрял в точке, где я пытаюсь подключить два или более устройств, используя один и тот же BluetoothServerSocket. Если я не закрою исходную розетку, я не могу открыть новые соединения.

Любые предложения на этот счет приветствуются.

Ответы [ 2 ]

8 голосов
/ 17 февраля 2011

Я наконец понял, что я делаю не так. Очевидно, всякий раз, когда вы вызываете метод accept из BluetoothServerSocket и возвращаете сокет, вы должны закрыть этот сокет перед повторным вызовом accept.

Я обошел эту проблему, чтобы создать нужную пикосеть, создав 7 различных UUID и используя BluetoothServerSocket для прослушивания и приема соединения для каждого этих UUID. Как только я получаю соединение для определенного UUID, я закрываю соответствующий сокет сервера и снова открываю другой для следующего UUID.

Следующий фрагмент иллюстрирует идею, которую я получил от BTClickLinkCompete .

for (int i = 0; i < 7; i++) {
                BluetoothServerSocket myServerSocket = mBtAdapter
                        .listenUsingRfcommWithServiceRecord(srcApp, mUuid.get(i));
                BluetoothSocket myBSock = myServerSocket.accept();
                myServerSocket.close(); // Close the socket now that the connection
                //has been made
                //Do stuff with the socket here, like callback to main thread
}

Здесь mUuid - это массив, в котором хранятся 7 различных uuids. Клиенты, пытающиеся подключиться к серверу, также будут обладать этими uuids и будут пробовать их один за другим по порядку, потому что они не знают число клиентов, уже подключенных к серверу.

1 голос
/ 15 февраля 2011

Может быть, это поможет:

Вы должны вызывать метод accept() (из BluetoothServerSocket) для каждого соединения, запомните это.

Когда вы получаете соединение, вы должны начать новый поток с тем, что вы хотите сделать с этим соединением, а затем снова вызвать accept()

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...