Клиент Windows C++ Obex отправляет запрос, но файл не отправляется на AndroidC++

Программы на C++. Форум разработчиков
Ответить
Anonymous
 Клиент Windows C++ Obex отправляет запрос, но файл не отправляется на Android

Сообщение Anonymous »

OBEX, вероятно, является наиболее часто используемым методом передачи файлов через устройства, поддерживающие Bluetooth. Напротив, несмотря на то, что он является наиболее распространенным, он не очень хорошо документирован, как он на самом деле работает.
У меня мало опыта в OBEX. Моя цель — разработать клиентский сервер OBEX на моем ноутбуке, который должен отправлять файлы на мое устройство Android с помощью такого всплывающего окна.
Я выбрал C++ в качестве языка для программирования сервера с нуля. Окна. UUID для этого действия, которое я использую, следующий.

Код: Выделить всё

00001105-0000-1000-8000-00805F9B34FB
и я инициализировал клиент OBEX следующим образом.

Код: Выделить всё

    GUID OBEX_GUID;

UuidFromString((unsigned char*)"00001105-0000-1000-8000-00805F9B34FB",(UUID*)&OBEX_GUID);

SOCKET soc,acpt;
SOCKADDR_BTH BluetoothAddress;

BluetoothAddress.addressFamily = AF_BTH;
BluetoothAddress.port = BT_PORT_ANY;
str2ba((char*)"BC:41:01:11:BC:2F",&BluetoothAddress.btAddr);
BluetoothAddress.serviceClassId = OBEX_GUID;
//OBEXObjectPushServiceClass_UUID;

soc = socket(AF_BTH , SOCK_STREAM , BTHPROTO_RFCOMM);

if(soc>0){
printf("Socket initialisation success\n");
}

stat = connect(soc,(sockaddr*)&BluetoothAddress,sizeof(BluetoothAddress));
printf("%s\n\n",(stat==0) ? "CONNECTED to the remote device!" : "Remote device is unavailable." );

Процесс подключения пока успешен, и без каких-либо ошибок начинается связь с моим устройством Android по адресу BC:41:01:11:BC:2F. Статус функции сокета connect() возвращает ноль (тоже успех).
Теперь, согласно OBEX 1.4 pdf, мне нужно запустить сеанс после соединение успешно установлено. Итак, на странице 38 PDF-файла хорошо описан начальный сеанс подключения, и я попытался имитировать синтаксис подключающегося пакета, например

Код: Выделить всё

char connect_req[] = {
0x80 , 0x00 , 0x11 , 0x10 , 0x00 , 0x20 , 0x00 , 0xc0  , 0x00 , 0x00 , 0x00 , 0x01 , 0xc3       ,   0x00 , 0x00 , 0xf4 , 0x83
//  CNCT | 2B Length   | Vers | Flag | Max Pack 8K | Count | 4 byte file count         | Len Header |   Total length of hex
};
После отправки этого пакета подключения на мой Android он успешно возвращается со значением 0xA0. Это означает, что сеанс наконец-то начался.
После запуска сеанса мне нужно отправить фиктивный файл, который необходимо запросить в качестве метода PUT. который определен на странице 40 PDF-файла. попробовал сделать такую ​​же имитацию и получил вот такую ​​упаковку.

Код: Выделить всё

unsigned char putfile_req[] = {
0x82 , 0x00 , 0x21 , 0x01    , 0x00 , 0x17 ,   0x00,0x41   ,  0x00,0x42  ,  0x00,0x43  , 0x00,0x44  , 0x00,0x45 , 0x00,0x2c ,  0x00,0x74  ,  0x00,0x78 ,  0x00,0x74  ,  0xC3 ,  0x00 , 0x00 , 0x00 , 0x01 ,  0x49  , 0x00 , 0x01 ,  0x74
//      PUT  |  2b Len     | HI Name |  NameLen    |       A              B             C            D             E           .            T             X            T      |  Len  |              1  Byte       |  end   |     1 Byte  |
};

