您的位置:逆风者 VC++ 正文
 添加时间:2007-09-01 原文发表:2007-08-31 人气:265 来源:vckbase.com

本文章共4175字,分3页,当前第1页,快速翻页:
 

在WinCE5中编程查找并连接周围的蓝牙设备并实现通信

作者:谢红伟

下载源代码
逆风编程精品


  不好意思,题目有些长,我只是想让更多人能看到这篇文章,提高被搜索引擎搜到几率。
  蓝牙(Bluetooth)是一种短距离无线通信技术,利用“蓝牙”技术,能够有效地简化掌上电脑、笔记本电脑和移动电话手机等移动通信终端设备之间的通信,也能够成功地简化以上这些设备与Internet之间的通信,从而使这些现代通信设备与因特网之间的数据传输变得更加迅速高效,为无线通信拓宽道路。说得通俗一点,就是蓝牙技术使得现代一些轻易携带的移动通信设备和电脑设备,不必借助电缆就能联网,并且能够实现无线上因特网,其实际应用范围还可以拓展到各种家电产品、消费电子产品和汽车等信息家电,组成一个巨大的无线通信网络。
  利用蓝牙做无线通信的应用非常广泛,甚至有些工业控制都在使用,编程玩家当然也是爱不释手,比如用自己的宝贝手机编一个蓝牙控制程序来控制自己的电脑,看电影的时候可以当做遥控器来使用。
那么如何在手机中编程实现蓝牙通信即是本文将要阐述的内容,本文以Windows Mobile 5.0 为开发平台,简单介绍用蓝牙APIs进行编程的要点,并附上一个源代码供大家参考。
  在PC上编写蓝牙应用程序,可以使用 WindowsXP Platform SDK中的蓝牙APIs,也可以使用WinSock,二者兼可实现蓝牙设备的查找,服务的发现、配对。大部分蓝牙设备都提供虚拟串口的服务,所以真正的通信可以使用系统中虚拟的串口,像操作普通串口一样进行数据通信,当然也可以使用网络编程服务器侦听客户端连接的方式来进行数据通信。PC端蓝牙编程我有一个简单的源代码,可以给初学者一点启发,下载地址是:http://www.pudn.com/downloads82/sourcecode/windows/comm/detail316460.html
  在Windows Mobile中我们不能使用Windows XP Platform SDK,像 BluetoothFindFirstDevice()、BluetoothFindNextDevice()等函数都没办法使用,但是我们还可以使用蓝牙SOCKET来编程。
  蓝牙通信第一步就是搜索蓝牙设备。这里要用到 WSALookupServiceBegin()、WSALookupServiceNext()、WSALookupServiceEnd()三个API函数。为了纪录搜索到的所有周边蓝牙设备信息,自定义一个结构体和数组变量:


// 远程蓝牙设备详细信息

typedef struct _RemoteBthDevInfo

{

	_RemoteBthDevInfo ()

	{

		memset ( szName, 0, sizeof(szName) );

		memset ( &RemoteAddr, 0, sizeof(BT_ADDR) );

		memset ( &LocalAddr, 0, sizeof(BT_ADDR) );

	}

	TCHAR szName[64];

	BT_ADDR RemoteAddr;

	BT_ADDR LocalAddr;

} t_RemoteBthDevInfo;

typedef CArray<t_RemoteBthDevInfo,t_RemoteBthDevInfo&> t_Ary_RemoteBthDevInfo;

搜索周边蓝牙设备的具体代码如下:

//

// 用Socket 函数搜索附近的蓝牙设备,成功时返回设备数,否则返回-1

//

int CBlueTooth_WM::ScanNearbyBthDev_Direct ()

