Alle Devices finden...



  • Hallo,

    ich schreibe momentan an einer App, die mit Bluetooth Low Energy Devices kommunizieren soll (die schon gepairt) sind. Mein Problem ist nun, mir die entsprechende Device rauszusuchen.

    Folgenden Code habe ich mir soweit mal zusammen gebastelt:

    int BLEDevice::initializeDevice() {
    
    	GUID GUID_BLESHIELD_DEVICE_INTERFACE = {0x781aee18, 0x7733, 0x4ce4, 0xad, 0xd0, 0x91, 0xf4, 0x1c, 0x67, 0xb5, 0x92};
    	//GUID InterfaceClassGUID = {};			// Interface Class GUID, nach der gesucht wird
    	GUID InterfaceClassGUID = {0x4d36e972L, 0xe325, 0x11ce, {0xbf, 0xc1, 0x08, 0x00, 0x2b, 0xe1, 0x03, 0x18}};
    	HDEVINFO DevInfoSet;					// information set with all BLE-Devices
    	SP_DEVICE_INTERFACE_DATA bufDevInterfaceData;
    	bufDevInterfaceData.cbSize = sizeof(SP_DEVICE_INTERFACE_DATA);
    	SP_DEVICE_INTERFACE_DETAIL_DATA* pBufDevInterfaceDetailData;
    	HANDLE devHandle;
    	DWORD MemberIndex = 0;
    	DWORD lastErrorCode = 0;
    	DWORD RequiredSize = 0;
    	WCHAR* devicePath;
    
    	// get a handle to the device information set who are currently present
    	DevInfoSet = SetupDiGetClassDevs(NULL, NULL, NULL, DIGCF_ALLCLASSES);
    	if (DevInfoSet == INVALID_HANDLE_VALUE) {
    		SetupDiDestroyDeviceInfoList(DevInfoSet);
    		return 1;
    	}
    
    	// enumerate the device interfaces in the device information set, und speichern in devInterfaceList
    
    // ----> HIER
    	while(SetupDiEnumDeviceInterfaces(DevInfoSet, NULL, &GUID_BLESHIELD_DEVICE_INTERFACE, MemberIndex, &bufDevInterfaceData)) {
    		RequiredSize = 0;
    		// detail data größe in RequiredSize für bufDevInterfaceData holen
    		if(!SetupDiGetDeviceInterfaceDetail(DevInfoSet, &bufDevInterfaceData, NULL, NULL, &RequiredSize, NULL))
    			break;
    
    		// Speicher für bufDevInterfaceDetailData allokieren
    		if(RequiredSize)
    			pBufDevInterfaceDetailData = (SP_DEVICE_INTERFACE_DETAIL_DATA*) malloc(RequiredSize);
    		else
    			break;
    
    		if(!SetupDiGetDeviceInterfaceDetail(DevInfoSet, &bufDevInterfaceData, pBufDevInterfaceDetailData, RequiredSize, NULL, NULL))
    			break;
    
    		// Handle zum Device Interface herstellen
    		devHandle = CreateFile(pBufDevInterfaceDetailData->DevicePath, GENERIC_READ | GENERIC_WRITE,
    			FILE_SHARE_READ, NULL, CREATE_NEW, FILE_ATTRIBUTE_NORMAL, NULL);
    
    		if(devHandle == INVALID_HANDLE_VALUE)
    			break;
    
    		// device Handle in Liste eintragen
    		deviceHandlesList.push_back(devHandle);
    
    		MemberIndex++;
    	}
    	int i = GetLastError();
    	return 0;
    }
    

    Leider springt er mir bei der Markierung immer über die while-Schleife drüber und gibt mir den Error-Code 259 (ERROR_NO_MORE_ITEMS) aus. Also findet er wohl in den geholten Devices keine, die der Suche entsprechen?

    Ich steh momentan total auf dem Schlauch und aus der Windowsdoku werd ich auch nicht schlau. Vielleicht kann mir jemand helfen...

    Vielen Dank für eure Hilfe!

    Edit: Als Service GUID ist einfach mal die vom Netzwerkadapter eingetragen, die im GUIDexplorer stand.



  • Du willst Device Interfaces aufzählen, lässt Dir aber keine Interfaces in Dein InfoSet packen. Genau zu diesem Zwecke gibt es das Flag DIGCF_DEVICEINTERFACE, dieses musst Du beim Aufruf von SetupDiGetClassDevs auch angeben.


Log in to reply