После отправки этого запроса PUT с именем файла ABCDE.TXT (1 байт) ответ от моего Android каким-то образом возвращается неудачно со значением нуля ( 0)
Проблема в том, что до состояния сеанса подключения каждый запрос и ответ работали нормально, но всякий раз, когда я отправляю запрос PUT с именем файла, он принимается Android, но для по каким-то неизвестным причинам Android не может его обработать и возвращает ноль.
Я слышал, как некоторые люди говорили, что Android не поддерживает OBEX, но если бы это было фактическим фактором, статус успеха (A0) не вернулся бы при отправке пакета подключения в начале.
Если имеет значение, вот полный код...

Код: Выделить всё

#include 
#include 
#include 
#include 
#include 

#include 
#include 

#include 
#include 
#include 
#include 

GUID OBEX_GUID;

int str2ba(const char *straddr, BTH_ADDR *btaddr)
{
int i;
unsigned int aaddr[6];
BTH_ADDR tmpaddr = 0;

if (sscanf(straddr, "%02x:%02x:%02x:%02x:%02x:%02x",
&aaddr[0], &aaddr[1], &aaddr[2],
&aaddr[3], &aaddr[4], &aaddr[5]) != 6)
return 1;
*btaddr = 0;
for (i = 0; i < 6; i++) {
tmpaddr = (BTH_ADDR) (aaddr[i] & 0xff);
*btaddr = ((*btaddr) 0){
printf("Socket initialisation success\n");
}

stat = connect(soc,(sockaddr*)&BluetoothAddress,sizeof(BluetoothAddress));
printf("%s\n\n",(stat==0) ? "CONNECTED to the remote device!" : "Remote device is unavailable." );

char connect_req[] = {
0x80 , 0x00 , 0x11 , 0x10 , 0x00 , 0x20 , 0x00 , 0xc0  , 0x00 , 0x00 , 0x00 , 0x01 , 0xc3       ,   0x00 , 0x00 , 0xf4 , 0x83
//  CNCT | 2B Length   | Vers | Flag | Max Pack 8K | Count | 4 byte file count         | Len Header |   Total length of hex
};

unsigned char putfile_req[] = {
0x82 , 0x00 , 0x21 , 0x01    , 0x00 , 0x17 ,   0x00,0x41   ,  0x00,0x42  ,  0x00,0x43  , 0x00,0x44  , 0x00,0x45 , 0x00,0x2c ,  0x00,0x74  ,  0x00,0x78 ,  0x00,0x74  ,  0xC3 ,  0x00 , 0x00 , 0x00 , 0x01 ,  0x49  , 0x00 , 0x01 ,  0x74
//      PUT  |  2b Len     | HI Name |  NameLen    |       A              B             C            D             E           .            T             X            T      |  Len  |              1  Byte       |  end   |     1 Byte  |
};

printf("PUT packet Length: %d\n\n",sizeof(putfile_req)/sizeof(unsigned char));

send(soc,(const char*)connect_req,sizeof(connect_req)/sizeof(connect_req[0]),0);
int Recvd = recv(soc,(char*)response,sizeof(response),0);

printf("OBEX CONNECT status: %X\n",response[0]);
if(response[0]==0xA0){
printf(" SUCCESS\n");
}

memset(response,0,sizeof(response));

send(soc,(char*)putfile_req,sizeof(putfile_req)/sizeof(putfile_req[0]),0);
Recvd = recv(soc,(char*)response,sizeof(response),0);

printf("PUT Request status: %X\n",response[0]);

if(response[0]==0x00){
printf("Something went wrong!\n");
}

}
Вывод выглядит следующим образом:
Изображение
Несмотря на то, что сеанс подключения прошел успешно с возвращаемым значением 0xA0, сокет закрывается с нулевым кодом ошибки в ответ на запрос PUT. Следовательно, всплывающий диалог на моей стороне Android не должен появляться.
Теперь все, что я хочу, это отправить файл из клиента Winsock2 OBEX, написанный с нуля, на мой Android, где он должен быть на моем устройстве Android появится всплывающее окно с просьбой принять или отклонить входящий файл или запрос. после принятия должна начаться передача файла.
Так что это почему-то похоже на мою ошибку, которую я не могу диагностировать. Вот почему я здесь, чтобы попросить добрых советов и помощи у тех, кто имеет большой опыт в этой области.
Спасибо и с уважением.

Подробнее здесь: https://stackoverflow.com/questions/785 ... he-android
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «C++»