📄 fctest.cxx
字号:
//
// Copyright (c) Microsoft Corporation. All rights reserved.
//
//
// Use of this source code is subject to the terms of the Microsoft end-user
// license agreement (EULA) under which you licensed this SOFTWARE PRODUCT.
// If you did not accept the terms of the EULA, you are not authorized to use
// this source code. For a copy of the EULA, please see the LICENSE.RTF on your
// install media.
//
/**
THIS CODE AND INFORMATION IS PROVIDED "AS IS" WITHOUT WARRANTY OF ANY KIND,
EITHER EXPRESSED OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE IMPLIED
WARRANTIES OF MERCHANTABILITY AND/OR FITNESS FOR A PARTICULAR PURPOSE.
Abstract:
Windows CE Bluetooth application sample
**/
#include <windows.h>
#include <winsock.h>
#include <ws2bth.h>
#include <bt_api.h>
#include <winioctl.h>
#include <console.h>
#define BUF_MAX 256
int GetDI (WCHAR **pp, unsigned int *pi) {
while (**pp == ' ')
++*pp;
int iDig = 0;
*pi = 0;
while (iswdigit (**pp)) {
int c = **pp;
c = c - '0';
if ((c < 0) || (c > 9))
return FALSE;
*pi = *pi * 10 + c;
++*pp;
++iDig;
}
if ((iDig <= 0) || (iDig > 10))
return FALSE;
return TRUE;
}
int GetBA (WCHAR **pp, BT_ADDR *pba) {
while (**pp == ' ')
++*pp;
for (int i = 0 ; i < 4 ; ++i, ++*pp) {
if (! iswxdigit (**pp))
return FALSE;
int c = **pp;
if (c >= 'a')
c = c - 'a' + 0xa;
else if (c >= 'A')
c = c - 'A' + 0xa;
else c = c - '0';
if ((c < 0) || (c > 16))
return FALSE;
*pba = *pba * 16 + c;
}
for (i = 0 ; i < 8 ; ++i, ++*pp) {
if (! iswxdigit (**pp))
return FALSE;
int c = **pp;
if (c >= 'a')
c = c - 'a' + 0xa;
else if (c >= 'A')
c = c - 'A' + 0xa;
else c = c - '0';
if ((c < 0) || (c > 16))
return FALSE;
*pba = *pba * 16 + c;
}
if ((**pp != ' ') && (**pp != '\0'))
return FALSE;
return TRUE;
}
int GetUx (WCHAR **pp, void *pRes, int nDigs) {
while (**pp == ' ')
++*pp;
if (**pp != '0')
return FALSE;
++*pp;
if (**pp != 'x')
return FALSE;
++*pp;
int iDig = 0;
int iRes = 0;
while (iswxdigit (**pp)) {
int c = **pp;
if (c >= 'a')
c = c - 'a' + 0xa;
else if (c >= 'A')
c = c - 'A' + 0xa;
else c = c - '0';
if ((c < 0) || (c > 16))
return FALSE;
iRes = iRes * 16 + c;
++*pp;
++iDig;
}
if (iDig > nDigs)
return FALSE;
switch (nDigs) {
case 2:
*(unsigned char *)pRes = (unsigned char)iRes;
break;
case 4:
*(unsigned short *)pRes = (unsigned short)iRes;
break;
case 8:
*(unsigned int *)pRes = (unsigned int)iRes;
break;
}
return TRUE;
}
#define BPR 8
void DumpBuff (WCHAR *szLineHeader, unsigned char *lpBuffer, unsigned int cBuffer) {
WCHAR szLine[5 + 7 + 2 + 4 * BPR];
for (int i = 0 ; i < (int)cBuffer ; i += BPR) {
int bpr = cBuffer - i;
if (bpr > BPR)
bpr = BPR;
wsprintf (szLine, L"%04x ", i);
WCHAR *p = szLine + wcslen (szLine);
for (int j = 0 ; j < bpr ; ++j) {
WCHAR c = (lpBuffer[i + j] >> 4) & 0xf;
if (c > 9) c += L'a' - 10; else c += L'0';
*p++ = c;
c = lpBuffer[i + j] & 0xf;
if (c > 9) c += L'a' - 10; else c += L'0';
*p++ = c;
*p++ = L' ';
}
for ( ; j < BPR ; ++j) {
*p++ = L' ';
*p++ = L' ';
*p++ = L' ';
}
*p++ = L' ';
*p++ = L' ';
*p++ = L' ';
*p++ = L'|';
*p++ = L' ';
*p++ = L' ';
*p++ = L' ';
for (j = 0 ; j < bpr ; ++j) {
WCHAR c = lpBuffer[i + j];
if ((c < L' ') || (c >= 127))
c = L'.';
*p++ = c;
}
for ( ; j < BPR ; ++j) {
*p++ = L' ';
}
*p++ = L'\n';
*p++ = L'\0';
wprintf (L"%s %s", szLineHeader ? szLineHeader : L"", szLine);
}
}
static int gContinue = TRUE;
static int ControlCHandler(void) {
gContinue = FALSE;
return FALSE;
}
// server port COMx:
// client bd_addr port [COMx:]
int wmain (int argc, WCHAR **argv) {
BT_ADDR b;
unsigned int channel = 0;
WCHAR *arg2 = argv[2];
WCHAR *arg3 = argv[3];
WCHAR *arg4 = argv[4];
USE_CONIOCTL_CALLS
WSADATA wsd;
if (WSAStartup (MAKEWORD(1,0), &wsd)) {
wprintf (L"Initialization of socket subsystem failed! Error = %d\n", WSAGetLastError ());
return 0;
}
if ((argc >= 4) && (argc <= 5) && (wcsicmp (argv[1], L"client") == 0) && GetBA(&arg2, &b) && GetDI(&arg3, &channel)) {
if (argc == 5) { // serial port?
int index = 0;
if (! GetDI(&arg4, (unsigned int *)&index)) {
wprintf (L"Could not get index out of %s\n", arg4);
return 1;
}
PORTEMUPortParams pp;
memset (&pp, 0, sizeof(pp));
pp.channel = channel & 0xff;
pp.device = b;
HANDLE h = RegisterDevice (L"COM", index, L"btd.dll", (DWORD)&pp);
if (h == NULL) {
wprintf (L"Failed RegisterDevice on COM%d:, Error = %d\n", index, GetLastError ());
return 0;
}
wprintf (L"device handle = 0x%08x; connecting...\n", h);
WCHAR szComPort[30];
wsprintf (szComPort, L"COM%d:", index);
HANDLE hCommPort = CreateFile (szComPort, GENERIC_READ | GENERIC_WRITE, 0, NULL, OPEN_EXISTING, 0, NULL);
if (hCommPort == INVALID_HANDLE_VALUE) {
DeregisterDevice (h);//DeregisterDevice:卸载驱动程序。
wprintf (L"Failed to open %s (connection failed?). Error = %d\n", szComPort, GetLastError ());
return 0;
}
wprintf (L"Device connected; press ctrl-S to pause sending, or ctrl-C to stop.\n");
CeSetControlCHandler(_fileno(stdout), ControlCHandler);
int i = 0;
while (gContinue) {
WCHAR buffer[128];
DWORD dwWrit = 0;
wsprintf (buffer, L"Line %d, press ctrl-c to stop\n", ++i);
if (! WriteFile (hCommPort, buffer, (wcslen(buffer) + 1) * sizeof(WCHAR), &dwWrit, NULL))
break;
if ((i % 32) == 0)
wprintf (L"%d", i);
wprintf (L".");
if ((i % 32) == 31)
wprintf (L"%d\n", i);
}
CeSetControlCHandler(_fileno(stdout), NULL);
CloseHandle (hCommPort);
DeregisterDevice (h);
wprintf (L"Successfully completed\n");
return 0;
}
SOCKET s = socket (AF_BT, SOCK_STREAM, BTHPROTO_RFCOMM);
if (s == INVALID_SOCKET) {
wprintf (L"socket failed, error %d\n", WSAGetLastError ());
return 0;
}
SOCKADDR_BTH sa;
memset (&sa, 0, sizeof(sa));
sa.addressFamily = AF_BT;
sa.btAddr = b;
sa.port = channel & 0xff;
wprintf (L"Connecting to %04x%08x 0x%02x\n", GET_NAP(b), GET_SAP(b), channel & 0xff);
if (connect (s, (SOCKADDR *)&sa, sizeof(sa))) {
closesocket (s);
wprintf (L"Connect failed, error = %d\n", WSAGetLastError ());
return 0;
}
wprintf (L"Device connected; press ctrl-S to pause sending, or ctrl-C to stop.\n");
CeSetControlCHandler(_fileno(stdout), ControlCHandler);
int i = 0;
while (gContinue) {
WCHAR buffer[128];
DWORD dwWrit = 0;
wsprintf (buffer, L"Line %d, press ctrl-c to stop\n", ++i);
int cBytes = (wcslen(buffer) + 1) * sizeof(WCHAR);
if (send (s, (char *)buffer, cBytes, 0) != cBytes)
break;
if ((i % 32) == 0)
wprintf (L"%d", i);
wprintf (L".");
if ((i % 32) == 31)
wprintf (L"%d\n", i);
}
CeSetControlCHandler(_fileno(stdout), NULL);
closesocket (s);
return 0;
} else if ((argc >=3) && (argc <= 4) && (wcsicmp (argv[1], L"server") == 0) && GetDI (&arg2, &channel)) {
if (argc == 4) {
int index = 0;
if (! GetDI(&arg3, (unsigned int *)&index)) {
wprintf (L"Could not get index out of %s\n", arg3);
return 1;
}
PORTEMUPortParams pp;
memset (&pp, 0, sizeof(pp));
pp.channel = channel & 0xff;
pp.flocal = TRUE;
HANDLE h = RegisterDevice (L"COM", index, L"btd.dll", (DWORD)&pp);
if (h == NULL) {
wprintf (L"Failed RegisterDevice on COM%d:, Error = %d\n", index, GetLastError ());
return 0;
}
wprintf (L"device handle = 0x%08x; opening...\n", h);
WCHAR szComPort[30];
wsprintf (szComPort, L"COM%d:", index);
HANDLE hCommPort = CreateFile (szComPort, GENERIC_READ | GENERIC_WRITE, 0, NULL, OPEN_EXISTING, 0, NULL);
if (hCommPort == INVALID_HANDLE_VALUE) {
DeregisterDevice (h);
wprintf (L"Failed to open %s (connection failed?). Error = %d\n", szComPort, GetLastError ());
return 0;
}
wprintf (L"waiting for call. Ctrl-C to interrupt\n");
SetCommMask (hCommPort, EV_RLSD | EV_RXCHAR);
CeSetControlCHandler(_fileno(stdout), ControlCHandler);
DWORD dwEvt;
while (gContinue) {
if (! WaitCommEvent (hCommPort, &dwEvt, NULL)) {
wprintf (L"Failure on port read, Error = %d\n", GetLastError ());
gContinue = FALSE;
break;
}
if (! (dwEvt & EV_RLSD))
continue;
DWORD dwModemFlags = 0;
if (GetCommModemStatus (hCommPort, & dwModemFlags) && (dwModemFlags & MS_RLSD_ON))
break;
}
if (gContinue)
wprintf (L"Device connected; press ctrl-S to pause sending, or ctrl-C to stop.\n");
while (gContinue) {
WCHAR buffer[128];
DWORD dwRead = 0;
if (! ReadFile (hCommPort, buffer, sizeof(buffer), &dwRead, NULL))
break;
DumpBuff (L"server>", (unsigned char *)buffer, (unsigned int)dwRead);
DWORD dwModemFlags = 0;
if ((! GetCommModemStatus (hCommPort, & dwModemFlags)) || ((dwModemFlags & MS_RLSD_ON) == 0))
break;
}
CeSetControlCHandler(_fileno(stdout), NULL);
CloseHandle (hCommPort);
DeregisterDevice (h);
wprintf (L"Successfully completed\n");
return 0;
}
SOCKET s = socket (AF_BT, SOCK_STREAM, BTHPROTO_RFCOMM);
if (s == INVALID_SOCKET) {
wprintf (L"socket failed, error %d\n", WSAGetLastError ());
return 0;
}
SOCKADDR_BTH sa;
memset (&sa, 0, sizeof(sa));
sa.addressFamily = AF_BT;
sa.port = channel & 0xff;
wprintf (L"binding to 0x%02x\n", channel & 0xff);
if (bind (s, (SOCKADDR *)&sa, sizeof(sa))) {
wprintf (L"Bind failed, error = %d\n", WSAGetLastError ());
return 0;
}
if (listen (s, 5)) {
wprintf (L"Listen failed, error = %d\n", WSAGetLastError ());
return 0;
}
SOCKADDR_BTH sa2;
int size = sizeof(sa2);
wprintf (L"Accepting...\n");
SOCKET s2 = accept (s, (SOCKADDR *)&sa2, &size);
closesocket (s);
if (s2 == INVALID_SOCKET) {
wprintf (L"Accept failed, error = %d\n", WSAGetLastError ());
return 0;
}
CeSetControlCHandler(_fileno(stdout), ControlCHandler);
while (gContinue) {
WCHAR buffer[128];
int iRead = 0;
if ((iRead = recv (s2, (char *)buffer, sizeof(buffer), 0)) <= 0)
break;
DumpBuff (L"server>", (unsigned char *)buffer, (unsigned int)iRead);
}
CeSetControlCHandler(_fileno(stdout), NULL);
closesocket (s2);
} else {
wprintf (L"Usage: %s {server | client <target bt_addr>} channel {index}\n", argv[0]);
return 1;
}
return 0;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -