📄 main.cpp
字号:
//////////////////////////////////////////////////////////////////////////
//
// Bluetooth demo program for the Gizmondo (should work on any PocketPC)
//
// This program just demonstrates to how find nearby BT devices and
// how to connect to them. Finding devices takes long (~20 seconds),
// so a real program should do this in the background and then keep
// a list of known devices!
//
// If serverAddrStr is not NULL, the code will not search for devices
// but instead use this address. This code ALWAYS connects to the first
// device found, so make sure that only the server has BT activated!
// The program assumes that the PC counterpart is running which accepts
// a string and sends back an echo message ("ECHO xx!").
//
// (c) 2006 by Daniel Wagner
//
// You are free to use this code for any purpose, but please credit me...
//
// This code is based on a sample (ssa.cxx) by Microsoft from the
// Windows CE 5.0 Platform Builder.
//
#include <winsock2.h>
#include <ws2bth.h>
#undef WSAGetLastError
#define WSAGetLastError() GetLastError()
#define BLUETOOTHQUERY_MAXDEVICES 32
BT_ADDR deviceAddrList[BLUETOOTHQUERY_MAXDEVICES];
TCHAR deviceNameList[BLUETOOTHQUERY_MAXDEVICES][64];
int deviceCount = 0;
const char* toChar(const wchar_t* nString)
{
static char* string = 0;
static size_t stringLen = 0;
size_t i, len=wcslen(nString);
if(len>stringLen)
{
stringLen = len;
delete string;
string = new char[stringLen+1];
}
for(i=0; i<len; i++)
string[i] = (char)nString[i];
string[len] = 0;
return string;
}
void
ShowMessage(const char* nTitle, const char* nInfo, ...)
{
char infoString[256];
va_list marker;
va_start(marker, nInfo);
vsprintf(infoString,nInfo,marker);
int i,lenI=(int)strlen(infoString), lenT=(int)strlen(nTitle);
wchar_t wInfo[256], wTitle[64];
for(i=0; i<lenI; i++)
wInfo[i] = infoString[i];
wInfo[lenI] = 0;
for(i=0; i<lenT; i++)
wTitle[i] = nTitle[i];
wTitle[lenT] = 0;
::MessageBoxW(NULL, wInfo, wTitle, MB_OK|MB_SETFOREGROUND|MB_TOPMOST);
}
// this function converts a string of hex numbers
// into the native Bluetooth address format.
// taken from the Windows CE Platform Builder sample (ssa.cxx)
//
int GetBA (const WCHAR **pp, BT_ADDR *pba) {
int i;
while (**pp == ' ')
++*pp;
for (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;
}
bool
findDevices()
{
WSAQUERYSET querySet;
HANDLE hLookup;
char buffer[1000];
DWORD bufferlength;
WSAQUERYSET *results;
SOCKADDR_BTH *btaddr;
memset(&querySet, 0, sizeof(querySet));
querySet.dwSize = sizeof(querySet);
querySet.dwNameSpace = NS_BTH;
deviceCount = 0;
if(WSALookupServiceBegin(&querySet, LUP_CONTAINERS, &hLookup) == SOCKET_ERROR)
{
return false;
}
while(deviceCount < BLUETOOTHQUERY_MAXDEVICES)
{
bufferlength = sizeof(buffer);
memset(buffer, 0, sizeof(buffer));
results = (WSAQUERYSET *) &buffer;
if (WSALookupServiceNext(hLookup, LUP_RETURN_NAME|LUP_RETURN_ADDR, &bufferlength, results) == SOCKET_ERROR)
{
int result = WSAGetLastError();
break;
}
btaddr = (SOCKADDR_BTH *) results->lpcsaBuffer->RemoteAddr.lpSockaddr;
deviceAddrList[deviceCount] = btaddr->btAddr;
if (results->lpszServiceInstanceName != NULL)
wcscpy((TCHAR*)deviceNameList[deviceCount], results->lpszServiceInstanceName);
else
wcscpy((TCHAR*)deviceNameList[deviceCount], L"<unnamed>");
deviceCount++;
}
WSALookupServiceEnd(hLookup);
return true;
}
int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPTSTR lpCmdLine, int nCmdShow )
{
// hard coded server address. if serverAddrStr is NULL
// the client will try to find the server...
//
//const WCHAR* serverAddrStr = L"0016415bfabf"; // PC BT address of Daniel
//const WCHAR* serverAddrStr = L"0011f6053631"; // PC BT address of dole_95
const WCHAR* serverAddrStr = NULL;
const char* serverName = "unknwon";
BT_ADDR serverAddrBt;
unsigned int channel = 0;
int namelen;
// turn on BT usage
//
UINT Bluetooth_Message = RegisterWindowMessage(TEXT("BT_MSG"));
SendMessage(HWND_BROADCAST, Bluetooth_Message, 1, 0);
Sleep(1000);
// init WinSock
WSADATA wsd;
if (WSAStartup (MAKEWORD(1,0), &wsd)) {
wprintf (L"Initialization of socket subsystem failed! Error = %d\n", WSAGetLastError ());
ShowMessage("ERROR", "Initialization of socket subsystem failed! Error = %d", WSAGetLastError());
return 0;
}
if(serverAddrStr==NULL)
{
ShowMessage("INFO", "Searching for devices!\nThis will take a few seconds.\nPlease klick OK to continue.");
findDevices();
if(deviceCount<1)
{
ShowMessage("ERROR", "No devices found!");
return -1;
}
serverName = toChar(deviceNameList[0]);
ShowMessage("INFO", "Found %d device(s)...\nConnecting to %s", deviceCount, serverName);
serverAddrBt = deviceAddrList[0];
}
else
{
// convert the address string into native format
//
if(!GetBA(&serverAddrStr, &serverAddrBt))
{
wprintf(L"Invalid server address!\n");
ShowMessage("ERROR", "Invalid server address!");
return 0;
}
}
// now create a socket (this should always work)
//
SOCKET s = socket (AF_BT, SOCK_STREAM, BTHPROTO_RFCOMM);
if(s == INVALID_SOCKET) {
wprintf (L"socket failed, error %d\n", WSAGetLastError ());
ShowMessage("ERROR", "socket failed, error %d", WSAGetLastError ());
return 0;
}
SOCKADDR_BTH sa;
memset (&sa, 0, sizeof(sa));
sa.addressFamily = AF_BT;
sa.btAddr = serverAddrBt;
// try to connect on all 30 channels
//
for(int ch=0; ch<=30; ch++)
{
channel = ch;
sa.port = channel & 0xff;
wprintf (L"Connecting to %04x%08x 0x%02x\n", GET_NAP(serverAddrBt), GET_SAP(serverAddrBt), channel & 0xff);
if (connect (s, (SOCKADDR *)&sa, sizeof(sa))) {
wprintf (L"Connect failed, error = %d\n", WSAGetLastError ());
}
else
{
wprintf (L"connected on channel %d\n", ch);
break;
}
}
if(channel>=30)
{
ShowMessage("ERROR", "could not connect");
return -1;
}
ShowMessage("INFO", "connected on channel %d\nto device: %s", channel, serverName);
// just post some info on the connection
//
SOCKADDR_BTH sa3;
namelen = sizeof(sa3);
if (0 == getsockname(s, (SOCKADDR *)&sa3, &namelen)) {
wprintf (L"Socket s:localname<%04x%08x> connecting on port %d(0x%x)...\n", GET_NAP(sa3.btAddr), GET_SAP(sa3.btAddr), sa3.port, sa3.port);
}
namelen = sizeof(sa3);
if (!getpeername(s, (SOCKADDR *)&sa3, &namelen)) {
wprintf (L"Socket s:peername<%04x%08x> connecting on port %d(0x%x)...\n", GET_NAP(sa3.btAddr), GET_SAP(sa3.btAddr), sa3.port, sa3.port);
}
// now that we have a connection we can send some data...
//
const char* msg = "Hey you over there...";
int bytesSent = send (s, (char*)msg, strlen(msg), 0);
if(bytesSent != strlen(msg)) {
wprintf (L"send returns %d, Error = %d\n", bytesSent, WSAGetLastError ());
ShowMessage("ERRRO", "send returns %d, Error = %d\n", bytesSent, WSAGetLastError());
return 0;
}
// wait for the reply
// normally there should be a header telling how much data will come
// for simplicity we assume this will be 10 bytes...
//
char buf[256];
int len = recv(s, buf, 10, 0);
if(len>0)
{
buf[len] = 0;
printf(buf);
ShowMessage("Got Reply", buf);
}
return 0;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -