рдЬреАрд╡рди рдпрд╛ рдЖрд▓рд╕реНрдп рдХреЗ рд▓рд┐рдП рд░рд┐рдореЛрдЯ рдХрдВрдЯреНрд░реЛрд▓ рдХреЗ рд╕рд╛рде - рдкреНрд░рдЧрддрд┐ рдХрд╛ рдЗрдВрдЬрди

рдЫрд╡рд┐

рдзреНрдпрд╛рди рдЖрдХрд░реНрд╖рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рддрд╕реНрд╡реАрд░, рд╡рд╛рд╕реНрддрд╡рд┐рдХ рдЬреАрд╡рди рд╕реЗ рд╕рдорд╛рдирддрд╛ рджреВрд░ рд╣реИ



рдореИрдВ рдПрдХ рдФрд░ рд▓реЗрдЦ рд▓рд┐рдЦреВрдВрдЧрд╛ред рдкрд╣рд▓реЗ рд╕реЗ рдЙрд▓реНрд▓реЗрдЦ рдХрд┐рдП рдЧрдП рдлрд╝реЛрд▓реНрдбрд░ "рдкреНрд░реЛрдЬреЗрдХреНрдЯреНрд╕ / 4 рдлрд╝рди" рд╕реЗ рдЖрдкрдХреА рдПрдХ рдкрд░рд┐рдпреЛрдЬрдирд╛ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВред рдпрд╣ рдкрд░рд┐рдпреЛрдЬрдирд╛ 4Fun рдХреЗ рд░реВрдк рдореЗрдВ рд╢реБрд░реВ рд╣реБрдИ, рдФрд░ 4Use рдХреЗ рд░реВрдк рдореЗрдВ рд╕рдорд╛рдкреНрдд рд╣реБрдИред рдпрд╣реА рд╣реИ, рдпрд╣ рд╕рдордп-рд╕рдордп рдкрд░ рдЖрдЬ рддрдХ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рдФрд░ рдРрд╕рд╛ рдерд╛ ...







рд╕рдорд╕реНрдпрд╛ рдПрдХ



рд╣рдо рд╕рднреА рдХреЛ рддреЗрд▓реА рджреЗрдЦрдирд╛ рдмрд╣реБрдд рдкрд╕рдВрдж рд╣реИред рд╡реИрд╕реЗ рддреЛ рд▓рдЧрднрдЧ рд╕рднреА рдХреЛ рдкреНрдпрд╛рд░ рд╣реЛрддрд╛ рд╣реИред рдореИрдВ рдХреЛрдИ рдЕрдкрд╡рд╛рдж рдирд╣реАрдВ рд╣реВрдВред рд▓реЗрдХрд┐рди рдПрдХ рддреЗрд▓реА рдХреЛ рджреЗрдЦрдиреЗ рдХреЗ рд▓рд┐рдП, рдЖрдкрдХреЗ рдкрд╛рд╕ рдпрд╣ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдПред рд▓реЗрдХрд┐рди рдореБрдЭреЗ рдЗрд╕рд╕реЗ рдХреБрдЫ рд╕рдорд╕реНрдпрд╛рдПрдВ рдереАрдВред рдореЗрд░реЗ рдкрд╛рд╕ рдпрд╣ (рддреЗрд▓реА) рдирд╣реАрдВ рд╣реИред рдФрд░ рд╡рд╣ рд╡рд╣рд╛рдВ рдирд╣реАрдВ рдерд╛ рдХреНрдпреЛрдВрдХрд┐ рдЖрдорддреМрд░ рдкрд░ рдЯреЗрд▓реА рдХрд┐рд░рд╛рдП рдХреЗ рдЕрдкрд╛рд░реНрдЯрдореЗрдВрдЯ рд╕реЗ рдЬреБрдбрд╝реА рд╣реЛрддреА рдереА рдЬрд┐рд╕рдореЗрдВ рдореИрдВ рд░рд╣рддрд╛ рдерд╛ред рд▓реЗрдХрд┐рди рддрдм рдореИрдВ рдЯреАрд╡реА рдХреЗ рдмрд┐рдирд╛ рдПрдХ рдЕрдкрд╛рд░реНрдЯрдореЗрдВрдЯ рдореЗрдВ рдЖрдпрд╛ рдерд╛ред рдФрд░ рдЗрд╕ рд╕рдорд╕реНрдпрд╛ рдХреЛ рдХрд┐рд╕реА рддрд░рд╣ рд╣рд▓ рдХрд░рдирд╛ рдкрдбрд╝рд╛ред



рдирд┐рд░реНрдгрдп рдПрдХ



