/*
本代码是由linux系统捕获w,a,s,d键盘抬起放下
的c++代码由于本人是初学者,里面注释可能误
导大家对学术的认知不要见怪,这些api我也找了
一晚才写出来---------最后如果大家打不开的
话换要打开的文件把event1到event4都试以下
在此希望能帮助大家爱------作者:拼命三郎
*/
#include<sys/types.h>
#include<sys/stat.h>
#include<fcntl.h>
#include<unistd.h>
#include<linux/input.h>
#include<cstdio>
#include<iostream>
#include<stdlib.h>
#include<string.h>
#include<arpa/inet.h>
#include<sys/socket.h>
class JP //声明一个键盘类
{
public:
void error_handling( const char *message);
void jcdqhax(int argc ,char* argv[] ); //实现参成员法
};
int main(int argc ,char* argv[])
{
int mz=argc;
char **macha=argv;
JP tkcjp;//创建对象
tkcjp.jcdqhax(mz,macha); //创建一个键盘对象
return 0;
}
//检测输入抬起还是按下是生马等等
void JP::jcdqhax( int argc ,char* argv[]) {
struct input_event mykey; //定义一个读取按键的结构体
int fd;
if((fd=open("/dev/input/event1",O_RDONLY))==-1) //打开按键文件
{
perror("open error");
exit(0);
}
int serv_sock;
int clnt_sock;
struct sockaddr_in serv_addr;
struct sockaddr_in clnt_addr;
socklen_t clnt_addr_size;
char message[] = "Hello World!";
char ws[]="11";
char wx[]="12";
char ds[]="13";
char dx[]="14";
char ss[]="15";
char sx[]="16";
char as[]="17";
char ax[]="18";
if (argc != 2)
{
printf("Usage : %s <port>\n", argv[0]);
exit(1);
}
serv_sock = socket(PF_INET, SOCK_STREAM, 0);
if (serv_sock == -1)
{
error_handling("socket() error");
}
memset(&serv_addr, 0, sizeof(serv_addr));
serv_addr.sin_family = AF_INET;
serv_addr.sin_addr.s_addr = htonl(INADDR_ANY);
serv_addr.sin_port = htons(atoi(argv[1]));
if (bind(serv_sock, (struct sockaddr*)&serv_addr, sizeof(serv_addr)) == -1)
{
error_handling("bind() error");
}
if (listen(serv_sock, 5) == -1)
{
error_handling("listen() error");
}
clnt_addr_size = sizeof(clnt_addr);
clnt_sock = accept(serv_sock, (struct sockaddr*)&clnt_addr, &clnt_addr_size);
if (clnt_sock == -1)
{
error_handling("accept() error");
}
write(clnt_sock, message, sizeof(message));
while(1)
{
read(fd,&mykey,sizeof(mykey));
if(mykey.type==EV_KEY)
{
printf("type:%#x,code:%d,value:%#x\n",mykey.type,mykey.code,mykey.value);
switch(mykey.code)
{
case 17:
if(mykey.value==1)
{
std::cout<<"w键按下了"<<std::endl;
write(clnt_sock, ws, sizeof(ws));
}
if(mykey.value==0)
{
printf("w按键台起了\n");
write(clnt_sock, wx, sizeof(wx));
}
if(mykey.value==2)
{
printf("w按键一直按下\n");
}
break;
case 30:
if(mykey.value==1)
{
//switch(mykey.code)
printf("a按键按下了\n");
write(clnt_sock, as, sizeof(as));
}
if(mykey.value==0)
{
printf("a按键台起了\n");
write(clnt_sock, ax, sizeof(ax));
}
if(mykey.value==2)
{
printf("a按键一直按下\n");
}
break;
case 31:
if(mykey.value==1)
{
printf("s按键按下了\n");
write(clnt_sock, ss, sizeof(ss));
}
if(mykey.value==0)
{
printf("s按键台起了\n");
write(clnt_sock, sx, sizeof(sx));
}
if(mykey.value==2)
{
std::cout<<"s键一直按下"<<std::endl;
}
break;
case 32:
if(mykey.value==1)
{
printf("d按键按下了\n");
write(clnt_sock, ds, sizeof(sx));
}
if(mykey.value==0)
{
printf("d按键台起了\n");
write(clnt_sock, dx, sizeof(dx));
}
if(mykey.value==2)
{
printf("d按键一直按下\n");
}
break;
}
}
}
close(clnt_sock);
close(serv_sock);
}
void JP::error_handling( const char *message)
{
fputs(message, stderr);
fputc('\n', stderr);
exit(1);
}
上面的是控制代码
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <arpa/inet.h>
#include <sys/socket.h>
void error_handling(char *message);
int main(int argc, char* argv[])
{
int sock;
struct sockaddr_in serv_addr;
char message[30];
int str_len;
if (argc != 3)
{
printf("Usage : %s <IP> <port>\n", argv[0]);
exit(1);
}
sock = socket(PF_INET, SOCK_STREAM, 0);
if (sock == -1)
{
error_handling("socket() error");
}
memset(&serv_addr, 0, sizeof(serv_addr));
serv_addr.sin_family = AF_INET;
serv_addr.sin_addr.s_addr = inet_addr(argv[1]);
serv_addr.sin_port = htons(atoi(argv[2]));
if (connect(sock, (struct sockaddr*)&serv_addr, sizeof(serv_addr)) == -1)
{
error_handling("connect() error!");
}
str_len = read(sock, message, sizeof(message) - 1);
if (str_len == -1)
{
error_handling("read() error!");
}
printf("Message from server : %s \n", message);
while(1)
{
str_len = read(sock, message, sizeof(message) - 1);
if (str_len == -1)
{
error_handling("read() error!");
}
if(strcmp(message,"11")==0)
{
printf("小车向前走\n");
printf("Message from server : %s \n", message);
}
if(strcmp(message,"12")==0)
{
printf("小车向前走这走这突然停下来了\n");
printf("Message from server : %s \n", message);
}
if(strcmp(message,"15")==0)
{
printf("小车向后退\n");
printf("Message from server : %s \n", message);
}
if(strcmp(message,"16")==0)
{
printf("小车向后退这突然停了下来\n");
printf("Message from server : %s \n", message);
}
if(strcmp(message,"17")==0)
{
printf("小车向左走\n");
printf("Message from server : %s \n", message);
}
if(strcmp(message,"18")==0)
{
printf("小车向左走突然停下来了\n");
printf("Message from server : %s \n", message);
}
if(strcmp(message,"13")==0)
{
printf("小车向右走\n");
printf("Message from server : %s \n", message);
}
if(strcmp(message,"14")==0)
{
printf("小车向右走突然停下来了\n");
printf("Message from server : %s \n", message);
}
}
close(sock);
return 0;
}
void error_handling(char *message)
{
fputs(message, stderr);
fputc('\n', stderr);
exit(1);
}
下面的是放到树莓派里面的
控制端:a.out 8989
树莓派芯片linux: a.out 127.0.0.1(根据不同情况来写的ubuntuIP地址) 8989
我在补充一点端口号尽量不要小于500!