使用蓝牙FTP从已知设备获取文件

时间:2018-01-09 16:18:17

标签: android bluetooth ftp

对于我正在开发的项目,我有一个运行OBEX监听服务的Raspberry Pi,允许设备在客户端(当前是另一个Raspberry Pi)请求存在于固定“共享”内的文件时从内部存储分发文件“文件夹。我正在努力使这个功能作为Android伴侣程序工作。但是,我发现很多资源实现从 Android设备发送文件另一台设备但是对于如何获取来自主机的文件。

此时我正在寻找的功能是让程序只向硬编码的蓝牙MAC地址“XX-XX-XX-XX-XX-XX”发送请求,要求提供硬编码文件“ test.txt“并将此文件放在Android设备的下载文件夹中,并附带一封toast消息,表明转移已完成。

为了清楚起见,Raspberry Pi正在运行ObexPushd作为监听程序,以防它具有针对性。

1 个答案:

答案 0 :(得分:0)

也许这会对你有所帮助。 (使用javax.OBEX库)

private void GetFileViaBTFTP(UUID FTPUUID)
{
    try
    {
        mBtSocket = mBtDevice.createRfcommSocketToServiceRecord(FTPUUID);
    }
    catch (Exception e)
    {

        //e.printStackTrace();
    }

    Thread thread=new Thread(new Runnable() {
            public void run()
            {
                UUID uuid=UUID.fromString("F9EC7BC4-953C-11D2-984E-525400DC9E09");
                ByteBuffer bb = ByteBuffer.wrap(new byte[16]);
                bb.putLong(uuid.getMostSignificantBits());
                bb.putLong(uuid.getLeastSignificantBits());
                byte [] bytes=bb.array();
                Operation putOperation=null;
                Operation getOperation=null;
                try
                {
                    // connect
                    mBtSocket.connect();
                    mSession = new ClientSession((ObexTransport)(mTransport = new BluetoothObexTransport(mBtSocket)));

                    HeaderSet headerset = new HeaderSet();
                    headerset.setHeader(HeaderSet.TARGET, bytes);

                    headerset = mSession.connect(headerset);

                    if (headerset.getResponseCode() == ResponseCodes.OBEX_HTTP_OK)
                    {
                        mConnected = true;
                    }
                    else
                    {
                        mSession.disconnect(headerset);
                    }
/*
                    //In order to go the desired folder the OBEX SETPATH command is 
                    //being used 
                    //Prepare the header for the SETPATH command
                    HeaderSet header = new HeaderSet(); 
                    //folder_name is set to the name of the desired folder 
                    //if left blank the root folder will be used 
                    //header.setHeader(HeaderSet.NAME, ""); 
                    //Send the SETPATH command 
*/
                    /*result =*//* mSession.setPath(header, false, false); 
                    final HeaderSet geths = new HeaderSet();
                    //geths.setHeader(HeaderSet.NAME, null);
                    geths.setHeader(HeaderSet.TYPE, "x-obex/folder-listing");
                    //hs.setHeader(HeaderSet.LENGTH, new Long((long)filebytes.length));

                    getOperation = mSession.get(geths);
                    InputStreamReader din = new 
                        InputStreamReader(getOperation.openInputStream(), "UTF-8"); 

                    BufferedReader bufferedReader = new BufferedReader(din); 
                    String tmp2=new String();
                    String line = bufferedReader.readLine(); 
                    while (line != null)
                    { 
                        tmp2 += line;//System.out.println(line); 
                        line = bufferedReader.readLine(); 
                    } 
                    bufferedReader.close(); 
                    getOperation.close();  
*/
                    header=new HeaderSet();
                    header.setHeader(HeaderSet.NAME, "text.txt"); 
                    getOperation = mSession.get(header);
                    //InputStreamReader din = new InputStreamReader(getOperation.openInputStream(), "UTF-8"); 
                     // Retrieve the length of the object being sent back
                     int length = (int) getOperation.getLength();
                     // Create space for the object
                     byte[] obj = new byte[length];
                     // Get the object from the input stream
                     DataInputStream in = getOperation.openDataInputStream();
                     in.read(obj);
                     // End the transaction
                     in.close();    
                     String str=new String(obj);            
                }
                catch (Exception e)
                {
                    //e.printStackTrace();
                }
                finally
                {
                    try
                    {
                        mOutput.close();
                        putOperation.close();
                        mSession.disconnect(null);
                    }
                    catch (IOException e)
                    {}
                    //updateStatus("[CLIENT] Connection Closed");
                }

            }
        });
    thread.start();
}

我在网站上找到了一些原始代码(如果我再找到,我会将其链接起来)并根据您的目的进行修改。

另请参阅herehere以了解有关OBEX操作的更多信息。