jaklsdkfjosfij 2018-02-18 01:18 采纳率: 60%
浏览 1339
已结题

windows 蓝牙传输文件至手机,connect 返回 100064

经过长时间的摸索,我发现手机不能像单片机一样在windows上安装一个虚拟串口,
但有人说可以用windows socket 方式发送数据,但是SOCKADDR_BTH 的参数怎么填?
我现在只知道目标的蓝牙地址是对的,serviceClassId 和 port该怎么填呢?
下面的connect 返回100064,按照msdn说法,如果填port,需要什么sdp
“Using the port member instead of the serviceClassId member requires the application to perform its own service (SDP) search before attempting the connect operation.”
看不懂,请教各位大神,为啥connect 失败?

 memset(&m_sa, 0, sizeof(m_sa));
    if (m_device.bdi.Address.ullLong)
    {
        m_sa.btAddr = m_device.bdi.Address.ullLong;
    }
    m_sa.addressFamily = AF_BTH;
    m_sa.serviceClassId = OBEXFileTransferServiceClass_UUID;
    m_sa.port = 1;

    if (connect (m_client_socket, (SOCKADDR *)&m_sa,sizeof(m_sa)) == SOCKET_ERROR)
    {
        bRet = FALSE;
        zssLogERROR(_T("<%s  %d> %s(return bRet :[%s], WSAGetLastError :[%d])"), __FILE__, __LINE__, __FUNCTION__, bRet ? "TRUE" : "FALSE", WSAGetLastError());
        closesocket (m_client_socket);
        m_client_socket = INVALID_SOCKET;
        return bRet;
    }

我后来对代码做了更改,循环连接


 do 
    {
        m_sa.port++;
        zssLogINFO(_T("<%s  %d> %s(m_sa.port :[%d])"), __FILE__, __LINE__, __FUNCTION__, m_sa.port);
        if (m_sa.port == 31)
        {
            bRet = FALSE;
            zssLogERROR(_T("<%s  %d> %s(return bRet :[%s], WSAGetLastError :[%d])"), __FILE__, __LINE__, __FUNCTION__, bRet ? "TRUE" : "FALSE", WSAGetLastError());
            closesocket (m_client_socket);
            m_client_socket = INVALID_SOCKET;
            return bRet;
        }
    } while (connect (m_client_socket, (SOCKADDR *)&m_sa,sizeof(m_sa)) == SOCKET_ERROR && m_sa.port < 30);

发现port为2,连接成功,手机上也显示连接成功,但是为什么是音频的?
此时send成功,但是手机端没反应,什么原因?

 bRet=send(m_client_socket,"hello,from client",100,0);//这是传数据,如何传文件。
  if (bRet == SOCKET_ERROR) {
      bRet = FALSE;
      closesocket (m_client_socket);
      m_client_socket = INVALID_SOCKET;
      zssLogERROR(_T("<%s  %d> %s(return bRet :[%s], WSAGetLastError :[%d])"), __FILE__, __LINE__, __FUNCTION__, bRet ? "TRUE" : "FALSE", WSAGetLastError());
      return bRet;
  } 

图片说明
图片说明

  • 写回答

2条回答 默认 最新

  • threenewbee 2018-02-18 01:41
    关注

    是的,如果你用的是bind,那么不需要port,直接设置为0,而你用了connect,就需要serviceClassId
    你的手机是不是没有开启蓝牙发现,那样你的服务端就不能使用SDP

    评论

报告相同问题?

悬赏问题

  • ¥15 lammps Gpu加速出错
  • ¥15 关于PLUS模型中kapaa值的问题
  • ¥15 关于博途V17进行仿真时无法建立连接问题
  • ¥15 请问下这个红框里面是什么文档或者记事本编辑器
  • ¥15 机器学习教材中的例题询问
  • ¥15 求.net core 几款免费的pdf编辑器
  • ¥15 为什么安装HCL 和virtualbox之后没有找到VirtualBoxHost-OnlyNetWork?
  • ¥15 C# P/Invoke的效率问题
  • ¥20 thinkphp适配人大金仓问题
  • ¥20 Oracle替换.dbf文件后无法连接,如何解决?(相关搜索:数据库|死循环)