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

经过长时间的摸索,我发现手机不能像单片机一样在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个回答

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

jaklsdkfjosfij
jaklsdkfjosfij 我手机开启了蓝牙发现
大约 2 年之前 回复

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

Csdn user default icon
上传中...
上传图片
插入图片
抄袭、复制答案,以达到刷声望分或其他目的的行为,在CSDN问答是严格禁止的,一经发现立刻封号。是时候展现真正的技术了!
立即提问