рдЕрдкрдиреЗ рдЬреАрд╡рди рдореЗрдВ рдПрдХ рдкрд░реНрдпрд╛рдкреНрдд рдкреНрдпрд╛рд╕рд╛ рд╡реНрдпрдХреНрддрд┐ рд╣реЛрдиреЗ рдХреЗ рдирд╛рддреЗ, рдореИрдВрдиреЗ рдПрдХ рдЯреИрд▓реА рдирд╣реАрдВ рдЦрд░реАрджрдиреЗ рдХрд╛ рдлреИрд╕рд▓рд╛ рдХрд┐рдпрд╛, рд▓реЗрдХрд┐рди рдПрдХ рдЯреАрд╡реА рдЯреНрдпреВрдирд░ - рдпрд╣ рд╢рд╛рдпрдж рдкрд╣рд▓рд╛ рд╡рд┐рдЪрд╛рд░ рд╣реИ рдЬреЛ рдПрдХ рд╕рдорд╛рди рд╕реНрдерд┐рддрд┐ рдореЗрдВ рдХрдВрдкреНрдпреВрдЯрд░ рддрдХрдиреАрд╢рд┐рдпрди рдХреЗ рджрд┐рдорд╛рдЧ рдореЗрдВ рдЖрдирд╛ рдЪрд╛рд╣рд┐рдПред рд╕реЛрдЪрд╛ - рдХрд┐рдпрд╛ рд╣реБрдЖред рдореЗрд░реЗ рдПрдХ рд╕рд╛рдереА рд╕рд┐рд░реНрдл рдПрдХ рдЯреАрд╡реА рдЯреНрдпреВрдирд░ рдХреЛ рдмреЗрдЪрдирд╛ рдЪрд╛рд╣рддреЗ рдереЗред рдпрд╣рд╛рдБ рдРрд╕рд╛ рд╣реИ, рд▓рдЧрднрдЧ:

рдЫрд╡рд┐



рд╕рд╛рдорд╛рдиреНрдп рддреМрд░ рдкрд░, рдореИрдВрдиреЗ рдЗрд╕реЗ рдЦрд░реАрджрд╛ред рд╣рд╛рдБ, рдпрд╣ рдХреЗрд╡рд▓ рдерд╛ ...



рджреВрд╕рд░реА рд╕рдорд╕реНрдпрд╛



рдпрд╣ рдкрддрд╛ рдЪрд▓рд╛ рдХрд┐ рд░рд┐рдореЛрдЯ рдХрдВрдЯреНрд░реЛрд▓ рдЕрдирд┐рдпрдорд┐рдд рд░реВрдк рд╕реЗ рдЦреЛ рдЧрдпрд╛ рдерд╛ рдФрд░ рдЗрд╕реЗ рдмрд╣рд╛рд▓ рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рдерд╛ред рдФрд░ рдореИрдВ рдЪреИрдирд▓реЛрдВ рдХреЛ рд╕реНрд╡рд┐рдЪ рдХрд░рдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реВрдВ рдФрд░ рд╕реЛрдлреЗ рдкрд░ рдкрдбрд╝реА рдзреНрд╡рдирд┐ (рд╕рд╛рдзрд╛рд░рдг рдФрд░ рд╕рдордЭрдиреЗ рдпреЛрдЧреНрдп рдЦреБрд╢рд┐рдпрд╛рдБ) рдХреЛ рд╕рдорд╛рдпреЛрдЬрд┐рдд рдХрд░рдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реВрдВред рдлрд┐рд░ рдорд╕реНрддрд┐рд╖реНрдХ рд╡рд┐рднрд╛рдЧ рдЬреБрдбрд╝реЗ рд╕рдорд╛рдзрд╛рди рдЦреЛрдЬрдиреЗ рдХреЗ рд▓рд┐рдП рдЬрд┐рдореНрдореЗрджрд╛рд░ рд╣реИред рддреБрд░рдВрдд рд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗ рд╕реНрдкрд╖реНрдЯ рдерд╛ - рдПрдХ рдФрд░ рд░рд┐рдореЛрдЯ рдХрдВрдЯреНрд░реЛрд▓ рдЦреЛрдЬрдиреЗ рдХреЗ рд▓рд┐рдП рдФрд░ рдХрд┐рд╕реА рддрд░рд╣ рдЯреНрдпреВрдирд░ рдХреЗ рд╕рд╛рде рджреЛрд╕реНрдд рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдПред рд▓реЗрдХрд┐рди рдпрд╣ рдлрд┐рдЯ рдирд╣реАрдВ рдерд╛, рдХреНрдпреЛрдВрдХрд┐ рджреЗрд╢реА рд░рд┐рдореЛрдЯ рдХрдВрдЯреНрд░реЛрд▓ рдХреЗ рд╕рд╛рде, рд╕рд┐рдЧреНрдирд▓ рд░рд┐рд╕реАрд╡рд░ рдЦреЛ рдЧрдпрд╛ рдерд╛ (рдРрд╕рд╛ рд▓рдЧрддрд╛ рд╣реИ, рдпрд╣ рдмрд╣реБрдд рд╕рдордп рдкрд╣рд▓реЗ рдерд╛)ред рдареАрдХ рд╣реИ, рдХрд┐рд╕реА рддрд░рд╣ рдпрд╣ рдкреНрд░реЛрдЧреНрд░рд╛рдорд░ рдпрд╛ рдХреБрдЫ рдореЗрдВ рдирд╣реАрдВ рд╣реИ - "рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдЕрдкрдирд╛ рд░рд╛рд╕реНрддрд╛ рд╣реИ" (рдЧ)ред рдЗрд╕рд▓рд┐рдП, рдпрд╣ рднреАрдЦ рдорд╛рдБрдЧрддрд╛ рд╣реИ ...



