root / trunk / code / projects / colonet / utilities / manual_control / manualControlServer / manualControlServer.c @ 13
History | View | Annotate | Download (4.42 KB)
1 |
/* Colonet Server
|
---|---|
2 |
Eugene Marinelli and Gregory Tress
|
3 |
*/
|
4 |
|
5 |
#include <sys/types.h> |
6 |
#include <sys/socket.h> |
7 |
#include <stdio.h> |
8 |
#include <netinet/in.h> |
9 |
#include <arpa/inet.h> |
10 |
#include <string.h> |
11 |
#include <netdb.h> |
12 |
|
13 |
#include "wireless.h" |
14 |
|
15 |
#define SERIAL_PORT "/dev/ttyS0" |
16 |
//#define SERIAL_PORT "/dev/ttyUSB0"
|
17 |
#define SERVER_ID 213 |
18 |
|
19 |
#define FORWARD 0xF0 |
20 |
#define BACK 0xF1 |
21 |
#define RIGHT 0xF2 |
22 |
#define LEFT 0xF3 |
23 |
#define STOP 0xF4 |
24 |
|
25 |
#define message_length 3 |
26 |
|
27 |
void send_command(char cmd, char dest); |
28 |
|
29 |
int mysocket; //the socket that gets new connections |
30 |
int io_socket; //the socket we use to communicate when a connection is initiated. |
31 |
|
32 |
int main (int argc, char **argv) { |
33 |
|
34 |
unsigned int clientlen; |
35 |
struct sockaddr_in clientaddr;
|
36 |
struct hostent *hp;
|
37 |
char *haddrp;
|
38 |
char newdata[100]; |
39 |
int newdatasize;
|
40 |
if (argc != 2) { |
41 |
fprintf(stderr, "Usage: %s <port>\n", argv[0]); |
42 |
return 0; |
43 |
} |
44 |
|
45 |
//start server
|
46 |
printf("Starting server on port %i\n", atoi(argv[1])); |
47 |
mysocket = open_listenfd(atoi(argv[1]));
|
48 |
if (mysocket < 0) { |
49 |
fprintf(stderr, "Error listening on port.\n");
|
50 |
return -1; |
51 |
} else {
|
52 |
printf("Server running, waiting for connection\n");
|
53 |
} |
54 |
|
55 |
//accept connections
|
56 |
while (1) { |
57 |
clientlen = sizeof(clientaddr);
|
58 |
io_socket = accept(mysocket, (struct sockaddr *) &clientaddr, &clientlen);
|
59 |
|
60 |
//get client info
|
61 |
hp = gethostbyaddr((const char *) &clientaddr.sin_addr.s_addr, |
62 |
sizeof(clientaddr.sin_addr.s_addr), AF_INET);
|
63 |
haddrp = inet_ntoa(clientaddr.sin_addr); |
64 |
printf("Client connected: %s %s\n", hp->h_name, haddrp);
|
65 |
|
66 |
if (!fork()) { // this is the child process |
67 |
close(mysocket); // child doesn't need the listener
|
68 |
newdata[0] = ' '; |
69 |
while (newdata[0] != 'q') { |
70 |
memset(newdata, '\0', strlen(newdata));
|
71 |
newdatasize = recv(io_socket, newdata, 99, 0); |
72 |
//receive commands from clients and give them to robots
|
73 |
printf("Received: [%s]\n", newdata);
|
74 |
send_command(newdata[0], GLOBAL_DEST);
|
75 |
} |
76 |
printf("\nClient has disconnected.\n");
|
77 |
close(io_socket); |
78 |
return 0; |
79 |
} |
80 |
close(io_socket); |
81 |
} |
82 |
|
83 |
close(mysocket); |
84 |
return 0; |
85 |
} |
86 |
|
87 |
//listen on port, as specified by 15-213 book.
|
88 |
int open_listenfd(int port) { |
89 |
int listenfd, optval=1; |
90 |
struct sockaddr_in serveraddr;
|
91 |
|
92 |
//create socket descriptor
|
93 |
if ((listenfd = socket(AF_INET, SOCK_STREAM, 0)) < 0) |
94 |
return -1; |
95 |
|
96 |
//prevent "address already in use" error
|
97 |
if (setsockopt(listenfd, SOL_SOCKET, SO_REUSEADDR, (const void *) &optval, |
98 |
sizeof(int)) < 0) |
99 |
return -1; |
100 |
|
101 |
bzero((char *) &serveraddr, sizeof(serveraddr)); |
102 |
serveraddr.sin_family = AF_INET; |
103 |
serveraddr.sin_addr.s_addr = htonl(INADDR_ANY); |
104 |
serveraddr.sin_port = htons((unsigned short)port); |
105 |
if (bind(listenfd, (struct sockaddr *) &serveraddr, sizeof(serveraddr)) < 0) |
106 |
return -1; |
107 |
|
108 |
//start listening
|
109 |
if (listen(listenfd, 128) < 0) |
110 |
return -1; |
111 |
return listenfd;
|
112 |
} |
113 |
|
114 |
void send_command(char cmd, char dest){ |
115 |
FILE* serial; |
116 |
WL_Packet pkt; |
117 |
int i;
|
118 |
char robot_cmd[message_length];
|
119 |
|
120 |
if(cmd != 'w' && cmd != 'a' && cmd != 's' && cmd != 'd' && cmd != ' '){ |
121 |
fprintf(stderr, "Invalid command\n");
|
122 |
return;
|
123 |
} |
124 |
|
125 |
robot_cmd[0] = 0; |
126 |
robot_cmd[1] = '\0'; |
127 |
|
128 |
switch(cmd){
|
129 |
case 'w': |
130 |
robot_cmd[0] = FORWARD;
|
131 |
break;
|
132 |
case 'a': |
133 |
robot_cmd[0] = LEFT;
|
134 |
break;
|
135 |
case 's': |
136 |
robot_cmd[0] = BACK;
|
137 |
break;
|
138 |
case 'd': |
139 |
robot_cmd[0] = RIGHT;
|
140 |
break;
|
141 |
case ' ': |
142 |
robot_cmd[0] = STOP;
|
143 |
break;
|
144 |
} |
145 |
|
146 |
wl_create_packet(robot_cmd, SERVER_ID, dest, &pkt); |
147 |
|
148 |
serial = fopen(SERIAL_PORT, "w");
|
149 |
|
150 |
fprintf(stderr, "%i %i %i %i ", pkt.prefix[0], pkt.prefix[1], pkt.src, |
151 |
pkt.dest); |
152 |
fprintf(serial, "%c%c%c%c", pkt.prefix[0], pkt.prefix[1], pkt.src, |
153 |
pkt.dest); |
154 |
|
155 |
for(i = 0; i < message_length; i++){ |
156 |
fprintf(stderr, "%i ", pkt.msg[i]);
|
157 |
fprintf(serial, "%c", pkt.msg[i]);
|
158 |
} |
159 |
|
160 |
fprintf(stderr, "%i", pkt.checksum);
|
161 |
fprintf(serial, "%c", pkt.checksum);
|
162 |
|
163 |
fclose(serial); |
164 |
} |
165 |
|
166 |
char wl_get_checksum(WL_Packet* packet){
|
167 |
char checksum = 0; |
168 |
int i;
|
169 |
|
170 |
checksum += packet->src; |
171 |
checksum += packet->dest; |
172 |
for(i = 0; i < message_length; i++) { |
173 |
checksum += packet->msg[i]; |
174 |
} |
175 |
|
176 |
return checksum;
|
177 |
} |
178 |
|
179 |
int wl_create_packet(char* msg, char src, char dest, WL_Packet* packet){ |
180 |
packet->prefix[0] = 'R'; |
181 |
packet->prefix[1] = 'C'; |
182 |
|
183 |
packet->src = src; |
184 |
packet->dest = dest; |
185 |
|
186 |
memset(packet->msg, 0, message_length);
|
187 |
strcpy(packet->msg, msg); |
188 |
|
189 |
packet->checksum = wl_get_checksum(packet); |
190 |
|
191 |
return 0; |
192 |
} |