示例#1
0
void serial_task(void *pvParameters)	//remote_command_task
{
    char command[MAX_COMMAND_LENGTH];
    char length_str[4];
    uint8_t length;
    uint8_t mode;
    unsigned char ch;

    for (;;) {
        /* get length and mode */
        xQueueReceive(uart_receive_queue, &length_str[0], portMAX_DELAY);
        xQueueReceive(uart_receive_queue, &length_str[1], portMAX_DELAY);
        xQueueReceive(uart_receive_queue, &length_str[2], portMAX_DELAY);
        xQueueReceive(uart_receive_queue, &mode, portMAX_DELAY);
        length = atoi(length_str);
        if(length >= MAX_COMMAND_LENGTH) {
            length = MAX_COMMAND_LENGTH-1;
            debug_msg("length is too long");
        }
        for (uint8_t i = 0; i < length; i++) {
            xQueueReceive(uart_receive_queue, &ch, portMAX_DELAY);
            command[i] = ch;
        }
        command[length] = 0x00;
        handle_package(mode, command, length);
    }
}
int main()
{
	init();
	pid_t pid;
	pid=fork();
	if(pid==0)
	{
		handle_package();
	}
	else if(pid>0)
	{
		menu();
	}
	else
	{
		printf("ERROR!\n");
	}
	return 0;
}
示例#3
0
int main_server_loop(Server_Object *server_obj)
{
	IoTSocket new_socket;
	struct sockaddr_in  address;
	int activity, i,  valread,fdmax=65535;
	//first received buffer
	char buffer[MAXRECV];

	TimeSpan timeout;
	timeout.tv_sec = 100;
	timeout.tv_usec = 0;
	//set of socket descriptors
	fd_set master, readfds;

	//Bind
	if (bind(server_obj->listener, (struct sockaddr *)&server_obj->address, sizeof(server_obj->address)) == -1)
	{
		printf("Main server Bind failed\n");
		PAUSE;
		exit(EXIT_FAILURE);
	}

	puts("Main server  Bind done");

	//Listen to incoming connections
	listen(server_obj->listener, MAXCLIENTS);

	//Accept and incoming connection
	puts("Main server Waiting for incoming connections...");


	#if defined(WIN32)
        int addrlen = sizeof(struct sockaddr_in);
	#elif defined(__linux__) || defined(__FreeBSD__)
        socklen_t addrlen = sizeof(struct sockaddr_in);
    #endif

	//clear the socket fd set
	FD_ZERO(&master);
	FD_ZERO(&readfds);

	//add listener socket to fd set

	FD_SET(server_obj->listener, &master);

	//fdmax = server_obj->listener + 1;

	while (1)
	{
		readfds = master;
		activity = select(MAXCLIENTS, &readfds, NULL, NULL, &timeout);

		if (activity == -1)
		{
			printf("Main server select call failed");
			PAUSE;
			exit(EXIT_FAILURE);
		}

		//Add new connection into set
		if (FD_ISSET(server_obj->listener, &readfds))
		{
			if ((new_socket = accept(server_obj->listener, (struct sockaddr *)&address, &addrlen))<0)
			{
				perror("accept");
				PAUSE;
				exit(EXIT_FAILURE);
			}

			//inform user of socket number - used in send and receive commands
			printf("Main server has new connection , socket fd is %d , ip is : %s , port : %d \n", new_socket, inet_ntoa(address.sin_addr), ntohs(address.sin_port));

			//add new socket to array of sockets
			for (i = 0; i < MAXCLIENTS; i++)
			{
				if (client_socket[i] == 0)
				{
					client_socket[i] = new_socket;
					FD_SET(new_socket, &master);
					printf("Main server adding a new item to list of sockets at index %d \n", i);
					packageBuffer[i] = generate_package_buffer();
					break;
				}
			}
		}

		//handle connected conndetion,find which connection active
		for (i = 0; i < MAXCLIENTS; i++)
		{
			/*
			if (FD_ISSET(client_socket[i], &readfds))
			{
				valread = recv(client_socket[i], buffer, MAXRECV, 0);

				if (valread <= 0)
				{
					//Somebody disconnected , get his details and print
					printf("Host disconnected , ip %s , port %d \n", inet_ntoa(address.sin_addr), ntohs(address.sin_port));
					//Close the socket and mark as 0 in list for reuse
					FD_CLR(client_socket[i], &master);
					CloseIoTSocket(client_socket[i]);
					client_socket[i] = 0;
					free_package_buffer(packageBuffer[i]);
					packageBuffer[i] = NULL;
				}
				//Echo back the message that came in
				else if (valread>0)
				{
					//add null character, if you want to use with printf/puts or other string handling functions
					//buffer[valread] = '\0';
					printf("FD_Index:%d\n", i);
					printf("%s:%d-", inet_ntoa(address.sin_addr), ntohs(address.sin_port));
					printAllChar(buffer, valread);
					char buf[10];
					strcpy(buf, "Hello");
					//ms_sleep(4000);
					while (1)
					{
						send(client_socket[i], buf, 5, 0);
						ms_sleep(1000);
						printf("Sended\n");
					}


				}
			}
			*/

			if (FD_ISSET(client_socket[i], &readfds))
			{
				//get details of the client
				getpeername(client_socket[i], (struct sockaddr*)&address, &addrlen);

				//Check if it was for closing , and also read the incoming message
				//recv does not place a null terminator at the end of the string (whilst printf %s assumes there is one).
				memset(buffer, '\0', MAXRECV);
				valread = recv(client_socket[i], buffer, MAXRECV, 0);

				if (valread <= 0)
				{
					//Somebody disconnected , get his details and print
					printf("Main server got host disconnected , ip %s , port %d \n", inet_ntoa(address.sin_addr), ntohs(address.sin_port));
					//Close the socket and mark as 0 in list for reuse
					FD_CLR(client_socket[i], &master);
					CloseIoTSocket(client_socket[i]);
					client_socket[i] = 0;
					free_package_buffer(packageBuffer[i]);
					packageBuffer[i] = NULL;
				}
				//Echo back the message that came in
				else if (valread>0)
				{
					/*
					printf("Received data[%d]", valread);
					printAllChar(buffer, valread);
					*/
					if (packageBuffer[i]->receiveCount+ valread > MAXRECV)
					{
						puts("Buffer over flow clear All buffer");
						packageBuffer[i]->receiveCount = 0;
						memset(packageBuffer[i]->tempBuffer,'\0', MAXRECV);
					}
					else
					{
						charcat(packageBuffer[i]->tempBuffer, buffer, packageBuffer[i]->receiveCount, valread);
						packageBuffer[i]->receiveCount += valread;
					}


					//try to get a completed IoT Package
					recv_result result;
					do
					{
						IoT_Package package_info = generate_iot_package();

						result = getCompletedPackage(packageBuffer[i]->tempBuffer,
							&packageBuffer[i]->receiveCount,
							&package_info);

						if (result== recv_result_COMPLETED)
						{
							package_info.belongSocketIdx = i;
							handle_package(&package_info);
						}

						free_package(&package_info);
					} while (result == recv_result_COMPLETED);

					if (packageBuffer[i]->receiveCount == 0)
					{
						printf("Buffer[%d] cleared2\n",i);
					}


				}
			}

		}
	}
}