рджреВрд╕рд░рд╛ рдлреИрд╕рд▓рд╛



рдЯреАрд╡реА рджреЗрдЦрдиреЗ рдХреЗ рд▓рд┐рдП, рдореИрдВ рдЕрдкрдиреЗ рдореВрд▓ рдЯреНрдпреВрдирд░ рдРрдк рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реВрдВ - рдмреАрд╣реЛрд▓реНрдбрдЯреАрд╡реАред рдЖрдк рдКрдкрд░ рдФрд░ рдиреАрдЪреЗ рдХреБрдВрдЬрд┐рдпреЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдЗрд╕рдореЗрдВ рдЪреИрдирд▓ рд╕реНрд╡рд┐рдЪ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рдзреНрд╡рдирд┐ рдХреЛ рджрд╛рдИрдВ / рдмрд╛рдИрдВ рдУрд░ рд╕рдорд╛рдпреЛрдЬрд┐рдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рдЖрджрд┐ред рдЗрд╕рд▓рд┐рдП, рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рд╕реЛрдЪрд╛ рдЧрдпрд╛ рдерд╛: рдХрдВрдкреНрдпреВрдЯрд░ рдкрд░ рдПрдХ рд╕рд░реНрд╡рд░ рд▓рд┐рдЦреЗрдВ рдЬреЛ рдХрд┐рд╕реНрдЯреНрд░реЛрдХреНрд╕ рдХрд╛ рдЕрдиреБрдХрд░рдг рдХрд░реЗрдЧрд╛, рдФрд░ рдореЛрдмрд╛рдЗрд▓ рдкрд░ рдХреНрд▓рд╛рдЗрдВрдЯ рд╕рд░реНрд╡рд░ рдХреА рдЖрд╡рд╢реНрдпрдХ рдХреБрдВрдЬреА рдХреЗ рдХреЛрдб рднреЗрдЬ рджреЗрдЧрд╛, рдФрд░ рд╕рдм рдХреБрдЫ рдареАрдХ рд╣реЛ рдЬрд╛рдПрдЧрд╛ред рддреЛ рдЕрдВрдд рдореЗрдВ рдпрд╣ (рдЕрдЪреНрдЫрд╛) рдирд┐рдХрд▓рд╛ред



рд╕рд░реНрд╡рд░ рдХреЛ Windows рдХреЗ рддрд╣рдд C ++ рдФрд░ WinAPI рдореЗрдВ рд▓рд┐рдЦрд╛ рдЧрдпрд╛ рдерд╛ред рдпрд╣ рд╕рд░рд▓ рд╣реИ: рд╣рдо "рдореИрдВ рдЯреАрд╡реА рд╕реЗрдЯ рдХреЛ рдирд┐рдпрдВрддреНрд░рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рд╕рд░реНрд╡рд░ рд╣реВрдВ" рдлреЙрд░реНрдо рдХреЗ рдпреВрдбреАрдкреА рд╕рдВрджреЗрд╢реЛрдВ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдкреНрд░рд╕рд╛рд░рдг рдХреЗ рд▓рд┐рдП рдзрд╛рд░рд╛ рд╢реБрд░реВ рдХрд░рддрд╛ рд╣реВрдВ рдФрд░ рдЧреНрд░рд╛рд╣рдХреЛрдВ рдХреЛ рдХрдиреЗрдХреНрдЯ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдкреНрд░рддреАрдХреНрд╖рд╛ рдХрд░рддрд╛ рд╣реВрдВред рдЗрд╕рд▓рд┐рдП рдХреЛрдИ рднреА рдХреНрд▓рд╛рдЗрдВрдЯ рд╕рд░реНрд╡рд░ рдХреА рд▓реЛрдХреЗрд╢рди рдХрд╛ рдкрддрд╛ рд▓рдЧрд╛ рд╕рдХреЗрдЧрд╛, рдФрд░ рдХрд┐рд╕реА рд╣рд╛рд░реНрдбрдХреЛрдб рдЖрдИрдкреА рдХреА рдЬрд░реВрд░рдд рдирд╣реАрдВ рд╣реЛрдЧреАред рдФрд░ рдЗрд╕рд▓рд┐рдП рдпрд╣ рд╕рд╣реА рд╣реИ (рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ)ред

