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

📄 opttest.cxx

📁 This a sample Bluetooth application which illustrates the use of Windows CE Bluetooth stack WinSock
💻 CXX
📖 第 1 页 / 共 3 页
字号:

			continue;
		} else {
			wprintf (L"Incorrect syntax: %s\n", argv[0]);
			return FALSE;
		}

		int iRes = setsockopt (s, SOL_RFCOMM, iName, (char *)&iOpt, sizeof(iOpt));
		if (iRes != ERROR_SUCCESS) {
			wprintf (L"setsockopt returns %d for %s (name = %d, val = %d)\n", iRes, argv[0], iName, iOpt);
			return FALSE;
		}

		++argv;
		--argc;

		if (sz != NULL) {
			++argv;
			--argc;
		}
	}

	return TRUE;
}

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];

	WSADATA wsd;
	if (WSAStartup (MAKEWORD(1,0), &wsd)) {
		wprintf (L"Initialization of socket subsystem failed! Error = %d\n", WSAGetLastError ());
		return 0;
	}

	if ((argc == 2) && (wcsicmp (argv[1], L"manage") == 0)) {
		SOCKET s = socket (AF_BT, SOCK_STREAM, BTHPROTO_RFCOMM);
		for ( ; ; ) {
			wprintf (L"Management mode. Type 'exit' to exit, 'help' for command list\n> ");

			WCHAR szCommand[BUF_MAX];
			if (! fgetws (szCommand, BUF_MAX, stdin))
				break;

			WCHAR *szEOL = wcschr (szCommand, L'\n');
			if (szEOL)
				*szEOL = '\0';

			if (wcsicmp (szCommand, L"EXIT") == 0)
				break;

			if (wcsicmp (szCommand, L"HELP") == 0) {
				wprintf (L"EXIT - exit the monitor\n");
				wprintf (L"GETVERSIONS - get local version\n");
				wprintf (L"GETPAGE, GETCOD, GETSCAN, GETAUTH - retrieve card parameters\n");
				wprintf (L"SETCOD 0xhhhhhh, SETPAGE 0xhhhh, SETSCAN 0xhh, SETAUTH 0xhh - set card parameters\n");
				wprintf (L"GETNAME hhhhhhhhhhhh - get remote name\n");
				continue;
			}

			if (wcsicmp (szCommand, L"GETVERSION") == 0) {
				BTH_LOCAL_VERSION bv;

				int iRes;
				int ilen = sizeof(bv);

				iRes = getsockopt (s, SOL_RFCOMM, SO_BTH_GET_LOCAL_VER, (char *)&bv, &ilen);
				if (iRes)
					wprintf (L"SO_BTH_GET_LOCAL_VER : error %d\n", iRes);
				else {
					wprintf (L"hci version %d\n", bv.hci_version);
					wprintf (L"hci revision %d\n", bv.hci_revision);
					wprintf (L"lmp version %d\n", bv.lmp_version);
					wprintf (L"lmp revision %d\n", bv.lmp_subversion);
					wprintf (L"manufacturer: ");
					switch (bv.manufacturer) {
					case 0:
						wprintf (L"Ericsson\n");
						break;
					case 1:
						wprintf (L"Nokia\n");
						break;
					case 2:
						wprintf (L"Intel\n");
						break;
					case 3:
						wprintf (L"IBM\n");
						break;
					case 4:
						wprintf (L"Toshiba\n");
						break;
					case 5:
						wprintf (L"3COM\n");
						break;
					case 6:
						wprintf (L"Microsoft\n");
						break;
					case 7:
						wprintf (L"Lucent\n");
						break;
					case 8:
						wprintf (L"Motorola\n");
						break;
					case 9:
						wprintf (L"Infineon\n");
						break;
					case 10:
						wprintf (L"CSR\n");
						break;
					case 11:
						wprintf (L"Silicon Wave\n");
						break;
					case 12:
						wprintf (L"Digianswer\n");
						break;
					default:
						wprintf (L"Unknown, code %d\n", bv.manufacturer);
						break;
					}
					DumpFeatures (bv.lmp_features);

				}

				continue;
			}

			if (wcsicmp (szCommand, L"GETPAGE") == 0) {
				int iDatum;
				int iRes;
				int ilen = sizeof(iDatum);

				iRes = getsockopt (s, SOL_RFCOMM, SO_BTH_GET_PAGE_TO, (char *)&iDatum, &ilen);
				if (iRes)
					wprintf (L"SO_BTH_GET_PAGE_TO : error %d\n", iRes);
				else
					wprintf (L"SO_BTH_GET_PAGE_TO returns 0x%08x (%d)\n", iDatum, iDatum);

				continue;
			}

			if (wcsicmp (szCommand, L"GETCOD") == 0) {
				int iDatum;
				int iRes;
				int ilen = sizeof(iDatum);

				iRes = getsockopt (s, SOL_RFCOMM, SO_BTH_GET_COD, (char *)&iDatum, &ilen);
				if (iRes)
					wprintf (L"SO_BTH_GET_COD : error %d\n", iRes);
				else
					wprintf (L"SO_BTH_GET_COD returns 0x%08x (%d)\n", iDatum, iDatum);

				continue;
			}

			if (wcsicmp (szCommand, L"GETSCAN") == 0) {
				int iDatum;
				int iRes;
				int ilen = sizeof(iDatum);

				iRes = getsockopt (s, SOL_RFCOMM, SO_BTH_GET_SCAN, (char *)&iDatum, &ilen);
				if (iRes)
					wprintf (L"SO_BTH_GET_SCAN : error %d\n", iRes);
				else
					wprintf (L"SO_BTH_GET_SCAN returns 0x%08x (%d)\n", iDatum, iDatum);

				continue;
			}

			if (wcsicmp (szCommand, L"GETAUTH") == 0) {
				int iDatum;
				int iRes;
				int ilen = sizeof(iDatum);

				iRes = getsockopt (s, SOL_RFCOMM, SO_BTH_GET_AUTHN_ENABLE, (char *)&iDatum, &ilen);
				if (iRes)
					wprintf (L"SO_BTH_GET_AUTHN_ENABLE : error %d\n", iRes);
				else
					wprintf (L"SO_BTH_GET_AUTHN_ENABLE returns 0x%08x (%d)\n", iDatum, iDatum);

				continue;
			}

			if (wcsnicmp (szCommand, L"SETSCAN ", 8) == 0) {
				int iDatum = 0;
				int iRes;
				int ilen = sizeof(iDatum);

				WCHAR *p = szCommand + 8;

				if (! GetUx (&p, &iDatum, 2)) {
					wprintf (L"Syntax: expected hex number, 0xhh\n");
					continue;
				}

				iRes = setsockopt (s, SOL_RFCOMM, SO_BTH_SET_SCAN, (char *)&iDatum, ilen);
				if (iRes)
					wprintf (L"SO_BTH_SET_SCAN : error %d\n", iRes);

				continue;
			}

			if (wcsnicmp (szCommand, L"SETAUTH ", 8) == 0) {
				int iDatum = 0;
				int iRes;
				int ilen = sizeof(iDatum);

				WCHAR *p = szCommand + 8;

				if (! GetUx (&p, &iDatum, 2)) {
					wprintf (L"Syntax: expected hex number, 0xhh\n");
					continue;
				}

				iRes = setsockopt (s, SOL_RFCOMM, SO_BTH_SET_AUTHN_ENABLE, (char *)&iDatum, ilen);
				if (iRes)
					wprintf (L"SO_BTH_SET_AUTHN_ENABLE : error %d\n", iRes);

				continue;
			}

			if (wcsnicmp (szCommand, L"SETPAGE ", 8) == 0) {
				int iDatum = 0;
				int iRes;
				int ilen = sizeof(iDatum);

				WCHAR *p = szCommand + 8;

				if (! GetUx (&p, &iDatum, 4)) {
					wprintf (L"Syntax: expected hex number, 0xhhhh\n");
					continue;
				}

				iRes = setsockopt (s, SOL_RFCOMM, SO_BTH_SET_PAGE_TO, (char *)&iDatum, ilen);
				if (iRes)
					wprintf (L"SO_BTH_SET_PAGE_TO : error %d\n", iRes);

				continue;
			}

			if (wcsnicmp (szCommand, L"SETCOD ", 7) == 0) {
				int iDatum = 0;
				int iRes;
				int ilen = sizeof(iDatum);

				WCHAR *p = szCommand + 7;

				if (! GetUx (&p, &iDatum, 8)) {
					wprintf (L"Syntax: expected hex number, 0xhhhhhh\n");
					continue;
				}

				iRes = setsockopt (s, SOL_RFCOMM, SO_BTH_SET_COD, (char *)&iDatum, ilen);
				if (iRes)
					wprintf (L"SO_BTH_SET_COD : error %d\n", iRes);

				continue;
			}

			if (wcsnicmp (szCommand, L"GETNAME ", 8) == 0) {

				WCHAR *p = szCommand + 8;

				BTH_REMOTE_NAME r;

				if (! GetBA (&p, &r.bt)) {
					wprintf (L"Syntax: expected bluetooth address\n");
					continue;
				}

				int ilen = sizeof(r);
				int iRes = setsockopt (s, SOL_RFCOMM, SO_BTH_SET_READ_REMOTE_NAME, (char *)&r, ilen);

				if (iRes)
					wprintf (L"SO_BTH_SET_READ_REMOTE_NAME : error %d\n", iRes);
				else
					wprintf (L"Name: %s\n", r.szNameBuffer);

				continue;
			}

		}

		closesocket (s);
		return 0;
	}

	if ((argc >= 4) && (wcsicmp (argv[1], L"client") == 0) && GetBA(&arg2, &b)) {
		SOCKET s = socket (AF_BT, SOCK_STREAM, BTHPROTO_RFCOMM);
		if (s == INVALID_SOCKET) {
			wprintf (L"socket failed, error %d\n", WSAGetLastError ());
			return 0;
		}

		if (! ProcessSockOpts (s, argv + 4, argc - 4)) {
			closesocket(s);
			return 0;
		}

		SOCKADDR_BTH sa;
		memset (&sa, 0, sizeof(sa));

		sa.addressFamily = AF_BT;

		sa.btAddr = b;

		if (! GetDI(&arg3, &channel)) {
			wprintf(L"Invalid format for Channel specified\n");
			closesocket(s);

			return 0;
		}

		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))) {
			wprintf (L"Connect failed, error = %d\n", WSAGetLastError ());
			return 0;
		}

		SOCKADDR_BTH sa3;
		int 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 (0 == 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);
		}

		wprintf (L"Established connection with %04x%08x 0x%02x\n", GET_NAP(b), GET_SAP(b), channel & 0xff);
		CloseHandle (CreateThread(NULL, 0, ReadThread, (LPVOID)s, 0, NULL));
		WriteThread ((LPVOID)s);
	} else if ((argc >= 3) && (wcsicmp (argv[1], L"server") == 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;

		if (! GetDI (&arg2, &channel)) {
			wprintf(L"Invalid format for Channel specified\n");
			closesocket(s);

			return 0;
		}

		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 ());
			closesocket(s);
			return 0;
		}

		int namelen = sizeof(sa);
		if (getsockname(s, (SOCKADDR *)&sa, &namelen))	{
			wprintf(L"getsockname failed, error = %d\n", WSAGetLastError());
			closesocket(s);
			return 0;
		}
			
		if (! ProcessSockOpts (s, argv + 3, argc - 3)) {
			closesocket(s);
			return 0;
		}

		wprintf (L"localhost<%04x%08x> listening on port %d(0x%x)...\n", GET_NAP(sa.btAddr), GET_SAP(sa.btAddr), sa.port, sa.port);

		if (listen (s, 5)) {
			wprintf (L"Listen failed, error = %d\n", WSAGetLastError ());
			return 0;
		}


		for ( ; ; ) {
			SOCKADDR_BTH sa2;
			int size = sizeof(sa2);

			wprintf (L"Accepting...\n");

			SOCKET s2 = accept (s, (SOCKADDR *)&sa2, &size);

			if (s2 == INVALID_SOCKET) {
				wprintf (L"Accept failed, error = %d\n", WSAGetLastError ());
				break;
			}

			if (size != sizeof(sa2))
				wprintf (L"Sockaddr size is %d, not %d which was expected!\n", size, sizeof(sa2));

			BT_ADDR b2 = sa2.btAddr;
			int channel2 = sa2.port;

			SOCKADDR_BTH sa3;
			namelen = sizeof(sa3);
			if (0 == getsockname(s2, (SOCKADDR *)&sa3, &namelen))	{
				wprintf (L"Socket s2: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 (0 == getpeername(s2, (SOCKADDR *)&sa3, &namelen))	{
				wprintf (L"Socket s2:peername<%04x%08x> connecting on port %d(0x%x)...\n", GET_NAP(sa3.btAddr), GET_SAP(sa3.btAddr), sa3.port, sa3.port);
			}
		

			wprintf (L"Connection accepted. Family %d Address %04x%08x Channel 0x%02x\n", sa2.addressFamily, GET_NAP(b2), GET_SAP(b2), channel2);
			CloseHandle (CreateThread(NULL, 0, ReadThread, (LPVOID)s2, 0, NULL));
			CloseHandle (CreateThread(NULL, 0, WriteThread, (LPVOID)s2, 0, NULL));
		}
	} else {
		wprintf (L"Usage: %s {server | client <target bt_addr>} channel {AUTH} {ENCRYPT}\n", argv[0]);
		wprintf (L"\t\t{MTU dec. number} {MTUMIN dec. number} {MTUMAX dec. number}\n");
		wprintf (L"\t\t{XON dec. number} {XOFF dec. number}\n");
		wprintf (L"\t\t{SENDBUFF dec. number} {RECVBUFF dec. number}\n");
		wprintf (L"Or: %s manage\n", argv[0]);
		return 1;
	}

	return 0;
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -