void application_start(void) { /* Initialise the device and WICED framework */ wiced_init( ); /* Bring up the network interface */ wiced_network_up( WICED_STA_INTERFACE, WICED_USE_EXTERNAL_DHCP_SERVER, NULL ); /* Create a TCP server socket */ if (wiced_tcp_create_socket(&tcp_server_handle.socket, WICED_STA_INTERFACE) != WICED_SUCCESS) { WPRINT_APP_INFO(("TCP socket creation failed\n")); } if (wiced_tcp_listen( &tcp_server_handle.socket, TCP_SERVER_LISTEN_PORT ) != WICED_SUCCESS) { WPRINT_APP_INFO(("TCP server socket initialization failed\n")); wiced_tcp_delete_socket(&tcp_server_handle.socket); return; } /* Start a tcp server thread */ WPRINT_APP_INFO(("Creating tcp server thread \n")); wiced_rtos_create_thread(&tcp_thread, TCP_SERVER_THREAD_PRIORITY, "Demo tcp server", tcp_server_thread_main, TCP_SERVER_STACK_SIZE, &tcp_server_handle); }
wiced_result_t ota_server_start( ota_server_t* server, uint16_t port, const ota_http_page_t* page_database, wiced_interface_t interface ) { memset( server, 0, sizeof( *server ) ); /* Create the TCP socket */ WICED_VERIFY(wiced_tcp_create_socket( &server->socket, interface )); if (wiced_tcp_listen( (wiced_tcp_socket_t*) &server->socket, port ) != WICED_SUCCESS) { wiced_tcp_delete_socket(&server->socket); return WICED_ERROR; } server->page_database = page_database; return wiced_rtos_create_thread(&server->thread, OTA_SERVER_THREAD_PRIORITY, "HTTPserver", ota_server_thread_main, OTA_SERVER_STACK_SIZE, server); }
wiced_result_t wiced_wlu_server_eth_start( int tcp_server_port , char** argv) { wiced_result_t result; UNUSED_PARAMETER(argv); wiced_assert("wlu_server already started", (wlu_server.started == WICED_FALSE)); wlu_server.started = WICED_TRUE; wlu_server.eth_started = WICED_TRUE; wlu_server.eth_port = tcp_server_port; // WWD_WLAN_KEEP_AWAKE( ); /* Bring up the network interface */ result = wiced_network_up( WICED_ETHERNET_INTERFACE, WICED_USE_EXTERNAL_DHCP_SERVER, NULL ); if ( result != WICED_SUCCESS ) { WPRINT_APP_INFO(("Failed to connect to Ethernet.\n")); } /* Create a TCP socket */ if ( wiced_tcp_create_socket( &tcp_client_socket, WICED_ETHERNET_INTERFACE ) != WICED_SUCCESS ) { WPRINT_APP_INFO( ("TCP socket creation failed\n") ); } if (wiced_tcp_listen( &tcp_client_socket, tcp_server_port ) != WICED_SUCCESS) { WPRINT_APP_INFO(("TCP server socket initialization failed\n")); wiced_tcp_delete_socket(&tcp_client_socket); return WICED_ERROR; } wiced_rtos_create_thread( &wlu_server.thread, WLU_SERVER_THREAD_PRIORITY, "wlu_eth_server", wlu_server_thread, WLU_SERVER_STACK_SIZE, &wlu_server ); return WICED_SUCCESS; }
static wiced_result_t client_disconnected_callback( wiced_tcp_socket_t* socket, void* arg ) { UNUSED_PARAMETER( arg ); // There are two ways to get here // 1. You disconnected the socket ... then this calls back for you to listen again (WICED_SOCKET_CLOSED) // 2. The client disconnected (in which case the state is WICED_SOCKET_CLOSING wiced_socket_state_t ss; wiced_tcp_get_socket_state( socket, &ss); /* // Debug prints switch(ss) { case WICED_SOCKET_CLOSED: WPRINT_APP_INFO(("closed\n")); break; case WICED_SOCKET_CLOSING: WPRINT_APP_INFO(("closing\n")); break; case WICED_SOCKET_CONNECTING: WPRINT_APP_INFO(("connecting\n")); break; case WICED_SOCKET_CONNECTED: WPRINT_APP_INFO(("connected\n")); break; case WICED_SOCKET_DATA_PENDING: WPRINT_APP_INFO(("data pending\n")); break; case WICED_SOCKET_LISTEN: WPRINT_APP_INFO(("listen\n")); break; case WICED_SOCKET_ERROR: WPRINT_APP_INFO(("error\n")); break; } */ if(ss == WICED_SOCKET_CLOSED) { wiced_tcp_listen( socket, TCP_SERVER_LISTEN_PORT ); return WICED_SUCCESS; } wiced_tcp_disconnect(socket); return WICED_SUCCESS; }
// The nonsecure server thread static void tcp_server_nonsecure_thread_main(wiced_thread_arg_t arg) { wiced_result_t result; wiced_tcp_stream_t stream; // The TCP stream wiced_tcp_socket_t socket; uint8_t rbuffer[MAX_LEGAL_MSG]; char returnMessage[128]; // better use less than 128 bytes // setup the server by creating the socket and hooking it to the correct TCP Port result = wiced_tcp_create_socket(&socket, INTERFACE); if(WICED_SUCCESS != result) { WPRINT_APP_INFO(("Create socket failed\n")); return; // this is a bad outcome } wiced_tcp_stream_init(&stream,&socket); if(WICED_SUCCESS != result) { WPRINT_APP_INFO(("Init stream failed\n")); return; // this is a bad outcome } result = wiced_tcp_listen( &socket, TCP_SERVER_NONSECURE_LISTEN_PORT ); if(WICED_SUCCESS != result) { WPRINT_APP_INFO(("Listen socket failed\n")); return; } while (1 ) { result = wiced_tcp_accept( &socket ); // this halts the thread until there is a connection if(result != WICED_SUCCESS) // this occurs if the accept times out continue; nonsecureConnectionCount += 1; /// Figure out which client is talking to us... and on which port wiced_ip_address_t peerAddress; uint16_t peerPort; wiced_tcp_server_peer(&socket,&peerAddress,&peerPort); uint32_t dataReadCount; wiced_tcp_stream_read_with_count(&stream,&rbuffer,MAX_LEGAL_MSG,100,&dataReadCount); // timeout in 100 ms processClientCommand(rbuffer, dataReadCount ,returnMessage); displayResult(peerAddress,peerPort,returnMessage); // send response and close things up wiced_tcp_stream_write(&stream,returnMessage,strlen(returnMessage)); wiced_tcp_stream_flush(&stream); wiced_tcp_disconnect(&socket); // disconnect the connection wiced_tcp_stream_deinit(&stream); // clear the stream if any crap left wiced_tcp_stream_init(&stream,&socket); // setup for next connection } }
static void tcp_server_thread_main(wiced_thread_arg_t arg) { wiced_bool_t wwepSecurity = (wiced_bool_t)arg; wiced_result_t result; wiced_tcp_stream_t stream; // The TCP stream wiced_tcp_socket_t socket; platform_dct_security_t *dct_security; wiced_tls_identity_t tls_identity; wiced_tls_context_t tls_context; uint8_t rbuffer[MAX_LEGAL_MSG]; char returnMessage[128]; // better use less than 128 bytes // setup the server by creating the socket and hooking it to the correct TCP Port result = wiced_tcp_create_socket(&socket, INTERFACE); if(WICED_SUCCESS != result) { WPRINT_APP_INFO(("Create socket failed\n")); return; // this is a bad outcome } if(wwepSecurity == WICED_TRUE) { WPRINT_APP_INFO(("Starting secure\n")); } else { WPRINT_APP_INFO(("Starting non-secure\n")); } result = wiced_tcp_listen( &socket, (wwepSecurity == WICED_TRUE)?TCP_SERVER_SECURE_LISTEN_PORT:TCP_SERVER_NONSECURE_LISTEN_PORT ); if(WICED_SUCCESS != result) { WPRINT_APP_INFO(("Listen socket failed\n")); return; } if(wwepSecurity == WICED_TRUE) { /* Lock the DCT to allow us to access the certificate and key */ WPRINT_APP_INFO(( "Read the certificate Key from DCT\n" )); result = wiced_dct_read_lock( (void**) &dct_security, WICED_FALSE, DCT_SECURITY_SECTION, 0, sizeof( *dct_security ) ); if ( result != WICED_SUCCESS ) { WPRINT_APP_INFO(("Unable to lock DCT to read certificate\n")); return; } /* Setup TLS identity */ result = wiced_tls_init_identity( &tls_identity, dct_security->private_key, strlen( dct_security->private_key ), (uint8_t*) dct_security->certificate, strlen( dct_security->certificate ) ); if ( result != WICED_SUCCESS ) { WPRINT_APP_INFO(( "Unable to initialize TLS identity. Error = [%d]\n", result )); return; } } else { wiced_tcp_stream_init(&stream,&socket); if(WICED_SUCCESS != result) { WPRINT_APP_INFO(("Init stream failed\n")); return; // this is a bad outcome } } while (1 ) { if(wwepSecurity == WICED_TRUE) { result = wiced_tls_init_context( &tls_context, &tls_identity, NULL ); if(result != WICED_SUCCESS) { WPRINT_APP_INFO(("Init context failed %d",result)); return; } result = wiced_tcp_enable_tls(&socket,&tls_context); if(result != WICED_SUCCESS) { WPRINT_APP_INFO(("Enabling TLS failed %d",result)); return; } wiced_tcp_stream_init(&stream,&socket); if(WICED_SUCCESS != result) { WPRINT_APP_INFO(("Init stream failed\n")); return; // this is a bad outcome } } result = wiced_tcp_accept( &socket ); // this halts the thread until there is a connection if(result != WICED_SUCCESS) // this occurs if the accept times out continue; if(wwepSecurity == WICED_TRUE) secureConnectionCount += 1; else nonsecureConnectionCount += 1; /// Figure out which client is talking to us... and on which port wiced_ip_address_t peerAddress; uint16_t peerPort; wiced_tcp_server_peer(&socket,&peerAddress,&peerPort); uint32_t dataReadCount; wiced_tcp_stream_read_with_count(&stream,&rbuffer,MAX_LEGAL_MSG,100,&dataReadCount); // timeout in 100 ms processClientCommand(rbuffer, dataReadCount ,returnMessage); displayResult(peerAddress,peerPort,returnMessage); // send response and close things up wiced_tcp_stream_write(&stream,returnMessage,strlen(returnMessage)); wiced_tcp_stream_flush(&stream); wiced_tcp_disconnect(&socket); // disconnect the connection if(wwepSecurity == WICED_TRUE) { wiced_tls_deinit_context(&tls_context); } wiced_tcp_stream_deinit(&stream); // clear the stream if any crap left wiced_tcp_stream_init(&stream,&socket); // setup for next connection } }