环境:
windows xp SP3 + vs2005 + 用Windows BlueTooth SDK
用WSASetService发布服务:        WSAQUERYSET service;
memset(&service, 0, sizeof(service));
service.dwSize = sizeof(WSAQUERYSET);
GUID serviceID = OBEXObjectPushServiceClass_UUID;
service.lpServiceClassId = &serviceID;
service.dwNameSpace = NS_BTH;
service.dwNumberOfCsAddrs = 1;
service.lpszServiceInstanceName = L"OBEXObjectPush"; CSADDR_INFO csAddr;
memset(&csAddr, 0, sizeof(CSADDR_INFO));
csAddr.LocalAddr.iSockaddrLength = sizeof(SOCKADDR_BTH);
csAddr.LocalAddr.lpSockaddr = pAddr;
csAddr.iSocketType = SOCK_STREAM;
csAddr.iProtocol = BTHPROTO_RFCOMM;
service.lpcsaBuffer = &csAddr; int iRtn = WSASetService(&service, RNRSERVICE_REGISTER, 0);
if (0 != iRtn)
{
return GetLastError();
}
return 0;发布成功。用我另外一个蓝牙查看服务,确实能搜索到服务。
1、第一种情况:在手机里面,先搜索并配对,然后选取一个文件,然后点击通过蓝牙发送,选择已经有的蓝牙,发送没有问题。
2、第二种情况:如果不先配对,直接先选取一个文件,然后点击通过蓝牙发送,点搜索,就搜索不到设备。如果用系统自带的那个工具,点击“接收文件”,第二种情况也能被搜索到。
这是什么问题?还有一种发布方式:使用SDP Record,可是在网上找了很多,WSASetService都是10022错误。哪位知道要怎么样使用
SDPRecord发布服务?

解决方案 »

  1.   

    1)
    既然第一种情况已经OK,那说明服务已经注册成功了。建议换个机型的手机试试第二种情况,有可能是手机的问题.2) SDP 的方式和现在采用的并没有本质的区别. 你可以试试下面的代码, 这个SDP不一定适合你的BT设备...//SDP record generated by bthnscreate.exe
    BYTE grgbSdpRecord[] = {
             0x35, 0x4d, 0x09, 0x00, 0x01, 0x35, 0x11, 0x1c,
             0x29, 0xf9, 0xc0, 0xfd, 0xbb, 0x6e, 0x47, 0x97,
             0x9f, 0xa9, 0x3e, 0xc9, 0xa8, 0x54, 0x29, 0x0c,
             0x09, 0x00, 0x04, 0x35, 0x0c, 0x35, 0x03, 0x19,
             0x01, 0x00, 0x35, 0x05, 0x19, 0x00, 0x03, 0x08,
             0x1a, 0x09, 0x00, 0x06, 0x35, 0x09, 0x09, 0x65,
             0x6e, 0x09, 0x00, 0x6a, 0x09, 0x01, 0x00, 0x09,
             0x00, 0x09, 0x35, 0x08, 0x35, 0x06, 0x19, 0x11,
             0x05, 0x09, 0x01, 0x00, 0x09, 0x01, 0x00, 0x25,
             0x06, 0x53, 0x65, 0x72, 0x69, 0x61, 0x6c
    };
    //SDP record size constant returned by bthnscreate.exe
    #define SDP_RECORD_SIZE 0x0000004f
    #define SDP_CHANNEL_OFFSET 40
    ULONG recordHandle = 0;
    SOCKADDR_BTH sa;
    memset (&sa, 0, sizeof(sa));
    int nSize; nSize = sizeof(sa);
    if (getsockname(m_hSocket, (SOCKADDR *)&sa, &nSize) == SOCKET_ERROR)
    return WSAGetLastError(); struct bigBlob
    {
    BTHNS_SETBLOB   b;
    }*pBigBlob; pBigBlob = (bigBlob *)malloc(sizeof(struct bigBlob)+ SDP_RECORD_SIZE );
    ULONG ulSdpVersion = BTH_SDP_VERSION;
    pBigBlob->b.pRecordHandle   = &recordHandle;
    pBigBlob->b.pSdpVersion     = &ulSdpVersion;
    pBigBlob->b.fSecurity       = 0;
    pBigBlob->b.fOptions        = 0;
    pBigBlob->b.ulRecordLength  = SDP_RECORD_SIZE; memcpy (pBigBlob->b.pRecord, grgbSdpRecord, SDP_RECORD_SIZE);
    pBigBlob->b.pRecord[SDP_CHANNEL_OFFSET] = (unsigned char)sa.port;
    BLOB blob;
    blob.cbSize    = sizeof(BTHNS_SETBLOB) + SDP_RECORD_SIZE - 1;
    blob.pBlobData = (PBYTE) pBigBlob; WSAQUERYSET Service;
    memset (&Service, 0, sizeof(Service));
    Service.dwSize = sizeof(Service);
    Service.lpBlob = &blob;
    Service.dwNameSpace = NS_BTH;
    if (WSASetService(&Service, RNRSERVICE_REGISTER, 0) == SOCKET_ERROR)
    {
    free(pBigBlob);
    return WSAGetLastError();
    }

            free(pBigBlob);
    return 0;
      

  2.   

    TO: skyxie用你那个也是返回10022。那个SdpRecord每个蓝牙都不一样?在XP下怎么查到或生成?
      

  3.   

    是CE上的工具
    http://msdn.microsoft.com/en-us/library/aa450195.aspxxp下不清楚...