「ESP32」デバイスを識別し、Windows C++ アプリケーションからデータを送受信するアプリケーションを作成する必要があります。
Q1: WSALookupServiceBegin()
API を使用して BT デバイスを検索していますが、期待どおりに動作しませんでした。Windows Bluetooth ウィンドウで [デバイスの追加] を手動でクリックするまで、API は 10108 を返します。デバイスの近くで BT を検出できる他の API/サービスはありますか、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]