void dumpBTevent(BTEVENT btEvent, HWND hwnd){ BT_CONNECT_EVENT* cntEvt = NULL; BT_DISCONNECT_EVENT* discntEvt=NULL; BT_ROLE_SWITCH_EVENT* rolSwitchEvt=NULL; BT_MODE_CHANGE_EVENT* btModeChgEvt=NULL; BT_LINK_KEY_EVENT* btLnkKeyEvt=NULL; TCHAR btAddress[18]; TCHAR hConn[12]; TCHAR encMode[5]; TCHAR linkType[5]; TCHAR szTemp[MAX_PATH]; TCHAR szMsg[MAX_PATH]; wsprintf(szMsg, L"\r\n"); switch (btEvent.dwEventId){ case BTE_KEY_NOTIFY: wsprintf(szMsg, L"\r\n%s: BTE_KEY_NOTIFY:", logDateTime()); break; case BTE_KEY_REVOKED: btLnkKeyEvt = (BT_LINK_KEY_EVENT*)btEvent.baEventData; //XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX wsprintf(btAddress, L"%s", btAddr2Mac( btLnkKeyEvt->bta, btAddress)); wsprintf(szMsg, L"\r\n%s: BTE_KEY_REVOKED: mac=%s", logDateTime(), btAddress); break; case BTE_LOCAL_NAME: wsprintf(szMsg, L"\r\n%s: BTE_LOCAL_NAME:", logDateTime()); break; case BTE_COD: wsprintf(szMsg, L"\r\n%s: BTE_COD:", logDateTime()); break; case BTE_STACK_UP: wsprintf(szMsg, L"\r\n%s: BTE_STACK_UP:", logDateTime()); break; case BTE_STACK_DOWN: wsprintf(szMsg,L"\r\n%s: BTE_STACK_DOWN:", logDateTime()); break; case BTE_CONNECTION: cntEvt = (BT_CONNECT_EVENT*)btEvent.baEventData; btAddr2Mac(cntEvt->bta, btAddress); wsprintf(btAddress, L"%s", btAddress);// L"0x00 n/a"); wsprintf(hConn, L"0x%08x", cntEvt->hConnection); wsprintf(encMode, L"0x%02x", cntEvt->ucEncryptMode); wsprintf(linkType, L"0x%02x", cntEvt->ucLinkType); wsprintf(szMsg, L"\r\n%s: BTE_CONNECTION: hnd=%s, mac=%s, enc=%s, lnk=%s", logDateTime(), hConn, btAddress, encMode, linkType); break; case BTE_PAGE_TIMEOUT: wsprintf(szMsg,L"\r\n%s: BTE_PAGE_TIMEOUT:", logDateTime()); break; case BTE_MODE_CHANGE: btModeChgEvt = (BT_MODE_CHANGE_EVENT*)btEvent.baEventData; wsprintf(btAddress, L"%s", btAddr2Mac(btModeChgEvt->bta, btAddress)); wsprintf(hConn, L"0x%08x", btModeChgEvt->hConnection); wsprintf(encMode, L"0x%02x", btModeChgEvt->bMode); wsprintf(szTemp, L"%i", btModeChgEvt->usInterval); wsprintf(szMsg, L"\r\n%s: BTE_MODE_CHANGE: cnt=%s, mac=%s, mod=%s, int=%s", logDateTime(), hConn, btAddress, encMode, szTemp); break; case BTE_ROLE_SWITCH: rolSwitchEvt = (BT_ROLE_SWITCH_EVENT*)btEvent.baEventData; wsprintf(btAddress, L"%s", btAddr2Mac(rolSwitchEvt->bta, btAddress)); wsprintf(szTemp, L"0x%02x", rolSwitchEvt->fRole); wsprintf(szMsg, L"\r\n%s: BTE_ROLE_SWITCH: mac=%s, new role=%s", logDateTime(), btAddress, szTemp); break; case BTE_DISCONNECTION: discntEvt = (BT_DISCONNECT_EVENT*)btEvent.baEventData; wsprintf(hConn, L"0x%08x", discntEvt->hConnection); wsprintf(szTemp, L"%i", discntEvt->ucReason); if( discntEvt->ucReason <= lastError) wsprintf(szTemp, L"'%s'", szBTerror[discntEvt->ucReason]); wsprintf(szMsg, L"\r\n%s: BTE_DISCONNECTION: hnd=%s, why=%s", logDateTime(), hConn, szTemp); break; case BTE_CONNECTION_AUTH_FAILURE: wsprintf(szMsg, L"\r\n%s BTE_CONNECTION_AUTH_FAILURE", logDateTime()); break; default: wsprintf(szMsg, L"\r\n%s: unknown BT event: %i", logDateTime(), btEvent.dwEventId); break; }//switch DEBUGMSG(1, (szMsg)); nclog(szMsg); printMsg(szMsg, hwnd); }
void bluetoothDiscovery(ConnectivityBluetooth *conn) { //BOOL bHaveName; HANDLE hScan = INVALID_HANDLE_VALUE; WSAQUERYSET wsaq; BTHNS_INQUIRYBLOB queryBlob; queryBlob.LAP = BT_ADDR_GIAC; queryBlob.num_responses = 10; queryBlob.length = 12; BLOB blob; int count = 0; BthInquiryResult *p_inqRes; union { CHAR buf[4096]; SOCKADDR_BTH __unused; }; const BluetoothAddress *addr; blob.cbSize = sizeof(queryBlob); blob.pBlobData = (BYTE *) & queryBlob; ZeroMemory(&wsaq, sizeof(wsaq)); wsaq.dwSize = sizeof(wsaq); wsaq.dwNameSpace = NS_BTH; wsaq.lpcsaBuffer = NULL; wsaq.lpBlob = &blob; addr = conn->rootInterface->getAddress<BluetoothAddress>(); if (!addr) return; CM_DBG("Doing scan on device %s - %s\n", conn->rootInterface->getName(), addr->getStr()); if (ERROR_SUCCESS != WSALookupServiceBegin(&wsaq, LUP_CONTAINERS, &hScan)) { CM_DBG("WSALookupServiceBegin failed\n"); return; } // loop the results while (!conn->shouldExit()) { DWORD dwSize = sizeof(buf); LPWSAQUERYSET pwsaResults = (LPWSAQUERYSET) buf; ZeroMemory(pwsaResults, sizeof(WSAQUERYSET)); pwsaResults->dwSize = sizeof(WSAQUERYSET); pwsaResults->dwNameSpace = NS_BTH; pwsaResults->lpBlob = NULL; unsigned char macaddr[BT_ALEN]; string name = "bluetooth device"; bool report_interface = false; InterfaceStatus_t status; if (WSALookupServiceNext(hScan, LUP_RETURN_NAME | LUP_RETURN_ADDR | LUP_RETURN_BLOB, &dwSize, pwsaResults) != ERROR_SUCCESS) { CM_DBG("Found %d Haggle devices\n", count); break; } p_inqRes = (BthInquiryResult *) pwsaResults->lpBlob->pBlobData; BT_ADDR btAddr = ((SOCKADDR_BTH *) pwsaResults->lpcsaBuffer->RemoteAddr.lpSockaddr)->btAddr; if (pwsaResults->lpszServiceInstanceName && *(pwsaResults->lpszServiceInstanceName)) { int namelen = wcslen(pwsaResults->lpszServiceInstanceName) + 1; char *tmp = new char[namelen]; wcstombs(tmp, pwsaResults->lpszServiceInstanceName, namelen); name.clear(); name = tmp; delete[] tmp; } btAddr2Mac(btAddr, macaddr); BluetoothAddress addr(macaddr); status = conn->is_known_interface(Interface::TYPE_BLUETOOTH, macaddr); if (status == INTERFACE_STATUS_HAGGLE) { report_interface = true; } else if (status == INTERFACE_STATUS_UNKNOWN) { //int ret = DetectRFCommChannel(&btAddr); int ret = findHaggleService(&btAddr); if (ret > 0) { report_interface = true; conn->report_known_interface(Interface::TYPE_BLUETOOTH, macaddr, true); } else if (ret == 0) { conn->report_known_interface(Interface::TYPE_BLUETOOTH, macaddr, false); } } if (report_interface) { CM_DBG("Found Haggle Bluetooth device [%s:%s]\n", addr.getStr(), name.c_str()); BluetoothInterface foundInterface(macaddr, name, &addr, IFFLAG_UP); conn->report_interface(&foundInterface, conn->rootInterface, new ConnectivityInterfacePolicyTTL(2)); count++; } else { CM_DBG("Bluetooth device [%s] is not a Haggle device\n", addr.getStr()); } } // cleanup WSALookupServiceEnd(hScan); return; }