рдХреНрд▓рд╛рдЗрдВрдЯ рдХрдиреЗрдХреНрдЯ рд╣реЛрддрд╛ рд╣реИ, рд╕рд░реНрд╡рд░ рдЖрдиреЗ рд╡рд╛рд▓реА рдХрдорд╛рдВрдб рдХреЛ рд╕реБрдирдирд╛ рд╢реБрд░реВ рдХрд░ рджреЗрддрд╛ рд╣реИред рдЬреИрд╕реЗ рд╣реА рдореИрдВрдиреЗ рдХреБрдЫ рд╕реБрдирд╛, рдпрд╣ рдПрдХ рдХреАрд╕реНрдЯреНрд░реЛрдХ рдХрд╛ рдЕрдиреБрдХрд░рдг рдХрд░рддрд╛ рд╣реИред рд╕рдм рдХреБрдЫ рд╕рд░рд▓ рд╣реИ рдФрд░ рдПрдХ рдлрд╛рдЗрд▓ рдореЗрдВ рдлрд┐рдЯ рдмреИрдарддрд╛ рд╣реИ:

рд╕рд░реНрд╡рд░ рдХреЛрдб
// Roco.cpp : Defines the entry point for the console application. // #include "stdafx.h" #include <winsock2.h> #pragma comment(lib, "Ws2_32.lib") void broadcastThreadFunction(void *context) { const SOCKET *broadcastSocket = (SOCKET*)context; sockaddr_in broadcastSocketServiceInfo; ZeroMemory(&broadcastSocketServiceInfo, sizeof(broadcastSocketServiceInfo)); broadcastSocketServiceInfo.sin_family = AF_INET; broadcastSocketServiceInfo.sin_addr.s_addr = htonl(INADDR_BROADCAST); broadcastSocketServiceInfo.sin_port = htons(28777); static const char broadcastMessage[] = "ROCO-BROADCAST-MESSAGE"; do { const int result = sendto(*broadcastSocket, broadcastMessage, sizeof(broadcastMessage), 0, (SOCKADDR*)&broadcastSocketServiceInfo, sizeof(broadcastSocketServiceInfo)); if (result == SOCKET_ERROR && ::WSAGetLastError() == WSAENOTSOCK) { break; } ::Sleep(300); } while (true); _endthread(); } int _tmain(int argc, _TCHAR* argv[]) { if (argc >= 2 && _tcscmp(argv[1], _T("/silent")) == 0) { ::ShowWindow(::GetConsoleWindow(), SW_HIDE); } WSADATA wsaData; ZeroMemory(&wsaData, sizeof(wsaData)); printf("Initializing network... "); int result = ::WSAStartup(MAKEWORD(2,2), &wsaData); if (result == NO_ERROR) { printf("Done.\n"); printf("Creating broadcast socket... "); const SOCKET broadcastSocket = socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP); if (broadcastSocket != INVALID_SOCKET) { printf("Done.\n"); static const BOOL onValue = TRUE; setsockopt(broadcastSocket, SOL_SOCKET, SO_BROADCAST, (const char*)&onValue, sizeof(onValue)); printf("Starting broadcast thread... "); HANDLE broadcastThreadHandle =(HANDLE)_beginthread(broadcastThreadFunction, 0, (void*)&broadcastSocket); if (broadcastThreadHandle != INVALID_HANDLE_VALUE) { printf("Done.\n"); printf("Creating listen socket... "); const SOCKET listenSocket = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP); if (listenSocket != INVALID_SOCKET) { printf("Done.\n"); printf("Binding listen socket... "); sockaddr_in listenSocketServiceInfo; ZeroMemory(&listenSocketServiceInfo, sizeof(listenSocketServiceInfo)); listenSocketServiceInfo.sin_family = AF_INET; listenSocketServiceInfo.sin_addr.s_addr = htonl(INADDR_ANY); listenSocketServiceInfo.sin_port = htons(28666); result = bind(listenSocket, (SOCKADDR*)&listenSocketServiceInfo, sizeof(listenSocketServiceInfo)); if (result != SOCKET_ERROR) { printf("Done.\n"); printf("Listening for incoming connection... "); result = listen(listenSocket, SOMAXCONN); if (result != SOCKET_ERROR) { printf("Done.\n"); unsigned connectionIndex = 0; do { printf("Accepting incoming connection #%d... ", connectionIndex + 1); ::ResumeThread(broadcastThreadHandle); SOCKET commandSocket = accept(listenSocket, NULL, NULL); if (commandSocket != INVALID_SOCKET) { printf("Done.\n"); ::SuspendThread(broadcastThreadHandle); printf("Sending PING to command socket... "); static const char ping[] = "PING"; result = send(commandSocket, ping, sizeof(ping), 0); if (result != SOCKET_ERROR && result == sizeof(ping)) { printf("Done.\n"); printf("Receiving PONG from command socket... "); static char pong[sizeof("PONG")]; pong[0] = '\0'; result = recv(commandSocket, pong, sizeof(pong), 0); if (result != SOCKET_ERROR && result == sizeof(pong) && strcmp(pong, "PONG") == 0) { printf("Done.\n"); unsigned commandIndex = 0; do { printf("Waiting for command #%d...\n", commandIndex + 1); static char command[2]; ZeroMemory(command, sizeof(command)); result = recv(commandSocket, command, sizeof(command), 0); if (result != SOCKET_ERROR && result == sizeof(command)) { enum { CC_KEY_DOWM = 1, CC_KEY_UP = 0 }; const char commandCode = command[0]; const char keyCode = command[1]; static const char res = 1; switch (commandCode) { case CC_KEY_DOWM: { printf("KEY_DOWN(%d)\n", keyCode); keybd_event(keyCode, 0, 0, 0); send(commandSocket, &res, sizeof(res), 0); } break; case CC_KEY_UP: { printf("KEY_UP(%d)\n", keyCode); keybd_event(keyCode, 0, KEYEVENTF_KEYUP, 0); send(commandSocket, &res, sizeof(res), 0); } break; default: { printf("Invalid command received - %d!\n", commandCode); } break; } } else { printf("Could not receive command from socket (error - %d)!\n", ::WSAGetLastError()); break; } ++commandIndex; } while (true); } else { printf("\nCould not receive PONG from command socket (error - %d)!\n", ::WSAGetLastError()); } } else { printf("\nCould not sent PING to command socket (error - %d)!\n", ::WSAGetLastError()); } } else { printf("\nCould not accept incoming connection (error - %d)!\n", ::WSAGetLastError()); } ++connectionIndex; } while (true); } else { printf("\nCould not listen for incoming connection (error - %d)!\n", ::WSAGetLastError()); } } else { printf("\nCould not bind listen socket (error - %d)!\n", ::WSAGetLastError()); } closesocket(listenSocket); } else { printf("\nCould not create listen socket (error - %d)!\n", ::WSAGetLastError()); } } else { printf("\nCould not start broadcast thread!\n"); } ::ResumeThread(broadcastThreadHandle); closesocket(broadcastSocket); ::WaitForSingleObject(broadcastThreadHandle, INFINITE); } else { printf("\nCould not create broadcast socket (error - %d)!\n", ::WSAGetLastError()); } ::WSACleanup(); } else { printf("\nWSAStartup failed (error - %d)!", result); } return 0; }
      
      









