|
在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 - 下一页>> |