Winsock Bluetooth Device suche



  • Hey,

    Ich habe aktuell ein ziemliches Problem mit der Suche eines Bluetooth Devices.
    Es handelt sich um ein Devkit von Atmel: http://www.atmel.com/devices/ATSAMB11.aspx

    Mit nachfolgendem Code ist es mir jedoch nicht möglich dieses Device zu finden, alle anderen Devices jedoch schon (Handy, Laptop, etc.). Desweiteren kann auch die integrierte Windows 7 Suche das Devkit nicht finden.
    Die einzige Möglichkeit ist, es per Windows 8.1/10 App zu suchen. Diese nutzen soweit ich weiß die Universal Windows Platform und somit nicht identisch mit der WinAPI / Winsockets.

    Meine Frage:
    Gibt es eine Möglichkeit das Devkit auch mit den Winsockets zu erkennen?
    Außerdem würde mich interessieren was der Unterschied zwischen der Universal Windows Platform und der WinAPI ist. Die UWP nutzen in den Examples ja auch Winsockets dafür - auch natürlich der Code anders (aufgebaut) ist.

    Hier noch der Code:

    WSAQUERYSET wsaq;
    	HANDLE hLookup;
    	LPWSAQUERYSET pwsaResults;
    	DWORD dwSize;
    	BOOL bHaveName;
    	BT_ADDR btAddr;
    	DWORD dwNameSpace;
    
    	pwsaResults = (LPWSAQUERYSET)butuh.buf;
    	dwSize = sizeof(butuh.buf);
    
    	ZeroMemory(&wsaq, sizeof(wsaq));
    	wsaq.dwSize = sizeof(wsaq);
    	wsaq.dwNameSpace = NS_BTH;
    	wsaq.lpcsaBuffer = NULL;
    
    	printf("\n");
    
    	if (WSALookupServiceBegin(&wsaq, LUP_CONTAINERS | LUP_FLUSHCACHE | LUP_DEEP, &hLookup) == SOCKET_ERROR)
    	{
    		printf("WSALookupServiceBegin() failed %d (Maybe no BT Device?) \r\n", WSAGetLastError());
    		return FALSE;
    	}
    
    	ZeroMemory(pwsaResults, sizeof(WSAQUERYSET));
    	pwsaResults->dwSize = sizeof(WSAQUERYSET);
    	pwsaResults->dwNameSpace = NS_BTH;
    	pwsaResults->lpBlob = NULL;
    
    	while (WSALookupServiceNext(hLookup, LUP_RETURN_NAME | LUP_RETURN_ADDR, &dwSize, pwsaResults) == 0)
    	{
    		// to get the remote address, the btAddr field should be properly cast
    		btAddr = ((SOCKADDR_BTH *)pwsaResults->lpcsaBuffer->RemoteAddr.lpSockaddr)->btAddr;
    
    		// Verify the returned name
    		bHaveName = (pwsaResults->lpszServiceInstanceName) && *(pwsaResults->lpszServiceInstanceName);
    
    		// Some more info
    		dwNameSpace = pwsaResults->dwNameSpace;
    
    		// http://msdn.microsoft.com/en-us/library/cc510863.aspx
    		// http://msdn.microsoft.com/en-us/library/ms892245.aspx
    		// SAP = 32 bits (8-hex-string)+ NAP = 16 bits 94-hex-string)= 48 bits = bluetooth address
    		wprintf(L"Device Name: %s \n", pwsaResults->lpszServiceInstanceName);
    		wprintf(L"Device Address: 0X%012X \n", btAddr);
    		wprintf(L"NAP Address: 0X%04X \n", GET_NAP(btAddr));
    		wprintf(L"SAP Address: 0X%08X \n", GET_SAP(btAddr));
    		wprintf(L"Name Space: 0X%0X \n \n \n", dwNameSpace);
    
    		memcpy(&list+devices, &btAddr, sizeof(btAddr));
    		devices++;
    	}
    
    	if (WSALookupServiceEnd(hLookup) != 0)
    		printf("FindingBtDevices(): WSALookupServiceEnd(hLookup) failed with error code %ld\n", WSAGetLastError());
    


  • Vermutlich liegt es am Windows Bluetooth Stack. Ich denke mal, dass es mit dem Broadcomm/Widcomm funktioniert aber die implementation / das SDK von denen ist ja eine kleine Katastrophe.





  • Unterstützten die WinAPI-Funktionen überhaupt BLE-Devices? Ich würde fast wetten, dass das nur mit WinRT/UWP geht.

    Edit: http://stackoverflow.com/a/20322855


Log in to reply