рд╕рд░реНрд╡рд░ рдкреНрд░рдореБрдЦ рдХреЗ рд╕рд╛рде рд╢реБрд░реВ рд╣реЛрддрд╛ рд╣реИред рд╕рд░реНрд╡рд░ рдПрдХ рдХрдВрд╕реЛрд▓ рдЙрдкрдпреЛрдЧрд┐рддрд╛ рд╣реИ (рд▓реЙрдЧ рджреЗрдЦрдиреЗ рдХреЗ рд▓рд┐рдП рд╕реБрд╡рд┐рдзрд╛рдЬрдирдХ, рдпрджрд┐ рд╡рд╣ рд╣реИ), рддреЛ рд▓реЙрдиреНрдЪ рдХреЗ рдареАрдХ рдмрд╛рдж рдЗрд╕ рд▓рд╛рдЗрди рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ:

 ::ShowWindow(::GetConsoleWindow(), SW_HIDE);
      
      







рдореЗрд░реЗ рдкрд╛рд╕ рдПрдВрдбреНрд░реЙрдЗрдб рдкрд░ рдПрдХ рдореЛрдмрд╛рдЗрд▓ рд╣реИ, рдЗрд╕рд▓рд┐рдП рдХреНрд▓рд╛рдЗрдВрдЯ рдиреЗ рдЬрд╛рд╡рд╛ рдкрд░ рдореВрд▓ рд▓рд┐рдЦрд╛ рд╣реИред рдкрд░рд┐рдгрд╛рдо рдПрдХ рдРрд╕рд╛ рд╕реБрдкрд░-рдореЗрдЧрд╛ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рд╣реИ:





