1

リモート Bluetooth デバイスを Windows Mobile/CE ハンドヘルドとペアリングし、デバイスのサービスを取得するアプリケーションを作成しようとしています。

デバイスを手動でペアリングし、システムを介してサービスを設定すると (例: [設定] -> [Bluetooth] -> [デバイスの追加] に移動) 、次のレジストリにsdprecord値が生成されることに気付きました。

HKLM/ソフトウェア/マイクロソフト/Bluetooth/デバイス/ {deviceAddress} /{*Service_UUID*}.

私は基本的にこれを自分のプログラムに実装しようとしています。

次のドキュメントに従いました: http://msdn.microsoft.com/en-us/library/ms883458.aspx http://msdn.microsoft.com/en-us/library/ms883398.aspx

次に、SDPrecord をバイナリに変換し、レジストリに書き込みます。

RegSetValueEx(hSerialPortKey,_T("sdprecord"),0,REG_BINARY,(BYTE*)&pRecord,sizeof(pRecord)*2+1);

結果は、デバイスを手動でペアリングした場合と同じではありません。

私は何を間違っていますか?SDP レコードを取得するにはどうすればよいですか? 前もって感謝します。

以下は私のコードです

BTHNS_RESTRICTIONBLOB RBlob;
memset(&RBlob,0,sizeof(BTHNS_RESTRICTIONBLOB));
RBlob.type = SDP_SERVICE_SEARCH_ATTRIBUTE_REQUEST;
RBlob.numRange = 1;
RBlob.uuids[0].uuidType= SDP_ST_UUID16;//SDP_ST_UUID128;
RBlob.uuids[0].u.uuid16= SerialPortServiceClassID_UUID16;
RBlob.pRange[0].minAttribute =SDP_ATTRIB_PROTOCOL_DESCRIPTOR_LIST;
RBlob.pRange[0].maxAttribute = SDP_ATTRIB_PROTOCOL_DESCRIPTOR_LIST;

SOCKADDR_BTH sa;
memset (&sa, 0, sizeof(SOCKADDR_BTH));
BTH_ADDR *pDeviceAddr = &devAddress;
*(BTH_ADDR *)(&sa.btAddr) = *pDeviceAddr;
sa.addressFamily = AF_BTH;

CSADDR_INFO csai;
memset(&csai,0,sizeof(CSADDR_INFO));
csai.RemoteAddr.lpSockaddr = (sockaddr*)&sa;
csai.RemoteAddr.iSockaddrLength = sizeof(sa);

BLOB blob;
blob.cbSize = sizeof(BTHNS_RESTRICTIONBLOB);
blob.pBlobData = (BYTE *)&RBlob;

WSAQUERYSET wsaq;
memset(&wsaq,0,sizeof(WSAQUERYSET));
wsaq.dwSize = sizeof(WSAQUERYSET);
wsaq.dwNumberOfCsAddrs = 1;
wsaq.dwNameSpace = NS_BTH;
wsaq.lpBlob = &blob;
wsaq.lpcsaBuffer = &csai;
wsaq.lpServiceClassId = &serialPortUUID;

//Initialising winsock
    WSADATA data;
    int result = WSAStartup(MAKEWORD(2, 2), &data);//initializing winsock
    if (hLib == NULL)
    {
        return S_FALSE;
    }
    result =  WSALookupServiceBegin (&wsaq,0, &hLookup);
    while (result ==ERROR_SUCCESS )
    {
        BYTE sdpBuffer[4096];
        memset(sdpBuffer,0,sizeof(sdpBuffer));
        LPWSAQUERYSET pResult = (LPWSAQUERYSET)&sdpBuffer;
        dwSize = sizeof(sdpBuffer);
        pResult->dwSize = sizeof(WSAQUERYSET);
        pResult->dwNameSpace = NS_BTH;
        pResult->lpBlob = NULL;
        pResult->lpServiceClassId = &serialPortUUID;
        result = WSALookupServiceNext(hLookup,0,&dwSize,pResult);
        if(result == -1 )
        {
            int error;
            error = WSAGetLastError();
            if (error == WSA_E_NO_MORE)
                break;
        }
        else
        {
            //Get SDP record
            if (pResult != NULL)
            {
                if (ERROR_SUCCESS != ServiceAndAttributeSearchParse(pResult->lpBlob->pBlobData,pResult->lpBlob->cbSize,&pRecordArg,&ulRecords)) { //error handling}
                ULONG recordIndex;
                for (recordIndex = 0; recordIndex < ulRecords; recordIndex++) {
                    pRecord = pRecordArg[recordIndex];}
4

1 に答える 1