参考文章
关于开发板上的LED的控制,是通过gpio来实现的,参考文章:http://blog.youkuaiyun.com/q1070292175/article/details/17307381
关于socket编程,参考文章:http://blog.youkuaiyun.com/jisuanji_wjfioj/article/details/39012153
本篇思路
采用C/S架构,pc机为客户端,开发板为服务器。
对于客户端来说,主要工作是:判断用户输入是否合法,向服务器发送用户输入。
对于服务器来说监听端口,接受来自客户端的信息,解析信息,完成相应的操作。
源代码
common.h
#define MAX_LINE 100
struct data{
char name[5];
char ctl[4] ;
};
#ifndef _GPIO_H
#define _GPIO_H
#define LED1_direction "/sys/class/gpio/gpio37/direction"
#define LED1_value "/sys/class/gpio/gpio37/value"
#define LED2_direction "/sys/class/gpio/gpio38/direction"
#define LED2_value "/sys/class/gpio/gpio38/value"
#define LED3_direction "/sys/class/gpio/gpio39/direction"
#define LED3_value "/sys/class/gpio/gpio39/value"
#define LED4_direction "/sys/class/gpio/gpio40/direction"
#define LED4_value "/sys/class/gpio/gpio40/value"
#define LED_export "/sys/class/gpio/export"
#define LED_unexport "/sys/class/gpio/unexport"
#define on "0"
#define off "1"
#define LED1 "37"
#define LED2 "38"
#define LED3 "39"
#define LED4 "40"
#define OUT "out"
extern int my_write(char file_name[], char command[]);
extern void gpio_init();
extern void led_on(char led_name[]);
extern void led_off(char led_name[]);
gpio.h
//用于初始化gpio
/*********************************
*把命令写入指定的GPIO
*********************************/
int my_write(char file_name[], char command[])
{
int fp;
if((fp = open(file_name, O_WRONLY)) == -1){
perror("fail to open ");
return -1;
}
if(write(fp, command, strlen(command)) == -1){
perror("fail to write");
return -1;
}
close(fp);
return 1;
}
/********************************
*功能:初始化GPIO
********************************/
void gpio_init()
{
//LED1 init
if(my_write(LED1_direction, OUT) == -1){
my_write(LED_export, LED1);
my_write(LED1_direction, OUT);
}
printf("LED1 init success!\n");
//LED2 init
if(my_write(LED2_direction, OUT) == -1){
my_write(LED_export, LED2);
my_write(LED2_direction, OUT);
}
printf("LED2 init success!\n");
//LED3 init
if(my_write(LED3_direction, OUT) == -1){
my_write(LED_export, LED3);
my_write(LED3_direction, OUT);
}
printf("LED3 init success!\n");
//LED4 init
if(my_write(LED4_direction, OUT) == -1){
my_write(LED_export, LED4);
my_write(LED4_direction, OUT);
}
printf("LED4 init success!\n");
}
/*************************************
*功能:打开指定的LED
***************************************/
void led_on(char led_name[])
{
if(!strcasecmp(led_name, "led1"))
my_write(LED1_value, on);
if(!strcasecmp(led_name, "led2"))
my_write(LED2_value, on);
if(!strcasecmp(led_name, "led3"))
my_write(LED3_value, on);
if(!strcasecmp(led_name, "led4"))
my_write(LED4_value, on);
}
/*************************************
*功能:关闭指定的LED
***************************************/
void led_off(char led_name[])
{
if(!strcasecmp(led_name, "led1"))
my_write(LED1_value, off);
if(!strcasecmp(led_name, "led2"))
my_write(LED2_value, off);
if(!strcasecmp(led_name, "led3"))
my_write(LED3_value, off);
if(!strcasecmp(led_name, "led4"))
my_write(LED4_value, off);
}
服务器端:
server.c
int my_fun(struct data buf)
{
if(!strcasecmp(buf.ctl, "on")){
led_on(buf.name);
return 1;
} else if(!strcasecmp(buf.ctl, "off")){
led_off(buf.name);
return 1;
}else return 0;
}
int main(int argc, char *argv[])
{
struct data buf;
struct sockaddr_in sin ;
struct sockaddr_in cin ;
int l_fd ;
int c_fd ;
socklen_t len ;
//char buf[MAX_LINE] ;
char addr_p[INET_ADDRSTRLEN] ;
int port = 8000 ;
int n ;
bzero(&sin, sizeof(sin)) ;
sin.sin_family = AF_INET ;
sin.sin_addr.s_addr = INADDR_ANY ;
sin.sin_port = htons(port) ;
l_fd = socket(AF_INET, SOCK_STREAM, 0) ;
bind(l_fd, (struct sockaddr*) &sin, sizeof(sin)) ;
listen(l_fd, 10) ;
printf("waiting......\n") ;
while(1){
c_fd = accept(l_fd, (struct sockaddr*) &cin, &len) ;
inet_ntop(AF_INET, &cin.sin_addr, addr_p, sizeof(addr_p)) ;
printf("client IP is: %s \n port is %d \n", addr_p, ntohs(cin.sin_port)) ;
while(1){
n = read(c_fd, &buf, MAX_LINE) ;
if(!strcasecmp(buf.name, "exit")){
printf("client will be exit\n");
sleep(1);
break;
}
if(my_fun(buf))
write(c_fd, "success!", 8) ;
else
write(c_fd, "fail to ctl!", 11);
printf("nume :%s\nctl:%s\n", buf.name, buf.ctl) ;
}
close(c_fd ) ;
}
return 0 ;
}
客户端:
client.c
int main(int argc, char *argv[])
{
struct sockaddr_in sin ;
struct data buf;
char mes[100];
int sfd ;
int port = 8000 ;
if(argc < 1 ){
printf("used as:name IP");
return -1;
}
bzero(&sin, sizeof(sin)) ;
sin.sin_family = AF_INET ;
inet_pton(AF_INET, argv[1], &sin.sin_addr) ;
sin.sin_port = htons(port) ;
sfd = socket(AF_INET, SOCK_STREAM, 0) ;
connect (sfd, (const struct sockaddr*)&sin, sizeof(sin) ) ;
while(1){
scanf("%s", buf.name);
if(!strcasecmp(buf.name, "exit")){
write(sfd, &buf, sizeof(buf)) ;
printf("client will exit !\n");
sleep(1);
goto end1;
}else if(!strcasecmp(buf.name, "led1") || !strcasecmp(buf.name, "led2")
|| !strcasecmp(buf.name, "led3") || !strcasecmp(buf.name, "led4") ){
scanf("%s", buf.ctl);
write(sfd, &buf, sizeof(buf)) ;
read(sfd, mes, MAX_LINE) ;
printf("result is :%s\n", mes) ;
}
else {
printf("please input like : led1/2/3/4 on/off\n");
fflush(stdin);
}
}
end1:
close(sfd) ;
return 0 ;
}
Makefile
all:server client
server:server.c
arm-linux-gcc server.c gpio.c -o server
client:client.c
gcc client.c -o client
clean:
rm *.o server client
.PHONY:clean