0

「ESP32」デバイスを識別し、Windows C++ アプリケーションからデータを送受信するアプリケーションを作成する必要があります。

Q1: WSALookupServiceBegin()API を使用して BT デバイスを検索していますが、期待どおりに動作しませんでした。Windows Bluetooth ウィンドウで [デバイスの追加] を手動でクリックするまで、API は 10108 を返します。デバイスの近くで BT を検出できる他の A​​PI/サービスはありますか、WSALookupServiceBegin()それとも API の使用方法が間違っていますか? WSALookupServiceBegin()Bluetooth キャッシュからデバイス データを取得しますか? API は Windows で手動検索を行った後にのみ正常に動作するため、この疑問が生じました。

Q2: Windows から BT デバイスの Mac ID だけで任意の Bluetooth デバイスに接続できますか?

以下のコードを見つけてください。

WSAQUERYSET data;
HANDLE handle;
ZeroMemory(&data, sizeof(data));
data.dwSize = sizeof(data);
data.dwNameSpace = NS_BTH;
data.lpcsaBuffer = NULL;

WSALookupServiceBegin(&data, LUP_CONTAINERS, &handle);
while(WSALookupServiceNext(hLookup, LUP_RETURN_NAME | LUP_RETURN_ADDR, 
&dwSize, pwsaResults)
{
 service_classID = pwsaResults->lpServiceClassId;
 _BTH_DEVICE_INFO *dev = (_BTH_DEVICE_INFO *)pwsaResults->lpBlob->pBlobData;

    SOCKET          LocalSocket = INVALID_SOCKET;
    SOCKADDR_BTH    SockAddrBthServer;

    SockAddrBthServer.btAddr = dev->address;
    SockAddrBthServer.addressFamily = AF_BTH;
    SockAddrBthServer.serviceClassId = *service_classID;
    SockAddrBthServer.port = 0;

    // connect to socket
    LocalSocket = socket(AF_BTH, SOCK_STREAM, BTHPROTO_RFCOMM);
    if (INVALID_SOCKET == LocalSocket) {
        wprintf(L"socket() call failed. WSAGetLastError = [%d]\n", WSAGetLastError());
        return -1;
    }

    if (SOCKET_ERROR == connect(LocalSocket,
        (struct sockaddr *) &SockAddrBthServer,
        sizeof(SOCKADDR_BTH))) {
        wprintf(L"connect() call failed. WSAGetLastError=[%d]\n", WSAGetLastError());
        return -1;
    }

}

出力:

connect() 呼び出しが失敗しました。WSAGetLastError=[10049]

4

1 に答える 1

1

WSALookupServiceBegin正しい方法ですが、正しいフラグを提供する必要があります。また、Bluetooth API から関数をBluetoothFidnFirstDevice使用することもできます。BluetoothFindNextDevice

ただし、どちらの方法でも、ペアリングされたデバイスが使用できない場合でも (見つかったばかりのデバイスと一緒に) 常に返されます。

あなたの説明から、関数に正しいフラグを指定していないようですWSAxxx

デバイスの MAC を知っていて、それが変更されていない場合は、毎回再検出せずに MAC でデバイスに接続できます。デバイスの認証要件によっては、デバイスとペアリングする必要さえありません (もちろん、デバイスが認証や暗号化を必要としない場合)。

于 2018-09-05T08:42:28.893 に答える