iot

라즈베리파이로 TCP/IP 소켓 통신

030binfolder 2024. 4. 9. 18:10

https://www.aladin.co.kr/shop/wproduct.aspx?ItemId=5928062&start=pgooglemc

 

윤성우의 열혈 TCP/IP 소켓 프로그래밍

눅스와 윈도우 기반에서의 소켓 프로그래밍을 함께 설명하며, 초보자에게 적절한 설명과 예제를 통해서 소켓 프로그래밍에 대한 재미를 안겨주고자 한 책이다. 2003년도에 출간된 <열혈강의 TCP/I

www.aladin.co.kr

 
tcp/ip 소켓 프로그래밍 교재. 위 책을 보고 초간단 요약 하였습니다. 자세한 부분은 교재를 참고하세요!
 
 

01.  네트워크 프로그래밍과 소켓의 이해(요약)

 
네트워크 프로그래밍(= 소켓 프로그래밍)이란? 네트워크로 연결되어 있는 서로 다른 두 컴퓨터가 데이터를 주고 받을 수 있도록 한 것.
물리적으로 연결된 네트워크 상에서 데이터 송수신에서 사용할 수 있는 소프트웨어적인 장치 - 소켓 -을 통해 네트워크 망을 연결할 수 있다. 
 
 
서버: 연결 요청을 수락하는 프로그램으로, 필요한 함수들은 다음과 같다.

#include <sys/socket.h>

int socket(int domain, int type, int protocol); // 1. 소켓 생성

int bind(int sockfd, struct sockaddr *myaddr, socklen_t addrlen); // 2. 소켓에 ip주소, port번호 할당

int listen(int sockfd, int backlog); // 3. 소켓을 연결 요청이 가능한 상태로 변경

int accept(int sockfd, struct sockaddr *addr, socklen_t *addrlen); // 4. 연결 요청에 대한 수락

 
 
클라이언트: 소켓 생성, 서버로의 연결 요청을 하는 프로그램이다.

#include <sys/socket.h>

int socket(int domain, int type, int protocol); // 1. 소켓 생성

int connect(int sockfd, struct sockaddr *serv_addr, socklen_t addrlen); // 2. 서버로의 연결 요청

 
 
 bind, listen 함수의 호출이 이어지면 서버 소켓, connect 함수의 호출이 이어지면 클라이언트 소켓이다.

 

Makefile
 
다음과 같은 makefile을 사용하여 코드를 컴파일하였다.

#CC:=arm-linux-gcc
CC:=gcc

TARGET_SRV=iot_server
OBJECT_SRV=$(TARGET_SRV).o

TARGET_CLN=iot_client
OBJECT_CLN=$(TARGET_CLN).o

#LDFLAGS=-D_REENTRANT -pthread -lmysqlclient
LDFLAGS=-D_REENTRANT -pthread

all : $(TARGET_SRV) $(TARGET_CLN)

$(TARGET_SRV):$(OBJECT_SRV)
        $(CC) -o $@ $(OBJECT_SRV) $(LDFLAGS)
$(TARGET_CLN):$(OBJECT_CLN)
        $(CC) -o $@ $(OBJECT_CLN) $(LDFLAGS)
%.o:%.c
        $(CC) -c -o $@ $<
clean:
        rm -f *.o $(TARGET_SRV) $(TARGET_CLN)

 
iot_server.c와 iot_client.c를 make 해준 후,
 

*make all 하면 모든 파일을 make하고, make clean 하면 make로 생긴 파일을 모두 지운다.
파일을 하나씩 make 하려면  
gcc iot_server.c(make 대상이 되는 파일 이름) -o iot_server(output의 이름) 이런 식으로 명령어를 실행하면 된다.

 

서버를 먼저 구동시킨 후, 클라이언트를 접속한 모습.

 
 
./iot_server 5000(포트 번호)
./iot_client 127.0.0.1(루프백 주소) 5000(포트 번호) 20(클라이언트 이름) 명령어를 실행해 서버와 클라이언트 프로그램을 실행하였다.
 
*루프백 주소: 컴퓨터 자신의 IP 주소를 의미한다. 하나의 컴퓨터에서 서버와 클라이언트가 모두 실행될 수 있게 한다.
*INADDR_ANY: 이 상수로 서버의 IP 주소를 할당할 경우, IP주소가 자동으로 할당되며 포트번호만 맞으면 수신할 수 있기 때문에 서버 프로그램 구현에 많이 쓰인다.
 

클라이언트가 전송한 메시지가 서버에 기록되는 모습.

 
 
이 하나의 서버를 통해 여러 클라이언트들이 메시지를 주고받을 수 있다.
 

ubuntu는 가상머신으로 열어서 그런지 루프백 주소가 아닌 할당된 주소를 직접 입력해주어야 했다.

 
 
블루투스 모듈도 클라이언트로 연결해주었다.
 

클라이언트 20에서 LSB_BT(블루투스 클라이언트)와 전체를 대상으로 메시지를 전송해보았다.

 

 
 
 
[LSB_BT]MOTOR@RIGHT 처럼 앞에 전송하는 대상을 쓰면 그 클라이언트에게만 메시지가 전송되고, 전송 대상을 표기하지 않으면 전체 메시지로 전송되는 것을 확인할 수 있다.
 
 
stm32f429 보드와 와이파이 모듈을 연결해서 tcp 통신을 통해 접속해보았다.

LSB_LIN 클라이언트에서 LSB_STM 클라이언트로 LED 명령어를 보낸 모습.

 


led가 on off 되는 것을 확인할 수 있다.