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

    评论

报告相同问题?

悬赏问题

  • ¥50 comfyui下连接animatediff节点生成视频质量非常差的原因
  • ¥20 有关区间dp的问题求解
  • ¥15 多电路系统共用电源的串扰问题
  • ¥15 slam rangenet++配置
  • ¥15 有没有研究水声通信方面的帮我改俩matlab代码
  • ¥15 ubuntu子系统密码忘记
  • ¥15 信号傅里叶变换在matlab上遇到的小问题请求帮助
  • ¥15 保护模式-系统加载-段寄存器
  • ¥15 电脑桌面设定一个区域禁止鼠标操作
  • ¥15 求NPF226060磁芯的详细资料