У меня мало опыта в OBEX. Моя цель — разработать клиентский сервер OBEX на моем ноутбуке, который должен отправлять файлы на мое устройство Android с помощью такого всплывающего окна.
Я выбрал C++ в качестве языка для программирования сервера с нуля. Окна. UUID для этого действия, которое я использую, следующий.
Код: Выделить всё
00001105-0000-1000-8000-00805F9B34FB
Код: Выделить всё
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." );
Теперь, согласно 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
};
После запуска сеанса мне нужно отправить фиктивный файл, который необходимо запросить в качестве метода 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 с именем файла, он принимается 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
Мобильная версия