[C] 纯文本查看 复制代码
/* USER CODE BEGIN Header */
/**
******************************************************************************
* @file app_netxduo.c
* @author MCD Application Team
* @brief NetXDuo applicative file
******************************************************************************
* @attention
*
* Copyright (c) 2020-2021 STMicroelectronics.
* All rights reserved.
*
* This software is licensed under terms that can be found in the LICENSE file
* in the root directory of this software component.
* If no LICENSE file comes with this software, it is provided AS-IS.
*
******************************************************************************
*/
/* USER CODE END Header */
/* Includes ------------------------------------------------------------------*/
#include "app_netxduo.h"
/* Private includes ----------------------------------------------------------*/
/* USER CODE BEGIN Includes */
#include "nxd_bsd.h"
/* USER CODE END Includes */
/* Private typedef -----------------------------------------------------------*/
/* USER CODE BEGIN PTD */
/* USER CODE END PTD */
/* Private define ------------------------------------------------------------*/
/* USER CODE BEGIN PD */
/* USER CODE END PD */
/* Private macro -------------------------------------------------------------*/
/* USER CODE BEGIN PM */
#define UDP_SERVER_PORT 1234
#define PRINT_DATA(addr, port, data) do { \
printf("[%lu.%lu.%lu.%lu:%u] -> '%s' \r\n", \
(addr >> 24) & 0xff, \
(addr >> 16) & 0xff, \
(addr >> 8) & 0xff, \
(addr & 0xff), port, data); \
} while(0)
#define UDP_THREAD_PRIORITY 3U
/* USER CODE END PM */
/* Private variables ---------------------------------------------------------*/
TX_THREAD NxAppThread;
NX_PACKET_POOL NxAppPool;
NX_IP NetXDuoEthIpInstance;
/* USER CODE BEGIN PV */
TX_THREAD thread_udp_server;
NX_UDP_SOCKET UDPSocket;
UCHAR data_buffer[4096];
/* USER CODE END PV */
/* Private function prototypes -----------------------------------------------*/
static VOID nx_app_thread_entry (ULONG thread_input);
/* USER CODE BEGIN PFP */
static VOID thread_server_entry(ULONG thread_input);
/* USER CODE END PFP */
/**
* @brief Application NetXDuo Initialization.
* @param memory_ptr: memory pointer
* @retval int
*/
UINT MX_NetXDuo_Init(VOID *memory_ptr)
{
UINT ret = NX_SUCCESS;
TX_BYTE_POOL *byte_pool = (TX_BYTE_POOL*)memory_ptr;
CHAR *pointer;
/* USER CODE BEGIN MX_NetXDuo_MEM_POOL */
if (tx_byte_allocate(byte_pool, (VOID **)&pointer, NX_APP_THREAD_STACK_SIZE, TX_NO_WAIT) != TX_SUCCESS) {
return TX_POOL_ERROR;
}
ret = tx_thread_create(&thread_udp_server,
"UDP Server thread",
thread_server_entry,
0,
pointer,
NX_APP_THREAD_STACK_SIZE,
UDP_THREAD_PRIORITY,
UDP_THREAD_PRIORITY,
TX_NO_TIME_SLICE,
TX_AUTO_START);
if (ret != TX_SUCCESS) {
return TX_THREAD_ERROR;
}
/* USER CODE END MX_NetXDuo_MEM_POOL */
/* USER CODE BEGIN 0 */
/* USER CODE END 0 */
/* Initialize the NetXDuo system. */
nx_system_initialize();
/* Allocate the memory for packet_pool. */
if (tx_byte_allocate(byte_pool, (VOID **) &pointer, NX_APP_PACKET_POOL_SIZE, TX_NO_WAIT) != TX_SUCCESS)
{
return TX_POOL_ERROR;
}
/* Create the Packet pool to be used for packet allocation,
* If extra NX_PACKET are to be used the NX_APP_PACKET_POOL_SIZE should be increased
*/
ret = nx_packet_pool_create(&NxAppPool, "NetXDuo App Pool", DEFAULT_PAYLOAD_SIZE, pointer, NX_APP_PACKET_POOL_SIZE);
if (ret != NX_SUCCESS)
{
return NX_POOL_ERROR;
}
/* Allocate the memory for Ip_Instance */
if (tx_byte_allocate(byte_pool, (VOID **) &pointer, Nx_IP_INSTANCE_THREAD_SIZE, TX_NO_WAIT) != TX_SUCCESS)
{
return TX_POOL_ERROR;
}
/* Create the main NX_IP instance */
ret = nx_ip_create(&NetXDuoEthIpInstance, "NetX Ip instance", NX_APP_DEFAULT_IP_ADDRESS, NX_APP_DEFAULT_NET_MASK, &NxAppPool, nx_stm32_eth_driver,
pointer, Nx_IP_INSTANCE_THREAD_SIZE, NX_APP_INSTANCE_PRIORITY);
if (ret != NX_SUCCESS)
{
return NX_NOT_SUCCESSFUL;
}
/* Allocate the memory for ARP */
if (tx_byte_allocate(byte_pool, (VOID **) &pointer, DEFAULT_ARP_CACHE_SIZE, TX_NO_WAIT) != TX_SUCCESS)
{
return TX_POOL_ERROR;
}
/* Enable the ARP protocol and provide the ARP cache size for the IP instance */
/* USER CODE BEGIN ARP_Protocol_Initialization */
ret = nx_ip_fragment_enable(&NetXDuoEthIpInstance);
if (ret != NX_SUCCESS) {
return NX_NOT_SUCCESSFUL;
}
/* USER CODE END ARP_Protocol_Initialization */
ret = nx_arp_enable(&NetXDuoEthIpInstance, (VOID *)pointer, DEFAULT_ARP_CACHE_SIZE);
if (ret != NX_SUCCESS)
{
return NX_NOT_SUCCESSFUL;
}
/* Enable the ICMP */
/* USER CODE BEGIN ICMP_Protocol_Initialization */
/* USER CODE END ICMP_Protocol_Initialization */
ret = nx_icmp_enable(&NetXDuoEthIpInstance);
if (ret != NX_SUCCESS)
{
return NX_NOT_SUCCESSFUL;
}
/* Enable TCP Protocol */
/* USER CODE BEGIN TCP_Protocol_Initialization */
/* USER CODE END TCP_Protocol_Initialization */
ret = nx_tcp_enable(&NetXDuoEthIpInstance);
if (ret != NX_SUCCESS)
{
return NX_NOT_SUCCESSFUL;
}
/* Enable the UDP protocol required for DHCP communication */
/* USER CODE BEGIN UDP_Protocol_Initialization */
/* USER CODE END UDP_Protocol_Initialization */
ret = nx_udp_enable(&NetXDuoEthIpInstance);
if (ret != NX_SUCCESS)
{
return NX_NOT_SUCCESSFUL;
}
/* Allocate the memory for main thread */
if (tx_byte_allocate(byte_pool, (VOID **) &pointer, NX_APP_THREAD_STACK_SIZE, TX_NO_WAIT) != TX_SUCCESS)
{
return TX_POOL_ERROR;
}
/* Create the main thread */
ret = tx_thread_create(&NxAppThread, "NetXDuo App thread", nx_app_thread_entry , 0, pointer, NX_APP_THREAD_STACK_SIZE,
NX_APP_THREAD_PRIORITY, NX_APP_THREAD_PRIORITY, TX_NO_TIME_SLICE, TX_AUTO_START);
if (ret != TX_SUCCESS)
{
return TX_THREAD_ERROR;
}
/* USER CODE BEGIN MX_NetXDuo_Init */
/* USER CODE END MX_NetXDuo_Init */
return ret;
}
/**
* @brief Main thread entry.
* @param thread_input: ULONG user argument used by the thread entry
* @retval none
*/
static VOID nx_app_thread_entry (ULONG thread_input)
{
/* USER CODE BEGIN Nx_App_Thread_Entry 0 */
/* USER CODE END Nx_App_Thread_Entry 0 */
}
/* USER CODE BEGIN 1 */
static VOID thread_server_entry(ULONG thread_input)
{
NX_PACKET *RecPacket;
NX_PACKET *TraPacket;
ULONG bytes_read;
UINT source_port;
ULONG source_ip_address;
uint8_t send_buffer[20];
ULONG count = 0;
UINT ret = nx_udp_socket_create(&NetXDuoEthIpInstance,
&UDPSocket,
"UDP Server Socket",
NX_IP_NORMAL,
NX_FRAGMENT_OKAY,
NX_IP_TIME_TO_LIVE,
512);
if (ret != NX_SUCCESS) {
printf("create socket err\n");
}
ret = nx_udp_socket_bind(&UDPSocket, UDP_SERVER_PORT, TX_WAIT_FOREVER);
if (ret != NX_SUCCESS) {
printf("bind err\n");
}
while (1) {
/* 接收数据 */
ret = nx_udp_socket_receive(&UDPSocket, &RecPacket, TX_WAIT_FOREVER);
if (ret == NX_SUCCESS) {
/* 将UDP数据包中的数据复制到缓冲data_buffer */
nx_packet_data_extract_offset(RecPacket, 0, data_buffer, sizeof(data_buffer), &bytes_read);
/* 获取远程端口和IP */
nx_udp_source_extract(RecPacket, &source_ip_address, &source_port);
// PRINT_DATA(source_ip_address, source_port, data_buffer);
nx_packet_release(RecPacket);
ret = nx_packet_allocate(&NxAppPool, &TraPacket, NX_UDP_PACKET, TX_WAIT_FOREVER);
if (ret) {
printf("udp packet allocate fail\n");
}
// sprintf((char *)send_buffer, "send buff = %lu\r\n", count++);
/*将要发�?�的数据附加到TraPacket */
ret = nx_packet_data_append(
TraPacket, (VOID *)send_buffer, strlen((char *)send_buffer), &NxAppPool, TX_WAIT_FOREVER);
if (ret) {
printf("udp packet data append fail\n");
}
/* 发�?�数据包到UDP发�?�端 */
ret = nx_udp_socket_send(&UDPSocket, TraPacket, source_ip_address, source_port);
}
}
}
/* USER CODE END 1 */