#include "FreeRTOS.h" #include "board.h" #include "chip.h" #include "test_demo.h" #ifdef WIFI_SUPPORT #if WIFI_TEST //#define RELTECK_WIFI_AP_MODE #include "FreeRTOS_Sockets.h" #include "FreeRTOS_IP.h" #include "FreeRTOS_DHCP.h" #include "carlink_ey.h" #include "carlink_video.h" #include "iperf_task.h" #include "iot_wifi.h" #include "FreeRTOS_DHCP_Server.h" struct test_header { uint16_t id; uint16_t payload_len; }; #ifdef RELTECK_WIFI_AP_MODE static const uint8_t ucIPAddress[4] = {192, 168, 13, 1}; #else static const uint8_t ucIPAddress[4] = {192, 168, 13, 37}; #endif static const uint8_t ucNetMask[4] = {255, 255, 255, 0}; //static const uint8_t ucGatewayAddress[4] = {192, 168, 13, 1}; static const uint8_t ucGatewayAddress[4] = {192, 168, 13, 1}; static const uint8_t ucDNSServerAddress[4] = {8, 8, 8, 8}; //static const uint8_t ucMACAddress[6] = {0x00, 0x0c, 0x29, 0x5d, 0x2e, 0x03}; //static const uint8_t ucMACAddress[6] = {0x68, 0xb9, 0xd3, 0xc1, 0x28, 0x03}; static const uint8_t ucMACAddress[6] = {0x30, 0x4a, 0x26, 0x78, 0xfd, 0x12}; uint8_t wifi_data_buffer[65536] = {0}; extern void ark_test_h264_dec(); extern int wifi_sta_test_proc(); extern int wifi_ap_test_proc(); #if 0 static int vCreateTCPServerSocket( 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; struct test_header header; uint8_t header_buf[4]; uint8_t* header_buf_ptr; const int header_len = sizeof(struct test_header); int header_buf_len = 0; uint8_t *h264SrcBuf = NULL; uint8_t *h264SrcBufPtr = NULL; int32_t h264SrcSize = 0, h264SrcSizePos = 0; uint8_t err_flag = 0;int i; video_frame_s* frame = NULL; 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 ); //ark_test_h264_dec(); carlink_ey_video_init(); 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 ) ) { uint8_t 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 ) ) { header_buf_ptr = header_buf; header_buf_len = header_len; err_flag = 0; while (header_buf_len > 0) { err_flag = 0; ret = FreeRTOS_recv(xClientSocket, (void*)header_buf_ptr, header_buf_len, 0); if (ret < 0) { err_flag = 1; printf("FreeRTOS_recv header err:%d\r\n", ret); break; } header_buf_ptr += ret; header_buf_len -= ret; } if (err_flag) { FreeRTOS_FD_CLR(xClientSocket, xFD_Set, eSELECT_READ); FreeRTOS_closesocket(xClientSocket); xClientSocket = FREERTOS_INVALID_SOCKET; video_frame_s* dummy = NULL; notify_h264_frame_ready(&dummy); continue; } /*printf("##header:"); for (i = 0; i < header_len; i++) { printf("%02x ", header_buf[i]); }printf("\r\n");*/ //READ_LE16(header_buf, header.id); //READ_LE16(header_buf + 2, header.payload_len); header.id = (header_buf[0] | (header_buf[1] << 8)); header.payload_len = (header_buf[2] | (header_buf[3] << 8)); printf("recv id:%d len:%d\r\n", header.id, header.payload_len); int retry_cnt = 0; h264SrcSize = header.payload_len; get_retry: frame = get_h264_frame_buf(); if (NULL == frame) { printf("h264 frame is empty\r\n"); vTaskDelay(pdMS_TO_TICKS(10)); goto get_retry; //continue; } h264SrcSizePos = h264SrcSize; h264SrcBufPtr = frame->cur; h264SrcBuf = frame->cur; frame->len = h264SrcSize; err_flag = 0; while (h264SrcSizePos > 0) { //printf("h264SrcSizePos:%d\r\n", h264SrcSizePos); ret = FreeRTOS_recv( xClientSocket, (void *)h264SrcBufPtr, h264SrcSizePos, 0); //printf("lBytes:%d h264SrcSizePos:%d\r\n", lBytes, h264SrcSizePos); if (ret < 0) { printf("FreeRTOS_recv err:%d\r\n", ret); err_flag = 1; break; } h264SrcBufPtr += ret; h264SrcSizePos -= ret; }/*printf("read finished\r\n"); printf("payload:"); for (i = 0; i < 16; i++) { printf("%02x ", h264SrcBuf[i]); }printf("\r\n");*/ if (err_flag) { FreeRTOS_FD_CLR(xClientSocket, xFD_Set, eSELECT_READ); FreeRTOS_closesocket(xClientSocket); xClientSocket = FREERTOS_INVALID_SOCKET; video_frame_s* dummy = NULL; notify_h264_frame_ready(&dummy); continue; } notify_h264_frame_ready(&frame); } } FreeRTOS_closesocket(xClientSocket); FreeRTOS_closesocket(xSockets); } #else static int vCreateTCPServerSocket( 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; 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 ); //ark_test_h264_dec(); carlink_ey_video_init(); 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; } } } FreeRTOS_closesocket(xClientSocket); FreeRTOS_closesocket(xSockets); return 0; } #endif #if ( ipconfigUSE_DHCP_HOOK != 0 ) eDHCPCallbackAnswer_t xApplicationDHCPHook2( eDHCPCallbackPhase_t eDHCPPhase, uint32_t ulIPAddress ) { eDHCPCallbackAnswer_t eReturn; //uint32_t ulStaticIPAddress, ulStaticNetMask; 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 eDHCPPhasePreDiscover : eReturn = eDHCPContinue; break; case eDHCPPhasePreRequest : #if 0 ulStaticIPAddress = FreeRTOS_inet_addr_quick( ucIPAddress[0], ucIPAddress[1], ucIPAddress[2], ucIPAddress[3] ); ulStaticNetMask = FreeRTOS_inet_addr_quick( ucNetMask[0], ucNetMask[1], ucNetMask[2], ucNetMask[3] ); ulStaticIPAddress &= ulStaticNetMask; ulIPAddress &= ulStaticNetMask; if( ulStaticIPAddress == ulIPAddress ) { eReturn = eDHCPUseDefaults; } else { eReturn = eDHCPContinue; } #else eReturn = eDHCPContinue; #endif break; default : eReturn = eDHCPContinue; break; } return eReturn; } #endif void wifi_test_event_handler( WIFIEvent_t * xEvent ) { WIFIEventType_t xEventType = xEvent->xEventType; if (0) { } else if (eWiFiEventConnected == xEventType) {// meter is sta printf("\r\n The meter is connected to ap \r\n"); } else if (eWiFiEventDisconnected == xEventType) {// meter is sta printf("\r\n The meter is disconnected from ap \r\n"); } else if (eWiFiEventAPStationConnected == xEventType) {// meter is ap printf("\r\n The meter in AP is connected by a sta \r\n"); } else if (eWiFiEventAPStationDisconnected == xEventType) {// meter is ap printf("\r\n The sta is disconnected from the meter \r\n"); } } void wifi_demo_test(void) { BaseType_t ret = 0; unsigned int status; uint32_t IPAddress = (32 << 24) | (13 << 16) | (168 << 8) | (192 << 0); for (;;) { if (mmcsd_wait_sdio_ready(portMAX_DELAY)) { printf("detect sdio device\r\n"); break; } } #ifndef RELTECK_WIFI_AP_MODE setDhcpClientState(1); #endif ret = ret; //vTaskDelay(pdMS_TO_TICKS(5000));//wait connect ret = FreeRTOS_IPInit(ucIPAddress, ucNetMask, ucGatewayAddress,ucDNSServerAddress, ucMACAddress); //ark_wlan_init(); #ifdef RELTECK_WIFI_AP_MODE wifi_ap_test_proc(); #else WIFI_RegisterEvent(eWiFiEventMax, wifi_test_event_handler); wifi_sta_test_proc(); #endif //vTaskDelay(pdMS_TO_TICKS(8000)); while(0) { //printf("send ping\r\n"); FreeRTOS_SendPingRequest(IPAddress, 8, 1000); vTaskDelay(pdMS_TO_TICKS(1000)); } vTaskDelay(pdMS_TO_TICKS(1000)); #ifdef RELTECK_WIFI_AP_MODE setDhcpClientState(0); IPAddress = (20 << 24) | (13 << 16) | (168 << 8) | (192 << 0); dhcpserver_start(ucIPAddress, IPAddress, 10); #else setDhcpClientState(1); #endif //vCreateTCPServerSocket(); vIPerfInstall(); } #endif #endif