一般的手持蓝牙打印机都使用串口协议与主机通信,实现打印。WINCE提供了查找,配对及与蓝牙设备建立串口连接的界面。但那个界面不是很友好,优其对非专业人士来说太过复杂。下文讲述自行开发这样一个程序的方法。
1,准备工作。
蓝牙相关的功能需要使用到socket函数库,所以程序先要调用WSAStartup来初始化socket库。
2,查找蓝牙设备。
调用 WSALookupServiceBegin来启动一次搜索。
然后反复调用WSALookupServiceNext,直到找到想要的设备,或者此函数失败。
最后调用 WSALookupServiceEnd结束本次搜索过程。
示意代码如下。
WSADATA wsd;
HANDLE hLookup;
ZeroMemory(&wsaq, sizeof(wsaq));
wsaq.dwSize = sizeof(wsaq);
wsaq.dwNameSpace = NS_BTH;
wsaq.lpcsaBuffer = NULL;
iResult = WSALookupServiceBegin (&wsaq, LUP_CONTAINERS, &hLookup);
while(1)
{
CHAR buf[4096];
LPWSAQUERYSET pwsaResults = (LPWSAQUERYSET) buf;
ZeroMemory(pwsaResults, sizeof(WSAQUERYSET));
pwsaResults->dwSize = sizeof(WSAQUERYSET);
pwsaResults->dwNameSpace = NS_BTH;
pwsaResults->lpBlob = NULL;
DWORD dwSize = sizeof(buf);
int iRet = WSALookupServiceNext( hLookup, LUP_RETURN_NAME | LUP_RETURN_ADDR, &dwSize, pwsaResults);
...
}
3。如果已经找到设备,就可以使用BthPairRequest做密码配对,配对成功后查找它支持的服务。
需要用到BthNsLookupServiceBegin,BthNsLookupServiceNext,与BthNsLookupServiceEnd。
如果找到串口,就使用FindRFCOMMChannel来查找串口服务对应的端口号。
与上面三个函数的用法类似。
4,这些信息一旦得到,就可以调用 RegisterDevice来创建一个本地串口设备,使用CreateFile打开,WriteFile向其写数据,完成打印。
有几点需要注意:
1)使用完设备需要删除连接时,一定要调用 BthRevokeLinkKey来删除Link key,否则会造成永远不能连接。
2)蓝牙设备没有打开时RegisterDevice也能成功,就是说RegisterDevice不会引发与蓝牙设备连接,只有CreateFile时才会连接。