рдХреНрд▓рд╛рдЗрдВрдЯ рд╕реНрд░реЛрдд рднреА рдХрд╛рдлреА рд╕рд░рд▓ рд╣реИред рд╣рдо рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдХреЛ рдкреНрд░реЛрдЧреНрд░рд╛рдореЗрдЯрд┐рдХ рд░реВрдк рд╕реЗ рдЬреЗрдирд░реЗрдЯ рдХрд░рддреЗ рд╣реИрдВ, рдкреНрд░рддреНрдпреЗрдХ рдмрдЯрди рдХреЗ рд▓рд┐рдП рд╕рд░реНрд╡рд░ рдкрд░ рдХреБрдВрдЬреА рдХреЛрдб рднреЗрдЬрддреЗ рд╣реИрдВред рдХреНрд▓рд╛рдЗрдВрдЯ рд╢реБрд░реВ рдХрд░рддреЗ рд╕рдордп, рд╣рдо рд╕рд░реНрд╡рд░ рдХреЗ рд╕реНрдерд╛рди рдХреА рддрд▓рд╛рд╢ рдХрд░рддреЗ рд╣реИрдВ, рдХрдиреЗрдХреНрдЯ рдХрд░рддреЗ рд╣реИрдВред рдпрд╣ рдЗрд╕ рддрд░рд╣ рджрд┐рдЦрддрд╛ рд╣реИ:

