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

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了使用蓝牙FTP从已知设备获取文件相关的知识,希望对你有一定的参考价值。

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

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

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

答案

也许这会对你有所帮助。 (使用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操作的更多信息。

以上是关于使用蓝牙FTP从已知设备获取文件的主要内容,如果未能解决你的问题,请参考以下文章

在 C# 中从蓝牙设备获取数据

Windows 10连接到蓝牙经典设备而不进行配对

如何从蓝牙 LE 设备获取数据

从地址获取蓝牙设备的名称

从 iPhone 应用程序通过蓝牙传输文件

C#怎么获取已知USB设备驱动信息