[Intel AI SW 아카데미] TCP/IP, UDP, Hercules, QT

Jimeaning·2024년 1월 29일
0

Intel AIoT

목록 보기
25/38

2024.1.26

TCP/IP

Ethernet MAC Address에서 앞에 세 개는 Make ID, 뒤에 세 개는 시리얼 넘버(S/N)이다

STM의 IP주소와, subnet mask, gateway address를 설정해준다.

LAN8742로 등록되어 있으므로 IPs or Components와 Found Solutions를 LAN8742로 바꿔준다

Code

  • lwip.h
/* USER CODE BEGIN 0 */
extern struct netif gnetif;	// ADD_JM
/* USER CODE END 0 */
  • main.c
/* Private includes ----------------------------------------------------------*/
/* USER CODE BEGIN Includes */
#include "lwip/udp.h"		 // ADD_JM
#include "udp_echoserver.h"	// ADD_JM
/* USER CODE END Includes */

void StartDefaultTask(void *argument)
{
  /* init code for LWIP */
  MX_LWIP_Init();
  /* USER CODE BEGIN 5 */
  udp_echoserver_init();	// ADD_JM
  /* Infinite loop */
  for(;;)
  {
	ethernetif_input(&gnetif);	// ADD_JM
	sys_check_timeout();	// ADD_JM
    osDelay(1);
  }
  /* USER CODE END 5 */
}

udp_echoserver_init() 메서드는 udp_echoserver.c 파일에 있음

window + r키를 누르고 ping (ip주소) -t 하면 위와 같이 실행된다

  • main.c
/* USER CODE BEGIN 4 */
ip_addr_t addr1;	// ADD_JM
struct pbuf *p1;	// ADD send buffer
char temp_str[40];	// ADD temp buffer
extern struct udp_pcb *upcb1; // ADD udp control block
extern uint8_t udp_data[100];	// ADD udp data
/* USER CODE END 4 */

/* USER CODE BEGIN Header_StartDefaultTask */
/**
  * @brief  Function implementing the defaultTask thread.
  * @param  argument: Not used
  * @retval None
  */
/* USER CODE END Header_StartDefaultTask */
void StartDefaultTask(void *argument)
{
  /* init code for LWIP */
  MX_LWIP_Init();
  /* USER CODE BEGIN 5 */
  // --------------- TCP/IP start -------------------
  udp_echoserver_init();  // ADD_JM
  upcb1 = udp_new();	// ADD_JM
  IP4_ADDR(&addr1, 10, 10, 15, 59);	// ADD client PC IP address
  udp_bind(upcb1, IP_ADDR_ANY, 9999);	// ADD
  // ---------------- TCP/IP end --------------------
  /* Infinite loop */
  for(;;)
  {
	ethernetif_input(&gnetif);  // ADD_JM
	sys_check_timeouts();   // ADD_JM
    
    udp_connect(upcb1, &addr1, 9999);
    sprintf(temp_str, "Hello jimeaning!\n");
	p1 = pbuf_alloc(PBUF_TRANSPORT, strlen((char*)temp_str), PBUF_POOL);
	if (p1 != NULL)	// OK alloc
	{
		// 1. copy data to pbuf
		pbuf_take(p1, (char *)temp_str, strlen((char *)temp_str));
		// 2. send udp data
		udp_send(upcb1, p1);
		// 3. free the UDP connection 
		udp_disconnect(upcb1);
		// 4. free pbuf (memory)
		pbuf_free(p1);
	}
    else
	{
		HAL_UART_Transmit(&huart3, "pbuf not alloc!!\n", strlen("pbuf not alloc!!\n"), 10);
	}
	
    osDelay(100);
  }
  /* USER CODE END 5 */
}

pbuf *p1은 send buffer로 동적 메모리를 할당하는 변수이다.
9999 포트를 쓰는 이유는 이미 사용하던 포트와 겹치지 않게 하기 위함이다.

Hercules


UDP에서 Module IP에 STM32 IP로 설정해주고, 포트와 로컬 포트를 9999로 설정한 후 Listen 버튼을 클릭한다.

QT

리눅스에서 QT를 다운받아준다
버전: 5.12.4
다운로드 링크

profile
I mean

0개의 댓글