рдЧреНрд░рд╛рд╣рдХ рдХреЛрдб
 package com.dummy.roco; import java.net.DatagramPacket; import java.net.DatagramSocket; import java.net.InetSocketAddress; import java.net.Socket; import java.util.Timer; import java.util.TimerTask; import android.net.wifi.WifiManager; import android.net.wifi.WifiManager.MulticastLock; import android.os.Bundle; import android.os.StrictMode; import android.os.Vibrator; import android.app.Activity; import android.app.AlertDialog; import android.content.Context; import android.content.DialogInterface; import android.view.KeyEvent; import android.view.MotionEvent; import android.view.View; import android.view.ViewGroup.LayoutParams; import android.widget.Button; import android.widget.LinearLayout; public class RemoteControlActivity extends Activity { protected static class ButtonInfo { public final String text_; public final int code_; public ButtonInfo(final String text, final int code) { text_ = text; if (code != 0) { code_ = code; } else { code_ = text.codePointAt(0); } } } protected static class CommandButton extends Button { protected ButtonInfo buttonInfo_; protected Socket commandSocket_; protected Vibrator vibrator_; protected Timer commandTimer_; protected final int COMMAND_DELAY = 200; public CommandButton(final Context context, final ButtonInfo buttonInfo, final Socket commandSocket, final Vibrator vibrator) { super(context); buttonInfo_ = buttonInfo; commandSocket_ = commandSocket; vibrator_ = vibrator; setText(buttonInfo_.text_); setTextSize(getTextSize()); setOnTouchListener(new OnTouchListener() { @Override public boolean onTouch(View v, MotionEvent event) { switch (event.getAction()) { case MotionEvent.ACTION_DOWN: startCommandTimer(); break; case MotionEvent.ACTION_UP: stopCommandTimer(); break; } return false; } }); } protected void sendCommand(final int commandCode, final int buttonCode) { final byte command[] = { (byte) commandCode, (byte) buttonCode }; try { commandSocket_.getOutputStream().write(command); } catch (Exception exception) { exception.printStackTrace(); } } public void startCommandTimer() { vibrator_.vibrate(10); sendCommand(CC_KEY_DOWM, buttonInfo_.code_); commandTimer_ = new Timer(); commandTimer_.schedule(new TimerTask() { @Override public void run() { sendCommand(CC_KEY_DOWM, buttonInfo_.code_); } }, COMMAND_DELAY, COMMAND_DELAY); } public void stopCommandTimer() { commandTimer_.cancel(); commandTimer_.purge(); commandTimer_ = null; sendCommand(CC_KEY_UP, buttonInfo_.code_); vibrator_.vibrate(10); } } protected static final ButtonInfo buttonInfos_[][] = { { new ButtonInfo("1", 0), new ButtonInfo("2", 0), new ButtonInfo("3", 0) }, { new ButtonInfo("4", 0), new ButtonInfo("5", 0), new ButtonInfo("6", 0) }, { new ButtonInfo("7", 0), new ButtonInfo("8", 0), new ButtonInfo("9", 0) }, { new ButtonInfo("┬╛", 8), new ButtonInfo("тЖС", 38), new ButtonInfo("┬д", 77) }, { new ButtonInfo("тЖР", 37), new ButtonInfo("┬о", 13), new ButtonInfo("тЖТ", 39) }, { new ButtonInfo("┬з", 32), new ButtonInfo("тЖУ", 40), new ButtonInfo("┬л", 27) } }; protected static final int CC_KEY_DOWM = 1; protected static final int CC_KEY_UP = 0; protected final Socket commandSocket_ = new Socket(); protected Vibrator vibrator_; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); vibrator_ = (Vibrator) getSystemService(VIBRATOR_SERVICE); final LinearLayout mainLayout = new LinearLayout(this); mainLayout.setOrientation(LinearLayout.VERTICAL); for (int i = 0; i < buttonInfos_.length; ++i) { final LinearLayout rowLayout = new LinearLayout(this); rowLayout.setOrientation(LinearLayout.HORIZONTAL); for (int j = 0; j < buttonInfos_[i].length; ++j) { final CommandButton button = new CommandButton(this, buttonInfos_[i][j], commandSocket_, vibrator_); final LinearLayout.LayoutParams layoutParams = new LinearLayout.LayoutParams( LayoutParams.MATCH_PARENT, LayoutParams.MATCH_PARENT); layoutParams.weight = 1.0f; rowLayout.addView(button, layoutParams); } final LinearLayout.LayoutParams layoutParams = new LinearLayout.LayoutParams( LayoutParams.MATCH_PARENT, LayoutParams.MATCH_PARENT); layoutParams.weight = 1.0f; mainLayout.addView(rowLayout, layoutParams); } setContentView(mainLayout, new LayoutParams(LayoutParams.MATCH_PARENT, LayoutParams.MATCH_PARENT)); MulticastLock multicastLock = null; DatagramSocket broadcastSocket = null; try { StrictMode.setThreadPolicy(new StrictMode.ThreadPolicy.Builder() .permitAll().build()); final WifiManager wifiManager = (WifiManager) getSystemService(Context.WIFI_SERVICE); if (wifiManager != null) { multicastLock = wifiManager .createMulticastLock("ROCO-MulticastLock"); } if (multicastLock != null) { multicastLock.acquire(); } broadcastSocket = new DatagramSocket(28777); broadcastSocket.setBroadcast(true); broadcastSocket.setSoTimeout(1000); final byte[] datagramPacketData = new byte["ROCO-BROADCAST-MESSAGE\0" .length()]; final DatagramPacket datagramPacket = new DatagramPacket( datagramPacketData, datagramPacketData.length); broadcastSocket.receive(datagramPacket); if (new String(datagramPacketData) .compareTo("ROCO-BROADCAST-MESSAGE\0") != 0) { throw new Exception("Could not get ROCO server address!"); } commandSocket_.setSoTimeout(500); commandSocket_.connect(new InetSocketAddress(datagramPacket .getAddress().getHostAddress(), 28666), commandSocket_ .getSoTimeout()); final byte ping[] = new byte["PING\0".length()]; commandSocket_.getInputStream().read(ping); if (new String(ping).compareTo("PING\0") != 0) { throw new Exception( "Could not receive PING from command socket!"); } commandSocket_.getOutputStream().write( new String("PONG\0").getBytes()); } catch (Exception exception) { final AlertDialog alertDialog = new AlertDialog.Builder(this) .create(); alertDialog.setCancelable(false); alertDialog.setTitle("Roco: Error"); alertDialog .setMessage("Could not connect to the server!\nError - '" + exception.toString() + "'\n\nExiting..."); alertDialog.setButton(AlertDialog.BUTTON_POSITIVE, "OK", new DialogInterface.OnClickListener() { @Override public void onClick(DialogInterface dialog, int which) { dialog.dismiss(); finish(); } }); alertDialog.show(); } finally { if (broadcastSocket != null) { broadcastSocket.close(); } if (multicastLock != null && multicastLock.isHeld()) { multicastLock.release(); } } } @Override protected void onDestroy() { try { commandSocket_.close(); } catch (Exception exception) { exception.printStackTrace(); } super.onDestroy(); } @Override public boolean onKeyDown(int keyCode, KeyEvent event) { if ((keyCode == KeyEvent.KEYCODE_BACK)) { finish(); } return super.onKeyDown(keyCode, event); } }
      
      









