现在的位置: 首页 > 综合 > 正文

基于visual c++之windows核心编程代码分析(56)使用winsock搜索蓝牙设备

2013年03月25日 ⁄ 综合 ⁄ 共 2812字 ⁄ 字号 评论关闭

蓝牙,是一种支持设备短距离通信(一般10m内)的无线电技术。能在包括移动电话、PDA、无线耳机、笔记本电脑、相关外设等众多设备之间进行无线信息交换。利用“蓝牙”技术,能够有效地简化移动通信终端设备之间的通信,也能够成功地简化设备与因特网Internet之间的通信,从而数据传输变得更加迅速高效,为无线通信拓宽道路。蓝牙采用分散式网络结构以及快跳频和短包技术,支持点对点及点对多点通信,工作在全球通用的2.4GHz ISM(即工业、科学、医学)频段。其数据速率为1Mbps。采用时分双工传输方案实现全双工传输。
蓝牙,对于手机乃至整个 IT业而言已经不仅仅是一项简单的技术,而是一种概念。当蓝牙联盟信誓旦旦地对未来前景作着美好的憧憬时,整个业界都为之震动。抛开传统连线的束缚,彻底地享受无拘无束的乐趣,蓝牙给予我们的承诺足以让人精神振奋。  

 蓝牙技术是一种无线数据与语音通信的开放性全球规范,它以低成本的近距离无线连接为基础,为固定与移动设备通信环境建立一个特别连接。其程序写在一个9 x 9 mm的微芯片中。   例如,如果把蓝牙技术引入到移动电话和膝上型电脑中,就可以去掉移动电话与膝上型电脑之间的令人讨厌的连接电缆而而通过无线使其建立通信。

打印机、PDA、桌上型电脑、传真机、键盘、游戏操纵杆以及所有其它的数字设备都可以成为蓝牙系统的一部分。除此之外,蓝牙无线技术还为已存在的数字网络和外设提供通用接口以组建一个远离固定网络的个人特别连接设备群。  

 蓝牙工作在全球通用的2.4GHz ISM(即工业、科学、医学)频段。蓝牙的数据速率为1Mb/s。时分双工传输方案被用来实现全双工传输。 使用IEEE802.15协议。   ISM频带是对所有无线电系统都开放的频带,因此使用其中的某个频段都会遇到不可预测的干扰源。例如某些家电、无绳电话、汽车房开门器、微波炉等等,都可能是干扰。为此,蓝牙特别设计了快速确认和跳频方案以确保链路稳定。跳频技术是把频带分成若干个跳频信道(hop channel),在一次连接中,无线电收发器按一定的码序列(即一定的规律,技术上叫做“伪随机码”,就是"假"的随机码)不断地从一个信道"跳"到另一个信道,只有收发双方是按这个规律进行通信的,而其他的干扰不可能按同样的规律进行干扰;跳频的瞬时带宽是很窄的,但通过扩展频谱技术使这个窄带宽成百倍地扩展成宽频带,使干扰可能的影响变成很小。  

 与其它工作在相同频段的系统相比,蓝牙跳频更快,数据包更短,这使蓝牙比其它系统都更稳定。FEC(Forward Error Correction,前向纠错)的使用抑制了长距离链路的随机噪音。应用了二进制调频(FM)技术的跳频收发器被用来抑制干扰和防止衰落。  

 蓝牙基带协议是电路交换与分组交换的结合。在被保留的时隙中可以传输同步数据包,每个数据包以不同的频率发送。一个数据包名义上占用一个时隙,但实际上可以被扩展到占用5个时隙。蓝牙可以支持异步数据信道、多达3个的同时进行的同步话音信道,还可以用一个信道同时传送异步数据和同步话音。每个话音信道支持64kb/s同步话音链路。异步信道可以支持一端最大速率为721kb/s而另一端速率为57.6kb/s的不对称连接,也可以支持43.2kb/s的对称连接。

 

我们如何检索计算机上面的蓝牙设备呢,我们使用winsock搜索蓝牙设备,请见代码分析

 

#include "stdafx.h"

#include <winsock2.h>
#include <ws2bth.h>

#pragma comment(lib,"ws2_32.lib")

int _tmain(int argc, _TCHAR* argv[])
{
    // 初始化winsock
    WSADATA	wsaData;
    if( WSAStartup( MAKEWORD(2,2), &wsaData ) != 0 ) 
	{
		_tprintf(_T("WSAStartup failed with error code: %d\n"), WSAGetLastError());
        return 1;
    }

    // 初始化蓝牙枚举结构
	DWORD dwWsaqsLen = sizeof(WSAQUERYSET);
	LPWSAQUERYSET lpWsaqs = (LPWSAQUERYSET)HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, dwWsaqsLen);
	lpWsaqs->dwSize = sizeof(WSAQUERYSET);
	lpWsaqs->dwNameSpace = NS_BTH;

	// 开始枚举蓝牙设备
    DWORD dwWsaqsFlags = LUP_CONTAINERS | LUP_FLUSHCACHE | LUP_RETURN_NAME | LUP_RETURN_ADDR;
    HANDLE hService;

    if(WSALookupServiceBegin(lpWsaqs, dwWsaqsFlags, &hService) != SOCKET_ERROR) 
	{
		bool bFinished = false;
		while(!bFinished) 
		{
			if(WSALookupServiceNext(hService, dwWsaqsFlags, &dwWsaqsLen, lpWsaqs) == NO_ERROR) 
			{
				SOCKADDR_BTH *saBth = (SOCKADDR_BTH*)lpWsaqs->lpcsaBuffer->RemoteAddr.lpSockaddr;
				BTH_ADDR bthAddr = saBth->btAddr;

				_tprintf(_T("\n发现蓝牙设备: \n"));
				_tprintf(_T("------------------------\n"));
				_tprintf(_T("NAP: 0x%04X  SAP: 0x%08X 设备名称: %s\n"), GET_NAP(bthAddr), GET_SAP(bthAddr), lpWsaqs->lpszServiceInstanceName);
			} 
			else 
			{
				// 错误处理
				switch(WSAGetLastError())
				{
				// 所给缓冲区过小,重新申请
				case WSAEFAULT:
					HeapFree(GetProcessHeap(), 0, lpWsaqs);
					lpWsaqs = (LPWSAQUERYSET)HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, dwWsaqsLen);
					break;

				// 没有更多蓝牙设备了
				case WSA_E_NO_MORE:
					bFinished = true;
					break;

				default:
					//bFinished = true;
					break;
				}
			}
		}
		WSALookupServiceEnd( hService );
	}

	// 释放资源
	HeapFree(GetProcessHeap(), 0, lpWsaqs);
    WSACleanup();

    return 0;
}

 

抱歉!评论已关闭.