| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346 |
- #include <stdio.h>
- #include <FreeRTOS.h>
- #include <task.h>
- #include "mmcsd_core.h"
- #include "board.h"
- #include "timer.h"
- #include "iot_wifi.h"
- const uint8_t ucIPAddress[4] = {192, 168, 2, 100};
- const uint8_t ucNetMask[4] = {255, 255, 255, 0};
- const uint8_t ucGatewayAddress[4] = {0, 0, 0, 0};
- const uint8_t ucDNSServerAddress[4] = {8, 8, 8, 8};
- const uint8_t ucMACAddress[6] = {0x30, 0x4a, 0x26, 0x78, 0xfd, 0x12};
- #if !USE_LWIP
- #include "FreeRTOS_IP.h"
- #include "FreeRTOS_IP_Private.h"
- #include "FreeRTOS_Sockets.h"
- #include "FreeRTOS_DHCP.h"
- #include "FreeRTOS_DHCP_Server.h"
- #include "iperf_task.h"
- //static uint8_t ap_ssid[64] = {"ap63011"};
- //static uint8_t ap_passwd[16] = {"88888888"};
- int vTestTCPClientSocket( void )
- {
- SocketSet_t xFD_Set = NULL;
- Socket_t xSocket = FREERTOS_INVALID_SOCKET;
- struct freertos_sockaddr xServerAddress;
- WinProperties_t xWinProps;
- BaseType_t ret;
- uint8_t wifi_data_buffer[2048] = {0};
- int xReturn = -1;
- start_sta("AndroidAP", "12345678", 1);
- xFD_Set = FreeRTOS_CreateSocketSet();
- if (NULL == xFD_Set) {
- return xReturn;
- }
- /* Create a TCP socket. */
- xSocket = FreeRTOS_socket( FREERTOS_AF_INET, FREERTOS_SOCK_STREAM, FREERTOS_IPPROTO_TCP );
- if( xSocket != FREERTOS_INVALID_SOCKET ) {
- printf( "Open socket failed\r\n");
- goto exit;
- }
- if (0) {
- /* Set a time out so a missing reply does not cause the task to block indefinitely. */
- const TickType_t xReceiveTimeOut = pdMS_TO_TICKS( 4000 );
- const TickType_t xSendTimeOut = pdMS_TO_TICKS( 2000 );
- ret = FreeRTOS_setsockopt( xSocket, 0, FREERTOS_SO_RCVTIMEO, &xReceiveTimeOut, sizeof( xReceiveTimeOut ) );
- ret = FreeRTOS_setsockopt( xSocket, 0, FREERTOS_SO_SNDTIMEO, &xSendTimeOut, sizeof( xSendTimeOut ) );
- }
- /* Set the window and buffer sizes. */
- xWinProps.lTxBufSize = ipconfigIPERF_TX_BUFSIZE; /* Units of bytes. */
- xWinProps.lTxWinSize = ipconfigIPERF_TX_WINSIZE; /* Size in units of MSS */
- xWinProps.lRxBufSize = ipconfigIPERF_RX_BUFSIZE; /* Units of bytes. */
- xWinProps.lRxWinSize = ipconfigIPERF_RX_WINSIZE; /* Size in units of MSS */
- FreeRTOS_setsockopt( xSocket, 0, FREERTOS_SO_WIN_PROPERTIES, ( void * ) &xWinProps, sizeof( xWinProps ) );
- /* Connect to the echo server. */
- printf( "connecting to echo server....\r\n" );
- xServerAddress.sin_port = FreeRTOS_htons( 10010 );
- xServerAddress.sin_addr = FreeRTOS_inet_addr_quick( 192, 168, 43, 1 );
- ret = FreeRTOS_connect( xSocket, &xServerAddress, sizeof( xServerAddress ) );
- if( ret != 0 ) {
- printf( "Could not connect to server %ld\r\n", ret );
- goto exit;
- }
- ret = FreeRTOS_send( xSocket, (void*)wifi_data_buffer, sizeof wifi_data_buffer, 0 );
- if( ret < 0 ) {
- printf( "Could not send data to server %ld\r\n", ret );
- goto exit;
- }
- while (1) {//waiting for data from server
- FreeRTOS_FD_CLR(xSocket, xFD_Set, eSELECT_READ);
- FreeRTOS_FD_SET(xSocket, xFD_Set, eSELECT_READ);
- ret = FreeRTOS_select( xFD_Set, portMAX_DELAY );
- if (ret < 0) {
- printf("Select failed\r\n");
- break;
- }
- if( FreeRTOS_FD_ISSET ( xSocket, xFD_Set ) ) {
- ret = FreeRTOS_recv(xSocket, wifi_data_buffer, sizeof wifi_data_buffer, 0);
- if (ret > 0) {
- printf("recv buf size:%d\r\n", ret);
- } else {
- printf("FreeRTOS_recv err:%d\r\n", ret);
- break;
- }
- }
- }
- xReturn = 0;
- exit:
- /* Close this socket before looping back to create another. */
- if ( xSocket != FREERTOS_INVALID_SOCKET)
- FreeRTOS_closesocket( xSocket );
- if (NULL != xFD_Set)
- FreeRTOS_DeleteSocketSet(xFD_Set);
- return xReturn;
- }
- static int vTestTCPServerSocket( void )
- {
- SocketSet_t xFD_Set;
- struct freertos_sockaddr xAddress, xRemoteAddr;
- Socket_t xSockets = FREERTOS_INVALID_SOCKET, xClientSocket = FREERTOS_INVALID_SOCKET;
- socklen_t xClientLength = sizeof( xAddress );
- static const TickType_t xNoTimeOut = portMAX_DELAY;
- BaseType_t ret = -1;
- BaseType_t xResult;
- uint8_t wifi_data_buffer[2048] = {0};
- xFD_Set = FreeRTOS_CreateSocketSet();
- xSockets = FreeRTOS_socket( FREERTOS_AF_INET, FREERTOS_SOCK_STREAM, FREERTOS_IPPROTO_TCP );
- configASSERT( xSockets != FREERTOS_INVALID_SOCKET );
- FreeRTOS_setsockopt( xSockets,
- 0,
- FREERTOS_SO_RCVTIMEO,
- &xNoTimeOut,
- sizeof( xNoTimeOut ) );
- xAddress.sin_port = ( uint16_t ) 11111;
- xAddress.sin_port = FreeRTOS_htons( xAddress.sin_port );
- FreeRTOS_bind( xSockets, &xAddress, sizeof( xAddress ) );
- FreeRTOS_listen( xSockets, 1 );
- while (1) {
- FreeRTOS_FD_CLR(xSockets, xFD_Set, eSELECT_READ);
- FreeRTOS_FD_SET(xSockets, xFD_Set, eSELECT_READ);
- if (xClientSocket && xClientSocket != FREERTOS_INVALID_SOCKET) {
- FreeRTOS_FD_CLR(xClientSocket, xFD_Set, eSELECT_READ);
- FreeRTOS_FD_SET( xClientSocket, xFD_Set, eSELECT_READ );
- }
- xResult = FreeRTOS_select( xFD_Set, portMAX_DELAY );
- if (xResult < 0) {
- break;
- }
- if( FreeRTOS_FD_ISSET ( xSockets, xFD_Set ) ) {
- xClientSocket = FreeRTOS_accept( xSockets, &xRemoteAddr, &xClientLength);
- if( ( xClientSocket != NULL ) && ( xClientSocket != FREERTOS_INVALID_SOCKET ) ) {
- char pucBuffer[32] = {0};
- FreeRTOS_FD_CLR(xClientSocket, xFD_Set, eSELECT_READ);
- FreeRTOS_FD_SET(xClientSocket, xFD_Set, eSELECT_READ);
- FreeRTOS_GetRemoteAddress( xClientSocket, ( struct freertos_sockaddr * ) &xRemoteAddr );
- FreeRTOS_inet_ntoa(xRemoteAddr.sin_addr, pucBuffer );
- printf("Carlink: Received a connection from %s:%u\n", pucBuffer, FreeRTOS_ntohs(xRemoteAddr.sin_port));
- }
- continue;
- } else if( FreeRTOS_FD_ISSET ( xClientSocket, xFD_Set ) ) {
- ret = FreeRTOS_recv(xClientSocket, wifi_data_buffer, sizeof wifi_data_buffer, 0);
- if (ret > 0) {
- printf("recv buf size:%d\r\n", ret);
- } else {
- printf("FreeRTOS_recv err:%d\r\n", ret);
- FreeRTOS_FD_CLR(xClientSocket, xFD_Set, eSELECT_READ);
- FreeRTOS_closesocket(xClientSocket);
- xClientSocket = FREERTOS_INVALID_SOCKET;
- continue;
- }
- }
- }
- if (FREERTOS_INVALID_SOCKET != xClientSocket)
- FreeRTOS_closesocket(xClientSocket);
- if (FREERTOS_INVALID_SOCKET != xSockets)
- FreeRTOS_closesocket(xSockets);
- return 0;
- }
- #if !CARLINK_EY && !CARLINK_EC
- #if !FREERTOS_TCP_ETH_EN
- eDHCPCallbackAnswer_t xApplicationDHCPHook( eDHCPCallbackPhase_t eDHCPPhase, uint32_t ulIPAddress )
- {
- eDHCPCallbackAnswer_t eReturn;
- char ip_str[20] = {0};
- sprintf(ip_str, "%d.%d.%d.%d\r\n", (ulIPAddress >> 0) & 0xFF,
- (ulIPAddress >> 8) & 0xFF, (ulIPAddress >> 16) & 0xFF, (ulIPAddress >> 24) & 0xFF);
- printf("\r\n eDHCPPhase:%d ulIPAddress:%s state:%d \r\n", eDHCPPhase, ip_str, getDhcpClientState());
- if (getDhcpClientState() == 0)
- return eDHCPStopNoChanges;
- switch( eDHCPPhase )
- {
- case eDHCPPhaseFinished:
- eReturn = eDHCPContinue;
- break;
- case eDHCPPhasePreDiscover :
- eReturn = eDHCPContinue;
- break;
- case eDHCPPhasePreRequest :
- eReturn = eDHCPContinue;
- break;
- default :
- eReturn = eDHCPContinue;
- break;
- }
- return eReturn;
- }
- #endif
- #endif
- #else
- #include "ethernet.h"
- #include "tcpip.h"
- static struct netif glwip_netif[4];
- err_t dhcp_server_start(struct netif *netif, ip4_addr_t *start, ip4_addr_t *end);
- err_t wlan_ethernetif_init(struct netif *netif);
- #define lwip_ipv4_addr(addr) ((addr[0]) | (addr[1] << 8) | (addr[2] << 16) | (addr[3] << 24))
- extern err_t ncm_ethernetif_init(struct netif *netif);
- #endif
- #ifdef WIFI_SUPPORT
- void wifi_event_handler( WIFIEvent_t * xEvent )
- {
- //WIFIEventType_t xEventType = xEvent->xEventType;
- }
- static BaseType_t wifi_init()
- {
- WIFI_Context_init();
- WIFI_RegisterEvent(eWiFiEventMax, wifi_event_handler);
- for (;;) {
- if (mmcsd_wait_sdio_ready(portMAX_DELAY)) {
- printf("detect sdio device\r\n");
- break;
- }
- }
- return 0;
- }
- #endif
- static int g_flag_init_finished = 0;
- static void ark_network_init_thread(void *param)
- {
- #ifdef WIFI_SUPPORT
- BaseType_t ret = 0;
- ret = wifi_init();
- #if !USE_LWIP
- ret = FreeRTOS_IPInit(ucIPAddress, ucNetMask, ucGatewayAddress,ucDNSServerAddress, ucMACAddress);
- start_ap(36, "arkn141m_ap_3ca8", "88888888", 1);
- vIPerfInstall();
- vTestTCPServerSocket();
- #else
- ip4_addr_t ip_addr;
- ip4_addr_t netmask;
- ip4_addr_t gw;
- ip4_addr_t dhcp_addr_start;
- ip4_addr_t dhcp_addr_end;
- //start_ap(36, "arkn141m_lwip_ap_3ca8", "88888888", 1);
- start_p2p("ark630hv100_p2p", "ark630hv100", "12345678");
- ip_addr.addr = lwip_ipv4_addr(ucIPAddress);
- netmask.addr = lwip_ipv4_addr(ucNetMask);
- gw.addr = lwip_ipv4_addr(ucGatewayAddress);
- tcpip_init(NULL, NULL);
- netif_add(&glwip_netif[0],
- #if LWIP_IPV4
- &ip_addr, &netmask, &gw,
- #endif
- NULL, wlan_ethernetif_init, tcpip_input);
- netif_set_default(&glwip_netif[0]);
- uint8_t addr_start[4] = {192, 168, 13, 20};
- uint8_t addr_end[4] = {192, 168, 13, 30};
- dhcp_addr_start.addr = lwip_ipv4_addr(addr_start);
- dhcp_addr_end.addr = lwip_ipv4_addr(addr_end);
- dhcp_server_start(&glwip_netif[0], &dhcp_addr_start, &dhcp_addr_end);
- netif_set_up(&glwip_netif[0]);
- #endif
- #elif defined(CONFIG_USB_DEVICE_CDC_NCM)
- #if !USE_LWIP
- BaseType_t ret = 0;
- ret = FreeRTOS_IPInit(ucIPAddress, ucNetMask, ucGatewayAddress,ucDNSServerAddress, ucMACAddress);
- #else
- ip4_addr_t ip_addr;
- ip4_addr_t netmask;
- ip4_addr_t gw;
- //ip4_addr_t dhcp_addr_start;
- //ip4_addr_t dhcp_addr_end;
- ip_addr.addr = lwip_ipv4_addr(ucIPAddress);
- netmask.addr = lwip_ipv4_addr(ucNetMask);
- gw.addr = lwip_ipv4_addr(ucGatewayAddress);
- tcpip_init(NULL, NULL);
- netif_add(&glwip_netif[0],
- #if LWIP_IPV4
- &ip_addr, &netmask, &gw,
- #endif
- NULL, ncm_ethernetif_init, tcpip_input);
- netif_set_default(&glwip_netif[0]);
- /*uint8_t addr_start[4] = {192, 168, 13, 20};
- uint8_t addr_end[4] = {192, 168, 13, 30};
- dhcp_addr_start.addr = lwip_ipv4_addr(addr_start);
- dhcp_addr_end.addr = lwip_ipv4_addr(addr_end);
- dhcp_server_start(&glwip_netif[0], &dhcp_addr_start, &dhcp_addr_end);*/
- netif_set_up(&glwip_netif[0]);
- #endif
- #endif
- g_flag_init_finished = 1;
- #ifdef WIFI_SUPPORT
- ret = ret;
- #endif
- vTaskDelete(NULL);
- }
- int ark_network_init()
- {
- BaseType_t ret = 0;
- if (g_flag_init_finished)
- return 0;
- g_flag_init_finished = 0;
- ret = xTaskCreate(ark_network_init_thread, "ark_net_init", 1024, NULL, 8, NULL);
- while(!g_flag_init_finished) {
- vTaskDelay(pdMS_TO_TICKS(100));
- }
- return (int)ret;
- }
|