[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]
);
}
- [Bluetooth(SDK)]使用WinSock搜索蓝牙设备
- [Bluetooth(SDK)]使用WinSock搜索蓝牙设备
- [Bluetooth]使用WinSock连接到远程蓝牙设备
- [Bluetooth(SDK)]使用WinSock连接到远程设备
- [Bluetooth(SDK)]使用WinSock连接到远程设备
- Android 蓝牙Bluetooth搜索设备。
- 编程代码分析-使用winsock搜索蓝牙设备
- [Bluetooth API]使用Irprops库搜索蓝牙设备
- 【热门技术】Winsock 搜索蓝牙设备
- 基于visual c++之windows核心编程代码分析(56)使用winsock搜索蓝牙设备
- 基于visual c++之windows核心编程代码分析(56)使用winsock搜索蓝牙设备
- 基于visual c++之windows核心编程代码分析(56)使用winsock搜索蓝牙设备
- 基于visual c++之windows核心编程代码分析(56)使用winsock搜索蓝牙设备
- [Bluetooth]搜索一定范围内的远程蓝牙设备
- [Bluetooth]使用虚拟串口连接到远程蓝牙设备
- 蓝牙(Bluetooth)设备查找、蓝牙VC源代码
- android -- 蓝牙 bluetooth (三)搜索蓝牙
- android -- 蓝牙 bluetooth (三)搜索蓝牙
- Eclipse导入所依赖的Android项目
- hdu2896病毒侵袭(ac自动机,求模式串出现的个数)
- 24 Swap Nodes in Pairs
- Text为只读属性
- centos 6.5 安装 nginx
- [Bluetooth(SDK)]使用WinSock搜索蓝牙设备
- 安卓清理后台程序
- Fix “gcc: error trying to exec ‘cc1plus’: execvp: No such file or directory” in Fedora
- 仿美团实现地域选择和城市列表
- mysql 全局变量和SESSION变量
- JavaScript动态修改图片的代码
- MFC之列表视图控件List Control
- 找不到ADO.NET Entity Data Model模板或 sql server database project模板
- Improving neural networks by preventing co-adaptation of feature detectors (译文)