{

	m_Ary_RemoteBthDevInfo.RemoveAll ();



	SetWaitCursor ();



	WSAQUERYSET querySet;

	HANDLE hLookup;

	DWORD flags = LUP_RETURN_NAME | LUP_RETURN_ADDR; 



	union

	{

		CHAR buf[5000];

		double __unused; // ensure proper alignment

	};



	LPWSAQUERYSET pwsaResults = (LPWSAQUERYSET) buf;

	DWORD dwSize = sizeof(buf);

	BOOL bHaveName;

	ZeroMemory(&querySet, sizeof(querySet));

	querySet.dwSize = sizeof(querySet);

	querySet.dwNameSpace = NS_BTH;

	if ( ::WaitForSingleObject ( m_hEvtEndModule, 0 ) == WAIT_OBJECT_0 )

		return -1;

	if (ERROR_SUCCESS != WSALookupServiceBegin (&querySet, LUP_CONTAINERS, &hLookup))

	{

		ResotreCursor ();

		MsgBoxErr ( _T("WSALookupServiceBegin failed") );

		return (-1);

	}



	ZeroMemory(pwsaResults, sizeof(WSAQUERYSET));

	pwsaResults->dwSize = sizeof(WSAQUERYSET);

	pwsaResults->dwNameSpace = NS_BTH;

	pwsaResults->lpBlob = NULL;

	BOOL bError = FALSE;

	while ( TRUE )

	{

		if ( ::WaitForSingleObject ( m_hEvtEndModule, 0 ) == WAIT_OBJECT_0 )

			break;

		if ( ERROR_SUCCESS == WSALookupServiceNext (hLookup, flags, &dwSize, pwsaResults) )

		{

			ASSERT (pwsaResults->dwNumberOfCsAddrs == 1);

			BT_ADDR b = ((SOCKADDR_BTH *)pwsaResults->lpcsaBuffer->RemoteAddr.lpSockaddr)->btAddr;

			bHaveName = pwsaResults->lpszServiceInstanceName && *(pwsaResults->lpszServiceInstanceName);

			t_RemoteBthDevInfo RemoteBthDevInfo;

			if ( bHaveName )

			{

				hwSnprintf ( RemoteBthDevInfo.szName, sizeof(RemoteBthDevInfo.szName), _T("%s"), 

					pwsaResults->lpszServiceInstanceName );

			}

			RemoteBthDevInfo.RemoteAddr = b;



			CSADDR_INFO* pCSAddr = (CSADDR_INFO *)pwsaResults->lpcsaBuffer;

			RemoteBthDevInfo.LocalAddr = ((SOCKADDR_BTH *)pCSAddr->LocalAddr.lpSockaddr)->btAddr;



			TRACE (L"%s ( xx )\n", RemoteBthDevInfo.szName, GET_NAP(b), GET_SAP(b) );

			Add_RemoteBthDevInfo ( RemoteBthDevInfo );

		}

		else

		{

			if ( WSAGetLastError() != WSA_E_NO_MORE )

			{

				bError = TRUE;

				ResotreCursor ();

				MsgBoxErr ( L"Lookup bluetooth device failed" );

			}

			break;

		}

	}

	WSALookupServiceEnd(hLookup);



	ResotreCursor ();

	if ( bError ) return (-1);

	return (int)m_Ary_RemoteBthDevInfo.GetSize();

}

 
 
本文章更多内容1 - 2 - 3 - 下一页>>
相关文章

浅谈PDFlib中文输出(五)人工生成粗体及斜
系统分析员考试回顾
加密 Windows CE系统
WinSock学习笔记(一)
如何实现24位色工具条
树型控件实现数据库的访问
JScript 内存泄露、获取 XmlDataDocument 以
Windows中回收站(Recycle Bin)的存取方法
一个可重用的RAS 类
C语言之四书五经
语法高亮控件 PfxEditCtrl
Windows SDK笔记(五):非模式对话框
N皇后问题摆法算法描述
COM组件设计与应用(十八)——属性包
Security Briefs...小心完全信任的代码
如何在服务(Service)程序中显示对话框
如何在编辑框中使用IAutoComplete接口
基于SHA-256的HMAC文件校验器
VC学习笔记之一:怎样实现XP风格按钮
一种另类“关于(About)”对话框的动态显示方

相关评论


本文章所属分类:首页 VC++

  热门关键字: