Я хочу разработать приложение, использующее Linux Bluetooth API Bluez, позволяя Android-устройству отправлять и получать данные.
Для ПК я рассмотрел этот код: http://people.csail.mit.edu/albert/bluez-intro/x502.html, потому что Android использует протокол RFCOMM, или я предполагаю, что поскольку невозможно вручную установить протокол,
Поскольку в Android можно использовать Java API (Bluez API заблокирован), а SDP не работает очень хорошо, я должен использовать этот вызов:
InsecureBluetooth.createRfcommSocket(BlueDevice , Channel , false);
Когда я устанавливаю канал, например, на 0xC (12), который является одним из каналов, возвращаемых командой:
sdptool browse local | grep Channel
приложение Android может правильно подключаться к ПК.
Проблема в том, что я не могу понять, каков параметр, позволяющий двум приложениям обмениваться данными. На стороне ПК у меня есть только номер порта со значением 1. На стороне Android у меня есть канал, который назначается службе, доступной SDP. Но SDP не работает в Android, так как я могу это сделать?
Любая помощь приветствуется. благодаря
Я решил так:
Для ПК с использованием записи SDP. Мы должны записать эту услугу в хорошо известный канал, который должен быть БЕСПЛАТНО, я имею в виду, что он не используется другой службой. Для этого выполните команду:
sdptool record local
Код для этого - http://people.csail.mit.edu/albert/bluez-intro/x604.html.
Пример раздела 4-9. Описание услуги
Эта две строки должны быть добавлены после того, как //установили общий идентификатор службы
// set the service class ID
sdp_list_t service_class = {NULL, &svc_uuid};
sdp_set_service_classes( record, &service_class);
и мы должны изменить канал на тот, который не используется другой службой. Например, канал 1:
uint8_t rfcomm_channel = 1;
Теперь, когда мы что-то слушаем на стороне ПК, мы должны подключиться к устройству Android непосредственно к каналу с помощью хорошо известного метода отражения, потому что, к сожалению, SDP теперь работает в Android.
Method bluetoothConnect;
bluetoothConnect = BlueDevice.getClass().getMethod("createRfcommSocket", new Class[]{int.class} );
CommunicationChannel = (BluetoothSocket) bluetoothConnect.invoke(BlueDevice, 1);
CommunicationChannel.connect();
Конечно, BlueDevice - это устройство, записанное методом startDiscovery(), и подставка "1" для канала 1.
Я знаю, что это не отвечает на ваш вопрос, я думаю, что bluecove (http://bluecove.org/) будет лучшим выбором для этого. Он поддерживает большинство операционных систем и обеспечивает достойную библиотеку для Java.
Я не думаю, что bluez будет работать для Windows, для этого вам нужен стек WIDCOMM или BlueSoleil, и bluecove будет использовать соответствующий стек для вас.