最近发现,公司的设备,不能被相互查找到,我试了几台,发现确实如此,想了想,猜测可能没有设置蓝牙的可查找状态,以至于不能被其他设备找到,由于最近也比较忙,就没有时间去解决它。
昨天,台湾那边又提到这个问题,所以就只好抽时间去看这个问题。因为是猜测,所以就需要证明是这个原因,在网上下载了一个wince下可以运行的蓝牙应用程序,当我设置可被其他设备查找时,之前不能被查到的设备,就可以正常被查找到,看来确实是这个问题。然后就去看蓝牙相关的文档和动态链接库,看有没有函数可以实现。很容易就能找到BthGetMode和BthSetMode这两个函数,但是写好测试代码的时候,编译的时候,却说没有这个头文件(bthutil.h),也没有lib(bthutil.lib),很郁闷。文档说CE6已经对他支持了,但就是不能用。上网寻找帮助,发现很多人都有相同的疑问,但却没有一个可行的方法。
接下来我就想,如果没有对这两个函数支持的话,就自己去实现一个,看了btd.dll和btdrt.dll 导出的接口函数,发现几个比较可能有帮助的函数:BthGetCurrentMode、BthReadScanEnableMask、BthWriteScanEnableMask。然后就一个个看文档,觉得后两个应该有帮助,但是对文档上的理解的不够透彻,使得拿到的这几个可能有帮助的函数,现在也没有多大用处。后来在网上看到一个博客对这方面有描述,和我想的比较相近,但是终究不是自己搞出来的。链接地址:http://www.cnblogs.com/procoder/archive/2009/05/11/1454396.html
受到启发。于是也就照猫画虎,自己写了两个函数。
int BthGetMode(int& mode)
{
HMODULE hM = LoadLibrary(L"btdrt.dll");
if (hM == NULL)
{
return ERROR_INVALID_HANDLE;
}
pfuncBthReadScanEnableMask pBthReadScanEnableMask = (pfuncBthReadScanEnableMask)GetProcAddress(hM,L"BthReadScanEnableMask");
unsigned char mask = 0;
int iRet = pBthReadScanEnableMask(&mask);
switch(mask)
{
case 0x0:
mode = BTH_POWER_OFF;
break;
case 0x2:
mode = BTH_CONNECTABLE;
break;
case 0x3:
mode = BTH_DISCOVERABLE;
break;
default:
break;
}
FreeLibrary(hM);
return iRet;
}
int BthSetMode(int mode)
{
HMODULE hM = LoadLibrary(L"btdrt.dll");
if (hM == NULL)
{
return ERROR_INVALID_HANDLE;
}
pfuncBthWriteScanEnableMask pBthWriteScanEnableMask = (pfuncBthWriteScanEnableMask)GetProcAddress(hM,L"BthWriteScanEnableMask");
unsigned char mask = 0;
switch(mode)
{
case BTH_POWER_OFF:
mask = 0x0;
break;
case BTH_CONNECTABLE:
mask = 0x2;
break;
case BTH_DISCOVERABLE:
mask = 0x3;
break;
default:
break;
}
int iRet = pBthWriteScanEnableMask(mask);
FreeLibrary(hM);
return iRet;
}
这样就可以利用上面实现的两个函数来设置蓝牙的radio mode。
现在的情况就是经常能够很快的定位问题出现在什么地方,但是解决问题却并不那么容易。在网上看到很多人在应用开发方面都在用C#,虽然我不是做应用开发的,还是有必要去学习C#,实现一些有意思的小程序。学习应用程序的开发!