2013-11-04 28 views
1

我一直在嘗試了藍牙程序在Windows使用Winsock API和遇到了如何確定是否存在主機上還是掃描設置爲空,沒有藍牙的問題..如果在範圍內沒有設備,則Windows藍牙WSALookupServiceBegin返回WSASERVICE_NOT_FOUND(10108)?

所以程序很簡單的說,啓動Winsock,調用WSALookupServiceBegin,然後在掃描設備時調用ServiceNext和ServiceEnd。開發機器具有藍牙無線電,驅動程序是Microsoft BT Stack,我可以通過Windows使用設備嚮導查找設備。

的問題是,在調用WSALookupServiceBegin,WSASERVICE_NOT_FOUND是在兩種情況下返回:

  1. 有主機
  2. 有距離內沒有藍牙設備掃描無適配器(即空掃描集)

所以我的問題是:

  1. 是THI預計?
  2. 我如何進一步確定發生了哪一件?

在此先感謝!

代碼附:

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; 
} 

和掃描();

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; 
    } 
} 

回答

1

我使用以下代碼來確定是否可以使用Windows藍牙堆棧,以及是否存在所需的硬件。

CanUseBluetooth()只是檢查是否有一個可以理解藍牙協議的winsock提供程序。如果是這種情況,則安裝堆棧。我們可以綁定到通配符地址,如果我們能夠這樣做,那麼我們有一個使用Windows的堆棧一些有效的藍牙硬件

static bool CanUseBluetooth(
    bool throwOnFailure) 
{ 
    static const CAddressTypeBluetooth addressType; 

    SOCKET s = ::socket(addressType.Family(), SOCK_STREAM, addressType.Protocol()); 

    const bool canUseBluetooth = (s != INVALID_SOCKET); 

    const DWORD lastError = ::GetLastError(); 

    ::closesocket(s); 

    if (!canUseBluetooth && throwOnFailure) 
    { 
     throw CWin32Exception(_T("CUsesXPBluetooth::CanUseBluetooth()"), lastError); 
    } 

    return canUseBluetooth; 
} 

HarwareActive()檢查。

static bool HardwareActive(
    bool throwOnFailure) 
{ 
    static const CAddressTypeBluetooth addressType; 

    SOCKET s = ::socket(addressType.Family(), SOCK_STREAM, addressType.Protocol()); 

    if (s == INVALID_SOCKET) 
    { 
     const DWORD lastError = ::GetLastError(); 

     ::closesocket(s); 

     throw CWin32Exception(_T("CUsesXPBluetooth::HardwareActive() - CanUseBluetooth"), lastError); 
    } 

    bool hardwareActive = true; 

    static const IAddress &address = addressType.WildcardAddress(); 

    if (SOCKET_ERROR == ::bind(s, &address.AsSockAddr(), address.Size())) 
    { 
     hardwareActive = false; 
    } 

    const DWORD lastError = ::GetLastError(); 

    ::closesocket(s); 

    if (!hardwareActive && throwOnFailure) 
    { 
     throw CWin32Exception(_T("CUsesXPBluetooth::HardwareActive()"), lastError); 
    } 

    return hardwareActive; 
} 
+0

非常好,謝謝。因此WSASERVICE_NOT_FOUND在藍牙的情況下並不能提供很多信息? – GKK

+0

它只是確定問題的原因,但信息量少。 –

相關問題