从Android到Windows的蓝牙套接字上的图片传输

时间:2012-08-01 12:48:49

标签: android c++ sockets bluetooth

我找不到解决这个问题的方法:我在android上创建了一个程序来拍摄图片(jpg格式)并通过蓝牙通道发送到嵌入式Windows XP电脑。我还使用Windows的C ++应用程序来接收图片 通信使用蓝牙套接字实现。 在Android中,应用程序以1024字节的块读取文件,并在套接字上写入每个块,直到图片完成。 在Windows端,我读取了1024字节的chunck中的字节,直到recv(...)函数返回值> 0.

结果是在Android端看起来所有字节都被正确读取和发送,但在Windows端我(几乎)总是只接收70-80%的字节。我甚至可以看到接收到的正确字节,因为可以可视化jpg(图像底部的缺失字节以灰色显示)。我很少能收到整张照片。 在这里,我发布了Android方面的相关代码部分:

String picturePath = "/sdcard/VERDE/PTR-0_15-31-24.jpg";
File picture = new File(picturePath);
if (picture.exists())
{
    Log.d(TAG, "File " + picture.getAbsolutePath() + " exists!");
    try
    {
        FileInputStream fis = new FileInputStream(picture);
        ostream = socket.getOutputStream();
        byte[] buf = new byte[1024];
        int read = 0;
        int totBytes = 0;
        while ((read = fis.read(buf)) != -1)
        {
            totBytes = totBytes + read;
            ostream.write(buf, 0, read);
            Log.d(TAG, "Image - Read: " + read + " - Total "
                                + totBytes + " bytes!");
        }
        ostream.flush();
        ostream.close();
        fis.close();
    } catch (UnknownHostException ex)
    {
        System.out.println(ex.getMessage());
    } catch (IOException ex)
    {
        System.out.println(ex.getMessage());
    }
} else
{
    Log.d(TAG, "File " + picture.getAbsolutePath()
            + " does not exist!");
}

这是C ++应用程序代码的相关部分:

if (_outFile != NULL) 
{
    _outFile.open(result.c_str(), ofstream::binary); //"pic.jpg"
    cout << "File opened!" << endl;
} else 
{
    cout << "Can't open file!" << endl;
}
while ((received = recv(client, buf, sizeof(buf), 0)) > 0) 
{
    cout << "R:" << received << " ";
    if (received > 0) 
    {
        totalBytes += received;
        if (_outFile.is_open()) 
        {
            _outFile.write(buf, received); 
            cout << " (Total: " << totalBytes << " B)" << endl;
        } else
        cout << "Error in recv() function, received bytes = "
                        << received << endl;

    } else 
        cout << "R:" << received << " ";
}

我已经看过几十篇关于这个主题的博客和帖子,但似乎没有人有类似的问题! 如果您有任何想法,请帮助我!

谢谢!

2 个答案:

答案 0 :(得分:0)

我有完全相同的问题(但不是普通套接字的bloutoth)。你有没有找到任何有用的解决方法?我尝试了一切,仍然得到了同样的错误。

否则我想我发现了问题所在,但我不知道要解决这个问题。在最后一步中,当传输<1024字节时,我将缓冲区分配给字符串,然后输出字符串的长度,该长度小于上一步中接收的字节数。我认为,当数据<1024 Bytes

时,他不会在最后一步收到所有内容

答案 1 :(得分:0)

我在代码中发现了问题!
我认为这是在接收端,事实上它是在传输Android代码 问题是在实际传输所有字节之前调用了 socket.close()函数!
我意识到在关闭套接字之前首先尝试使用Thread.CurrentThread()。sleep(2000),但这不是优化的。
imho的最佳方法是在客户端和服务器之间实现一个小型的控制数据交换协议,以确保图像完全传输(这里是伪代码示例):

  1. 客户端使用“clientName:pictureName:picLengthInBytes”
  2. 进行身份验证
  3. 服务器响应:“AuthenticationOK”
  4. 客户端发送图片字节
  5. 服务器检查:

      

    if(received bytes == picLengthInBytes)

         
        

    应答( “pictureOK”)

  6.     
  7. 根据需要执行其他客户操作(在我的情况下 - >删除图片)
  8.          然后仅在关闭应用程序或停止线程时关闭套接字。