рдкрд░рд┐рдпреЛрдЬрдирд╛ рдмрд╣реБрдд рдкрд╣рд▓реЗ рд▓рд┐рдЦреА рдЧрдИ рдереА, рдФрд░ рд╡реНрдпрд╛рд╡рд╕рд╛рдпрд┐рдХрддрд╛ рдЕрднреА рднреА рдЦрдбрд╝рд╛ рдирд╣реАрдВ рд╣реИред рдЕрдм, рд╢рд╛рдпрдж, рдореИрдВ рд╕рдм рдХреБрдЫ рдЗрддрдирд╛ рдЕрдирд╛рдбрд╝реА рдирд╣реАрдВ рд▓рд┐рдЦреВрдВрдЧрд╛ (рд╢рд╛рдпрдж рдЖрдзрд┐рдХрд╛рд░рд┐рдХ рдПрдкреАрдЖрдИ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ, рдЬрд┐рд╕реЗ рдореИрдВрдиреЗ рдкрд░рд┐рдпреЛрдЬрдирд╛ рд▓рд┐рдЦрдиреЗ рдХреЗ рдмрд╛рдж рд╕реАрдЦрд╛)ред рдлрд┐рд░ рднреА, рд╕рдм рдХреБрдЫ stably рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ рдФрд░ рд╕рдордп-рд╕рдордп рдкрд░ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред



рдПрдХ рджрд┐рд▓рдЪрд╕реНрдк рд╕рд╛рдЗрдб рдЗрдлреЗрдХреНрдЯ рд╣реИ - рдпрджрд┐ рдЖрдк рдЯреИрд▓реА рдирд╣реАрдВ рджреЗрдЦрддреЗ рд╣реИрдВ, рд▓реЗрдХрд┐рди, рдХрд╣рддреЗ рд╣реИрдВ, YouTube, рддреЛ рдЦрд┐рд▓рд╛рдбрд╝реА рдХреЛ рд░реЛрдХрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред рдФрд░ рдард╣рд░рд╛рд╡ рднреАред



рд╕рд╛рдорд╛рдиреНрдп рддреМрд░ рдкрд░, рдпрд╣ рд╢рд╛рдВрдд, рдЙрдкрдпреЛрдЧреА, рд╕рд╕реНрддрд╛ рдФрд░ рд╣рдВрд╕рдореБрдЦ рдирд┐рдХрд▓рд╛ред



рдкреНрд░реЛрдЬреЗрдХреНрдЯ рдХреЛ рд░реЛрдХреЛ рдХрд╣рд╛ рдЬрд╛рддрд╛ рд╣реИред рдХреМрди рдЕрдиреБрдорд╛рди рд▓рдЧрд╛рддрд╛ рд╣реИ рдХрд┐ рдРрд╕рд╛ рдХреНрдпреЛрдВ рд╣реИ - рдЯрд┐рдкреНрдкрдгрд┐рдпреЛрдВ рдореЗрдВ рд▓рд┐рдЦреЗрдВред рдЧреМрд░рд╡ рдФрд░ рд╕рдореНрдорд╛рди рдкрд╛рдпрд╛ред



рд╡реИрд╕реЗ, рд╣рд╛рд▓ рд╣реА рдореЗрдВ рдореИрдВ рд╢рд╛рдпрдж рд╣реА рдХрднреА рдШрдбрд╝реАред рдЬреНрдпрд╛рджрд╛рддрд░ рдбрд╛рдЙрдирд▓реЛрдб рдХреА рдЧрдИ рдлрд┐рд▓реНрдореЗрдВ рдпрд╛ рдСрдирд▓рд╛рдЗрдиред рдпрд╣ рдЕрдЪреНрдЫрд╛ рд╣реИ рдХрд┐ рдореИрдВрдиреЗ рддрдм рдЗрд╕реЗ рдирд╣реАрдВ рдЦрд░реАрджрд╛ рдерд╛ред рд▓реЗрдХрд┐рди рдЕрдм рдореИрдВ рдЦрд░реАрджрдиреЗ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рд╕реЛрдЪ рд░рд╣рд╛ рд╣реВрдВред рдХрд┐рд╕реА рддрд░рд╣ рдХрд╛ рд╡рд┐рд░реЛрдзрд╛рднрд╛рд╕ рдирд┐рдХрд▓рд╛ ...



All Articles