[Bluetooth(SDK)]使用WinSock搜索蓝牙设备

来源:互联网 发布:有关人工智能爱情电影 编辑:程序博客网 时间:2024/04/24 21:57

[Bluetooth(SDK)]使用WinSock搜索蓝牙设备

可以利用下面这些变成元素创建一个查询来搜索一定范围内的远程蓝牙设备:
    WSAQUERYSET 结构体
    WSALookupServiceBegin 函数
    WSALookupServiceNext函数
    WSALookupServiceEnd函数

1、提供Winsock的版本和实现细节的数据来初始化caller application。可以通过调用WSAStartup函数来获得这个数据。
    WSADATA wsd;
    WSAStartup (MAKEWORD(1,0), &wsd);
2、创建并初始化一个WSAQUERYSET变量用于指定搜索参数,设置dwNameSpace成员为NS_BTH限制为查询蓝牙设备。
    WSAQUERYSET wsaq; 
    ZeroMemory(&wsaq, sizeof(wsaq)); 
    wsaq.dwSize = sizeof(wsaq); 
    wsaq.dwNameSpace = NS_BTH; 
    wsaq.lpcsaBuffer = NULL; 
3、调用WSALookupServiceBegin函数来执行一个查询。
    int iRet = WSALookupServiceBegin (&wsaq, LUP_CONTAINERS, &hLookup);
    将LUP_CONTAINERS赋给dwFlags参数,启动SDP来搜索蓝牙设备。
    注意   将dwFlags参数设为零将执行一个服务搜索。
    WSALookupServiceBegin函数返回一个句柄到hLookup参数中。
4、要枚举在上一步中调用WSALookupServiceBegin所找到的设备,就要使用WSALookupServiceNex函数。函数返回一个指向存有查询结果的WSAQUERYSET及构体。
    a.设置一个WSAQUERYSET结构体来储存WSALookupServiceNext函数返回的设备数据。
 
    CHAR buf[4096];
    LPWSAQUERYSET pwsaResults = (LPWSAQUERYSET) buf;
    ZeroMemory(pwsaResults, sizeof(WSAQUERYSET));
    pwsaResults->dwSize = sizeof(WSAQUERYSET);
    pwsaResults->dwNameSpace = NS_BTH;
    pwsaResults->lpBlob = NULL;
 
    b.调用WSALookupServiceNext并将WSALookupServiceBegin返回的hLookUp参数传递给它。为了提高性能,对WSALookupServiceBegin 的调用只返回设备的地址并存储在内存中。要返回设备的名称和地址,就要将LUP_RETURN_NAME | LUP_RETURN_ADDR赋给dwFlags参数。
 
    DWORD dwSize = sizeof(buf);
    int iRet = WSALookupServiceNext (hLookup, LUP_RETURN_NAME | LUP_RETURN_ADDR, &dwSize, pwsaResults)
 
    可以通过循环调用WSALookupServiceNext来枚举所有的设备。
5、调用WSALookupServiceEnd函数来结束设备搜索。这个函数将释放由WSALookupServiceBegin创建的lookup句柄。
    WSALookupServiceEnd(hLookup);
6、要结束对Winsock服务的使用,调用WSACleanup函数。在程序中对每个成功调用的WSAStartup都必须对应地调用WSACleanup。


下面的代码执行了一次设备查询,并将设备名称和地址存入BTHDEV_INFO对象中:
using namespace std;
#ifndef NS_BTH 
#include "ws2bth.h" //如果没有定义NS_BTH宏,则将PSDK头文件包含进来 
#endif 

// for WSALookupServiceBegin() WSALookupServiceNext etc. 
#include <winsock2.h> 
#pragma comment(lib, "ws2_32.lib") 
#include <ws2bth.h> 

typedef struct _tag_BthDev_Info 

 BTH_ADDR btAddr;  //连接蓝牙用
 TCHAR szAddr[32]; //蓝牙名称
 TCHAR szName[128];  //蓝牙地址

 _tag_BthDev_Info() 
 { 
  memset(this, 0, sizeof(this)); 
 } 
}BTHDEV_INFO;

void CDemoDlg::OnBnClickedSearch()
{

 // 初始化winsock
 WSADATA wsaData;
 if( WSAStartup( MAKEWORD(2,2), &wsaData ) != 0 )
 {
  //Socket 库初始化失败
  WSACleanup();
  return ;
 }
 //确认持WinSock DLL是否支 2.2版本
 if(2 != HIBYTE(wsaData.wVersion) || 2 != LOBYTE(wsaData.wVersion))
 {
  //windows Socket 版本不支持
  WSACleanup();
  return ;
 }

 //搜索蓝牙设备
 HANDLE hLookup; 
 WSAQUERYSET wsaq; 
 ZeroMemory(&wsaq, sizeof(wsaq)); 
 wsaq.dwSize = sizeof(wsaq); 
 wsaq.dwNameSpace = NS_BTH; 
 wsaq.lpcsaBuffer = NULL; 

 BOOL bReasult = WSALookupServiceBegin(&wsaq, LUP_CONTAINERS, &hLookup); 
 if(ERROR_SUCCESS != bReasult)
 {
  //WSALookupServiceBegin 失败
  WSACleanup();
  return;
 }
 BTHDEV_INFO* pcBthDevInfo;
 //如果需要搜索所有设备,一下代码用while循环
 if (!hLookup) 
 { 
  return ; 
 } 
 memset(pcBthDevInfo->szAddr, 0, sizeof(pcBthDevInfo->szAddr)); 
 memset(pcBthDevInfo->szName, 0, sizeof(pcBthDevInfo->szName)); 
 union 
 { 
  CHAR buf[5000]; 
  double __unused; // ensure proper alignment 
 }; 
 LPWSAQUERYSET pwsaResults = (LPWSAQUERYSET)buf; 
 DWORD dwSize = sizeof(buf); 
 int nResult; 

 ZeroMemory(pwsaResults, sizeof(WSAQUERYSET)); 
 pwsaResults->dwSize = sizeof(WSAQUERYSET); 
 pwsaResults->dwNameSpace = NS_BTH; 
 pwsaResults->lpBlob = NULL; 

 nResult = WSALookupServiceNext(hLookup, LUP_RETURN_NAME | LUP_RETURN_ADDR, &dwSize, pwsaResults); 
 if (nResult == ERROR_SUCCESS) 
 { 
  pcBthDevInfo->btAddr = ((SOCKADDR_BTH *)pwsaResults->lpcsaBuffer->RemoteAddr.lpSockaddr)->btAddr; 
  BOOL bHaveName = pwsaResults->lpszServiceInstanceName && *(pwsaResults->lpszServiceInstanceName); 

  if (bHaveName) 
  { 
   HexMac2String(pcBthDevInfo->btAddr, pcBthDevInfo->szAddr); 
   _tcscpy(pcBthDevInfo->szName, pwsaResults->lpszServiceInstanceName); 
  } 
 } 
 if (hLookup) 
 { 
  WSALookupServiceEnd(hLookup); 
  hLookup = NULL; 
  return ; 
 } 
 //释放winsock库
 WSACleanup();
}
void CDemoDlg::HexMac2String(BTH_ADDR dw64Addr, TCHAR *pstrMac)

 BYTE *pbAddr = (BYTE*)&dw64Addr; 

 _stprintf( 
  pstrMac, _T("%02X:%02X:%02X:%02X:%02X:%02X"), 
  pbAddr[5], pbAddr[4], pbAddr[3], 
  pbAddr[2], pbAddr[1], pbAddr[0] 
 ); 
}

0 0
原创粉丝点击