⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 main.cpp

📁 演示了如何从一个Gizmondo WinCE设备通过蓝牙接口连接到PC 的代码演示.
💻 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 + -