Winsock API を使用して Windows で Bluetooth プログラミングを試してみましたが、ホストに Bluetooth がないかどうか、またはスキャン セットが空であるかどうかを判断する方法で問題が発生しました。
したがって、プログラムは非常に単純です。Winsock を開始し、WSALookupServiceBegin を呼び出してから、デバイスをスキャンしながら ServiceNext と ServiceEnd を呼び出します。開発マシンには Bluetooth 無線があり、ドライバーは Microsoft BT Stack で、Windows のデバイス ウィザードを使用してデバイスを見つけることができます。
問題は、WSALookupServiceBegin の呼び出し時に、次の 2 つのケースで WSASERVICE_NOT_FOUND が返されることです。
- ホスト マシンにアダプタがありません
- 範囲内にスキャンする Bluetooth デバイスがありません (つまり、空のスキャン セット)。
だから私の質問は:
- これは期待されていますか?
- どちらが起こっているかをさらに特定するにはどうすればよいですか?
前もって感謝します!
添付コード:
int main(int argc, char **argv)
{
WSADATA wsd;
BOOL retVal;
if (WSAStartup(MAKEWORD(2, 2), &wsd) != 0)
printf("WSAStartup() failed with error code %ld\n", WSAGetLastError());
else
printf("WSAStartup() is OK!\n");
scan();
if (WSACleanup() == 0)
printf("WSACleanup() is OK!\n");
else
printf("WSACleanup() failed with error code %ld\n", WSAGetLastError());
return 0;
}
そしてscan();
void scan()
{
WSAQUERYSET queryset;
memset(&queryset, 0, sizeof(WSAQUERYSET));
queryset.dwSize = sizeof(WSAQUERYSET);
queryset.dwNameSpace = NS_BTH;
// begin query
HANDLE hDeviceLookup;
if (WSALookupServiceBegin(&queryset, LUP_FLUSHCACHE | LUP_CONTAINERS, &hDeviceLookup)) {
int last_error = WSAGetLastError();
wcout << getWinErrorMessage(last_error) << endl;
return;
}
int bufSize = 0x2000;
void* buf = malloc(bufSize);
int result = -1;
while (result == -1) {
memset(buf, 0, bufSize);
LPWSAQUERYSET pwsaResults = (LPWSAQUERYSET)buf;
pwsaResults->dwSize = sizeof(WSAQUERYSET);
pwsaResults->dwNameSpace = NS_BTH;
DWORD size = bufSize;
if (hDeviceLookup == NULL) {
break;
}
if (WSALookupServiceNext(hDeviceLookup, LUP_RETURN_NAME | LUP_RETURN_ADDR | LUP_RETURN_BLOB, &size, pwsaResults)) {
int last_error = WSAGetLastError();
switch (last_error) {
case WSAENOMORE:
case WSA_E_NO_MORE:
result = 2;
break;
default:
wcout << getWinErrorMessage(last_error) << endl;
result = 3;
}
WSALookupServiceEnd(hDeviceLookup);
hDeviceLookup = NULL;
break;
}
BTH_DEVICE_INFO *p_inqRes = (BTH_DEVICE_INFO *)pwsaResults->lpBlob->pBlobData;
// get device name
WCHAR name[256];
BOOL bHaveName = pwsaResults->lpszServiceInstanceName && *(pwsaResults->lpszServiceInstanceName);
wcout << pwsaResults->lpszServiceInstanceName << endl;
int deviceClass = p_inqRes->classOfDevice;
BTH_ADDR deviceAddr;
deviceAddr = ((SOCKADDR_BTH *)pwsaResults->lpcsaBuffer->RemoteAddr.lpSockaddr)->btAddr;
}
if (buf != NULL) {
free(buf);
}
if (hDeviceLookup != NULL) {
WSALookupServiceEnd(hDeviceLookup);
hDeviceLookup = NULL;
}
}