通过蓝牙代码示例C ++将文件从PC传输到其他设备

时间:2011-04-28 12:59:23

标签: c++ bluetooth

您好Stackoverflow用户!!!

问题:

  1. 我正在寻找一些代码示例,说明如何找到连接到我的计算机的蓝牙设备。
  2. 我正在寻找一些代码示例,展示如何将信息从我的计算机传输到移动设备。
  3. 现在我正在尝试在C ++上开发应用程序,它必须与Bluetooth设备一起使用。当我通过互联网进行研究时,我发现了一些关于蓝牙的信息,我发现了一些代码示例,介绍了如何使用蓝牙设备。例如here我发现代码巫婆如何使用在所有蓝牙无线电范围内查找所有蓝牙设备:

    #define WIN32_LEAN_AND_MEAN
    #include <windows.h>
    #include <stdio.h>
    #include <stdlib.h>
    #include <winsock2.h>
    #include <bthdef.h>
    #include <BluetoothAPIs.h>
    
    #pragma comment(lib, "Irprops.lib")
    
    // The BLUETOOTH_FIND_RADIO_PARAMS structure facilitates 
    // enumerating installed Bluetooth radios.
    BLUETOOTH_FIND_RADIO_PARAMS m_bt_find_radio = {
      sizeof(BLUETOOTH_FIND_RADIO_PARAMS)
    };
    
    // The BLUETOOTH_RADIO_INFO structure contains information
    // about a Bluetooth radio.
    BLUETOOTH_RADIO_INFO m_bt_info = {
      sizeof(BLUETOOTH_RADIO_INFO),
      0,
    };
    
    // The BLUETOOTH_DEVICE_SEARCH_PARAMS structure specifies
    // search criteria for Bluetooth device searches.
    BLUETOOTH_DEVICE_SEARCH_PARAMS m_search_params = {
      sizeof(BLUETOOTH_DEVICE_SEARCH_PARAMS),
      1,
      0,
      1,
      1,
      1,
      15,
      NULL
    };
    
    // The BLUETOOTH_DEVICE_INFO structure provides information
    // about a Bluetooth device.
    BLUETOOTH_DEVICE_INFO m_device_info = {
      sizeof(BLUETOOTH_DEVICE_INFO),
      0,
    };
    
    HANDLE m_radio = NULL;
    HBLUETOOTH_RADIO_FIND m_bt = NULL;
    HBLUETOOTH_DEVICE_FIND m_bt_dev = NULL;
    
    int wmain(int argc, wchar_t **args) {
      while(true) {
        // The BluetoothFindFirstRadio function begins the 
        // enumeration of local Bluetooth radios.
        m_bt = BluetoothFindFirstRadio(&m_bt_find_radio, &m_radio);
    
        int m_radio_id = 0;
        do {
          m_radio_id++;
    
          // The BluetoothGetRadioInfo function obtains information
          // about a Bluetooth radio.
          BluetoothGetRadioInfo(m_radio, &m_bt_info);
    
          wprintf(L"Radio %d:\r\n", m_radio_id);
          wprintf(L"\tName: %s\r\n", m_bt_info.szName);
          wprintf(L"\tAddress: %02x:%02x:%02x:%02x:%02x:%02x\r\n", m_bt_info.address.rgBytes[1], m_bt_info.address.rgBytes[0], m_bt_info.address.rgBytes[2], m_bt_info.address.rgBytes[3], m_bt_info.address.rgBytes[4], m_bt_info.address.rgBytes[5]);
          wprintf(L"\tClass: 0x%08x\r\n", m_bt_info.ulClassofDevice);
          wprintf(L"\tManufacturer: 0x%04x\r\n", m_bt_info.manufacturer);
    
          m_search_params.hRadio = m_radio;
    
          ::ZeroMemory(&m_device_info, sizeof(BLUETOOTH_DEVICE_INFO));
          m_device_info.dwSize = sizeof(BLUETOOTH_DEVICE_INFO);
    
          m_bt_dev = BluetoothFindFirstDevice(&m_search_params, &m_device_info);
    
          int m_device_id = 0;
          do {
            m_device_id++;
    
            wprintf(L"\tDevice %d:\r\n", m_device_id);
            wprintf(L"\t\tName: %s\r\n", m_device_info.szName);
            wprintf(L"\t\tAddress: %02x:%02x:%02x:%02x:%02x:%02x\r\n", m_device_info.Address.rgBytes[1], m_device_info.Address.rgBytes[0], m_device_info.Address.rgBytes[2], m_device_info.Address.rgBytes[3], m_device_info.Address.rgBytes[4], m_device_info.Address.rgBytes[5]);
            wprintf(L"\t\tClass: 0x%08x\r\n", m_device_info.ulClassofDevice);
            wprintf(L"\t\tConnected: %s\r\n", m_device_info.fConnected ? L"true" : L"false");
            wprintf(L"\t\tAuthenticated: %s\r\n", m_device_info.fAuthenticated ? L"true" : L"false");
            wprintf(L"\t\tRemembered: %s\r\n", m_device_info.fRemembered ? L"true" : L"false");
    
          } while(BluetoothFindNextDevice(m_bt_dev, &m_device_info));
    
          BluetoothFindDeviceClose(m_bt_dev);
    
        } while(BluetoothFindNextRadio(&m_bt_find_radio, &m_radio));
    
        BluetoothFindRadioClose(m_bt);
    
        Sleep(10000);
      }
    
      return 0;
    }
    

    然后我创建项目并在我的笔记本上运行它,打开蓝牙没有结果出现。好像应用程序找不到任何蓝牙设备。在我继续我的研究之后,发现了另一篇名为Finding Bluetooth devices and services using C++ in Windows XP

    的文章
    #include <winsock2.h>
    #include <ws2bth.h>
    #include <BluetoothAPIs.h>
    #include <stdlib.h>
    #include <stdio.h>
    #include <iostream>
    
    #pragma comment(lib, "ws2_32.lib")
    #pragma comment(lib, "irprops.lib")
    
    using namespace std;
    
    int main(){
    
        //Initialising winsock
    
        WSADATA data;
        int result;
    
        result = WSAStartup(MAKEWORD(2, 2), &data);//initializing winsock
    
        if (result!=0) {
            cout << "An error occured while initialising winsock, closing....";
            exit(result);
        }
    
        //Initialising query for device
        WSAQUERYSET queryset;
    
        memset(&queryset, 0, sizeof(WSAQUERYSET));
        queryset.dwSize = sizeof(WSAQUERYSET);
        queryset.dwNameSpace = NS_BTH;
    
        HANDLE hLookup;
    
        result = WSALookupServiceBegin(&queryset, LUP_CONTAINERS, &hLookup);
    
        if (result!=0){
            cout << "An error occured while initialising look for devices, closing....";
            Sleep(100000);
            exit(result);
        }
    
        //Initialisation succedd, start looking for devices
    
        BYTE buffer[4096];
        memset(buffer, 0, sizeof(buffer));
        DWORD bufferLength = sizeof(buffer);
        WSAQUERYSET *pResults = (WSAQUERYSET*)&buffer;
    
            while (result==0){
                result = WSALookupServiceNext(hLookup, LUP_RETURN_NAME | LUP_CONTAINERS | LUP_RETURN_ADDR | LUP_FLUSHCACHE | LUP_RETURN_TYPE | LUP_RETURN_BLOB | LUP_RES_SERVICE,&bufferLength, pResults);
    
                if(result==0){// A device found
                    //print the name of the device
                    LPTSTR s = pResults->lpszServiceInstanceName;
                    wcout << s << "found. quering for services\n";
                    //Initialise quering the device services
                    WSAQUERYSET queryset2;
                    memset(&queryset2, 0, sizeof(queryset2));
                    queryset2.dwSize = sizeof(queryset2);
                    queryset2.dwNameSpace = NS_BTH;
                    queryset2.dwNumberOfCsAddrs = 0;
                    CSADDR_INFO * addr = (CSADDR_INFO *)pResults->lpcsaBuffer;
                    WCHAR addressAsString[1000];
                    DWORD addressSize = sizeof(addressAsString);
                    WSAAddressToString(addr->RemoteAddr.lpSockaddr,addr->RemoteAddr.iSockaddrLength,NULL,addressAsString, &addressSize);
                    queryset2.lpszContext = addressAsString;
                    GUID protocol = L2CAP_PROTOCOL_UUID;
                    queryset2.lpServiceClassId = &protocol;
                    HANDLE hLookup2;
                    int result2 = WSALookupServiceBegin(&queryset2, LUP_FLUSHCACHE |LUP_RETURN_NAME | LUP_RETURN_TYPE | LUP_RETURN_ADDR | LUP_RETURN_BLOB | LUP_RETURN_COMMENT, &hLookup2);
    
                    if (result2 !=0){
                        cout << "An error occured while initializing query for services";
                        Sleep(100000);
                        exit(result);
                    }
    
                    //Start quering for device services
                    while(result2 ==0){
                        BYTE buffer2[4096];
                        memset(buffer2, 0, sizeof(buffer2));
                        DWORD bufferLength2 = sizeof(buffer2);
                        WSAQUERYSET *pResults2 = (WSAQUERYSET*)&buffer2;
                        result2 = WSALookupServiceNext(hLookup2,LUP_FLUSHCACHE |LUP_RETURN_NAME | LUP_RETURN_TYPE | LUP_RETURN_ADDR | LUP_RETURN_BLOB | LUP_RETURN_COMMENT,&bufferLength2,pResults2);
                        if(result2 == 0)
                            wcout << "Service found: " << pResults2->lpszServiceInstanceName <<"\n";
                        Sleep(100000);
                    }
                }
            }
    
            Sleep(100000);
    
        return 0;     
    
    }
    

    当我编译这个并启动应用程序错误消息时出现“初始化查找设备时出错,关闭...... ”!!!

    如果你能在我的研究中向我提供任何文章,代码示例或其他内容的信息,我将非常高兴并感谢你们!

    最诚挚的问候!!!

2 个答案:

答案 0 :(得分:4)

尝试检查此link

它可能对您有用...... :)

答案 1 :(得分:1)

这是一个古老的问题,但我觉得我必须为之后观看过的8k人回答这个问题。

queryset结构错误,这就是wsalookupbegin失败的原因

queryset.lpcsaBuffer = NULL;

将此添加到您的结构可以使其工作;然后使用wsalookupbegin返回一个句柄;然后传递wsalookupnext上的句柄,根据你的旗帜得到所需的结果。