Модераторы: javastic
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Пересылка файлов по bluetooth 
:(
    Опции темы
DevGroup
Дата 5.5.2011, 16:20 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 3
Регистрация: 5.5.2011

Репутация: нет
Всего: нет



Здравствуйте!
Пытаюсь реализовать программу, которая с использованием сервиса пересылает файлы по bluetooth. (Запускаю на HTC Wildfire, Android 2.2.1).
С устройством связывается нормально, а вот саму передачу файла реализовать не получается:

Код
    OutputStream osSend;
    try {
        mmSocket.connect();
        osSend = mmSocket.getOutputStream();
        } catch (IOException e) {
            try {
                mmSocket.close();
            } catch (IOException e2) {}
            return;
        }

    File file = getPhoto();//получаю файл - фотографию
    int nRead;
    int nPartSize = 1024;
    byte[] buffer = new byte[nPartSize];
    InputStream isFile = null;
    try {
        isFile = new BufferedInputStream(new FileInputStream(file));
//        osSend.write(file.getName().getBytes());//пытался сначала посылать имя файла и его размер - не помогло)
//        osSend.write(Long.toString(file.length()).getBytes());
        nRead = isFile.read(buffer, 0, nPartSize);
        while (nRead > 0){
            osSend.write(buffer, 0, nRead);
            nRead = isFile.read(buffer, 0, nPartSize);
            osSend.flush();
        }
    }
    catch (Exception e) {
        //TODO выдать сообщение, что файл не передан
    }
    finally {
        try {
            isFile.close();
            osSend.close();
            mmSocket.close();
        } catch (IOException e) {}
    }

В спецификации bluetooth читал, что сначала посылается код начала потока, затем имя файла и его размер, затем сам файл и в конце код конца потока.
Но, к сожалению, нигде этих кодов найти не смог.

Когда пытаюсь переслать файл на ноутбук (Windows 7), сначала ничего не пишет (не отображает прогресс принятия файла, хотя программа исправно пишет данные в поток), затем, в конце, когда вызываю mmSocket.close();, пишет:
"Windows was unable to transfer some files
Catastrophic failure"

При попытке послать файл на телефон (Nokia) выдаёт только 2 сообщения:
"Устройство ... подключено" и
"Устройство ... отключено"

Подскажите, пожалуйста, как наладить передачу файла?
Заранее огромное спасибо за помощь! 
PM MAIL   Вверх
alexvs11
Дата 5.5.2011, 16:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


hell is here
**


Профиль
Группа: Участник
Сообщений: 518
Регистрация: 21.8.2010

Репутация: нет
Всего: 10



приведенный кусок кода мало о чем говорит
1. не знаю как это в андроиде работает, но вы уверены, что система понимает, что у вас opp профайл?
2. там точно не должно быть никакой управляющей инфы ибо обычный порядок работы профайла:

- регистрация профайла в система (gap все дела)
- установка транспорта (l2cap, rfcomm в андроиде вроде нету)
- конфигурация профайла (opp в частности)
- сама передача
PM MAIL   Вверх
ROKR
Дата 5.5.2011, 18:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 9
Регистрация: 26.9.2009

Репутация: нет
Всего: 1



Есть же готовый OPP в андроиде. Почему не использовать его классы для передачи?
PM MAIL   Вверх
DevGroup
Дата 7.5.2011, 17:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 3
Регистрация: 5.5.2011

Репутация: нет
Всего: нет



Цитата(ROKR @ 5.5.2011,  18:55)
Есть же готовый OPP в андроиде. Почему не использовать его классы для передачи?

А Вы не могли бы поподробнее написать про Opp в андроиде? (желательно с примером)
В Android SDK есть OutputStream (используется в примере BluetoothChat), который, насколько я понял, не даёт возможности выбрать OPP, FTP и т.п.

В интернете нашёл исходники для посылки файла с помощью Opp (package Bluetooth.Opp), но приспособить никак не получается - требуется javax.obex, другой класс BluetoothDevice (отличный от встроенного по дефолту в Android.jar) и т.д.. И собрать всё это вместе чтобы работало не удаётся(

Попробовал использовать ObjectOutputStream:
Код

        BluetoothDevice device = mBTAdapter.getRemoteDevice(DeviceMAC);//Получаем устройство по известному MAC-адресу
        BluetoothSocket mmSocket;
        try {
            Method m;
            m = device.getClass().getMethod("createRfcommSocket", new Class[]{int.class});
            mmSocket = (BluetoothSocket)m.invoke(device, Integer.valueOf(1));//получаем сокет
        } catch (Exception e) {return;} 

              mmSocket.connect();

            ObjectOutputStream os;
            os = new ObjectOutputStream(mmSocket.getOutputStream());
            os.writeByte(ObjectOutputStream.TC_OBJECT);//послать отметку о новом объекте ("tag to mark a new object")
//...

Однако Windows на шаге "os = new ObjectOutputStream(mmSocket.getOutputStream());" выдаёт
"Windows was unable to transfer some files
Catastrophic failure"
PM MAIL   Вверх
DevGroup
Дата 8.5.2011, 20:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 3
Регистрация: 5.5.2011

Репутация: нет
Всего: нет



Итак, небольшой успех, может кому пригодится:
Готовый Opp так и не нашёл, зато наткнулся на описание протокола OBEX
По нему сделал пересылку файлов:
Код

        int nRead, nRcv;
        int nPartSize = 1024;
        byte[] buffer = new byte[nPartSize];
        byte[] rcvBuff = new byte[nPartSize];
        InputStream isFile = null;
        try {
            isFile = new BufferedInputStream(new FileInputStream(file));

            //пакет с запросом на подключение
            buffer[0] = (byte)0x80;//HI - Connect
            buffer[1] = (byte)0x00;
            buffer[2] = (byte)0x07;//длина пакета
            buffer[3] = (byte)0x10;//версия OBEX
            buffer[4] = (byte)0x00;
            buffer[5] = (byte)0x04;//0x04 - 1024 - max длина входящего пакета
            buffer[6] = (byte)0x00;
            osSend.write(buffer, 0, 7);

            //считываем ответ из входного потока BT
            //...

            //Посылаем информацию о файле (имя, размер)
            long filelen = file.length();
            short namelen = (short) ((file.getName().length()+1)*2);
            
            ByteBuffer bb = ByteBuffer.allocate(namelen+15-4);
            bb.order(ByteOrder.BIG_ENDIAN);
            bb.put((byte) 0x02);
            bb.putShort((short) (namelen+15-4));//длина пакета
            bb.put((byte) 0x01);//HI - Name
            bb.putShort((short) (namelen+3));//длина имени с заголовком
            for (int i = 0; i < file.getName().length(); i++){
                bb.put((byte) 0x00);
                bb.put(file.getName().getBytes()[i]);
            }
            bb.putChar((char) 0);//конец строки
            bb.put((byte) 0xC3);//HI - Length
            bb.putInt((int) filelen);
            bb.rewind();
            bb.get(buffer, 0, bb.capacity());
            osSend.write(buffer,0,namelen+15-4);
            
            //считываем ответ из входного потока BT
            //...

            // Загрузка файла
            long nSend = 0;
            while (nSend < filelen){
                if ((filelen-nSend) > (nPartSize-6)){
                    bb = ByteBuffer.allocate(6);//не последний кусок
                    bb.put((byte) 0x02);
                    bb.putShort((short) nPartSize);
                    bb.put((byte) 0x48);
                    bb.putShort((short) (nPartSize-3));
                }
                else{
                    bb = ByteBuffer.allocate(6);//последний кусок
                    bb.put((byte) 0x82);
                    bb.putShort((short) (filelen-nSend+6));
                    bb.put((byte) 0x49);
                    bb.putShort((short) (filelen-nSend+3));
                };
                bb.rewind();
                bb.get(buffer, 0, bb.capacity());
                
                nRead = isFile.read(buffer, 6, nPartSize-6);
                if (nRead == -1)
                    throw new Exception();
                osSend.write(buffer, 0, nRead+6);

                //считываем ответ из входного потока BT
                //...

                nSend += nRead;//сколько считано из файла
            }
            
            //Disconnect
            buffer[0] = (byte)0x81;
            buffer[1] = (byte)0x00;
            buffer[2] = (byte)0x03;
            osSend.write(buffer, 0, 3);

        }
        catch (Exception e) {
            //TODO выдать сообщение, что файл не передан
        }
        finally {
            try {
                isFile.close();
                osSend.close();
                mmSocket.close();
            } catch (IOException e) {}

На компьютер файл передаётся, а на телефон не хочет.
Nokia вместо ответов на входящие пакеты (см. pdf OBEX) отсылает мои же пакеты обратно smile 


Если кто-нибудь подскажет где найти описание протокола для передачи файлов на телефон, буду очень благодарен)

Это сообщение отредактировал(а) DevGroup - 8.5.2011, 20:12
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Android | Следующая тема »


 




[ Время генерации скрипта: 0.0609 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.