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 永磁型步进电机PID算法
  • ¥15 sqlite 附加(attach database)加密数据库时,返回26是什么原因呢?
  • ¥88 找成都本地经验丰富懂小程序开发的技术大咖
  • ¥15 如何处理复杂数据表格的除法运算
  • ¥15 如何用stc8h1k08的片子做485数据透传的功能?(关键词-串口)
  • ¥15 有兄弟姐妹会用word插图功能制作类似citespace的图片吗?
  • ¥200 uniapp长期运行卡死问题解决
  • ¥15 latex怎么处理论文引理引用参考文献
  • ¥15 请教:如何用postman调用本地虚拟机区块链接上的合约?
  • ¥15 为什么使用javacv转封装rtsp为rtmp时出现如下问题:[h264 @ 000000004faf7500]no frame?