wifi_test_demo.c 12 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380
  1. #include "FreeRTOS.h"
  2. #include "board.h"
  3. #include "chip.h"
  4. #include "test_demo.h"
  5. #ifdef WIFI_SUPPORT
  6. #if WIFI_TEST
  7. //#define RELTECK_WIFI_AP_MODE
  8. #include "FreeRTOS_Sockets.h"
  9. #include "FreeRTOS_IP.h"
  10. #include "FreeRTOS_DHCP.h"
  11. #include "carlink_ey.h"
  12. #include "carlink_video.h"
  13. #include "iperf_task.h"
  14. #include "iot_wifi.h"
  15. #include "FreeRTOS_DHCP_Server.h"
  16. struct test_header
  17. {
  18. uint16_t id;
  19. uint16_t payload_len;
  20. };
  21. #ifdef RELTECK_WIFI_AP_MODE
  22. static const uint8_t ucIPAddress[4] = {192, 168, 13, 1};
  23. #else
  24. static const uint8_t ucIPAddress[4] = {192, 168, 13, 37};
  25. #endif
  26. static const uint8_t ucNetMask[4] = {255, 255, 255, 0};
  27. //static const uint8_t ucGatewayAddress[4] = {192, 168, 13, 1};
  28. static const uint8_t ucGatewayAddress[4] = {192, 168, 13, 1};
  29. static const uint8_t ucDNSServerAddress[4] = {8, 8, 8, 8};
  30. //static const uint8_t ucMACAddress[6] = {0x00, 0x0c, 0x29, 0x5d, 0x2e, 0x03};
  31. //static const uint8_t ucMACAddress[6] = {0x68, 0xb9, 0xd3, 0xc1, 0x28, 0x03};
  32. static const uint8_t ucMACAddress[6] = {0x30, 0x4a, 0x26, 0x78, 0xfd, 0x12};
  33. uint8_t wifi_data_buffer[65536] = {0};
  34. extern void ark_test_h264_dec();
  35. extern int wifi_sta_test_proc();
  36. extern int wifi_ap_test_proc();
  37. #if 0
  38. static int vCreateTCPServerSocket( void )
  39. {
  40. SocketSet_t xFD_Set;
  41. struct freertos_sockaddr xAddress, xRemoteAddr;
  42. Socket_t xSockets = FREERTOS_INVALID_SOCKET, xClientSocket = FREERTOS_INVALID_SOCKET;
  43. socklen_t xClientLength = sizeof( xAddress );
  44. static const TickType_t xNoTimeOut = portMAX_DELAY;
  45. BaseType_t ret = -1;
  46. BaseType_t xResult;
  47. struct test_header header;
  48. uint8_t header_buf[4];
  49. uint8_t* header_buf_ptr;
  50. const int header_len = sizeof(struct test_header);
  51. int header_buf_len = 0;
  52. uint8_t *h264SrcBuf = NULL;
  53. uint8_t *h264SrcBufPtr = NULL;
  54. int32_t h264SrcSize = 0, h264SrcSizePos = 0;
  55. uint8_t err_flag = 0;int i;
  56. video_frame_s* frame = NULL;
  57. xFD_Set = FreeRTOS_CreateSocketSet();
  58. xSockets = FreeRTOS_socket( FREERTOS_AF_INET, FREERTOS_SOCK_STREAM, FREERTOS_IPPROTO_TCP );
  59. configASSERT( xSockets != FREERTOS_INVALID_SOCKET );
  60. FreeRTOS_setsockopt( xSockets,
  61. 0,
  62. FREERTOS_SO_RCVTIMEO,
  63. &xNoTimeOut,
  64. sizeof( xNoTimeOut ) );
  65. xAddress.sin_port = ( uint16_t ) 11111;
  66. xAddress.sin_port = FreeRTOS_htons( xAddress.sin_port );
  67. FreeRTOS_bind( xSockets, &xAddress, sizeof( xAddress ) );
  68. FreeRTOS_listen( xSockets, 1 );
  69. //ark_test_h264_dec();
  70. carlink_ey_video_init();
  71. while (1) {
  72. FreeRTOS_FD_CLR(xSockets, xFD_Set, eSELECT_READ);
  73. FreeRTOS_FD_SET(xSockets, xFD_Set, eSELECT_READ);
  74. if (xClientSocket && xClientSocket != FREERTOS_INVALID_SOCKET) {
  75. FreeRTOS_FD_CLR(xClientSocket, xFD_Set, eSELECT_READ);
  76. FreeRTOS_FD_SET( xClientSocket, xFD_Set, eSELECT_READ );
  77. }
  78. xResult = FreeRTOS_select( xFD_Set, portMAX_DELAY );
  79. if (xResult < 0) {
  80. break;
  81. }
  82. if( FreeRTOS_FD_ISSET ( xSockets, xFD_Set ) ) {
  83. xClientSocket = FreeRTOS_accept( xSockets, &xRemoteAddr, &xClientLength);
  84. if( ( xClientSocket != NULL ) && ( xClientSocket != FREERTOS_INVALID_SOCKET ) ) {
  85. uint8_t pucBuffer[32] = {0};
  86. FreeRTOS_FD_CLR(xClientSocket, xFD_Set, eSELECT_READ);
  87. FreeRTOS_FD_SET(xClientSocket, xFD_Set, eSELECT_READ);
  88. FreeRTOS_GetRemoteAddress( xClientSocket, ( struct freertos_sockaddr * ) &xRemoteAddr );
  89. FreeRTOS_inet_ntoa(xRemoteAddr.sin_addr, pucBuffer );
  90. printf("Carlink: Received a connection from %s:%u\n", pucBuffer, FreeRTOS_ntohs(xRemoteAddr.sin_port));
  91. }
  92. continue;
  93. } else if( FreeRTOS_FD_ISSET ( xClientSocket, xFD_Set ) ) {
  94. header_buf_ptr = header_buf;
  95. header_buf_len = header_len;
  96. err_flag = 0;
  97. while (header_buf_len > 0) {
  98. err_flag = 0;
  99. ret = FreeRTOS_recv(xClientSocket, (void*)header_buf_ptr, header_buf_len, 0);
  100. if (ret < 0) {
  101. err_flag = 1;
  102. printf("FreeRTOS_recv header err:%d\r\n", ret);
  103. break;
  104. }
  105. header_buf_ptr += ret;
  106. header_buf_len -= ret;
  107. }
  108. if (err_flag) {
  109. FreeRTOS_FD_CLR(xClientSocket, xFD_Set, eSELECT_READ);
  110. FreeRTOS_closesocket(xClientSocket);
  111. xClientSocket = FREERTOS_INVALID_SOCKET;
  112. video_frame_s* dummy = NULL;
  113. notify_h264_frame_ready(&dummy);
  114. continue;
  115. }
  116. /*printf("##header:");
  117. for (i = 0; i < header_len; i++) {
  118. printf("%02x ", header_buf[i]);
  119. }printf("\r\n");*/
  120. //READ_LE16(header_buf, header.id);
  121. //READ_LE16(header_buf + 2, header.payload_len);
  122. header.id = (header_buf[0] | (header_buf[1] << 8));
  123. header.payload_len = (header_buf[2] | (header_buf[3] << 8));
  124. printf("recv id:%d len:%d\r\n", header.id, header.payload_len);
  125. int retry_cnt = 0;
  126. h264SrcSize = header.payload_len;
  127. get_retry:
  128. frame = get_h264_frame_buf();
  129. if (NULL == frame) {
  130. printf("h264 frame is empty\r\n");
  131. vTaskDelay(pdMS_TO_TICKS(10));
  132. goto get_retry;
  133. //continue;
  134. }
  135. h264SrcSizePos = h264SrcSize;
  136. h264SrcBufPtr = frame->cur;
  137. h264SrcBuf = frame->cur;
  138. frame->len = h264SrcSize;
  139. err_flag = 0;
  140. while (h264SrcSizePos > 0) {
  141. //printf("h264SrcSizePos:%d\r\n", h264SrcSizePos);
  142. ret = FreeRTOS_recv( xClientSocket, (void *)h264SrcBufPtr, h264SrcSizePos, 0);
  143. //printf("lBytes:%d h264SrcSizePos:%d\r\n", lBytes, h264SrcSizePos);
  144. if (ret < 0) {
  145. printf("FreeRTOS_recv err:%d\r\n", ret);
  146. err_flag = 1;
  147. break;
  148. }
  149. h264SrcBufPtr += ret;
  150. h264SrcSizePos -= ret;
  151. }/*printf("read finished\r\n");
  152. printf("payload:");
  153. for (i = 0; i < 16; i++) {
  154. printf("%02x ", h264SrcBuf[i]);
  155. }printf("\r\n");*/
  156. if (err_flag) {
  157. FreeRTOS_FD_CLR(xClientSocket, xFD_Set, eSELECT_READ);
  158. FreeRTOS_closesocket(xClientSocket);
  159. xClientSocket = FREERTOS_INVALID_SOCKET;
  160. video_frame_s* dummy = NULL;
  161. notify_h264_frame_ready(&dummy);
  162. continue;
  163. }
  164. notify_h264_frame_ready(&frame);
  165. }
  166. }
  167. FreeRTOS_closesocket(xClientSocket);
  168. FreeRTOS_closesocket(xSockets);
  169. }
  170. #else
  171. static int vCreateTCPServerSocket( void )
  172. {
  173. SocketSet_t xFD_Set;
  174. struct freertos_sockaddr xAddress, xRemoteAddr;
  175. Socket_t xSockets = FREERTOS_INVALID_SOCKET, xClientSocket = FREERTOS_INVALID_SOCKET;
  176. socklen_t xClientLength = sizeof( xAddress );
  177. static const TickType_t xNoTimeOut = portMAX_DELAY;
  178. BaseType_t ret = -1;
  179. BaseType_t xResult;
  180. xFD_Set = FreeRTOS_CreateSocketSet();
  181. xSockets = FreeRTOS_socket( FREERTOS_AF_INET, FREERTOS_SOCK_STREAM, FREERTOS_IPPROTO_TCP );
  182. configASSERT( xSockets != FREERTOS_INVALID_SOCKET );
  183. FreeRTOS_setsockopt( xSockets,
  184. 0,
  185. FREERTOS_SO_RCVTIMEO,
  186. &xNoTimeOut,
  187. sizeof( xNoTimeOut ) );
  188. xAddress.sin_port = ( uint16_t ) 11111;
  189. xAddress.sin_port = FreeRTOS_htons( xAddress.sin_port );
  190. FreeRTOS_bind( xSockets, &xAddress, sizeof( xAddress ) );
  191. FreeRTOS_listen( xSockets, 1 );
  192. //ark_test_h264_dec();
  193. carlink_ey_video_init();
  194. while (1) {
  195. FreeRTOS_FD_CLR(xSockets, xFD_Set, eSELECT_READ);
  196. FreeRTOS_FD_SET(xSockets, xFD_Set, eSELECT_READ);
  197. if (xClientSocket && xClientSocket != FREERTOS_INVALID_SOCKET) {
  198. FreeRTOS_FD_CLR(xClientSocket, xFD_Set, eSELECT_READ);
  199. FreeRTOS_FD_SET( xClientSocket, xFD_Set, eSELECT_READ );
  200. }
  201. xResult = FreeRTOS_select( xFD_Set, portMAX_DELAY );
  202. if (xResult < 0) {
  203. break;
  204. }
  205. if( FreeRTOS_FD_ISSET ( xSockets, xFD_Set ) ) {
  206. xClientSocket = FreeRTOS_accept( xSockets, &xRemoteAddr, &xClientLength);
  207. if( ( xClientSocket != NULL ) && ( xClientSocket != FREERTOS_INVALID_SOCKET ) ) {
  208. char pucBuffer[32] = {0};
  209. FreeRTOS_FD_CLR(xClientSocket, xFD_Set, eSELECT_READ);
  210. FreeRTOS_FD_SET(xClientSocket, xFD_Set, eSELECT_READ);
  211. FreeRTOS_GetRemoteAddress( xClientSocket, ( struct freertos_sockaddr * ) &xRemoteAddr );
  212. FreeRTOS_inet_ntoa(xRemoteAddr.sin_addr, pucBuffer );
  213. printf("Carlink: Received a connection from %s:%u\n", pucBuffer, FreeRTOS_ntohs(xRemoteAddr.sin_port));
  214. }
  215. continue;
  216. } else if( FreeRTOS_FD_ISSET ( xClientSocket, xFD_Set ) ) {
  217. ret = FreeRTOS_recv(xClientSocket, wifi_data_buffer, sizeof wifi_data_buffer, 0);
  218. if (ret > 0) {
  219. printf("recv buf size:%d\r\n", ret);
  220. } else {
  221. printf("FreeRTOS_recv err:%d\r\n", ret);
  222. FreeRTOS_FD_CLR(xClientSocket, xFD_Set, eSELECT_READ);
  223. FreeRTOS_closesocket(xClientSocket);
  224. xClientSocket = FREERTOS_INVALID_SOCKET;
  225. continue;
  226. }
  227. }
  228. }
  229. FreeRTOS_closesocket(xClientSocket);
  230. FreeRTOS_closesocket(xSockets);
  231. return 0;
  232. }
  233. #endif
  234. #if ( ipconfigUSE_DHCP_HOOK != 0 )
  235. eDHCPCallbackAnswer_t xApplicationDHCPHook2( eDHCPCallbackPhase_t eDHCPPhase,
  236. uint32_t ulIPAddress )
  237. {
  238. eDHCPCallbackAnswer_t eReturn;
  239. //uint32_t ulStaticIPAddress, ulStaticNetMask;
  240. char ip_str[20] = {0};
  241. sprintf(ip_str, "%d.%d.%d.%d\r\n", (ulIPAddress >> 0) & 0xFF,
  242. (ulIPAddress >> 8) & 0xFF, (ulIPAddress >> 16) & 0xFF, (ulIPAddress >> 24) & 0xFF);
  243. printf("\r\n eDHCPPhase:%d ulIPAddress:%s state:%d \r\n", eDHCPPhase, ip_str, getDhcpClientState());
  244. if (getDhcpClientState() == 0)
  245. return eDHCPStopNoChanges;
  246. switch( eDHCPPhase )
  247. {
  248. case eDHCPPhasePreDiscover :
  249. eReturn = eDHCPContinue;
  250. break;
  251. case eDHCPPhasePreRequest :
  252. #if 0
  253. ulStaticIPAddress = FreeRTOS_inet_addr_quick( ucIPAddress[0],
  254. ucIPAddress[1],
  255. ucIPAddress[2],
  256. ucIPAddress[3] );
  257. ulStaticNetMask = FreeRTOS_inet_addr_quick( ucNetMask[0],
  258. ucNetMask[1],
  259. ucNetMask[2],
  260. ucNetMask[3] );
  261. ulStaticIPAddress &= ulStaticNetMask;
  262. ulIPAddress &= ulStaticNetMask;
  263. if( ulStaticIPAddress == ulIPAddress ) {
  264. eReturn = eDHCPUseDefaults;
  265. } else {
  266. eReturn = eDHCPContinue;
  267. }
  268. #else
  269. eReturn = eDHCPContinue;
  270. #endif
  271. break;
  272. default :
  273. eReturn = eDHCPContinue;
  274. break;
  275. }
  276. return eReturn;
  277. }
  278. #endif
  279. void wifi_test_event_handler( WIFIEvent_t * xEvent )
  280. {
  281. WIFIEventType_t xEventType = xEvent->xEventType;
  282. if (0) {
  283. } else if (eWiFiEventConnected == xEventType) {// meter is sta
  284. printf("\r\n The meter is connected to ap \r\n");
  285. } else if (eWiFiEventDisconnected == xEventType) {// meter is sta
  286. printf("\r\n The meter is disconnected from ap \r\n");
  287. } else if (eWiFiEventAPStationConnected == xEventType) {// meter is ap
  288. printf("\r\n The meter in AP is connected by a sta \r\n");
  289. } else if (eWiFiEventAPStationDisconnected == xEventType) {// meter is ap
  290. printf("\r\n The sta is disconnected from the meter \r\n");
  291. }
  292. }
  293. void wifi_demo_test(void)
  294. {
  295. BaseType_t ret = 0;
  296. unsigned int status;
  297. uint32_t IPAddress = (32 << 24) | (13 << 16) | (168 << 8) | (192 << 0);
  298. for (;;) {
  299. if (mmcsd_wait_sdio_ready(portMAX_DELAY)) {
  300. printf("detect sdio device\r\n");
  301. break;
  302. }
  303. }
  304. #ifndef RELTECK_WIFI_AP_MODE
  305. setDhcpClientState(1);
  306. #endif
  307. ret = ret;
  308. //vTaskDelay(pdMS_TO_TICKS(5000));//wait connect
  309. ret = FreeRTOS_IPInit(ucIPAddress, ucNetMask, ucGatewayAddress,ucDNSServerAddress, ucMACAddress);
  310. //ark_wlan_init();
  311. #ifdef RELTECK_WIFI_AP_MODE
  312. wifi_ap_test_proc();
  313. #else
  314. WIFI_RegisterEvent(eWiFiEventMax, wifi_test_event_handler);
  315. wifi_sta_test_proc();
  316. #endif
  317. //vTaskDelay(pdMS_TO_TICKS(8000));
  318. while(0) {
  319. //printf("send ping\r\n");
  320. FreeRTOS_SendPingRequest(IPAddress, 8, 1000);
  321. vTaskDelay(pdMS_TO_TICKS(1000));
  322. }
  323. vTaskDelay(pdMS_TO_TICKS(1000));
  324. #ifdef RELTECK_WIFI_AP_MODE
  325. setDhcpClientState(0);
  326. IPAddress = (20 << 24) | (13 << 16) | (168 << 8) | (192 << 0);
  327. dhcpserver_start(ucIPAddress, IPAddress, 10);
  328. #else
  329. setDhcpClientState(1);
  330. #endif
  331. //vCreateTCPServerSocket();
  332. vIPerfInstall();
  333. }
  334. #endif
  335. #endif